From 1999b289213dc29214a924f5da0b8d51cbfdd3c5 Mon Sep 17 00:00:00 2001 From: rangoliu Date: Thu, 13 Apr 2023 16:22:05 +0800 Subject: [PATCH 01/42] [Feature] controlnet animation inferencer (#1713) * add config * add controlnet animation inferencer * fix lint * add controlnet_aux dependency * fix lint * fix ut * add readme * add demo * change video size * misc * misc * misc * misc * misc * misc * add video input output * add video result to readme * misc * misc * update readme * update readme * update readme * update inferecer * update readme * add gradio demo * fix lint * add control weight * add arguments * add inherit pipeline * delete unused code * fix hard code * fix lint * support fp16 * misc change. * add latent mask to improve edge * roll back inferencer dir change * revert change * fix lint * implement with our controlnet * build scheduler from mmedit * update readme * update readme * rename gradio inpaiting demo * Update configs/controlnet_animation/README.md Co-authored-by: LeoXing1996 * Update mmedit/models/diffusion_schedulers/__init__.py Co-authored-by: LeoXing1996 --------- Co-authored-by: LeoXing1996 --- configs/controlnet_animation/README.md | 95 ++++++ .../controlnet_animation/anythingv3_config.py | 36 ++ configs/controlnet_animation/metafile.yml | 18 + demo/gradio_controlnet_animation.py | 72 ++++ demo/{gradio-demo.py => gradio_inpainting.py} | 0 mmedit/apis/__init__.py | 18 +- mmedit/apis/inferencers/__init__.py | 110 +++++- .../controlnet_animation_inferencer.py | 230 +++++++++++++ mmedit/apis/inferencers/mmedit_inferencer.py | 96 ------ mmedit/edit.py | 10 +- .../models/diffusion_schedulers/__init__.py | 12 +- .../models/editors/controlnet/controlnet.py | 322 +++++++++++++++++- .../stable_diffusion/stable_diffusion.py | 30 ++ model-index.yml | 1 + requirements/optional.txt | 1 + requirements/tests.txt | 1 + .../test_mmedit_inferencer.py | 38 +-- 17 files changed, 963 insertions(+), 127 deletions(-) create mode 100644 configs/controlnet_animation/README.md create mode 100644 configs/controlnet_animation/anythingv3_config.py create mode 100644 configs/controlnet_animation/metafile.yml create mode 100644 demo/gradio_controlnet_animation.py rename demo/{gradio-demo.py => gradio_inpainting.py} (100%) create mode 100644 mmedit/apis/inferencers/controlnet_animation_inferencer.py delete mode 100644 mmedit/apis/inferencers/mmedit_inferencer.py diff --git a/configs/controlnet_animation/README.md b/configs/controlnet_animation/README.md new file mode 100644 index 0000000000..8c919c2dd4 --- /dev/null +++ b/configs/controlnet_animation/README.md @@ -0,0 +1,95 @@ +# Controlnet Animation (2023) + +> [Controlnet](https://github.com/lllyasviel/ControlNet) Application + +> **Task**: controlnet_animation + + + +## Abstract + + + +It is difficult to avoid video frame flickering when using stable diffusion to generate video frame by frame. +Here we reproduce a method that effectively avoids video flickering, that is, using controlnet and multi-frame rendering. +[ControlNet](https://github.com/lllyasviel/ControlNet) is a neural network structure to control diffusion models by adding extra conditions. +[Multi-frame rendering](https://xanthius.itch.io/multi-frame-rendering-for-stablediffusion) is a community method to reduce flickering. +We use controlnet with hed condition and stable diffusion img2img for multi-frame rendering. + +## Demos + +prompt key words: a handsome man, silver hair, smiling, play basketball + +
+
+ +prompt key words: a handsome man + +
+
+ +  + +**Change prompt to get different result** + +prompt key words: a girl, black hair, white pants, smiling, play basketball + +
+
+ +## Pretrained models + +We use pretrained model from hugging face. + +| Model | Dataset | Download | +| :-----------------------------------------: | :-----: | :-------------------------------------------------------------------------------: | +| [anythingv3 config](./anythingv3_config.py) | - | [stable diffusion model](https://huggingface.co/Linaqruf/anything-v3.0/tree/main) | + +## Quick Start + +There are two ways to try controlnet animation. + +### 1. Use MMEdit inference API. + +Running the following codes, you can get an generated animation video. + +```python +from mmedit.edit import MMEdit + +# Create a MMEdit instance and infer +editor = MMEdit(model_name='controlnet_animation') + +prompt = 'a girl, black hair, T-shirt, smoking, best quality, extremely detailed' +negative_prompt = 'longbody, lowres, bad anatomy, bad hands, missing fingers, ' + \ + 'extra digit, fewer digits, cropped, worst quality, low quality' + +# you can download the example video with this link +# https://user-images.githubusercontent.com/12782558/227418400-80ad9123-7f8e-4c1a-8e19-0892ebad2a4f.mp4 +video = '/path/to/your/input/video.mp4' +save_path = '/path/to/your/output/video.mp4' + +# Do the inference to get result +editor.infer(video=video, prompt=prompt, negative_prompt=negative_prompt, save_path=save_path) +``` + +### 2. Use controlnet animation gradio demo. + +```python +python demo/gradio_controlnet_animation.py +``` + +## Citation + +```bibtex +@misc{zhang2023adding, + title={Adding Conditional Control to Text-to-Image Diffusion Models}, + author={Lvmin Zhang and Maneesh Agrawala}, + year={2023}, + eprint={2302.05543}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/configs/controlnet_animation/anythingv3_config.py b/configs/controlnet_animation/anythingv3_config.py new file mode 100644 index 0000000000..8bfd594b75 --- /dev/null +++ b/configs/controlnet_animation/anythingv3_config.py @@ -0,0 +1,36 @@ +# config for model +stable_diffusion_v15_url = 'Linaqruf/anything-v3.0' +controlnet_hed_url = 'lllyasviel/sd-controlnet-hed' +control_detector = 'lllyasviel/ControlNet' +control_scheduler = 'UniPCMultistepScheduler' + +model = dict( + type='ControlStableDiffusionImg2Img', + vae=dict( + type='AutoencoderKL', + from_pretrained=stable_diffusion_v15_url, + subfolder='vae'), + unet=dict( + type='UNet2DConditionModel', + subfolder='unet', + from_pretrained=stable_diffusion_v15_url), + text_encoder=dict( + type='ClipWrapper', + clip_type='huggingface', + pretrained_model_name_or_path=stable_diffusion_v15_url, + subfolder='text_encoder'), + tokenizer=stable_diffusion_v15_url, + controlnet=dict( + type='ControlNetModel', from_pretrained=controlnet_hed_url), + scheduler=dict( + type='DDPMScheduler', + from_pretrained=stable_diffusion_v15_url, + subfolder='scheduler'), + test_scheduler=dict( + type='DDIMScheduler', + from_pretrained=stable_diffusion_v15_url, + subfolder='scheduler'), + data_preprocessor=dict(type='EditDataPreprocessor'), + init_cfg=dict(type='init_from_unet'), + enable_xformers=False, +) diff --git a/configs/controlnet_animation/metafile.yml b/configs/controlnet_animation/metafile.yml new file mode 100644 index 0000000000..e6a18203a5 --- /dev/null +++ b/configs/controlnet_animation/metafile.yml @@ -0,0 +1,18 @@ +Collections: +- Name: Controlnet Animation + Paper: + Title: Controlnet + URL: https://github.com/lllyasviel/ControlNet + README: configs/controlnet_animation/README.md + Task: + - controlnet_animation + Year: 2023 +Models: +- Config: configs/controlnet_animation/anythingv3_config.py + In Collection: Controlnet Animation + Name: anythingv3_config + Results: + - Dataset: '-' + Metrics: {} + Task: controlnet_animation + Weights: https://huggingface.co/Linaqruf/anything-v3.0/tree/main diff --git a/demo/gradio_controlnet_animation.py b/demo/gradio_controlnet_animation.py new file mode 100644 index 0000000000..a7c23937b3 --- /dev/null +++ b/demo/gradio_controlnet_animation.py @@ -0,0 +1,72 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import gradio as gr + +from mmedit.edit import MMEdit + +editor = MMEdit(model_name='controlnet_animation') + + +def process(video, prompt, a_prompt, negative_prompt, + controlnet_conditioning_scale, width, height): + prompt = prompt + a_prompt + save_path = editor.infer( + video=video, + prompt=prompt, + negative_prompt=negative_prompt, + width=width, + height=height, + controlnet_conditioning_scale=controlnet_conditioning_scale) + + return save_path + + +block = gr.Blocks().queue() +with block: + with gr.Row(): + gr.Markdown('## Controlnet Animation') + with gr.Row(): + with gr.Column(): + video_inp = gr.Video( + label='Video Source', + source='upload', + type='filepath', + elem_id='input-vid') + prompt = gr.Textbox(label='Prompt') + run_button = gr.Button(label='Run') + with gr.Accordion('Advanced options', open=False): + a_prompt = gr.Textbox( + label='Added Prompt', + value='best quality, extremely detailed') + n_prompt = gr.Textbox( + label='Negative Prompt', + value='longbody, lowres, bad anatomy, bad hands, ' + + 'missing fingers, extra digit, fewer digits, ' + 'cropped, worst quality, low quality') + controlnet_conditioning_scale = gr.Slider( + label='Control Weight', + minimum=0.0, + maximum=2.0, + value=0.7, + step=0.01) + width = gr.Slider( + label='Image Width', + minimum=256, + maximum=768, + value=512, + step=64) + height = gr.Slider( + label='Image Width', + minimum=256, + maximum=768, + value=512, + step=64) + + with gr.Column(): + video_out = gr.Video(label='Video Result', elem_id='video-output') + ips = [ + video_inp, prompt, a_prompt, n_prompt, controlnet_conditioning_scale, + width, height + ] + run_button.click(fn=process, inputs=ips, outputs=video_out) + +block.launch(server_name='0.0.0.0', share=True) diff --git a/demo/gradio-demo.py b/demo/gradio_inpainting.py similarity index 100% rename from demo/gradio-demo.py rename to demo/gradio_inpainting.py diff --git a/mmedit/apis/__init__.py b/mmedit/apis/__init__.py index 71141fb7a5..7b2c6484a6 100644 --- a/mmedit/apis/__init__.py +++ b/mmedit/apis/__init__.py @@ -1,2 +1,18 @@ # Copyright (c) OpenMMLab. All rights reserved. -from .inferencers import * # NOQA +from .inferencers import (Inferencers, calculate_grid_size, + colorization_inference, delete_cfg, init_model, + inpainting_inference, matting_inference, + restoration_face_inference, restoration_inference, + restoration_video_inference, + sample_conditional_model, sample_img2img_model, + sample_unconditional_model, set_random_seed, + video_interpolation_inference) + +__all__ = [ + 'init_model', 'delete_cfg', 'set_random_seed', 'matting_inference', + 'inpainting_inference', 'restoration_inference', + 'restoration_video_inference', 'restoration_face_inference', + 'video_interpolation_inference', 'sample_conditional_model', + 'sample_unconditional_model', 'sample_img2img_model', + 'colorization_inference', 'calculate_grid_size', 'Inferencers' +] diff --git a/mmedit/apis/inferencers/__init__.py b/mmedit/apis/inferencers/__init__.py index 41176291db..620950b062 100644 --- a/mmedit/apis/inferencers/__init__.py +++ b/mmedit/apis/inferencers/__init__.py @@ -1,4 +1,14 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Dict, List, Optional, Union + +import torch + +from mmedit.utils import ConfigType +from .colorization_inferencer import ColorizationInferencer +from .conditional_inferencer import ConditionalInferencer +from .controlnet_animation_inferencer import ControlnetAnimationInferencer +from .eg3d_inferencer import EG3DInferencer +from .image_super_resolution_inferencer import ImageSuperResolutionInferencer # yapf: disable from .inference_functions import (calculate_grid_size, colorization_inference, delete_cfg, init_model, inpainting_inference, @@ -11,13 +21,105 @@ sample_unconditional_model, set_random_seed, video_interpolation_inference) # yapf: enable -from .mmedit_inferencer import MMEditInferencer +from .inpainting_inferencer import InpaintingInferencer +from .matting_inferencer import MattingInferencer +from .text2image_inferencer import Text2ImageInferencer +from .translation_inferencer import TranslationInferencer +from .unconditional_inferencer import UnconditionalInferencer +from .video_interpolation_inferencer import VideoInterpolationInferencer +from .video_restoration_inferencer import VideoRestorationInferencer __all__ = [ - 'MMEditInferencer', 'init_model', 'delete_cfg', 'set_random_seed', - 'matting_inference', 'inpainting_inference', 'restoration_inference', + 'init_model', 'delete_cfg', 'set_random_seed', 'matting_inference', + 'inpainting_inference', 'restoration_inference', 'restoration_video_inference', 'restoration_face_inference', 'video_interpolation_inference', 'sample_conditional_model', 'sample_unconditional_model', 'sample_img2img_model', - 'colorization_inference', 'calculate_grid_size' + 'colorization_inference', 'calculate_grid_size', 'ColorizationInferencer', + 'ConditionalInferencer', 'EG3DInferencer', 'InpaintingInferencer', + 'MattingInferencer', 'ImageSuperResolutionInferencer', + 'Text2ImageInferencer', 'TranslationInferencer', 'UnconditionalInferencer', + 'VideoInterpolationInferencer', 'VideoRestorationInferencer', + 'ControlnetAnimationInferencer' ] + + +class Inferencers: + """Class to assign task to different inferencers. + + Args: + task (str): Inferencer task. + config (str or ConfigType): Model config or the path to it. + ckpt (str, optional): Path to the checkpoint. + device (str, optional): Device to run inference. If None, the best + device will be automatically used. + seed (int): The random seed used in inference. Defaults to 2022. + """ + + def __init__(self, + task: Optional[str] = None, + config: Optional[Union[ConfigType, str]] = None, + ckpt: Optional[str] = None, + device: torch.device = None, + extra_parameters: Optional[Dict] = None, + seed: int = 2022) -> None: + self.task = task + if self.task in ['conditional', 'Conditional GANs']: + self.inferencer = ConditionalInferencer( + config, ckpt, device, extra_parameters, seed=seed) + elif self.task in ['colorization', 'Colorization']: + self.inferencer = ColorizationInferencer( + config, ckpt, device, extra_parameters, seed=seed) + elif self.task in ['unconditional', 'Unconditional GANs']: + self.inferencer = UnconditionalInferencer( + config, ckpt, device, extra_parameters, seed=seed) + elif self.task in ['matting', 'Matting']: + self.inferencer = MattingInferencer( + config, ckpt, device, extra_parameters, seed=seed) + elif self.task in ['inpainting', 'Inpainting']: + self.inferencer = InpaintingInferencer( + config, ckpt, device, extra_parameters, seed=seed) + elif self.task in ['translation', 'Image2Image']: + self.inferencer = TranslationInferencer( + config, ckpt, device, extra_parameters, seed=seed) + elif self.task in ['Image super-resolution', 'Image Super-Resolution']: + self.inferencer = ImageSuperResolutionInferencer( + config, ckpt, device, extra_parameters, seed=seed) + elif self.task in ['video_restoration', 'Video Super-Resolution']: + self.inferencer = VideoRestorationInferencer( + config, ckpt, device, extra_parameters, seed=seed) + elif self.task in ['video_interpolation', 'Video Interpolation']: + self.inferencer = VideoInterpolationInferencer( + config, ckpt, device, extra_parameters) + elif self.task in [ + 'text2image', 'Text2Image', 'Text2Image, Image2Image' + ]: + self.inferencer = Text2ImageInferencer( + config, ckpt, device, extra_parameters, seed=seed) + elif self.task in ['3D_aware_generation', '3D-aware Generation']: + self.inferencer = EG3DInferencer( + config, ckpt, device, extra_parameters, seed=seed) + elif self.task in ['controlnet_animation']: + self.inferencer = ControlnetAnimationInferencer(config) + else: + raise ValueError(f'Unknown inferencer task: {self.task}') + + def __call__(self, **kwargs) -> Union[Dict, List[Dict]]: + """Call the inferencer. + + Args: + kwargs: Keyword arguments for the inferencer. + + Returns: + Union[Dict, List[Dict]]: Results of inference pipeline. + """ + return self.inferencer(**kwargs) + + def get_extra_parameters(self) -> List[str]: + """Each inferencer may has its own parameters. Call this function to + get these parameters. + + Returns: + List[str]: List of unique parameters. + """ + return self.inferencer.get_extra_parameters() diff --git a/mmedit/apis/inferencers/controlnet_animation_inferencer.py b/mmedit/apis/inferencers/controlnet_animation_inferencer.py new file mode 100644 index 0000000000..dd3a28fcfb --- /dev/null +++ b/mmedit/apis/inferencers/controlnet_animation_inferencer.py @@ -0,0 +1,230 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os +from typing import Dict, List, Optional, Union + +import cv2 +import mmcv +import numpy as np +import PIL.Image +import requests +import torch +from controlnet_aux import HEDdetector +from mmengine.config import Config +from mmengine.runner import set_random_seed + +from mmedit.registry import DIFFUSION_SCHEDULERS, MODELS +from mmedit.utils import ConfigType +from .base_mmedit_inferencer import BaseMMEditInferencer + +VIDEO_EXTENSIONS = ('.mp4', '.mov', '.avi') +IMAGE_EXTENSIONS = ('.jpg', '.jpeg', '.png', '.JPG', '.JPEG', '.PNG') + + +def load_image(image: Union[str, PIL.Image.Image]) -> PIL.Image.Image: + """ + Args: + Loads `image` to a PIL Image. + image (`str` or `PIL.Image.Image`): + The image to convert to the PIL Image format. + Returns: + `PIL.Image.Image`: A PIL Image. + """ + if isinstance(image, str): + if image.startswith('http://') or image.startswith('https://'): + image = PIL.Image.open(requests.get(image, stream=True).raw) + elif os.path.isfile(image): + image = PIL.Image.open(image) + else: + raise ValueError( + f'Incorrect path or url, URLs must start with `http://` ' + f'or `https://`, and {image} is not a valid path') + elif isinstance(image, PIL.Image.Image): + image = image + else: + raise ValueError( + 'Incorrect format used for image. Should be an url linking' + ' to an image, a local path, or a PIL image.') + image = PIL.ImageOps.exif_transpose(image) + image = image.convert('RGB') + return image + + +class ControlnetAnimationInferencer(BaseMMEditInferencer): + """Base inferencer. + + Args: + config (str or ConfigType): Model config or the path to it. + ckpt (str, optional): Path to the checkpoint. + device (str, optional): Device to run inference. If None, the best + device will be automatically used. + result_out_dir (str): Output directory of images. Defaults to ''. + """ + + func_kwargs = dict( + preprocess=[], + forward=[], + visualize=['result_out_dir'], + postprocess=['get_datasample']) + func_order = dict(preprocess=0, forward=1, visualize=2, postprocess=3) + + extra_parameters = dict() + + def __init__(self, + config: Union[ConfigType, str], + device: Optional[str] = None, + extra_parameters: Optional[Dict] = None, + dtype=torch.float32, + **kwargs) -> None: + cfg = Config.fromfile(config) + self.hed = HEDdetector.from_pretrained(cfg.control_detector) + self.pipe = MODELS.build(cfg.model).cuda() + + control_scheduler_cfg = dict( + type=cfg.control_scheduler, + from_config=self.pipe.scheduler.config, + ) + control_scheduler = DIFFUSION_SCHEDULERS.build(control_scheduler_cfg) + self.pipe.test_scheduler = control_scheduler + + @torch.no_grad() + def __call__(self, + prompt=None, + video=None, + negative_prompt=None, + controlnet_conditioning_scale=0.7, + image_width=512, + image_height=512, + save_path=None, + strength=0.75, + num_inference_steps=20, + seed=1, + **kwargs) -> Union[Dict, List[Dict]]: + """Call the inferencer. + + Args: + kwargs: Keyword arguments for the inferencer. + + Returns: + Union[Dict, List[Dict]]: Results of inference pipeline. + """ + if save_path is None: + from datetime import datetime + datestring = datetime.now().strftime('%y%m%d-%H%M%S') + save_path = '/tmp/' + datestring + '.mp4' + + set_random_seed(seed) + + latent_width = image_width // 8 + latent_height = image_height // 8 + + init_noise_shape = (1, 4, latent_height, latent_width) + init_noise_all_frame = torch.randn( + init_noise_shape, dtype=self.pipe.controlnet.dtype).cuda() + + init_noise_shape_cat = (1, 4, latent_height, latent_width * 3) + init_noise_all_frame_cat = torch.randn( + init_noise_shape_cat, dtype=self.pipe.controlnet.dtype).cuda() + + latent_mask = torch.zeros( + (1, 4, image_height // 8, image_width // 8 * 3)) + latent_mask[:, :, :, + image_width // 8 + 1:image_width // 8 * 2 - 1] = 1.0 + latent_mask = latent_mask.type(self.pipe.controlnet.dtype).cuda() + + # load the images + input_file_extension = os.path.splitext(video)[1] + from_video = True + all_images = [] + if input_file_extension in VIDEO_EXTENSIONS: + video_reader = mmcv.VideoReader(video) + + fourcc = cv2.VideoWriter_fourcc(*'mp4v') + video_writer = cv2.VideoWriter(save_path, fourcc, video_reader.fps, + (image_width, image_height)) + for frame in video_reader: + all_images.append(np.flip(frame, axis=2)) + else: + frame_files = os.listdir(video) + frame_files = [os.path.join(video, f) for f in frame_files] + frame_files.sort() + for frame in frame_files: + frame_extension = os.path.splitext(frame)[1] + if frame_extension in IMAGE_EXTENSIONS: + all_images.append(frame) + + if not os.path.exists(save_path): + os.makedirs(save_path) + + from_video = False + + # first result + image = None + if from_video: + image = PIL.Image.fromarray(all_images[0]) + else: + image = load_image(all_images[0]) + image = image.resize((image_width, image_height)) + hed_image = self.hed(image, image_resolution=image_width) + + result = self.pipe.infer( + control=hed_image, + latent_image=image, + prompt=prompt, + negative_prompt=negative_prompt, + strength=strength, + controlnet_conditioning_scale=controlnet_conditioning_scale, + num_inference_steps=num_inference_steps, + latents=init_noise_all_frame)['samples'][0] + + first_result = result + first_hed = hed_image + last_result = result + last_hed = hed_image + + for ind in range(len(all_images)): + if from_video: + image = PIL.Image.fromarray(all_images[ind]) + else: + image = load_image(all_images[ind]) + image = image.resize((image_width, image_height)) + hed_image = self.hed(image, image_resolution=image_width) + + concat_img = PIL.Image.new('RGB', (image_width * 3, image_height)) + concat_img.paste(last_result, (0, 0)) + concat_img.paste(image, (image_width, 0)) + concat_img.paste(first_result, (image_width * 2, 0)) + + concat_hed = PIL.Image.new('RGB', (image_width * 3, image_height), + 'black') + concat_hed.paste(last_hed, (0, 0)) + concat_hed.paste(hed_image, (image_width, 0)) + concat_hed.paste(first_hed, (image_width * 2, 0)) + + result = self.pipe.infer( + control=concat_hed, + latent_image=concat_img, + prompt=prompt, + negative_prompt=negative_prompt, + strength=strength, + controlnet_conditioning_scale=controlnet_conditioning_scale, + num_inference_steps=num_inference_steps, + latents=init_noise_all_frame_cat, + latent_mask=latent_mask, + )['samples'][0] + result = result.crop( + (image_width, 0, image_width * 2, image_height)) + + last_result = result + last_hed = hed_image + + if from_video: + video_writer.write(np.flip(np.asarray(result), axis=2)) + else: + frame_name = frame_files[ind].split('/')[-1] + save_name = os.path.join(save_path, frame_name) + result.save(save_name) + + if from_video: + video_writer.release() + + return save_path diff --git a/mmedit/apis/inferencers/mmedit_inferencer.py b/mmedit/apis/inferencers/mmedit_inferencer.py deleted file mode 100644 index c149df0b2c..0000000000 --- a/mmedit/apis/inferencers/mmedit_inferencer.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -from typing import Dict, List, Optional, Union - -import torch - -from mmedit.utils import ConfigType -from .colorization_inferencer import ColorizationInferencer -from .conditional_inferencer import ConditionalInferencer -from .eg3d_inferencer import EG3DInferencer -from .image_super_resolution_inferencer import ImageSuperResolutionInferencer -from .inpainting_inferencer import InpaintingInferencer -from .matting_inferencer import MattingInferencer -from .text2image_inferencer import Text2ImageInferencer -from .translation_inferencer import TranslationInferencer -from .unconditional_inferencer import UnconditionalInferencer -from .video_interpolation_inferencer import VideoInterpolationInferencer -from .video_restoration_inferencer import VideoRestorationInferencer - - -class MMEditInferencer: - """Class to assign task to different inferencers. - - Args: - task (str): Inferencer task. - config (str or ConfigType): Model config or the path to it. - ckpt (str, optional): Path to the checkpoint. - device (str, optional): Device to run inference. If None, the best - device will be automatically used. - seed (int): The random seed used in inference. Defaults to 2022. - """ - - def __init__(self, - task: Optional[str] = None, - config: Optional[Union[ConfigType, str]] = None, - ckpt: Optional[str] = None, - device: torch.device = None, - extra_parameters: Optional[Dict] = None, - seed: int = 2022) -> None: - self.task = task - if self.task in ['conditional', 'Conditional GANs']: - self.inferencer = ConditionalInferencer( - config, ckpt, device, extra_parameters, seed=seed) - elif self.task in ['colorization', 'Colorization']: - self.inferencer = ColorizationInferencer( - config, ckpt, device, extra_parameters, seed=seed) - elif self.task in ['unconditional', 'Unconditional GANs']: - self.inferencer = UnconditionalInferencer( - config, ckpt, device, extra_parameters, seed=seed) - elif self.task in ['matting', 'Matting']: - self.inferencer = MattingInferencer( - config, ckpt, device, extra_parameters, seed=seed) - elif self.task in ['inpainting', 'Inpainting']: - self.inferencer = InpaintingInferencer( - config, ckpt, device, extra_parameters, seed=seed) - elif self.task in ['translation', 'Image2Image']: - self.inferencer = TranslationInferencer( - config, ckpt, device, extra_parameters, seed=seed) - elif self.task in ['Image super-resolution', 'Image Super-Resolution']: - self.inferencer = ImageSuperResolutionInferencer( - config, ckpt, device, extra_parameters, seed=seed) - elif self.task in ['video_restoration', 'Video Super-Resolution']: - self.inferencer = VideoRestorationInferencer( - config, ckpt, device, extra_parameters, seed=seed) - elif self.task in ['video_interpolation', 'Video Interpolation']: - self.inferencer = VideoInterpolationInferencer( - config, ckpt, device, extra_parameters) - elif self.task in [ - 'text2image', 'Text2Image', 'Text2Image, Image2Image' - ]: - self.inferencer = Text2ImageInferencer( - config, ckpt, device, extra_parameters, seed=seed) - elif self.task in ['3D_aware_generation', '3D-aware Generation']: - self.inferencer = EG3DInferencer( - config, ckpt, device, extra_parameters, seed=seed) - else: - raise ValueError(f'Unknown inferencer task: {self.task}') - - def __call__(self, **kwargs) -> Union[Dict, List[Dict]]: - """Call the inferencer. - - Args: - kwargs: Keyword arguments for the inferencer. - - Returns: - Union[Dict, List[Dict]]: Results of inference pipeline. - """ - return self.inferencer(**kwargs) - - def get_extra_parameters(self) -> List[str]: - """Each inferencer may has its own parameters. Call this function to - get these parameters. - - Returns: - List[str]: List of unique parameters. - """ - return self.inferencer.get_extra_parameters() diff --git a/mmedit/edit.py b/mmedit/edit.py index bd9bac604a..3f531b8b13 100644 --- a/mmedit/edit.py +++ b/mmedit/edit.py @@ -8,7 +8,7 @@ import yaml from mmengine.registry import init_default_scope -from mmedit.apis.inferencers import MMEditInferencer +from mmedit.apis import Inferencers from mmedit.apis.inferencers.base_mmedit_inferencer import InputsType @@ -101,6 +101,9 @@ class MMEdit: # 3D-aware generation 'eg3d', + + # diffusers inferencer + 'controlnet_animation' ] inference_supported_models_cfg = {} @@ -122,7 +125,7 @@ def __init__(self, self._get_inferencer_kwargs(model_name, model_setting, model_config, model_ckpt, extra_parameters)) - self.inferencer = MMEditInferencer( + self.inferencer = Inferencers( device=device, seed=seed, **inferencer_kwargs) def _get_inferencer_kwargs(self, model_name: Optional[str], @@ -143,7 +146,8 @@ def _get_inferencer_kwargs(self, model_name: Optional[str], config_dir = config_dir[config_dir.find('configs'):] kwargs['config'] = os.path.join( osp.dirname(__file__), '..', config_dir) - kwargs['ckpt'] = cfgs['settings'][setting_to_use]['Weights'] + if 'Weights' in cfgs['settings'][setting_to_use].keys(): + kwargs['ckpt'] = cfgs['settings'][setting_to_use]['Weights'] if model_config is not None: if kwargs.get('config', None) is not None: diff --git a/mmedit/models/diffusion_schedulers/__init__.py b/mmedit/models/diffusion_schedulers/__init__.py index e50af75ae9..288f6be868 100644 --- a/mmedit/models/diffusion_schedulers/__init__.py +++ b/mmedit/models/diffusion_schedulers/__init__.py @@ -40,14 +40,22 @@ class SchedulerWrapper: `self._module_cls(*args, **kwargs)`. """ - def __init__(self, from_pretrained=None, *args, **kwargs): + def __init__(self, + from_pretrained=None, + from_config=None, + *args, + **kwargs): scheduler_cls = self._scheduler_cls self._from_pretrained = from_pretrained + self._from_config = from_config if self._from_pretrained: self.scheduler = scheduler_cls.from_pretrained( from_pretrained, *args, **kwargs) + elif self._from_config: + self.scheduler = scheduler_cls.from_config(from_config, *args, + **kwargs) else: self.scheduler = scheduler_cls(*args, **kwargs) @@ -76,6 +84,8 @@ def __repr__(self): prefix += f'Wrapped Scheduler Name: {self._scheduler_name}\n' if self._from_pretrained: prefix += f'From Pretrained: {self._from_pretrained}\n' + if self._from_config: + prefix += f'From Config: {self._from_config}\n' s = prefix + s return s diff --git a/mmedit/models/editors/controlnet/controlnet.py b/mmedit/models/editors/controlnet/controlnet.py index 700473bb35..a0a3b225cb 100644 --- a/mmedit/models/editors/controlnet/controlnet.py +++ b/mmedit/models/editors/controlnet/controlnet.py @@ -354,6 +354,7 @@ def infer(self, height: Optional[int] = None, width: Optional[int] = None, control: Optional[Union[str, np.ndarray, torch.Tensor]] = None, + controlnet_conditioning_scale: float = 1.0, num_inference_steps: int = 20, guidance_scale: float = 7.5, negative_prompt: Optional[Union[str, List[str]]] = None, @@ -489,7 +490,6 @@ def infer(self, return_dict=False, ) - controlnet_conditioning_scale = 1.0 down_block_res_samples = [ down_block_res_sample * controlnet_conditioning_scale for down_block_res_sample in down_block_res_samples @@ -538,3 +538,323 @@ def forward(self, *args, **kwargs): """forward is not implemented now.""" raise NotImplementedError( 'Forward is not implemented now, please use infer.') + + +@MODELS.register_module() +class ControlStableDiffusionImg2Img(ControlStableDiffusion): + + def _default_height_width(self, height, width, image): + if isinstance(image, list): + image = image[0] + + if height is None: + if isinstance(image, Image.Image): + height = image.height + elif isinstance(image, torch.Tensor): + height = image.shape[3] + + height = (height // 8) * 8 # round down to nearest multiple of 8 + + if width is None: + if isinstance(image, Image.Image): + width = image.width + elif isinstance(image, torch.Tensor): + width = image.shape[2] + + width = (width // 8) * 8 # round down to nearest multiple of 8 + + return height, width + + def get_timesteps(self, num_inference_steps, strength, device): + # get the original timestep using init_timestep + init_timestep = min( + int(num_inference_steps * strength), num_inference_steps) + + t_start = max(num_inference_steps - init_timestep, 0) + timesteps = self.test_scheduler.timesteps[t_start:] + + return timesteps, num_inference_steps - t_start + + def prepare_latents(self, + image, + timestep, + batch_size, + num_images_per_prompt, + dtype, + device, + generator=None, + noise=None): + if not isinstance(image, (torch.Tensor, Image.Image, list)): + raise ValueError( + f'`image` has to be of type `torch.Tensor`, ' + f' `PIL.Image.Image` or list but is {type(image)}') + + image = image.to(device=device, dtype=dtype) + + batch_size = batch_size * num_images_per_prompt + if isinstance(generator, list) and len(generator) != batch_size: + raise ValueError( + f'You have passed a list of generators of ' + f' length {len(generator)}, but requested an effective batch' + f' size of {batch_size}. Make sure the batch size ' + f' matches the length of the generators.') + + if isinstance(generator, list): + init_latents = [ + self.vae.encode(image[i:i + + 1]).latent_dist.sample(generator[i]) + for i in range(batch_size) + ] + init_latents = torch.cat(init_latents, dim=0) + else: + init_latents = self.vae.encode(image).latent_dist.sample(generator) + + init_latents = self.vae.config.scaling_factor * init_latents + + vae_encode_latents = init_latents + + if batch_size > init_latents.shape[0] and \ + batch_size % init_latents.shape[0] == 0: + raise ValueError( + f'Cannot duplicate `image` of batch size' + f' {init_latents.shape[0]} to {batch_size} text prompts.') + else: + init_latents = torch.cat([init_latents], dim=0) + + shape = init_latents.shape + if noise is None: + noise = torch.randn( + shape, generator=generator, device=device, dtype=dtype) + + # get latents + init_latents = self.scheduler.add_noise(init_latents, noise, timestep) + + return init_latents, vae_encode_latents + + def prepare_latent_image(self, image, dtype): + if isinstance(image, torch.Tensor): + # Batch single image + if image.ndim == 3: + image = image.unsqueeze(0) + + image = image.to(dtype=dtype) + else: + # preprocess image + if isinstance(image, (Image.Image, np.ndarray)): + image = [image] + + if isinstance(image, list) and isinstance(image[0], Image.Image): + image = [np.array(i.convert('RGB'))[None, :] for i in image] + image = np.concatenate(image, axis=0) + elif isinstance(image, list) and isinstance(image[0], np.ndarray): + image = np.concatenate([i[None, :] for i in image], axis=0) + + image = image.transpose(0, 3, 1, 2) + image = torch.from_numpy(image).to(dtype=dtype) / 127.5 - 1.0 + + return image + + @torch.no_grad() + def infer(self, + prompt: Union[str, List[str]], + latent_image: Union[torch.FloatTensor, Image.Image, + List[torch.FloatTensor], + List[Image.Image]] = None, + latent_mask: torch.FloatTensor = None, + strength: float = 1.0, + height: Optional[int] = None, + width: Optional[int] = None, + control: Optional[Union[str, np.ndarray, torch.Tensor]] = None, + controlnet_conditioning_scale: float = 1.0, + num_inference_steps: int = 20, + 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, + return_type='image', + show_progress=True): + """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): The height in pixels of the generated + image. If not passed, the height will be + `self.unet_sample_size * self.vae_scale_factor` Defaults + to None. + width (int, Optional): The width in pixels of the generated image. + If not passed, the width will be + `self.unet_sample_size * self.vae_scale_factor` Defaults + to None. + num_inference_steps (int): The number of denoising steps. + More denoising steps usually lead to a higher quality image at + the expense of slower inference. Defaults to 50. + guidance_scale (float): Guidance scale as defined in Classifier- + Free Diffusion Guidance (https://arxiv.org/abs/2207.12598). + Defaults to 7.5 + 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). Defaults to None. + num_images_per_prompt (int): The number of images to generate + per prompt. Defaults to 1. + eta (float): Corresponds to parameter eta (η) in the DDIM paper: + https://arxiv.org/abs/2010.02502. Only applies to + DDIMScheduler, will be ignored for others. Defaults to 0.0. + generator (torch.Generator, optional): A torch generator to make + generation deterministic. Defaults to None. + 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`. + Defaults to None. + return_type (str): The return type of the inference results. + Supported types are 'image', 'numpy', 'tensor'. If 'image' + is passed, a list of PIL images will be returned. If 'numpy' + is passed, a numpy array with shape [N, C, H, W] will be + returned, and the value range will be same as decoder's + output range. If 'tensor' is passed, the decoder's output + will be returned. Defaults to 'image'. + + Returns: + dict: A dict containing the generated images and Control image. + """ + assert return_type in ['image', 'tensor', 'numpy'] + + # 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 + + height, width = self._default_height_width(height, width, control) + + # 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 + + if is_model_wrapper(self.controlnet): + control_dtype = self.controlnet.module.dtype + else: + control_dtype = self.controlnet.dtype + controls = self.prepare_control( + control, + width, + height, + batch_size, + num_images_per_prompt, + device, + dtype=control_dtype) + if do_classifier_free_guidance: + controls = torch.cat([controls] * 2) + + latent_image = self.prepare_latent_image(latent_image, + self.controlnet.dtype) + + # 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.test_scheduler.set_timesteps(num_inference_steps) + timesteps = self.test_scheduler.timesteps + + timesteps, num_inference_steps = self.get_timesteps( + num_inference_steps, strength, device) + + latent_timestep = timesteps[:1].repeat(batch_size * + num_images_per_prompt) + + # 5. Prepare latent variables + latents, vae_encode_latents = self.prepare_latents( + latent_image, + latent_timestep, + batch_size, + num_images_per_prompt, + text_embeddings.dtype, + device, + generator, + noise=latents) + + # 6. Prepare extra step kwargs. + extra_step_kwargs = self.prepare_test_scheduler_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.test_scheduler.scale_model_input( + latent_model_input, t) + + down_block_res_samples, mid_block_res_sample = self.controlnet( + latent_model_input, + t, + encoder_hidden_states=text_embeddings, + controlnet_cond=controls, + return_dict=False, + ) + + down_block_res_samples = [ + down_block_res_sample * controlnet_conditioning_scale + for down_block_res_sample in down_block_res_samples + ] + mid_block_res_sample *= controlnet_conditioning_scale + + # predict the noise residual + noise_pred = self.unet( + latent_model_input, + t, + encoder_hidden_states=text_embeddings, + down_block_additional_residuals=down_block_res_samples, + mid_block_additional_residual=mid_block_res_sample, + )['sample'] + + # 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.test_scheduler.step( + noise_pred, t, latents, **extra_step_kwargs)['prev_sample'] + + if latent_mask is not None: + latents = latents * latent_mask + \ + vae_encode_latents * (1.0 - latent_mask) + + # 8. Post-processing + image = self.decode_latents(latents) + + if do_classifier_free_guidance: + controls = torch.split(controls, controls.shape[0] // 2, dim=0)[0] + + if return_type == 'image': + image = self.output_to_pil(image) + controls = self.output_to_pil(controls * 2 - 1) + elif return_type == 'numpy': + image = image.cpu().numpy() + controls = controls.cpu().numpy() + else: + assert return_type == 'tensor', ( + 'Only support \'image\', \'numpy\' and \'tensor\' for ' + f'return_type, but receive {return_type}') + + return {'samples': image, 'controls': controls} diff --git a/mmedit/models/editors/stable_diffusion/stable_diffusion.py b/mmedit/models/editors/stable_diffusion/stable_diffusion.py index 37e48f064d..de18eea99d 100644 --- a/mmedit/models/editors/stable_diffusion/stable_diffusion.py +++ b/mmedit/models/editors/stable_diffusion/stable_diffusion.py @@ -427,6 +427,36 @@ def prepare_extra_step_kwargs(self, generator, eta): extra_step_kwargs['generator'] = generator return extra_step_kwargs + def prepare_test_scheduler_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.test_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.test_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.""" diff --git a/model-index.yml b/model-index.yml index 9e989fa0c6..625020429b 100644 --- a/model-index.yml +++ b/model-index.yml @@ -5,6 +5,7 @@ Import: - configs/biggan/metafile.yml - configs/cain/metafile.yml - configs/controlnet/metafile.yml +- configs/controlnet_animation/metafile.yml - configs/cyclegan/metafile.yml - configs/dcgan/metafile.yml - configs/deepfillv1/metafile.yml diff --git a/requirements/optional.txt b/requirements/optional.txt index 5d542bba17..24a71a75bc 100644 --- a/requirements/optional.txt +++ b/requirements/optional.txt @@ -1,4 +1,5 @@ -e git+https://github.com/openai/CLIP.git@d50d76daa670286dd6cacf3bcd80b5e4823fc8e1#egg=clip +controlnet_aux imageio-ffmpeg==0.4.4 mmdet >= 3.0.0 open_clip_torch diff --git a/requirements/tests.txt b/requirements/tests.txt index ffada59c26..3fc87aa272 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -1,4 +1,5 @@ -e git+https://github.com/openai/CLIP.git@d50d76daa670286dd6cacf3bcd80b5e4823fc8e1#egg=clip +controlnet_aux # codecov # flake8 # isort==5.10.1 diff --git a/tests/test_apis/test_inferencers/test_mmedit_inferencer.py b/tests/test_apis/test_inferencers/test_mmedit_inferencer.py index da5e1c1551..9801fcafbd 100644 --- a/tests/test_apis/test_inferencers/test_mmedit_inferencer.py +++ b/tests/test_apis/test_inferencers/test_mmedit_inferencer.py @@ -3,7 +3,7 @@ import pytest -from mmedit.apis.inferencers.mmedit_inferencer import MMEditInferencer +from mmedit.apis.inferencers import Inferencers from mmedit.utils import register_all_modules register_all_modules() @@ -11,38 +11,34 @@ def test_mmedit_inferencer(): with pytest.raises(Exception) as e_info: - inferencer_instance = MMEditInferencer('colorization', ['error_type'], - None) + inferencer_instance = Inferencers('colorization', ['error_type'], None) with pytest.raises(Exception) as e_info: - inferencer_instance = MMEditInferencer('unconditional', ['error_type'], - None) + inferencer_instance = Inferencers('unconditional', ['error_type'], + None) with pytest.raises(Exception) as e_info: - inferencer_instance = MMEditInferencer('matting', ['error_type'], None) + inferencer_instance = Inferencers('matting', ['error_type'], None) with pytest.raises(Exception) as e_info: - inferencer_instance = MMEditInferencer('inpainting', ['error_type'], - None) + inferencer_instance = Inferencers('inpainting', ['error_type'], None) with pytest.raises(Exception) as e_info: - inferencer_instance = MMEditInferencer('translation', ['error_type'], - None) + inferencer_instance = Inferencers('translation', ['error_type'], None) with pytest.raises(Exception) as e_info: - inferencer_instance = MMEditInferencer('restoration', ['error_type'], - None) + inferencer_instance = Inferencers('restoration', ['error_type'], None) with pytest.raises(Exception) as e_info: - inferencer_instance = MMEditInferencer('video_restoration', - ['error_type'], None) + inferencer_instance = Inferencers('video_restoration', ['error_type'], + None) with pytest.raises(Exception) as e_info: - inferencer_instance = MMEditInferencer('video_interpolation', - ['error_type'], None) + inferencer_instance = Inferencers('video_interpolation', + ['error_type'], None) with pytest.raises(Exception) as e_info: - inferencer_instance = MMEditInferencer('dog', ['error_type'], None) + inferencer_instance = Inferencers('dog', ['error_type'], None) print(e_info) @@ -50,10 +46,10 @@ def test_mmedit_inferencer(): osp.dirname(__file__), '..', '..', '..', 'configs', 'sngan_proj', 'sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py') inferencer_instance = \ - MMEditInferencer('conditional', - cfg, - None, - extra_parameters={'sample_model': 'orig'}) + Inferencers('conditional', + cfg, + None, + extra_parameters={'sample_model': 'orig'}) inference_result = inferencer_instance(label=1) result_img = inference_result[1] assert result_img.shape == (4, 3, 32, 32) From 595842673932e72bd4ed79b7a8cdcfa32c18468b Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Mon, 17 Apr 2023 19:51:37 +0800 Subject: [PATCH 02/42] [Fix] fix CI bug caused by pip 23.1 (#1760) * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut * [Fix] fix ut --- .github/workflows/merge_stage_test.yml | 10 +++++----- .github/workflows/pr_stage_test.yml | 6 +++--- .github/workflows/test_mim.yml | 2 +- mmedit/models/diffusion_schedulers/__init__.py | 2 +- .../test_models/test_diffusion_schedulers/test_init.py | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/merge_stage_test.yml b/.github/workflows/merge_stage_test.yml index fb76ac62ba..5089f91eca 100644 --- a/.github/workflows/merge_stage_test.yml +++ b/.github/workflows/merge_stage_test.yml @@ -38,7 +38,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Upgrade pip - run: pip install pip --upgrade + run: pip install pip --upgrade && pip install wheel - name: Install PyTorch run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/cpu/torch_stable.html - name: Install MMEngine @@ -84,7 +84,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Upgrade pip - run: pip install pip --upgrade + run: pip install pip --upgrade && pip install wheel - name: Install PyTorch run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/cpu/torch_stable.html - name: Install MMEngine @@ -131,7 +131,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Upgrade pip - run: pip install pip --upgrade + run: pip install pip --upgrade && pip install wheel - name: Fetch GPG keys run: | apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub @@ -167,7 +167,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Upgrade pip - run: pip install pip --upgrade + run: pip install pip --upgrade && pip install wheel - name: Fetch GPG keys run: | apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub @@ -205,7 +205,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Upgrade pip - run: python -m pip install pip --upgrade + run: python -m pip install pip --upgrade && pip install wheel - name: Install lmdb run: python -m pip install lmdb - name: Install PyTorch diff --git a/.github/workflows/pr_stage_test.yml b/.github/workflows/pr_stage_test.yml index eea5973767..0e2ed5af98 100644 --- a/.github/workflows/pr_stage_test.yml +++ b/.github/workflows/pr_stage_test.yml @@ -31,7 +31,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Upgrade pip - run: pip install pip --upgrade + run: pip install pip --upgrade && pip install wheel - name: Install PyTorch run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html - name: Install MMEngine @@ -77,7 +77,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Upgrade pip - run: pip install pip --upgrade + run: pip install pip --upgrade && pip install wheel - name: Fetch GPG keys run: | apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub @@ -114,7 +114,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Upgrade pip - run: python -m pip install pip --upgrade + run: python -m pip install pip --upgrade && pip install wheel - name: Install lmdb run: python -m pip install lmdb - name: Install PyTorch diff --git a/.github/workflows/test_mim.yml b/.github/workflows/test_mim.yml index b9e838b95e..aa4754a433 100644 --- a/.github/workflows/test_mim.yml +++ b/.github/workflows/test_mim.yml @@ -33,7 +33,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Upgrade pip - run: pip install pip --upgrade + run: pip install pip --upgrade && pip install wheel - name: Install PyTorch run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html - name: Install openmim diff --git a/mmedit/models/diffusion_schedulers/__init__.py b/mmedit/models/diffusion_schedulers/__init__.py index 288f6be868..acc958f8b6 100644 --- a/mmedit/models/diffusion_schedulers/__init__.py +++ b/mmedit/models/diffusion_schedulers/__init__.py @@ -73,7 +73,7 @@ def __getattr__(self, name: str) -> Any: try: return getattr(self.scheduler, name) except AttributeError: - raise AttributeError('\'name\' cannot be found in both ' + raise AttributeError(f'{name} cannot be found in both ' f'\'{self.__class__.__name__}\' and ' f'\'{self.__class__.__name__}.scheduler\'.') diff --git a/tests/test_models/test_diffusion_schedulers/test_init.py b/tests/test_models/test_diffusion_schedulers/test_init.py index 555c140053..5eb190835e 100644 --- a/tests/test_models/test_diffusion_schedulers/test_init.py +++ b/tests/test_models/test_diffusion_schedulers/test_init.py @@ -18,8 +18,8 @@ def test_build(self): num_train_timesteps=2000, beta_schedule='scaled_linear') scheduler = DIFFUSION_SCHEDULERS.build(config) - self.assertEqual(scheduler.num_train_timesteps, 2000) - self.assertEqual(scheduler.beta_schedule, 'scaled_linear') + self.assertEqual(len(scheduler.timesteps), 2000) + # self.assertEqual(scheduler.beta_schedule, 'scaled_linear') scheduler_str = repr(scheduler) self.assertIn( 'Wrapped Scheduler Class: ' From 2119660aba87230c4d8c8768666e2cc455f9adb9 Mon Sep 17 00:00:00 2001 From: Zhengwentai SUN <31286290+Taited@users.noreply.github.com> Date: Mon, 17 Apr 2023 20:01:10 +0800 Subject: [PATCH 03/42] fix typo in GGAN README.md (#1751) * fix typo in GGAN README.md * fix README_zh-CN --------- Co-authored-by: zhangjingdong <1396925302@qq.com> Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> --- README.md | 2 +- README_zh-CN.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e70272008a..421b567fe4 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,7 @@ Please see [quick run](docs/en/get_started/quick_run.md) and [inference](docs/en
  • DCGAN (ICLR'2016)
  • WGAN-GP (NeurIPS'2017)
  • LSGAN (ICCV'2017)
  • -
  • PGGAN (ArXiv'2017)
  • +
  • GGAN (ArXiv'2017)
  • PGGAN (ICLR'2018)
  • SinGAN (ICCV'2019)
  • StyleGANV1 (CVPR'2019)
  • diff --git a/README_zh-CN.md b/README_zh-CN.md index 8aae6a7081..7804ac9d13 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -187,7 +187,7 @@ pip3 install -e .
  • DCGAN (ICLR'2016)
  • WGAN-GP (NeurIPS'2017)
  • LSGAN (ICCV'2017)
  • -
  • PGGAN (ArXiv'2017)
  • +
  • GGAN (ArXiv'2017)
  • PGGAN (ICLR'2018)
  • SinGAN (ICCV'2019)
  • StyleGANV1 (CVPR'2019)
  • From 560d211460c745692a8973e249c54dc7cf597b87 Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Tue, 18 Apr 2023 12:00:15 +0800 Subject: [PATCH 04/42] [Fix] update owners (#1759) --- .owners.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.owners.yml b/.owners.yml index 3008653e26..0dfa3e9a2b 100644 --- a/.owners.yml +++ b/.owners.yml @@ -4,12 +4,17 @@ assign: pull_requests: enabled # or disabled # assign strategy, both issues and pull requests follow the same strategy strategy: - random - # round-robin (not impl currently.) - # daily-shift-based + # random + # round-robin + daily-shift-based scedule: '*/1 * * * *' # assignees assignees: - - wangruohui - - Yshuo-Li + - LeoXing1996 + - zengyh1900 + - plyfager + - liuwenran + - Z-Fran + - LeoXing1996 + - LeoXing1996 From 62e4ed53313ab69e58fb5ca0ed8bd3cde18e1dfb Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Tue, 18 Apr 2023 12:00:31 +0800 Subject: [PATCH 05/42] [Fix] fix get_flops (#1758) --- tools/analysis_tools/get_flops.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/analysis_tools/get_flops.py b/tools/analysis_tools/get_flops.py index d9c82dfc44..0a1141b2df 100644 --- a/tools/analysis_tools/get_flops.py +++ b/tools/analysis_tools/get_flops.py @@ -101,8 +101,7 @@ def main(): elif hasattr(model, 'infer'): model.forward = model.infer - analysis_results = get_model_complexity_info( - model, input_shape, inputs=inputs) + analysis_results = get_model_complexity_info(model, inputs=inputs) flops = analysis_results['flops_str'] params = analysis_results['params_str'] activations = analysis_results['activations_str'] From 54d3d453794b650984003648cedfa559ac46bc64 Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Tue, 18 Apr 2023 12:00:56 +0800 Subject: [PATCH 06/42] [Fix] replace mmcv utils by mmengine (#1757) --- .../dataset_converters/bgm/preprocess_bgm_dataset.py | 8 ++++---- tools/dataset_converters/comp1k/evaluate_comp1k.py | 7 ++++--- tools/dataset_converters/comp1k/extend_fg.py | 8 ++++---- tools/dataset_converters/comp1k/filter_comp1k_anno.py | 8 ++++---- .../comp1k/preprocess_comp1k_dataset.py | 11 ++++++----- .../df2k_ost/preprocess_df2k_ost_dataset.py | 6 +++--- .../div2k/preprocess_div2k_dataset.py | 4 ++-- .../vimeo90k/preprocess_vimeo90k_dataset.py | 2 +- 8 files changed, 28 insertions(+), 26 deletions(-) diff --git a/tools/dataset_converters/bgm/preprocess_bgm_dataset.py b/tools/dataset_converters/bgm/preprocess_bgm_dataset.py index 9604d9b314..5c410a638f 100644 --- a/tools/dataset_converters/bgm/preprocess_bgm_dataset.py +++ b/tools/dataset_converters/bgm/preprocess_bgm_dataset.py @@ -4,7 +4,7 @@ import os.path as osp from itertools import cycle -import mmcv +import mmengine def generate_json(data_root, seg_root, bg_root, all_data): @@ -40,7 +40,7 @@ def generate_json(data_root, seg_root, bg_root, all_data): for bg_dir in bg_dirs: bg_frames.extend([ osp.join(bg_root, bg_dir, f) - for f in sorted(mmcv.scandir(osp.join(bg_root, bg_dir))) + for f in sorted(mmengine.scandir(osp.join(bg_root, bg_dir))) ]) bg_stream = cycle(bg_frames) @@ -50,7 +50,7 @@ def generate_json(data_root, seg_root, bg_root, all_data): video_full_path = osp.join(video_root, video_dir) seg_full_path = osp.join(seg_root, video_dir) num_frames = len( - list(mmcv.scandir(video_full_path, suffix='_img.png'))) + list(mmengine.scandir(video_full_path, suffix='_img.png'))) # In the original Background Matting github repo, the # last 80 frames is not used. effective_frames = num_frames if all_data else num_frames - 80 @@ -71,7 +71,7 @@ def generate_json(data_root, seg_root, bg_root, all_data): bg_sup_path=bg_sup) data_infos.append(data_info) save_json_path = 'fixed_camera_train.json' - mmcv.dump(data_infos, osp.join(data_root, save_json_path)) + mmengine.dump(data_infos, osp.join(data_root, save_json_path)) def parse_args(): diff --git a/tools/dataset_converters/comp1k/evaluate_comp1k.py b/tools/dataset_converters/comp1k/evaluate_comp1k.py index 08daec7da6..5548b0d22e 100644 --- a/tools/dataset_converters/comp1k/evaluate_comp1k.py +++ b/tools/dataset_converters/comp1k/evaluate_comp1k.py @@ -5,6 +5,7 @@ import cv2 import mmcv +import mmengine import numpy as np from mmedit.evaluation import gauss_gradient @@ -190,8 +191,8 @@ def evaluate(pred_root, gt_root, trimap_root, verbose, nproc): nproc (int): number of processers. """ - images = sorted(mmcv.scandir(pred_root)) - gt_files_num = len(list(mmcv.scandir(gt_root))) + images = sorted(mmengine.scandir(pred_root)) + gt_files_num = len(list(mmengine.scandir(gt_root))) # If ground truth alpha mattes are not copied (number of files is 50), we # use the below pattern to recover the name of the original alpha matte. if gt_files_num == 50: @@ -210,7 +211,7 @@ def evaluate(pred_root, gt_root, trimap_root, verbose, nproc): osp.join(trimap_root, img) if trimap_root is not None else None) pairs.append((pred_alpha_path, alpha_path, trimap_path)) - results = mmcv.track_parallel_progress(evaluate_one, pairs, nproc) + results = mmengine.track_parallel_progress(evaluate_one, pairs, nproc) if verbose: # for sad_result, mse_result, grad_result, conn_result in results: diff --git a/tools/dataset_converters/comp1k/extend_fg.py b/tools/dataset_converters/comp1k/extend_fg.py index 5e1c7d8919..12dd0cfb3b 100644 --- a/tools/dataset_converters/comp1k/extend_fg.py +++ b/tools/dataset_converters/comp1k/extend_fg.py @@ -5,7 +5,7 @@ import re import subprocess -import mmcv +import mmengine import numpy as np from PIL import Image from pymatting import estimate_foreground_ml, load_image @@ -118,9 +118,9 @@ def main(): fg_iter = iter(fg_names) extend_fg = ExtendFg(data_root, fg_dirs, alpha_dirs) - data_infos = mmcv.track_parallel_progress(extend_fg.extend, list(fg_iter), - args.nproc) - mmcv.dump(data_infos, osp.join(data_root, save_json_path)) + data_infos = mmengine.track_parallel_progress(extend_fg.extend, + list(fg_iter), args.nproc) + mmengine.dump(data_infos, osp.join(data_root, save_json_path)) print('train done') diff --git a/tools/dataset_converters/comp1k/filter_comp1k_anno.py b/tools/dataset_converters/comp1k/filter_comp1k_anno.py index 9a447b409c..21e99d84bf 100644 --- a/tools/dataset_converters/comp1k/filter_comp1k_anno.py +++ b/tools/dataset_converters/comp1k/filter_comp1k_anno.py @@ -2,12 +2,12 @@ import argparse import os.path as osp -import mmcv +import mmengine def generate_json(comp1k_json_path, target_list_path, save_json_path): - data_infos = mmcv.load(comp1k_json_path) - targets = mmcv.list_from_file(target_list_path) + data_infos = mmengine.load(comp1k_json_path) + targets = mmengine.list_from_file(target_list_path) new_data_infos = [] for data_info in data_infos: for target in targets: @@ -15,7 +15,7 @@ def generate_json(comp1k_json_path, target_list_path, save_json_path): new_data_infos.append(data_info) break - mmcv.dump(new_data_infos, save_json_path) + mmengine.dump(new_data_infos, save_json_path) def parse_args(): diff --git a/tools/dataset_converters/comp1k/preprocess_comp1k_dataset.py b/tools/dataset_converters/comp1k/preprocess_comp1k_dataset.py index cb4b7d2850..3573fa96c0 100644 --- a/tools/dataset_converters/comp1k/preprocess_comp1k_dataset.py +++ b/tools/dataset_converters/comp1k/preprocess_comp1k_dataset.py @@ -5,7 +5,7 @@ import subprocess from itertools import chain, repeat -import mmcv +import mmengine import numpy as np from PIL import Image @@ -114,13 +114,14 @@ def get_data_info(args): bg = bg.crop((0, 0, w, h)) # save cropped bg and merged - mmcv.utils.mkdir_or_exist(osp.join(data_root, dir_prefix, 'bg')) + mmengine.utils.mkdir_or_exist(osp.join(data_root, dir_prefix, 'bg')) bgfilename = osp.join(data_root, bg_path) bg.save(bgfilename, 'PNG') fix_png_file(osp.basename(bgfilename), osp.dirname(bgfilename)) if composite: merged = (fg * alpha + bg * (1. - alpha)).astype(np.uint8) - mmcv.utils.mkdir_or_exist(osp.join(data_root, dir_prefix, 'merged')) + mmengine.utils.mkdir_or_exist( + osp.join(data_root, dir_prefix, 'merged')) mergedfilename = osp.join(data_root, merged_path) Image.fromarray(merged).save(mergedfilename, 'PNG') fix_png_file(osp.basename(mergedfilename), osp.dirname(mergedfilename)) @@ -215,12 +216,12 @@ def generate_json(data_root, source_bg_dir, composite, nproc, mode): source_bg_paths.append(osp.join(source_bg_dir, bg_name)) constants = repeat((data_root, composite, mode), len(bg_names)) - data_infos = mmcv.track_parallel_progress( + data_infos = mmengine.track_parallel_progress( get_data_info, list(zip(name_with_postfix, source_bg_paths, repeat_infos, constants)), nproc) - mmcv.dump(data_infos, osp.join(data_root, save_json_path)) + mmengine.dump(data_infos, osp.join(data_root, save_json_path)) def parse_args(): diff --git a/tools/dataset_converters/df2k_ost/preprocess_df2k_ost_dataset.py b/tools/dataset_converters/df2k_ost/preprocess_df2k_ost_dataset.py index 208be7dd56..5a31ee7968 100644 --- a/tools/dataset_converters/df2k_ost/preprocess_df2k_ost_dataset.py +++ b/tools/dataset_converters/df2k_ost/preprocess_df2k_ost_dataset.py @@ -166,7 +166,7 @@ def prepare_keys_df2k_ost(folder_path): print('Reading image path list ...') img_path_list = sorted( - list(mmcv.scandir(folder_path, suffix='png', recursive=False))) + list(mmengine.scandir(folder_path, suffix='png', recursive=False))) keys = [img_path.split('.png')[0] for img_path in sorted(img_path_list)] return img_path_list, keys @@ -236,7 +236,7 @@ def make_lmdb(data_path, dataset = {} # use dict to keep the order for multiprocessing shapes = {} print(f'Read images with multiprocessing, #thread: {n_thread} ...') - prog_bar = mmcv.ProgressBar(len(img_path_list)) + prog_bar = mmengine.ProgressBar(len(img_path_list)) def callback(arg): """get the image data and update prog_bar.""" @@ -264,7 +264,7 @@ def callback(arg): env = lmdb.open(lmdb_path, map_size=data_size * 10) # write data to lmdb - prog_bar = mmcv.ProgressBar(len(img_path_list)) + prog_bar = mmengine.ProgressBar(len(img_path_list)) txn = env.begin(write=True) txt_file = open(osp.join(lmdb_path, 'meta_info.txt'), 'w') for idx, (path, key) in enumerate(zip(img_path_list, keys)): diff --git a/tools/dataset_converters/div2k/preprocess_div2k_dataset.py b/tools/dataset_converters/div2k/preprocess_div2k_dataset.py index 3ab4547f35..d283b8f36c 100644 --- a/tools/dataset_converters/div2k/preprocess_div2k_dataset.py +++ b/tools/dataset_converters/div2k/preprocess_div2k_dataset.py @@ -287,7 +287,7 @@ def make_lmdb(data_path, dataset = {} # use dict to keep the order for multiprocessing shapes = {} print(f'Read images with multiprocessing, #thread: {n_thread} ...') - prog_bar = mmcv.ProgressBar(len(img_path_list)) + prog_bar = mmengine.ProgressBar(len(img_path_list)) def callback(arg): """get the image data and update prog_bar.""" @@ -315,7 +315,7 @@ def callback(arg): env = lmdb.open(lmdb_path, map_size=data_size * 10) # write data to lmdb - prog_bar = mmcv.ProgressBar(len(img_path_list)) + prog_bar = mmengine.ProgressBar(len(img_path_list)) txn = env.begin(write=True) txt_file = open(osp.join(lmdb_path, 'meta_info.txt'), 'w') for idx, (path, key) in enumerate(zip(img_path_list, keys)): diff --git a/tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py b/tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py index a1d104c749..6e2577ce24 100644 --- a/tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py +++ b/tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py @@ -100,7 +100,7 @@ def make_lmdb(mode, env = lmdb.open(lmdb_path, map_size=data_size * 10) # write data to lmdb - pbar = mmcv.ProgressBar(len(all_img_list)) + pbar = mmengine.ProgressBar(len(all_img_list)) txn = env.begin(write=True) txt_file = open(osp.join(lmdb_path, 'meta_info.txt'), 'w') for idx, (path, key) in enumerate(zip(all_img_list, keys)): From b83a7792d16fcb83ea8a72124e0fc9eeba27ca88 Mon Sep 17 00:00:00 2001 From: Xu CAO <49406546+SheffieldCao@users.noreply.github.com> Date: Tue, 18 Apr 2023 13:13:53 +0800 Subject: [PATCH 07/42] [Doc] fix quick start demo code of controlnet (#1754) * add npu.md and npu_zh.md * add npu.md and npu_zh.md * [Doc] fix demo code block bugs --------- Co-authored-by: luomaoling <2277435228@qq.com> Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> --- configs/controlnet/README.md | 6 ++++-- docs/en/device/npu.md | 29 +++++++++++++++++++++++++++++ docs/en/index.rst | 8 ++++++++ docs/zh_cn/device/npu_zh.md | 29 +++++++++++++++++++++++++++++ docs/zh_cn/index.rst | 7 +++++++ 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 docs/en/device/npu.md create mode 100644 docs/zh_cn/device/npu_zh.md diff --git a/configs/controlnet/README.md b/configs/controlnet/README.md index e9faa85066..f08b8190cc 100644 --- a/configs/controlnet/README.md +++ b/configs/controlnet/README.md @@ -52,6 +52,8 @@ controlnet=dict( Running the following codes, you can get a text-generated image. ```python +import cv2 +import numpy as np import mmcv from mmengine import Config from PIL import Image @@ -61,7 +63,7 @@ from mmedit.utils import register_all_modules register_all_modules() -cfg = Config.fromfile('configs/controlnet/controlnet_canny.py') +cfg = Config.fromfile('configs/controlnet/controlnet-canny.py') controlnet = MODELS.build(cfg.model).cuda() prompt = 'Room with blue walls and a yellow ceiling.' @@ -112,7 +114,7 @@ from mmedit.utils import register_all_modules register_all_modules() -cfg = Config.fromfile('configs/controlnet/controlnet_pose.py') +cfg = Config.fromfile('configs/controlnet/controlnet-pose.py') # convert ControlNet's weight from SD-v1.5 to Counterfeit-v2.5 cfg.model.unet.from_pretrained = 'gsdf/Counterfeit-V2.5' cfg.model.vae.from_pretrained = 'gsdf/Counterfeit-V2.5' diff --git a/docs/en/device/npu.md b/docs/en/device/npu.md new file mode 100644 index 0000000000..a0ad8ee5c1 --- /dev/null +++ b/docs/en/device/npu.md @@ -0,0 +1,29 @@ +# NPU (HUAWEI Ascend) + +## Usage + +Please refer to the [building documentation of MMCV](https://mmcv.readthedocs.io/en/latest/get_started/build.html#build-mmcv-full-on-ascend-npu-machine) to install MMCV and [mmengine](https://mmengine.readthedocs.io/en/latest/get_started/installation.html#build-from-source) on NPU devices. + +Here we use 8 NPUs on your computer to train the model with the following command: + +```shell +bash tools/dist_train.sh configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py 8 +``` + +Also, you can use only one NPU to train the model with the following command: + +```shell +python tools/train.py configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py +``` + +## Models Results + +| Model | Dataset | PSNR | SSIM | Download | +| :----------------------------------------------------------------------------------------: | ------- | :---: | :--- | :--------------------------------------------------------------------------------------------- | +| [edsr_x2c64b16_1x16_300k_div2k](https://github.com/open-mmlab/mmediting/blob/main/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py) | DIV2K | 35.83 | 0.94 | [log](https://download.openmmlab.com/mmediting/device/npu/edsr/edsr_x2c64b16_1xb16-300k_div2k.log) | + +**Notes:** + +- If not specially marked, the results on NPU with amp are the basically same as those on the GPU with FP32. + +**All above models are provided by Huawei Ascend group.** diff --git a/docs/en/index.rst b/docs/en/index.rst index 73cc96cb0b..de7ad78d6a 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -152,6 +152,14 @@ Documentation migration/visualization.md migration/amp.md + +.. toctree:: + :maxdepth: 1 + :caption: Device Support + + device/npu.md + + .. toctree:: :caption: Switch Language diff --git a/docs/zh_cn/device/npu_zh.md b/docs/zh_cn/device/npu_zh.md new file mode 100644 index 0000000000..eab6f4ca19 --- /dev/null +++ b/docs/zh_cn/device/npu_zh.md @@ -0,0 +1,29 @@ +# NPU (华为昇腾) + +## 使用方法 + +首先,请参考[MMCV](https://mmcv.readthedocs.io/zh_CN/latest/get_started/build.html#npu-mmcv-full) 安装带有 NPU 支持的 MMCV与 [mmengine](https://mmengine.readthedocs.io/en/latest/get_started/installation.html#build-from-source) 。 + +使用如下命令,可以利用 8 个 NPU 训练模型(以 edsr 为例): + +```shell +bash tools/dist_train.sh configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py 8 +``` + +或者,使用如下命令,在一个 NPU 上训练模型(以 edsr 为例): + +```shell +python tools/train.py configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py +``` + +## 经过验证的模型 + +| Model | Dataset | PSNR | SSIM | Download | +| :----------------------------------------------------------------------------------------: | ------- | :---: | :--- | :--------------------------------------------------------------------------------------------- | +| [edsr_x2c64b16_1x16_300k_div2k](https://github.com/open-mmlab/mmediting/blob/main/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py) | DIV2K | 35.83 | 0.94 | [log](https://download.openmmlab.com/mmediting/device/npu/edsr/edsr_x2c64b16_1xb16-300k_div2k.log) | + +**注意:** + +- 如果没有特别标记,NPU 上的结果与使用 FP32 的 GPU 上的结果相同。 + +**以上所有模型权重及训练日志均由华为昇腾团队提供** diff --git a/docs/zh_cn/index.rst b/docs/zh_cn/index.rst index 7a8e14da6e..478c9fc0b4 100644 --- a/docs/zh_cn/index.rst +++ b/docs/zh_cn/index.rst @@ -123,6 +123,13 @@ migration/amp.md +.. toctree:: + :maxdepth: 1 + :caption: 设备支持 + + device/npu_zh.md + + .. toctree:: :caption: 语言切换 From 3eb780ada09e2d6eae79864300260a1adaf534cb Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Tue, 18 Apr 2023 13:42:22 +0800 Subject: [PATCH 08/42] [Doc] update issue template (#1769) --- .github/ISSUE_TEMPLATE/1-bug-report.yml | 105 ++++++++++++++++++ .github/ISSUE_TEMPLATE/2-feature-request.yml | 31 ++++++ .github/ISSUE_TEMPLATE/3-new-model.yml | 32 ++++++ .github/ISSUE_TEMPLATE/4-documentation.yml | 34 ++++++ .github/ISSUE_TEMPLATE/config.yml | 9 +- .github/ISSUE_TEMPLATE/error-report.md | 45 -------- .github/ISSUE_TEMPLATE/feature_request.md | 21 ---- .github/ISSUE_TEMPLATE/general_questions.md | 7 -- .../reimplementation_questions.md | 67 ----------- ...eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py | 2 +- mmedit/utils/collect_env.py | 18 +++ 11 files changed, 227 insertions(+), 144 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/1-bug-report.yml create mode 100644 .github/ISSUE_TEMPLATE/2-feature-request.yml create mode 100644 .github/ISSUE_TEMPLATE/3-new-model.yml create mode 100644 .github/ISSUE_TEMPLATE/4-documentation.yml delete mode 100644 .github/ISSUE_TEMPLATE/error-report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/ISSUE_TEMPLATE/general_questions.md delete mode 100644 .github/ISSUE_TEMPLATE/reimplementation_questions.md create mode 100644 mmedit/utils/collect_env.py diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml new file mode 100644 index 0000000000..5b65aaab02 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -0,0 +1,105 @@ +name: "🐞 Bug report" +description: "Create a report to help us reproduce and fix the bug" +labels: "kind/bug,status/unconfirmed" +title: "[Bug] " + +body: + - type: markdown + attributes: + value: | + If you have already identified the reason, we strongly appreciate you creating a new PR to fix it [here](https://github.com/open-mmlab/mmediting/pulls)! + If this issue is about installing MMCV, please file an issue at [MMCV](https://github.com/open-mmlab/mmcv/issues/new/choose). + If you need our help, please fill in as much of the following form as you're able to. + + **The less clear the description, the longer it will take to solve it.** + + - type: checkboxes + attributes: + label: Prerequisite + description: Please check the following items before creating a new issue. + options: + - label: I have searched [Issues](https://github.com/open-mmlab/mmediting/issues) and [Discussions](https://github.com/open-mmlab/mmediting/discussions) but cannot get the expected help. + required: true + - label: I have read the [FAQ documentation](https://mmediting.readthedocs.io/en/latest/faq.html) but cannot get the expected help. + required: true + - label: The bug has not been fixed in the [latest version (main)](https://github.com/open-mmlab/mmediting) or [latest version (0.x)](https://github.com/open-mmlab/mmediting/tree/0.x). + required: true + + - type: dropdown + id: task + attributes: + label: Task + description: The problem arises when + options: + - I'm using the official example scripts/configs for the officially supported tasks/models/datasets. + - I have modified the scripts/configs, or I'm working on my own tasks/models/datasets. + validations: + required: true + + - type: dropdown + id: branch + attributes: + label: Branch + description: The problem arises when I'm working on + options: + - main branch https://github.com/open-mmlab/mmediting + - 0.x branch https://github.com/open-mmlab/mmediting/tree/0.x + validations: + required: true + + + - type: textarea + attributes: + label: Environment + description: | + Please run `python mmedit/utils/collect_env.py` to collect necessary environment information and copy-paste it here. + You may add additional information that may be helpful for locating the problem, such as + - How you installed PyTorch \[e.g., pip, conda, source\] + - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) + validations: + required: true + + - type: textarea + attributes: + label: Reproduces the problem - code sample + description: | + Please provide a code sample that reproduces the problem you ran into. It can be a Colab link or just a code snippet. + placeholder: | + ```python + # Sample code to reproduce the problem + ``` + validations: + required: true + + - type: textarea + attributes: + label: Reproduces the problem - command or script + description: | + What command or script did you run? + placeholder: | + ```shell + The command or script you run. + ``` + validations: + required: true + + - type: textarea + attributes: + label: Reproduces the problem - error message + description: | + Please provide the error message or logs you got, with the full traceback. + placeholder: | + ``` + The error message or logs you got, with the full traceback. + ``` + validations: + required: true + + - type: textarea + attributes: + label: Additional information + description: Tell us anything else you think we should know. + placeholder: | + 1. What's your expected result? + 2. What dataset did you use? + 3. What do you think might be the reason? diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.yml b/.github/ISSUE_TEMPLATE/2-feature-request.yml new file mode 100644 index 0000000000..99802169db --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2-feature-request.yml @@ -0,0 +1,31 @@ +name: 🚀 Feature request +description: Suggest an idea for this project +labels: "kind/enhancement,status/unconfirmed" +title: "[Feature] " + +body: + - type: markdown + attributes: + value: | + We strongly appreciate you creating a PR to implement this feature [here](https://github.com/open-mmlab/mmediting/pulls)! + If you need our help, please fill in as much of the following form as you're able to. + + **The less clear the description, the longer it will take to solve it.** + + - type: textarea + attributes: + label: What's the feature? + description: | + Tell us more about the feature and how this feature can help. + placeholder: | + E.g., It is inconvenient when \[....\]. + This feature can \[....\]. + validations: + required: true + + - type: textarea + attributes: + label: Any other context? + description: | + Have you considered any alternative solutions or features? If so, what are they? + Also, feel free to add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/3-new-model.yml b/.github/ISSUE_TEMPLATE/3-new-model.yml new file mode 100644 index 0000000000..2346685ea0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3-new-model.yml @@ -0,0 +1,32 @@ +name: "\U0001F31F New model/dataset/scheduler addition" +description: Submit a proposal/request to implement a new model / dataset / scheduler +labels: "kind/feature,status/unconfirmed" +title: "[New Models] " + + +body: + - type: textarea + id: description-request + validations: + required: true + attributes: + label: Model/Dataset/Scheduler description + description: | + Put any and all important information relative to the model/dataset/scheduler + + - type: checkboxes + attributes: + label: Open source status + description: | + Please provide the open-source status, which would be very helpful + options: + - label: "The model implementation is available" + - label: "The model weights are available." + + - type: textarea + id: additional-info + attributes: + label: Provide useful links for the implementation + description: | + Please provide information regarding the implementation, the weights, and the authors. + Please mention the authors by @gh-username if you're aware of their usernames. diff --git a/.github/ISSUE_TEMPLATE/4-documentation.yml b/.github/ISSUE_TEMPLATE/4-documentation.yml new file mode 100644 index 0000000000..1a95a7a0dc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/4-documentation.yml @@ -0,0 +1,34 @@ +name: 📚 Documentation +description: Report an issue related to the documentation. +labels: "kind/doc,status/unconfirmed" +title: "[Docs] " + +body: +- type: dropdown + id: branch + attributes: + label: Branch + description: This issue is related to the + options: + - main branch https://mmediting.readthedocs.io/en/latest/ + - 0.x branch https://mmediting.readthedocs.io/en/0.x/ + validations: + required: true + +- type: textarea + attributes: + label: 📚 The doc issue + description: > + A clear and concise description the issue. + validations: + required: true + +- type: textarea + attributes: + label: Suggest a potential alternative/fix + description: > + Tell us how we could improve the documentation in this regard. +- type: markdown + attributes: + value: > + Thanks for contributing 🎉! diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index f64a63299b..664ef7c988 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,6 +1,9 @@ blank_issues_enabled: false contact_links: - - name: MMEditing Documentation - url: https://mmediting.readthedocs.io/en/latest/ - about: Check if your question is answered in docs + - name: 💬 Forum + url: https://github.com/open-mmlab/mmediting/discussions + about: Ask general usage questions and discuss with other MMEditing community members + - name: 🌐 Explore OpenMMLab + url: https://openmmlab.com/ + about: Get to know more about OpenMMLab diff --git a/.github/ISSUE_TEMPLATE/error-report.md b/.github/ISSUE_TEMPLATE/error-report.md deleted file mode 100644 index 9ad9c29c6e..0000000000 --- a/.github/ISSUE_TEMPLATE/error-report.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -name: Error report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' ---- - -Thanks for your error report and we appreciate it a lot. - -**Checklist** - -1. I have searched related issues but cannot get the expected help. -2. The bug has not been fixed in the latest version. - -**Describe the bug** -A clear and concise description of what the bug is. - -**Reproduction** - -1. What command or script did you run? - -```none -A placeholder for the command. -``` - -2. Did you make any modifications on the code or config? Did you understand what you have modified? -3. What dataset did you use? - -**Environment** - -1. Please report necessary environment information here. -2. You may add addition that may be helpful for locating the problem, such as - - How you installed PyTorch \[e.g., pip, conda, source\] - - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) - -**Error traceback** -If applicable, paste the error traceback here. - -```none -A placeholder for traceback. -``` - -**Bug fix** -If you have already identified the reason, you can provide the information here. If you are willing to create a PR to fix it, please also leave a comment here and that would be much appreciated! diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 7bf92e8c91..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' ---- - -**Describe the feature** - -**Motivation** -A clear and concise description of the motivation of the feature. -Ex1. It is inconvenient when \[....\]. -Ex2. There is a recent paper \[....\], which is very helpful for \[....\]. - -**Related resources** -If there is an official code release or third-party implementations, please also provide the information here, which would be very helpful. - -**Additional context** -Add any other context or screenshots about the feature request here. -If you would like to implement the feature and create a PR, please leave a comment here and that would be much appreciated. diff --git a/.github/ISSUE_TEMPLATE/general_questions.md b/.github/ISSUE_TEMPLATE/general_questions.md deleted file mode 100644 index f02dd63a80..0000000000 --- a/.github/ISSUE_TEMPLATE/general_questions.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: General questions -about: Ask general questions to get help -title: '' -labels: '' -assignees: '' ---- diff --git a/.github/ISSUE_TEMPLATE/reimplementation_questions.md b/.github/ISSUE_TEMPLATE/reimplementation_questions.md deleted file mode 100644 index 71c0c59c64..0000000000 --- a/.github/ISSUE_TEMPLATE/reimplementation_questions.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -name: Reimplementation Questions -about: Ask about questions during model reimplementation -title: '' -labels: reimplementation -assignees: '' ---- - -**Notice** - -There are several common situations in the reimplementation issues as below - -1. Reimplement a model in the model zoo using the provided configs -2. Reimplement a model in the model zoo on other dataset (e.g., custom datasets) -3. Reimplement a custom model but all the components are implemented in MMEditing -4. Reimplement a custom model with new modules implemented by yourself - -There are several things to do for different cases as below. - -- For case 1 & 3, please follow the steps in the following sections thus we could help to quick identify the issue. -- For case 2 & 4, please understand that we are not able to do much help here because we usually do not know the full code and the users should be responsible to the code they write. -- One suggestion for case 2 & 4 is that the users should first check whether the bug lies in the self-implemented code or the original code. For example, users can first make sure that the same model runs well on supported datasets. If you still need help, please describe what you have done and what you obtain in the issue, and follow the steps in the following sections and try as clear as possible so that we can better help you. - -**Checklist** - -1. I have searched related issues but cannot get the expected help. -2. The issue has not been fixed in the latest version. - -**Describe the issue** - -A clear and concise description of what the problem you meet and what have you done. - -**Reproduction** - -1. What command or script did you run? - -```none -A placeholder for the command. -``` - -2. What config dir you run? - -```none -A placeholder for the config. -``` - -3. Did you make any modifications on the code or config? Did you understand what you have modified? -4. What dataset did you use? - -**Environment** - -1. Please report necessary environment information here. -2. You may add addition that may be helpful for locating the problem, such as - 1. How you installed PyTorch \[e.g., pip, conda, source\] - 2. Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) - -**Results** - -If applicable, paste the related results here, e.g., what you expect and what you get. - -```none -A placeholder for results comparison -``` - -**Issue fix** - -If you have already identified the reason, you can provide the information here. If you are willing to create a PR to fix it, please also leave a comment here and that would be much appreciated! diff --git a/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py b/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py index bf68b89a35..d115f08481 100644 --- a/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py +++ b/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py @@ -71,7 +71,7 @@ type=dataset_type, metainfo=dict(dataset_type='gopro', task_name='deblur'), data_root='./data/gopro/test', - ann_file='meta_info_gopro_test.txt', + # ann_file='meta_info_gopro_test.txt', data_prefix=dict(gt='sharp', img='blur'), pipeline=val_pipeline)) diff --git a/mmedit/utils/collect_env.py b/mmedit/utils/collect_env.py new file mode 100644 index 0000000000..9105896a50 --- /dev/null +++ b/mmedit/utils/collect_env.py @@ -0,0 +1,18 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.utils import collect_env as collect_base_env +from mmengine.utils import get_git_hash + +import mmedit + + +def collect_env(): + """Collect the information of the running environments.""" + env_info = collect_base_env() + env_info['MMEditing'] = f'{mmedit.__version__}+{get_git_hash()[:7]}' + + return env_info + + +if __name__ == '__main__': + for name, val in collect_env().items(): + print('{}: {}'.format(name, val)) From 01f50c667fdf78f4a43996325ed78638fc17ec95 Mon Sep 17 00:00:00 2001 From: rangoliu Date: Tue, 18 Apr 2023 13:54:53 +0800 Subject: [PATCH 09/42] [Fix] fix controlnet animation when image shape is not 64x (#1752) * bugfix * fix lint --------- Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> --- mmedit/apis/inferencers/controlnet_animation_inferencer.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mmedit/apis/inferencers/controlnet_animation_inferencer.py b/mmedit/apis/inferencers/controlnet_animation_inferencer.py index dd3a28fcfb..7b3c42cd44 100644 --- a/mmedit/apis/inferencers/controlnet_animation_inferencer.py +++ b/mmedit/apis/inferencers/controlnet_animation_inferencer.py @@ -164,7 +164,12 @@ def __call__(self, else: image = load_image(all_images[0]) image = image.resize((image_width, image_height)) - hed_image = self.hed(image, image_resolution=image_width) + detect_resolution = min(image_width, image_height) + hed_image = self.hed( + image, + detect_resolution=detect_resolution, + image_resolution=detect_resolution) + hed_image = hed_image.resize((image_width, image_height)) result = self.pipe.infer( control=hed_image, From 0d1aa3fb022a480d0bec800d9d07bee4927dacf1 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Tue, 18 Apr 2023 15:21:22 +0800 Subject: [PATCH 10/42] [Enhancement] Support define modules to be optimized by name and regularization expression (#1748) * support define parameters to optimize by name and regularization expression * add docstring for multi-optimizer-wrapper * revise docstring for multi optimizer constructor --- .../optimizers/multi_optimizer_constructor.py | 203 ++++++++++++++++-- .../test_multi_optimizer_constructor.py | 100 +++++++++ 2 files changed, 290 insertions(+), 13 deletions(-) diff --git a/mmedit/engine/optimizers/multi_optimizer_constructor.py b/mmedit/engine/optimizers/multi_optimizer_constructor.py index 822aee59ea..8f8eaf4a20 100644 --- a/mmedit/engine/optimizers/multi_optimizer_constructor.py +++ b/mmedit/engine/optimizers/multi_optimizer_constructor.py @@ -1,17 +1,24 @@ # Copyright (c) OpenMMLab. All rights reserved. +import re +from typing import Tuple, Union + import torch.nn as nn -from mmengine.optim import DefaultOptimWrapperConstructor, OptimWrapperDict +from mmengine import print_log +from mmengine.optim import (DefaultOptimWrapperConstructor, OptimWrapper, + OptimWrapperDict) -from mmedit.registry import OPTIM_WRAPPER_CONSTRUCTORS +from mmedit.registry import (OPTIM_WRAPPER_CONSTRUCTORS, OPTIM_WRAPPERS, + OPTIMIZERS) @OPTIM_WRAPPER_CONSTRUCTORS.register_module() class MultiOptimWrapperConstructor: """OptimizerConstructor for GAN models. This class construct optimizer for the submodules of the model separately, and return a - :class:`mmengine.optim.OptimWrapperDict`. + :class:`mmengine.optim.OptimWrapperDict` or + :class:`mmengine.optim.OptimWrapper`. - Example: + Example 1: Build multi optimizers (e.g., GANs): >>> # build GAN model >>> model = dict( >>> type='GANModel', @@ -21,7 +28,6 @@ class MultiOptimWrapperConstructor: >>> gan_model = MODELS.build(model) >>> # build constructor >>> optim_wrapper = dict( - >>> constructor='MultiOptimWrapperConstructor', >>> generator=dict( >>> type='OptimWrapper', >>> accumulative_counts=1, @@ -36,6 +42,72 @@ class MultiOptimWrapperConstructor: >>> # build optim wrapper dict >>> optim_wrapper_dict = optim_dict_builder(gan_model) + Example 2: Build multi optimizers for specific submodules: + >>> # build model + >>> class GAN(nn.Module): + >>> def __init__(self) -> None: + >>> super().__init__() + >>> self.generator = nn.Conv2d(3, 3, 1) + >>> self.discriminator = nn.Conv2d(3, 3, 1) + >>> class TextEncoder(nn.Module): + >>> def __init__(self): + >>> super().__init__() + >>> self.embedding = nn.Embedding(100, 100) + >>> class ToyModel(nn.Module): + >>> def __init__(self) -> None: + >>> super().__init__() + >>> self.m1 = GAN() + >>> self.m2 = nn.Conv2d(3, 3, 1) + >>> self.m3 = nn.Linear(2, 2) + >>> self.text_encoder = TextEncoder() + >>> model = ToyModel() + >>> # build constructor + >>> optim_wrapper = { + >>> '.*embedding': { + >>> 'type': 'OptimWrapper', + >>> 'optimizer': { + >>> 'type': 'Adam', + >>> 'lr': 1e-4, + >>> 'betas': (0.9, 0.99) + >>> } + >>> }, + >>> 'm1.generator': { + >>> 'type': 'OptimWrapper', + >>> 'optimizer': { + >>> 'type': 'Adam', + >>> 'lr': 1e-5, + >>> 'betas': (0.9, 0.99) + >>> } + >>> }, + >>> 'm2': { + >>> 'type': 'OptimWrapper', + >>> 'optimizer': { + >>> 'type': 'Adam', + >>> 'lr': 1e-5, + >>> } + >>> } + >>> } + >>> optim_dict_builder = MultiOptimWrapperConstructor(optim_wrapper) + >>> # build optim wrapper dict + >>> optim_wrapper_dict = optim_dict_builder(model) + + Example 3: Build a single optimizer for multi modules (e.g., DreamBooth): + >>> # build StableDiffusion model + >>> model = dict( + >>> type='StableDiffusion', + >>> unet=dict(type='unet'), + >>> vae=dict(type='vae'), + text_encoder=dict(type='text_encoder')) + >>> diffusion_model = MODELS.build(model) + >>> # build constructor + >>> optim_wrapper = dict( + >>> modules=['unet', 'text_encoder'] + >>> optimizer=dict(type='Adam', lr=0.0002), + >>> accumulative_counts=1) + >>> optim_dict_builder = MultiOptimWrapperConstructor(optim_wrapper) + >>> # build optim wrapper dict + >>> optim_wrapper_dict = optim_dict_builder(diffusion_model) + Args: optim_wrapper_cfg_dict (dict): Config of the optimizer wrapper. paramwise_cfg (dict): Config of parameter-wise settings. Default: None. @@ -49,19 +121,124 @@ def __init__(self, optim_wrapper_cfg: dict, paramwise_cfg=None): assert paramwise_cfg is None, ( 'parawise_cfg should be set in each optimizer separately') self.optim_cfg = optim_wrapper_cfg - self.constructors = {} - for key, cfg in self.optim_cfg.items(): - cfg_ = cfg.copy() + + if 'modules' in optim_wrapper_cfg: + # single optimizer with multi param groups + cfg_ = optim_wrapper_cfg.copy() + self.modules = cfg_.pop('modules') paramwise_cfg_ = cfg_.pop('paramwise_cfg', None) - self.constructors[key] = DefaultOptimWrapperConstructor( + self.constructors = DefaultOptimWrapperConstructor( cfg_, paramwise_cfg_) + else: + self.constructors = {} + self.modules = {} + for key, cfg in self.optim_cfg.items(): + cfg_ = cfg.copy() + if 'modules' in cfg_: + self.modules[key] = cfg_.pop('modules') + paramwise_cfg_ = cfg_.pop('paramwise_cfg', None) + self.constructors[key] = DefaultOptimWrapperConstructor( + cfg_, paramwise_cfg_) - def __call__(self, module: nn.Module) -> OptimWrapperDict: + def __call__(self, + module: nn.Module) -> Union[OptimWrapperDict, OptimWrapper]: """Build optimizer and return a optimizer_wrapper_dict.""" optimizers = {} if hasattr(module, 'module'): module = module.module - for key, constructor in self.constructors.items(): - optimizers[key] = constructor(module._modules[key]) - return OptimWrapperDict(**optimizers) + if isinstance(self.constructors, dict): + for key, constructor in self.constructors.items(): + module_names = self.modules[key] if self.modules else key + if (isinstance(module_names, str) + and module_names in module._modules): + optimizers[key] = constructor( + module._modules[module_names]) + optim_wrapper_cfg = constructor.optimizer_cfg + print_log( + f'Add to optimizer \'{key}\' ' + f'({optim_wrapper_cfg}): \'{key}\'.', 'current') + else: + + assert not constructor.paramwise_cfg, ( + 'Do not support paramwise_cfg for multi module ' + 'optimizer.') + + params, found_names = get_params_by_names( + module, module_names) + # build optimizer + optimizer_cfg = constructor.optimizer_cfg.copy() + optimizer_cfg['params'] = params + optimizer = OPTIMIZERS.build(optimizer_cfg) + + # build optimizer wrapper + optim_wrapper_cfg = constructor.optim_wrapper_cfg.copy() + optim_wrapper_cfg.setdefault('type', 'OptimWrapper') + optim_wrapper = OPTIM_WRAPPERS.build( + optim_wrapper_cfg, + default_args=dict(optimizer=optimizer)) + + for name in found_names: + print_log( + f'Add to optimizer \'{key}\' ' + f'({constructor.optimizer_cfg}): \'{name}\'.', + 'current') + + optimizers[key] = optim_wrapper + + return OptimWrapperDict(**optimizers) + + else: + params, found_names = get_params_by_names(module, self.modules) + + constructor = self.constructors + assert not constructor.paramwise_cfg, ( + 'Do not support paramwise_cfg for multi parameters') + + optimizer_cfg = constructor.optimizer_cfg.copy() + optimizer_cfg['params'] = params + optimizer = OPTIMIZERS.build(optimizer_cfg) + for name in found_names: + print_log( + f'Add to optimizer ({constructor.optimizer_cfg}): ' + f'\'{name}\'.', 'current') + + # build optimizer wrapper + optim_wrapper_cfg = constructor.optim_wrapper_cfg.copy() + optim_wrapper_cfg.setdefault('type', 'OptimWrapper') + optim_wrapper = OPTIM_WRAPPERS.build( + optim_wrapper_cfg, default_args=dict(optimizer=optimizer)) + + return optim_wrapper + + +def get_params_by_names(module: nn.Module, + names: Union[str, list]) -> Tuple[list, list]: + """Support two kinds of name matching: + 1. matching name from **first-level** submodule. + 2. matching name by `re.fullmatch`. + + Args: + module (nn.Module): The module to get parameters. + names (Union[str, list]): The name or a list of names of the + submodule parameters. + + Returns: + Tuple[list]: A list of parameters and corresponding name for logging. + """ + + if not isinstance(names, list): + names = [names] + + params = [] + found_names = [] + for name in names: + if name in module._modules: + params.extend(module._modules[name].parameters()) + found_names.append(name) + else: + for n, m in module.named_modules(): + if re.fullmatch(name, n): + params.extend(m.parameters()) + found_names.append(n) + return params, found_names diff --git a/tests/test_engine/test_optimizers/test_multi_optimizer_constructor.py b/tests/test_engine/test_optimizers/test_multi_optimizer_constructor.py index 8ddef1704d..567fb4c3ca 100644 --- a/tests/test_engine/test_optimizers/test_multi_optimizer_constructor.py +++ b/tests/test_engine/test_optimizers/test_multi_optimizer_constructor.py @@ -1,9 +1,13 @@ # Copyright (c) OpenMMLab. All rights reserved. import pytest import torch.nn as nn +from mmengine import MMLogger +from mmengine.optim import OptimWrapper from mmedit.engine.optimizers import MultiOptimWrapperConstructor +logger = MMLogger.get_instance('test_multi_optimizer_constructor') + class ToyModel(nn.Module): @@ -14,8 +18,27 @@ def __init__(self) -> None: self.discriminator = nn.Conv2d(3, 3, 1) +class TextEncoder(nn.Module): + + def __init__(self): + super().__init__() + self.embedding = nn.Embedding(100, 100) + + +class ToyModel2(nn.Module): + + def __init__(self) -> None: + super().__init__() + + self.m1 = ToyModel() + self.m2 = nn.Conv2d(3, 3, 1) + self.m3 = nn.Linear(2, 2) + self.text_encoder = TextEncoder() + + def test_optimizer_constructor(): + # test optimizer wrapper cfg is a dict optim_wrapper_constructor = MultiOptimWrapperConstructor( optim_wrapper_cfg=dict( generator=dict( @@ -30,6 +53,69 @@ def test_optimizer_constructor(): assert set(optim_wrapper_dict.optim_wrappers) == set( ['generator', 'discriminator']) + # test optimizer wrapper is dict of **modules** + optim_wrapper = { + '.*embedding': { + 'type': 'OptimWrapper', + 'optimizer': { + 'type': 'Adam', + 'lr': 1e-4, + 'betas': (0.9, 0.99) + } + }, + 'm1.generator': { + 'type': 'OptimWrapper', + 'optimizer': { + 'type': 'Adam', + 'lr': 1e-5, + 'betas': (0.9, 0.99) + } + }, + 'm2': { + 'type': 'OptimWrapper', + 'optimizer': { + 'type': 'Adam', + 'lr': 1e-5, + } + } + } + optim_wrapper_constructor = MultiOptimWrapperConstructor( + optim_wrapper_cfg=dict( + generator=dict( + type='OptimWrapper', + optimizer=dict(type='Adam', lr=1e-4, betas=(0.9, 0.99))), + discriminator=dict( + type='OptimWrapper', optimizer=dict(type='SGD', lr=0.1)))) + + optim_wrapper_cfg = { + '.*embedding': { + 'type': 'OptimWrapper', + 'optimizer': { + 'type': 'Adam', + 'lr': 1e-4, + 'betas': (0.9, 0.99) + } + }, + 'm1.generator': { + 'type': 'OptimWrapper', + 'optimizer': { + 'type': 'Adam', + 'lr': 1e-5, + 'betas': (0.9, 0.99) + } + }, + 'm2': { + 'type': 'OptimWrapper', + 'optimizer': { + 'type': 'Adam', + 'lr': 1e-5, + } + } + } + optim_wrapper_constructor = MultiOptimWrapperConstructor(optim_wrapper_cfg) + model = ToyModel2() + optim_wrapper_dict = optim_wrapper_constructor(model) + # optim_wrapper_cfg should be a dict with pytest.raises(TypeError): MultiOptimWrapperConstructor(1) @@ -37,3 +123,17 @@ def test_optimizer_constructor(): # parawise_cfg should be set in each optimizer separately with pytest.raises(AssertionError): MultiOptimWrapperConstructor(dict(), dict()) + + # test optimizer wrapper with multi param groups + optim_wrapper_constructor = MultiOptimWrapperConstructor( + optim_wrapper_cfg=dict( + modules=['.*text_encoder', '.*generator', 'm2'], + optimizer=dict( + type='Adam', + lr=1e-4, + betas=(0.9, 0.99), + ), + accumulative_counts=4)) + model = ToyModel2() + optim_wrapper = optim_wrapper_constructor(model) + assert isinstance(optim_wrapper, OptimWrapper) From c8b66e8e932d7099121c8a2ad11e4ae772b71837 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Wed, 19 Apr 2023 13:33:04 +0800 Subject: [PATCH 11/42] [Enhancement] Support evaluator without metric (#1764) * support evaluator without metric * add unit test for loop_utils * restore some modification of loop_utils --- mmedit/engine/runner/loop_utils.py | 1 + mmedit/evaluation/evaluator.py | 16 +++++++++++- .../test_runner/test_loop_utils.py | 4 +++ tests/test_evaluation/test_evaluator.py | 26 +++++++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/mmedit/engine/runner/loop_utils.py b/mmedit/engine/runner/loop_utils.py index 5564c91340..02ce80f95e 100644 --- a/mmedit/engine/runner/loop_utils.py +++ b/mmedit/engine/runner/loop_utils.py @@ -40,6 +40,7 @@ def update_and_check_evaluator(evaluator: EVALUATOR_TYPE 'Can only conduct check and update for list of metrics, a config dict ' f'or a Evaluator object. But receives {type(evaluator)}.') evaluator.setdefault('type', 'EditEvaluator') + evaluator.setdefault('metrics', None) # default as 'dummy evaluator' _type = evaluator['type'] if _type != 'EditEvaluator': print_log(warning_template.format(_type), 'current', WARNING) diff --git a/mmedit/evaluation/evaluator.py b/mmedit/evaluation/evaluator.py index 42e4a113ed..ff408ea234 100644 --- a/mmedit/evaluation/evaluator.py +++ b/mmedit/evaluation/evaluator.py @@ -44,7 +44,10 @@ class EditEvaluator(Evaluator): """ def __init__(self, metrics: Union[dict, BaseMetric, Sequence]): - super().__init__(metrics) + if metrics is not None: + super().__init__(metrics) + else: + self.metrics = None self.is_ready = False def prepare_metrics(self, module: BaseModel, dataloader: DataLoader): @@ -64,6 +67,10 @@ def prepare_metrics(self, module: BaseModel, dataloader: DataLoader): module (BaseModel): Model to evaluate. dataloader (DataLoader): The dataloader for real images. """ + if self.metrics is None: + self.is_ready = True + return + if self.is_ready: return @@ -108,6 +115,9 @@ def prepare_samplers(self, module: BaseModel, dataloader: DataLoader List[Tuple[List[BaseMetric], Iterator]]: A list of "metrics-shared sampler" pair. """ + if self.metrics is None: + return [[[None], []]] + # grouping metrics based on `SAMPLER_MODE` and `sample_mode` metric_mode_dict = defaultdict(list) for metric in self.metrics: @@ -137,6 +147,8 @@ def process(self, data_samples: Sequence[EditDataSample], metrics specific sampler or the dataloader. metrics (Optional[Sequence[BaseMetric]]): Metrics to evaluate. """ + if self.metrics is None: + return _data_samples = [] for data_sample in data_samples: @@ -159,6 +171,8 @@ def evaluate(self) -> dict: dict: Evaluation results of all metrics. The keys are the names of the metrics, and the values are corresponding results. """ + if self.metrics is None: + return {'No Metric': 'Nan'} metrics = {} for metric in self.metrics: _results = metric.evaluate() diff --git a/tests/test_engine/test_runner/test_loop_utils.py b/tests/test_engine/test_runner/test_loop_utils.py index c68b8f4079..4ab067c327 100644 --- a/tests/test_engine/test_runner/test_loop_utils.py +++ b/tests/test_engine/test_runner/test_loop_utils.py @@ -58,3 +58,7 @@ def test_update_and_check_evaluator(): evaluator = dict(type='EditEvaluator', metrics=[dict(type='PSNR')]) evaluator = update_and_check_evaluator(evaluator) assert evaluator['type'] == 'EditEvaluator' + + evaluator = dict(type='EditEvaluator') + evaluator = update_and_check_evaluator(evaluator) + assert evaluator['metrics'] is None diff --git a/tests/test_evaluation/test_evaluator.py b/tests/test_evaluation/test_evaluator.py index 80650be302..799a6b54d5 100644 --- a/tests/test_evaluation/test_evaluator.py +++ b/tests/test_evaluation/test_evaluator.py @@ -182,3 +182,29 @@ def test_evaluate(self): evaluator.metrics = [metric_mock3, metric_mock4] with self.assertRaises(ValueError): evaluator.evaluate() + + +class TestNonMetricEvaluator(TestCase): + + def test_init(self): + evaluator = EditEvaluator(None) + self.assertIsNone(evaluator.metrics) + + def test_prepare_metrics(self): + evaluator = EditEvaluator(None) + evaluator.prepare_metrics(None, None) + self.assertTrue(evaluator.is_ready) + + def test_prepare_samplers(self): + evaluator = EditEvaluator(None) + metric_sampler_list = evaluator.prepare_samplers(None, None) + self.assertEqual(metric_sampler_list, [[[None], []]]) + + def test_process(self): + evaluator = EditEvaluator(None) + evaluator.process(None, None, None) + + def test_evalute(self): + evaluator = EditEvaluator(None) + output = evaluator.evaluate() + self.assertEqual(output, {'No Metric': 'Nan'}) From 7a678ff2619423c5d296803caa2002f0e664d013 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Wed, 19 Apr 2023 14:31:27 +0800 Subject: [PATCH 12/42] [Enhancement] Revise visualization, visualizer and data preprocessor (#1765) * revise visualization, visualizer and data preprocessor * revise unit test for vis hook --- mmedit/engine/hooks/visualization_hook.py | 33 ++++++++---- .../edit_data_preprocessor.py | 8 ++- mmedit/visualization/gen_visualizer.py | 7 +-- .../test_hooks/test_visualization_hook.py | 54 +++++++++++++++++-- 4 files changed, 83 insertions(+), 19 deletions(-) diff --git a/mmedit/engine/hooks/visualization_hook.py b/mmedit/engine/hooks/visualization_hook.py index 90f3497770..b4e0d1a257 100644 --- a/mmedit/engine/hooks/visualization_hook.py +++ b/mmedit/engine/hooks/visualization_hook.py @@ -90,7 +90,7 @@ class GenVisualizationHook(Hook): - 'type': Value must be string. Denotes what kind of sampler is used to generate image. Refers to :meth:`~mmedit.utils.get_sampler`. - Optional key words (If not passed, will use the default value): - - 'n_rows': Value must be int. The number of images in one row. + - 'n_row': Value must be int. The number of images in one row. - 'num_samples': Value must be int. The number of samples to visualize. - 'vis_mode': Value must be string. How to visualize the generated samples (e.g. image, gif). @@ -123,11 +123,11 @@ class GenVisualizationHook(Hook): >>> vis_kwargs_list=[dict(type='Translation', >>> name='translation_train', >>> n_samples=6, draw_gt=True, - >>> n_rows=3), + >>> n_row=3), >>> dict(type='TranslationVal', >>> name='translation_val', >>> n_samples=16, draw_gt=True, - >>> n_rows=4)])] + >>> n_row=4)])] # NOTE: user-defined vis_kwargs > vis_kwargs_mapping > hook init args @@ -140,7 +140,7 @@ class GenVisualizationHook(Hook): n_samples (Optional[int]): The default value of number of samples to visualize. Defaults to 64. n_row (Optional[int]): The default value of number of images in each - row in the visualization results. Defaults to 8. + row in the visualization results. Defaults to None. message_hub_vis_kwargs (Optional[Tuple[str, dict, List[str], List[Dict]]]): Key arguments visualize images in message hub. Defaults to None. @@ -175,7 +175,7 @@ def __init__(self, vis_kwargs_list: Tuple[List[dict], dict] = None, fixed_input: bool = True, n_samples: Optional[int] = 64, - n_row: Optional[int] = 8, + n_row: Optional[int] = None, message_hub_vis_kwargs: Optional[Tuple[str, dict, List[str], List[Dict]]] = None, save_at_test: bool = True, @@ -336,7 +336,6 @@ def vis_sample(self, n_samples = vis_kwargs_.pop('n_samples', self.n_samples) n_row = vis_kwargs_.pop('n_row', self.n_row) - n_row = min(n_row, n_samples) num_iters = math.ceil(n_samples / num_batches) vis_kwargs_['max_times'] = num_iters @@ -353,15 +352,31 @@ def vis_sample(self, need_save = fixed_input and not self.inputs_buffer[sampler_type] for inputs in sampler: - output_list += [out for out in forward_func(inputs)] + output = forward_func(inputs) + if len(output) != num_batches: + # one sample contains multiple elements + output_list.append(output) + contain_mul_elements = True + else: + output_list += [out for out in forward_func(inputs)] + contain_mul_elements = False # save inputs if need_save: self.inputs_buffer[sampler_type].append(inputs) + output_list = output_list[:n_samples] + if contain_mul_elements: + output_to_vis = [] + for output in output_list: + output_to_vis += output + else: + output_to_vis = output_list + n_row = min(n_row, len(output_to_vis)) if n_row else None + self._visualizer.add_datasample( name=name, - gen_samples=output_list[:n_samples], + gen_samples=output_to_vis, target_keys=target_keys, vis_mode=vis_mode, n_row=n_row, @@ -444,6 +459,6 @@ def vis_from_message_hub(self, batch_idx: int): gen_samples=gen_samples, target_keys=key, vis_mode=vis_mode, - n_row=min(self.n_row, num_batches), + n_row=min(self.n_row, num_batches) if self.n_row else None, show=self.show, step=batch_idx) diff --git a/mmedit/models/data_preprocessors/edit_data_preprocessor.py b/mmedit/models/data_preprocessors/edit_data_preprocessor.py index 7dcd3f71a9..3b220fb3e0 100644 --- a/mmedit/models/data_preprocessors/edit_data_preprocessor.py +++ b/mmedit/models/data_preprocessors/edit_data_preprocessor.py @@ -111,8 +111,10 @@ def __init__(self, self.pad_mode = pad_mode self.pad_size_dict = dict() - self.data_keys = data_keys if isinstance(data_keys, - list) else [data_keys] + if data_keys is not None and not isinstance(data_keys, list): + self.data_keys = [data_keys] + else: + self.data_keys = data_keys # TODO: can be removed since only be used in LIIF self.input_view = input_view @@ -560,6 +562,8 @@ def _preprocess_data_sample(self, data_samples: SampleList, target_order, do_norm = self.output_channel_order, True for data_sample in data_samples: + if not self.data_keys: + break for key in self.data_keys: if not hasattr(data_sample, key): # do not raise error here diff --git a/mmedit/visualization/gen_visualizer.py b/mmedit/visualization/gen_visualizer.py index 2e2762d6cc..7262cb3b00 100644 --- a/mmedit/visualization/gen_visualizer.py +++ b/mmedit/visualization/gen_visualizer.py @@ -92,7 +92,7 @@ def _get_n_row_and_padding(samples: Tuple[dict, Tensor], n_samples = sample_shape[0] if n_row is None: - n_row = int(math.sqrt(n_samples)) + n_row = math.ceil(math.sqrt(n_samples)) if n_samples % n_row == 0: n_padding = 0 else: @@ -267,7 +267,7 @@ def add_datasample(self, gen_samples: Sequence[EditDataSample], target_keys: Optional[Tuple[str, List[str]]] = None, vis_mode: Optional[str] = None, - n_row: Optional[int] = 1, + n_row: Optional[int] = None, show: bool = False, wait_time: int = 0, step: int = 0, @@ -286,7 +286,8 @@ def add_datasample(self, gen_samples (List[EditDataSample]): Data samples to visualize. vis_mode (str, optional): Visualization mode. If not passed, will visualize results as image. Defaults to None. - n_rows (int, optional): Number of images in one row. Defaults to 1. + n_rows (int, optional): Number of images in one row. + Defaults to None. color_order (str): The color order of the passed images. Defaults to 'bgr'. target_mean (Sequence[Union[float, int]]): The target mean of the diff --git a/tests/test_engine/test_hooks/test_visualization_hook.py b/tests/test_engine/test_hooks/test_visualization_hook.py index 1d5bde0035..3a7d2fd608 100644 --- a/tests/test_engine/test_hooks/test_visualization_hook.py +++ b/tests/test_engine/test_hooks/test_visualization_hook.py @@ -401,7 +401,7 @@ def test_after_train_iter(self): self.assertEqual(messageHub_vis_args['name'], 'train_feat_map') self.assertEqual(len(messageHub_vis_args['gen_samples']), 4) self.assertEqual(messageHub_vis_args['vis_mode'], None) - self.assertEqual(messageHub_vis_args['n_row'], 4) + self.assertEqual(messageHub_vis_args['n_row'], None) # test vis with messagehub info --> list[str] mock_visualuzer.add_datasample.reset_mock() @@ -415,7 +415,7 @@ def test_after_train_iter(self): self.assertEqual(messageHub_vis_args['name'], 'train_feat_map') self.assertEqual(len(messageHub_vis_args['gen_samples']), 4) self.assertEqual(messageHub_vis_args['vis_mode'], None) - self.assertEqual(messageHub_vis_args['n_row'], 4) + self.assertEqual(messageHub_vis_args['n_row'], None) # test vis with messagehub info --> dict mock_visualuzer.add_datasample.reset_mock() @@ -429,7 +429,7 @@ def test_after_train_iter(self): self.assertEqual(messageHub_vis_args['name'], 'train_feat_map') self.assertEqual(len(messageHub_vis_args['gen_samples']), 4) self.assertEqual(messageHub_vis_args['vis_mode'], 'feature_map') - self.assertEqual(messageHub_vis_args['n_row'], 4) + self.assertEqual(messageHub_vis_args['n_row'], None) # test vis with messagehub info --> list[dict] mock_visualuzer.add_datasample.reset_mock() @@ -452,13 +452,13 @@ def test_after_train_iter(self): self.assertEqual(feat_map_vis_args['name'], 'train_feat_map') self.assertEqual(len(feat_map_vis_args['gen_samples']), 4) self.assertEqual(feat_map_vis_args['vis_mode'], 'feature_map') - self.assertEqual(feat_map_vis_args['n_row'], 4) + self.assertEqual(feat_map_vis_args['n_row'], None) _, x_t_vis_args = called_args_list[2] self.assertEqual(x_t_vis_args['name'], 'train_x_t') self.assertEqual(len(x_t_vis_args['gen_samples']), 1) self.assertEqual(x_t_vis_args['vis_mode'], None) - self.assertEqual(x_t_vis_args['n_row'], 1) + self.assertEqual(x_t_vis_args['n_row'], None) # test vis messageHub info --> errors hook.message_vis_kwargs = 'error' @@ -474,6 +474,50 @@ def test_after_train_iter(self): with self.assertRaises(TypeError): hook.after_train_iter(runner, 1, data_batch, None) + def test_after_train_iter_contain_mul_elements(self): + # test contain_mul_elements + n_row != None + # n_row = 8, n_samples = 3, batch_size = 2, model_n_samples = 4 + # run math.ceil(3 / 2) = 2 times, visualize 2 * 4 = 8 samples, + class MockModel: + + def __init__(self, n_samples): + self.n_samples = n_samples + + def noise_fn(self, *args, **kwargs): + return torch.randn(2, 2) + + def val_step(self, *args, **kwargs): + return [EditDataSample() for _ in range(self.n_samples)] + + def eval(self): + return self + + def train(self): + return self + + runner = MagicMock() + runner.model = MockModel(n_samples=4) + runner.train_dataloader = MagicMock() + runner.train_dataloader.batch_size = 2 + + hook = GenVisualizationHook( + interval=2, vis_kwargs_list=dict(type='GAN'), n_samples=3, n_row=8) + mock_visualuzer = MagicMock() + mock_visualuzer.add_datasample = MagicMock() + hook._visualizer = mock_visualuzer + + # build a empty data sample + data_batch = [ + dict(inputs=None, data_samples=EditDataSample()) + for idx in range(10) + ] + + for idx in range(3): + hook.after_train_iter(runner, idx, data_batch, None) + self.assertEqual(mock_visualuzer.add_datasample.call_count, 1) + called_args_list = mock_visualuzer.add_datasample.call_args_list[0] + self.assertEqual(len(called_args_list[1]['gen_samples']), 8) + def test_after_test_iter(self): model = MagicMock() hook = GenVisualizationHook( From d9d28acf01424b47c5abacd05b6d918927b23146 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Wed, 19 Apr 2023 15:21:01 +0800 Subject: [PATCH 13/42] [Enhancement] Support LoRA for linear modules (#1766) * support LoRA for linear modules * skip lora unit test when torch <= 1.8.1 --- mmedit/models/base_archs/__init__.py | 6 +- mmedit/models/base_archs/lora.py | 378 ++++++++++++++++++ .../test_models/test_base_archs/test_lora.py | 128 ++++++ 3 files changed, 511 insertions(+), 1 deletion(-) create mode 100644 mmedit/models/base_archs/lora.py create mode 100644 tests/test_models/test_base_archs/test_lora.py diff --git a/mmedit/models/base_archs/__init__.py b/mmedit/models/base_archs/__init__.py index 2d420b4ec9..3ce03b350d 100644 --- a/mmedit/models/base_archs/__init__.py +++ b/mmedit/models/base_archs/__init__.py @@ -12,6 +12,8 @@ from .gated_conv_module import SimpleGatedConvModule from .img_normalize import ImgNormalize from .linear_module import LinearModule +from .lora import (LoRAWrapper, set_lora, set_lora_disable, set_lora_enable, + set_only_lora_trainable) from .multi_layer_disc import MultiLayerDiscriminator from .patch_disc import PatchDiscriminator from .resnet import ResNet @@ -69,5 +71,7 @@ def gen_wrapped_cls(module, module_name): 'LinearModule', 'pixel_unshuffle', 'PixelShufflePack', 'ImgNormalize', 'SpatialTemporalEnsemble', 'SoftMaskPatchDiscriminator', 'SimpleEncoderDecoder', 'MultiLayerDiscriminator', 'PatchDiscriminator', - 'VGG16', 'ResNet', 'AllGatherLayer', 'ResidualBlockNoBN' + 'VGG16', 'ResNet', 'AllGatherLayer', 'ResidualBlockNoBN', 'LoRAWrapper', + 'set_lora', 'set_lora_disable', 'set_lora_enable', + 'set_only_lora_trainable' ] diff --git a/mmedit/models/base_archs/lora.py b/mmedit/models/base_archs/lora.py new file mode 100644 index 0000000000..066a13cbd4 --- /dev/null +++ b/mmedit/models/base_archs/lora.py @@ -0,0 +1,378 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import re +from typing import Any, List, Optional, Union + +import torch.nn as nn +from mmengine import print_log +from torch import Tensor + + +class LoRALinear(nn.Module): + """Linear layer for LoRA. + + Args: + in_feat (int): Number of input features. + out_feat (int): Number of output features. + rank (int): The rank of LoRA. + """ + + def __init__(self, in_feat: int, out_feat: int, rank: int = 4): + super().__init__() + self.rank = rank + assert rank < min(in_feat, out_feat) + + self.down = nn.Linear(in_feat, rank, bias=False) + self.up = nn.Linear(rank, out_feat, bias=False) + + nn.init.normal_(self.down.weight, std=1 / rank) + nn.init.zeros_(self.up.weight) + + def forward(self, x: Tensor) -> Tensor: + ori_type = x.dtype + dtype = self.down.weight.dtype + + out = self.down(x.to(dtype)) + out = self.up(out) + return out.to(ori_type) + + +class LoRAWrapper(nn.Module): + """Wrapper for LoRA layer. + + Args: + module (nn.Module): The module to be wrapped. + in_feat (int): Number of input features. + out_feat (int): Number of output features. + rank (int): The rank of LoRA. + scale (float): The scale of LoRA feature. + names (Union[str, List[str]], optional): The name of LoRA layers. If + you want to add multi LoRA for one module, names for each LoRA + mapping must be defined. + """ + + def __init__(self, + module: nn.Module, + in_feat: int, + out_feat: int, + rank: int, + scale: float = 1, + names: Optional[Union[str, List[str]]] = None): + super().__init__() + + # NOTE: LoRA for linear layer, LoCON will coming soon~ + assert isinstance( + module, + nn.Linear), ('Only Support LoRA for linear layer currently. ' + 'LoCON will coming soon~') + self.wrapped = module + + if names is not None: + # set a list of LoRAs + if not isinstance(names, list): + names = [names] + if isinstance(rank, list): + assert len(rank) == len(names) + else: + rank = [rank] * len(names) + if isinstance(scale, list): + assert len(scale) == len(names) + else: + scale = [scale] * len(names) + + self.names = names + self.lora_mapping = dict() + self.scale = dict() + self.enable = dict() + self.rank = dict() + for n, r, s in zip(names, rank, scale): + self.lora_mapping[n] = LoRALinear(in_feat, out_feat, r) + self.scale_dict[n] = s + self.enable[n] = True + self.rank[n] = r + self.lora_mapping = nn.ModuleDict(self.lora_mapping) + + else: + # set single LoRA + self.names = None + self.lora_mapping = LoRALinear(in_feat, out_feat, rank) + self.scale = scale + self.enable = True + self.rank = rank + + self.in_feat, self.out_feat = in_feat, out_feat + + def add_lora(self, + name: str, + rank: int, + scale: float = 1, + state_dict: Optional[dict] = None): + """Add LoRA mapping. + + Args: + name (str): The name of added LoRA. + rank (int): The rank of added LoRA. + scale (float, optional): The scale of added LoRA. Defaults to 1. + state_dict (dict, optional): The state dict of added LoRA. + Defaults to None. + """ + mapping_to_add = LoRALinear(self.in_feat, self.out_feat, rank) + if state_dict is not None: + mapping_to_add.load_state_dict(mapping_to_add) + # move to device and type + mapping_to_add.to(self.lora_mapping.weight.dtype) + + if isinstance(self.names, list): + self.names.append(name) + self.lora_mapping[name] = mapping_to_add + self.scale[name] = scale + self.enable[name] = True + self.rank[name] = rank + else: + self.names = ['orig', name] + self.lora_mapping = nn.ModuleDict({ + 'orig': self.lora_mapping, + name: mapping_to_add + }) + self.scale = {'orig': self.scale, name: scale} + self.enable = {'orig': self.enable, name: True} + self.rank = {'orig': self.rank, name: rank} + print_log( + 'The original LoRA mapping do not have name, ' + 'save as \'orig\'.', 'current') + print_log(f'Add LoRA \'{name}\' with rank {rank} and scale {scale}.', + 'current') + + def _set_value(self, + attr_name: str, + value: Any, + name: Optional[str] = None): + """Set value of attribute. + + Args: + attr_name (str): The name of attribute to be set value. + value (Any): The value to be set. + name (str, optional): The name of field in `attr_name`. If + passed, will set value to `attr_name[name]`. Defaults to None. + """ + attr = getattr(self, attr_name) + + if isinstance(attr, dict): + if name is None: + attr = {k: value for k in self.names} + print_log(f'Set all value in \'{attr_name}\' as \'{value}\'.', + 'current') + else: + attr[name] = value + print_log(f'Set \'{attr_name}[{name}]\' as \'{value}\'.', + 'current') + else: + attr = value + print_log(f'Set \'{attr_name}\' as \'{value}\'.', 'current') + + setattr(self, attr_name, attr) + + def set_scale(self, scale: float, name: Optional[str] = None): + """Set LoRA scale. + + Args: + scale (float): The scale to be set. + name (str, optional): The name of LoRA to be set. Defaults to None. + """ + self._set_value('scale', scale, name) + + def set_enable(self, name: Optional[str] = None): + """Enable LoRA for the current layer. + + Args: + name (str, optional): The name of LoRA to be set. Defaults to None. + """ + self._set_value('enable', True, name) + + def set_disable(self, name: Optional[str] = None): + """Disable LoRA for the current layer. + + Args: + name (str, optional): The name of LoRA to be set. Defaults to None. + """ + self._set_value('enable', False, name) + + def forward_lora_mapping(self, x: Tensor) -> Tensor: + """Forward LoRA mapping. + + Args: + x (Tensor): The input tensor. + + Returns: + Tensor: The output tensor. + """ + mapping_out = 0 + if isinstance(self.lora_mapping, dict): + for name in self.names: + scale = self.scale[name] + mapping_layer = self.lora_mapping[name] + enable = self.enable[name] + + if enable: + mapping_out = scale * mapping_layer(x) + else: + if self.enable: + mapping_out = self.scale * self.lora_mapping(x) + return mapping_out + + def forward(self, x: Tensor) -> Tensor: + """Forward and add LoRA mapping. + + Args: + x (Tensor): The input tensor. + + Returns: + Tensor: The output tensor. + """ + mapping_out = self.forward_lora_mapping(x) + return mapping_out + self.wrapped(x) + + @classmethod + def wrap_lora(cls, module, rank=4, scale=1, names=None, state_dict=None): + """Wrap LoRA. + + Use case: + >>> linear = nn.Linear(2, 4) + >>> lora_linear = LoRAWrapper.wrap_lora(linear, 4, 1) + + Args: + module (nn.Module): The module to add LoRA. + rank (int): The rank for LoRA. + scale (float): + + Returns: + LoRAWrapper: + """ + assert isinstance(module, + nn.Linear), 'Only support LoRA for Linear Layer' + in_feat = module.weight.shape[1] + out_feat = module.weight.shape[0] + lora = LoRAWrapper(module, in_feat, out_feat, rank, scale, names) + + return lora + + +def replace_module(parent_module: nn.Module, child_name: str, + new_module: nn.Module): + """Replace module in parent module.""" + setattr(parent_module, child_name, new_module) + + +def get_submodule(module: nn.Module, key: str): + """Get submodule by key.""" + target_name = key.split('.')[-1] + parent = module.get_submodule('.'.join(key.split('.')[:-1])) + target = module.get_submodule(key) + return parent, target, target_name + + +def set_lora(module: nn.Module, + config: dict, + verbose: bool = True) -> nn.Module: + """Set LoRA for module. + + Use case: + >>> 1. set all lora with same parameters + >>> lora_config = dict( + >>> rank=4, + >>> scale=1, + >>> target_modules=['to_q', 'to_k', 'to_v']) + + >>> 2. set lora with different parameters + >>> lora_config = dict( + >>> rank=4, + >>> scale=1, + >>> target_modules=[ + >>> # set `to_q` the default parameters + >>> 'to_q', + >>> # set `to_k` the defined parameters + >>> dict(target_module='to_k', rank=8, scale=1), + >>> # set `to_v` the defined `rank` and default `scale` + >>> dict(target_module='to_v', rank=16) + >>> ]) + + Args: + module (nn.Module): The module to set LoRA. + config (dict): The config dict. + verbose (bool): Whether to print log. Defaults to True. + """ + default_rank = config.get('rank', 4) + default_scale = config.get('scale', 1) + target_modules = config['target_modules'] + if not isinstance(target_modules, list): + target_modules = [target_modules] + + keys = [k for k, _ in module.named_modules()] + + for k in keys: + for target_module in target_modules: + if isinstance(target_module, str): + module_name = target_module + rank = default_rank + scale = default_scale + # pretrained_path = None + + elif isinstance(target_module, dict): + module_name = target_module['target_module'] + rank = target_module.get('rank', default_rank) + scale = target_module.get('scale', default_scale) + # pretrained_path = target_module.get('pretrained_path', None) + + else: + raise TypeError('Only support dict or string type for ' + 'target_modules') + # match keys + if re.fullmatch(module_name, k): + if verbose: + print_log( + f'Set LoRA for \'{k}\' with ' + f'regularization expression match \'{module_name}\'.', + 'current') + elif k.endswith(module_name): + if verbose: + print_log( + f'Set LoRA for \'{k}\' with ' + f'suffix match \'{module_name}\'.', 'current') + else: + continue + + parent, target, target_name = get_submodule(module, k) + new_module = LoRAWrapper.wrap_lora(target, rank=rank, scale=scale) + replace_module(parent, target_name, new_module) + return module + + +def set_only_lora_trainable(module: nn.Module) -> nn.Module: + """Set only LoRA modules trainable.""" + for n, m in module.named_children(): + if isinstance(m, LoRAWrapper): + m.lora_mapping.requires_grad_(True) + elif isinstance(m, nn.Module): + m.requires_grad_(False) + set_only_lora_trainable(m) + + return module + + +def set_lora_enable(module: nn.Module) -> nn.Module: + """Enable LoRA modules.""" + for n, m in module.named_children(): + if isinstance(m, LoRAWrapper): + m.set_enable() + elif isinstance(m, nn.Module): + set_lora_enable(m) + return module + + +def set_lora_disable(module: nn.Module) -> nn.Module: + """Disable LoRA modules.""" + for n, m in module.named_children(): + if isinstance(m, LoRAWrapper): + m.set_disable() + elif isinstance(m, nn.Module): + set_lora_disable(m) + return module diff --git a/tests/test_models/test_base_archs/test_lora.py b/tests/test_models/test_base_archs/test_lora.py new file mode 100644 index 0000000000..7eb2f64e7f --- /dev/null +++ b/tests/test_models/test_base_archs/test_lora.py @@ -0,0 +1,128 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch +import torch.nn as nn +from mmengine.utils import digit_version +from mmengine.utils.dl_utils import TORCH_VERSION + +from mmedit.models.base_archs import (LoRAWrapper, set_lora, set_lora_disable, + set_lora_enable, set_only_lora_trainable) + + +class ToyAttn(nn.Module): + + def __init__(self, in_dim, context_dim): + super().__init__() + self.to_q = nn.Linear(in_dim, in_dim) + self.to_k = nn.Linear(context_dim, in_dim) + self.to_v = nn.Linear(context_dim, in_dim) + + def forward(self, x, context=None): + + b, c, h, w = x.shape + x = x.view(b, c, h * w).permute(0, 2, 1) + if context is None: + context = x + + q = self.to_q(x) + k = self.to_k(context) + v = self.to_v(context) + attn_mask = torch.softmax(q @ k.transpose(-2, -1), dim=-1) + out = attn_mask @ v + return out.view(b, h, w, c).permute(0, 3, 1, 2) + + +class ToySubModule(nn.Module): + + def __init__(self): + super().__init__() + self.net = nn.Identity() + self.attn1 = ToyAttn(4, 3) + + def forward(self, x, context=None): + x = self.net(x) + x = self.attn1(x, context) + return x + + +class ToyModel(nn.Module): + + def __init__(self): + super().__init__() + self.n1 = ToySubModule() + self.attn2 = ToyAttn(4, 4) + + def forward(self, x, context=None): + out = self.n1(x, context) + out = self.attn2(out) + return out + + +@pytest.mark.skipif( + digit_version(TORCH_VERSION) <= digit_version('1.8.1'), + reason='get_submodule requires torch >= 1.9.0') +def test_set_lora(): + model = ToyModel() + + img = torch.randn(2, 4, 3, 3) + context = torch.randn(2, 11, 3) + + config = dict(rank=2, scale=1, target_modules='to_q') + model: ToyModel = set_lora(model, config, True) + isinstance(model.attn2.to_q, LoRAWrapper) + isinstance(model.n1.attn1.to_q, LoRAWrapper) + + out = model(img, context) + assert out.shape == (2, 4, 3, 3) + + model = ToyModel() + config = dict( + rank=2, + scale=1, + target_modules=[ + 'to_q', + dict(target_module='.*attn1.to_v', rank=1), + dict(target_module='to_k', scale=2.5) + ]) + out_wo_lora = model(img, context) + set_lora(model, config) + + assert isinstance(model.attn2.to_q, LoRAWrapper) + assert model.attn2.to_q.scale == 1 + assert model.attn2.to_q.rank == 2 + assert isinstance(model.attn2.to_k, LoRAWrapper) + assert model.attn2.to_k.scale == 2.5 + assert model.attn2.to_k.rank == 2 + assert isinstance(model.attn2.to_v, nn.Linear) + + assert isinstance(model.n1.attn1.to_q, LoRAWrapper) + assert model.n1.attn1.to_q.scale == 1 + assert model.n1.attn1.to_q.rank == 2 + assert isinstance(model.n1.attn1.to_k, LoRAWrapper) + assert model.n1.attn1.to_k.scale == 2.5 + assert model.n1.attn1.to_k.rank == 2 + assert isinstance(model.n1.attn1.to_v, LoRAWrapper) + assert model.n1.attn1.to_v.scale == 1 + assert model.n1.attn1.to_v.rank == 1 + + out_w_lora = model(img, context) + assert out_w_lora.shape == (2, 4, 3, 3) + + model.n1.attn1.to_v.set_scale(10) + assert model.n1.attn1.to_v.scale == 10 + + # test set onlyu lora trainable + set_only_lora_trainable(model) + for n, m in model.named_parameters(): + if 'lora_' in n: + assert m.requires_grad + else: + assert not m.requires_grad + + # test enable and disable + set_lora_disable(model) + out_lora_disable = model(img, context) + assert (out_lora_disable == out_wo_lora).all() + set_lora_enable(model) + out_lora_enable = model(img, context) + assert (out_lora_enable == out_w_lora).all() From 92560ea7b1ad4c80e7d20f5fc9f1c1a5a4ddd832 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Wed, 19 Apr 2023 15:56:52 +0800 Subject: [PATCH 14/42] support DreamBooth and SD Finetuning (#1767) * support DreamBooth and SD Finetuning * add docstring and unit test for dreambooth * add dataset for dreambooth * add configs and README for dreambooth --- configs/dreambooth/README.md | 88 +++++ .../dreambooth-finetune_text_encoder.py | 77 +++++ .../dreambooth/dreambooth-lora-prior_pre.py | 4 + configs/dreambooth/dreambooth-lora.py | 82 +++++ configs/dreambooth/dreambooth-prior_pre.py | 4 + configs/dreambooth/dreambooth.py | 76 +++++ configs/dreambooth/metafile.yml | 46 +++ mmedit/datasets/__init__.py | 4 +- mmedit/datasets/controlnet_dataset.py | 10 +- mmedit/datasets/dreambooth_dataset.py | 49 +++ mmedit/models/editors/__init__.py | 3 +- mmedit/models/editors/dreambooth/__init__.py | 4 + .../models/editors/dreambooth/dreambooth.py | 323 ++++++++++++++++++ .../stable_diffusion/stable_diffusion.py | 117 ++++++- model-index.yml | 1 + .../test_datasets/test_dreambooth_dataset.py | 20 ++ .../test_dreambooth/test_dreambooth.py | 151 ++++++++ 17 files changed, 1052 insertions(+), 7 deletions(-) create mode 100644 configs/dreambooth/README.md create mode 100644 configs/dreambooth/dreambooth-finetune_text_encoder.py create mode 100644 configs/dreambooth/dreambooth-lora-prior_pre.py create mode 100644 configs/dreambooth/dreambooth-lora.py create mode 100644 configs/dreambooth/dreambooth-prior_pre.py create mode 100644 configs/dreambooth/dreambooth.py create mode 100644 configs/dreambooth/metafile.yml create mode 100644 mmedit/datasets/dreambooth_dataset.py create mode 100644 mmedit/models/editors/dreambooth/__init__.py create mode 100644 mmedit/models/editors/dreambooth/dreambooth.py create mode 100644 tests/test_datasets/test_dreambooth_dataset.py create mode 100644 tests/test_models/test_editors/test_dreambooth/test_dreambooth.py diff --git a/configs/dreambooth/README.md b/configs/dreambooth/README.md new file mode 100644 index 0000000000..2a04fef323 --- /dev/null +++ b/configs/dreambooth/README.md @@ -0,0 +1,88 @@ +# DreamBooth (2022) + +> [DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation](https://arxiv.org/abs/2208.12242) + +> **Task**: Text2Image + + + +## Abstract + + + +Large text-to-image models achieved a remarkable leap in the evolution of AI, enabling high-quality and diverse synthesis of images from a given text prompt. However, these models lack the ability to mimic the appearance of subjects in a given reference set and synthesize novel renditions of them in different contexts. In this work, we present a new approach for "personalization" of text-to-image diffusion models. Given as input just a few images of a subject, we fine-tune a pretrained text-to-image model such that it learns to bind a unique identifier with that specific subject. Once the subject is embedded in the output domain of the model, the unique identifier can be used to synthesize novel photorealistic images of the subject contextualized in different scenes. By leveraging the semantic prior embedded in the model with a new autogenous class-specific prior preservation loss, our technique enables synthesizing the subject in diverse scenes, poses, views and lighting conditions that do not appear in the reference images. We apply our technique to several previously-unassailable tasks, including subject recontextualization, text-guided view synthesis, and artistic rendering, all while preserving the subject's key features. We also provide a new dataset and evaluation protocol for this new task of subject-driven generation. + + + +
    + +
    + +## Configs + +| Model | Dataset | Download | +| :----------------------------------------------------------------------------: | :-----: | :------: | +| [DreamBooth](./dreambooth.py) | - | - | +| [DreamBooth (Finetune Text Encoder)](./dreambooth-finetune_text_encoder.py) | - | - | +| [DreamBooth with Prior-Preservation Loss](./dreambooth-prior_pre.py) | - | - | +| [DreamBooth LoRA](./dreambooth-lora.py) | - | - | +| [DreamBooth LoRA with Prior-Preservation Loss](./dreambooth-lora-prior_pre.py) | - | - | + +## Quick Start + +1. Download [data](https://drive.google.com/drive/folders/1BO_dyz-p65qhBRRMRA4TbZ8qW4rB99JZ) and save to `data/dreambooth/` + +The file structure will be like this: + +```text +data +└── dreambooth + ├── alvan-nee-Id1DBHv4fbg-unsplash.jpeg + ├── alvan-nee-bQaAJCbNq3g-unsplash.jpeg + ├── alvan-nee-brFsZ7qszSY-unsplash.jpeg + └── alvan-nee-eoqnr8ikwFE-unsplash.jpeg +``` + +2. Start training with the following command: + +```bash +bash tools/dist_train.sh configs/dreambooth/dreambooth.py 1 +# or +bash tools/dist_train.sh configs/dreambooth/dreambooth_lora.py 1 +``` + + + + + + + +
    +
    + +
    + 'dreambooth' +
    +
    + +
    + 'dreambooth-lora' +
    +
    + +## 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://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_controlnet.py). + +Thanks for the efforts of the community! + +## Citation + +```bibtex +@article{ruiz2022dreambooth, + title={Dreambooth: Fine tuning text-to-image diffusion models for subject-driven generation}, + author={Ruiz, Nataniel and Li, Yuanzhen and Jampani, Varun and Pritch, Yael and Rubinstein, Michael and Aberman, Kfir}, + journal={arXiv preprint arXiv:2208.12242}, + year={2022} +} +``` diff --git a/configs/dreambooth/dreambooth-finetune_text_encoder.py b/configs/dreambooth/dreambooth-finetune_text_encoder.py new file mode 100644 index 0000000000..ab0f0be344 --- /dev/null +++ b/configs/dreambooth/dreambooth-finetune_text_encoder.py @@ -0,0 +1,77 @@ +_base_ = '../_base_/gen_default_runtime.py' + +# config for model +stable_diffusion_v15_url = 'runwayml/stable-diffusion-v1-5' + +val_prompts = [ + 'a sks dog in basket', 'a sks dog on the mountain', + 'a sks dog beside a swimming pool', 'a sks dog on the desk', + 'a sleeping sks dog', 'a screaming sks dog', 'a man in the garden' +] + +model = dict( + type='DreamBooth', + vae=dict( + type='AutoencoderKL', + from_pretrained=stable_diffusion_v15_url, + subfolder='vae'), + unet=dict( + type='UNet2DConditionModel', + subfolder='unet', + from_pretrained=stable_diffusion_v15_url), + text_encoder=dict( + type='ClipWrapper', + clip_type='huggingface', + pretrained_model_name_or_path=stable_diffusion_v15_url, + subfolder='text_encoder'), + tokenizer=stable_diffusion_v15_url, + finetune_text_encoder=True, + scheduler=dict( + type='DDPMScheduler', + from_pretrained=stable_diffusion_v15_url, + subfolder='scheduler'), + test_scheduler=dict( + type='DDIMScheduler', + from_pretrained=stable_diffusion_v15_url, + subfolder='scheduler'), + data_preprocessor=dict(type='EditDataPreprocessor', data_keys=None), + val_prompts=val_prompts) + +train_cfg = dict(max_iters=1000) + +optim_wrapper = dict( + modules='.*unet', + optimizer=dict(type='AdamW', lr=5e-6), + accumulative_counts=4) # batch size = 4 * 1 = 4 + +pipeline = [ + dict(type='LoadImageFromFile', key='img', channel_order='rgb'), + dict(type='Resize', scale=(512, 512)), + dict(type='PackEditInputs') +] +dataset = dict( + type='DreamBoothDataset', + data_root='./data/dreambooth', + concept_dir='imgs', + prompt='a photo of sks dog', + pipeline=pipeline) +train_dataloader = dict( + dataset=dataset, + num_workers=16, + sampler=dict(type='InfiniteSampler', shuffle=True), + persistent_workers=True, + batch_size=1) +val_cfg = val_evaluator = val_dataloader = None +test_cfg = test_evaluator = test_dataloader = None + +# hooks +default_hooks = dict(logger=dict(interval=10)) +custom_hooks = [ + dict( + type='GenVisualizationHook', + interval=50, + fixed_input=True, + # visualize train dataset + vis_kwargs_list=dict(type='Data', name='fake_img'), + n_samples=1) +] diff --git a/configs/dreambooth/dreambooth-lora-prior_pre.py b/configs/dreambooth/dreambooth-lora-prior_pre.py new file mode 100644 index 0000000000..8049c35f6c --- /dev/null +++ b/configs/dreambooth/dreambooth-lora-prior_pre.py @@ -0,0 +1,4 @@ +_base_ = 'dreambooth-lora.py' + +# config for model +model = dict(prior_loss_weight=1, class_prior_prompt='a dog') diff --git a/configs/dreambooth/dreambooth-lora.py b/configs/dreambooth/dreambooth-lora.py new file mode 100644 index 0000000000..109d79335e --- /dev/null +++ b/configs/dreambooth/dreambooth-lora.py @@ -0,0 +1,82 @@ +_base_ = '../_base_/gen_default_runtime.py' + +# config for model +stable_diffusion_v15_url = 'runwayml/stable-diffusion-v1-5' + +val_prompts = [ + 'a sks dog in basket', 'a sks dog on the mountain', + 'a sks dog beside a swimming pool', 'a sks dog on the desk', + 'a sleeping sks dog', 'a screaming sks dog', 'a man in the garden' +] + +lora_config = dict(target_modules=['to_q', 'to_k', 'to_v']) +model = dict( + type='DreamBooth', + vae=dict( + type='AutoencoderKL', + from_pretrained=stable_diffusion_v15_url, + subfolder='vae'), + unet=dict( + type='UNet2DConditionModel', + subfolder='unet', + from_pretrained=stable_diffusion_v15_url), + text_encoder=dict( + type='ClipWrapper', + clip_type='huggingface', + pretrained_model_name_or_path=stable_diffusion_v15_url, + subfolder='text_encoder'), + tokenizer=stable_diffusion_v15_url, + scheduler=dict( + type='DDPMScheduler', + from_pretrained=stable_diffusion_v15_url, + subfolder='scheduler'), + test_scheduler=dict( + type='DDIMScheduler', + from_pretrained=stable_diffusion_v15_url, + subfolder='scheduler'), + data_preprocessor=dict(type='EditDataPreprocessor', data_keys=None), + prior_loss_weight=0, + val_prompts=val_prompts, + lora_config=lora_config) + +train_cfg = dict(max_iters=1000) + +optim_wrapper = dict( + # Only optimize LoRA mappings + modules='.*.lora_mapping', + # NOTE: lr should be larger than dreambooth finetuning + optimizer=dict(type='AdamW', lr=5e-4), + accumulative_counts=1) + +pipeline = [ + dict(type='LoadImageFromFile', key='img', channel_order='rgb'), + dict(type='Resize', scale=(512, 512)), + dict(type='PackEditInputs') +] +dataset = dict( + type='DreamBoothDataset', + data_root='./data/dreambooth', + # TODO: rename to instance + concept_dir='imgs', + prompt='a photo of sks dog', + pipeline=pipeline) +train_dataloader = dict( + dataset=dataset, + num_workers=16, + sampler=dict(type='InfiniteSampler', shuffle=True), + persistent_workers=True, + batch_size=1) +val_cfg = val_evaluator = val_dataloader = None +test_cfg = test_evaluator = test_dataloader = None + +# hooks +default_hooks = dict(logger=dict(interval=10)) +custom_hooks = [ + dict( + type='GenVisualizationHook', + interval=50, + fixed_input=True, + # visualize train dataset + vis_kwargs_list=dict(type='Data', name='fake_img'), + n_samples=1) +] diff --git a/configs/dreambooth/dreambooth-prior_pre.py b/configs/dreambooth/dreambooth-prior_pre.py new file mode 100644 index 0000000000..d8ef655fdf --- /dev/null +++ b/configs/dreambooth/dreambooth-prior_pre.py @@ -0,0 +1,4 @@ +_base_ = './dreambooth.py' + +# config for model +model = dict(prior_loss_weight=1, class_prior_prompt='a dog') diff --git a/configs/dreambooth/dreambooth.py b/configs/dreambooth/dreambooth.py new file mode 100644 index 0000000000..8552f0ae3d --- /dev/null +++ b/configs/dreambooth/dreambooth.py @@ -0,0 +1,76 @@ +_base_ = '../_base_/gen_default_runtime.py' + +# config for model +stable_diffusion_v15_url = 'runwayml/stable-diffusion-v1-5' + +val_prompts = [ + 'a sks dog in basket', 'a sks dog on the mountain', + 'a sks dog beside a swimming pool', 'a sks dog on the desk', + 'a sleeping sks dog', 'a screaming sks dog', 'a man in the garden' +] + +model = dict( + type='DreamBooth', + vae=dict( + type='AutoencoderKL', + from_pretrained=stable_diffusion_v15_url, + subfolder='vae'), + unet=dict( + type='UNet2DConditionModel', + subfolder='unet', + from_pretrained=stable_diffusion_v15_url), + text_encoder=dict( + type='ClipWrapper', + clip_type='huggingface', + pretrained_model_name_or_path=stable_diffusion_v15_url, + subfolder='text_encoder'), + tokenizer=stable_diffusion_v15_url, + scheduler=dict( + type='DDPMScheduler', + from_pretrained=stable_diffusion_v15_url, + subfolder='scheduler'), + test_scheduler=dict( + type='DDIMScheduler', + from_pretrained=stable_diffusion_v15_url, + subfolder='scheduler'), + data_preprocessor=dict(type='EditDataPreprocessor', data_keys=None), + val_prompts=val_prompts) + +train_cfg = dict(max_iters=1000) + +optim_wrapper = dict( + modules='.*unet', + optimizer=dict(type='AdamW', lr=5e-6), + accumulative_counts=4) # batch size = 4 * 1 = 4 + +pipeline = [ + dict(type='LoadImageFromFile', key='img', channel_order='rgb'), + dict(type='Resize', scale=(512, 512)), + dict(type='PackEditInputs') +] +dataset = dict( + type='DreamBoothDataset', + data_root='./data/dreambooth', + concept_dir='imgs', + prompt='a photo of sks dog', + pipeline=pipeline) +train_dataloader = dict( + dataset=dataset, + num_workers=16, + sampler=dict(type='InfiniteSampler', shuffle=True), + persistent_workers=True, + batch_size=1) +val_cfg = val_evaluator = val_dataloader = None +test_cfg = test_evaluator = test_dataloader = None + +# hooks +default_hooks = dict(logger=dict(interval=10)) +custom_hooks = [ + dict( + type='GenVisualizationHook', + interval=50, + fixed_input=True, + # visualize train dataset + vis_kwargs_list=dict(type='Data', name='fake_img'), + n_samples=1) +] diff --git a/configs/dreambooth/metafile.yml b/configs/dreambooth/metafile.yml new file mode 100644 index 0000000000..a2b37373b9 --- /dev/null +++ b/configs/dreambooth/metafile.yml @@ -0,0 +1,46 @@ +Collections: +- Name: DreamBooth + Paper: + Title: 'DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven + Generation' + URL: https://arxiv.org/abs/2208.12242 + README: configs/dreambooth/README.md + Task: + - text2image + Year: 2022 +Models: +- Config: configs/dreambooth/dreambooth.py + In Collection: DreamBooth + Name: dreambooth + Results: + - Dataset: '-' + Metrics: {} + Task: Text2Image +- Config: configs/dreambooth/dreambooth-finetune_text_encoder.py + In Collection: DreamBooth + Name: dreambooth-finetune_text_encoder + Results: + - Dataset: '-' + Metrics: {} + Task: Text2Image +- Config: configs/dreambooth/dreambooth-prior_pre.py + In Collection: DreamBooth + Name: dreambooth-prior_pre + Results: + - Dataset: '-' + Metrics: {} + Task: Text2Image +- Config: configs/dreambooth/dreambooth-lora.py + In Collection: DreamBooth + Name: dreambooth-lora + Results: + - Dataset: '-' + Metrics: {} + Task: Text2Image +- Config: configs/dreambooth/dreambooth-lora-prior_pre.py + In Collection: DreamBooth + Name: dreambooth-lora-prior_pre + Results: + - Dataset: '-' + Metrics: {} + Task: Text2Image diff --git a/mmedit/datasets/__init__.py b/mmedit/datasets/__init__.py index 22eca611ee..98c17e508b 100644 --- a/mmedit/datasets/__init__.py +++ b/mmedit/datasets/__init__.py @@ -5,6 +5,7 @@ from .cifar10_dataset import CIFAR10 from .comp1k_dataset import AdobeComp1kDataset from .controlnet_dataset import ControlNetDataset +from .dreambooth_dataset import DreamBoothDataset from .grow_scale_image_dataset import GrowScaleImgDataset from .imagenet_dataset import ImageNet from .mscoco_dataset import MSCoCoDataset @@ -16,5 +17,6 @@ 'AdobeComp1kDataset', 'BasicImageDataset', 'BasicFramesDataset', 'BasicConditionalDataset', 'UnpairedImageDataset', 'PairedImageDataset', 'ImageNet', 'CIFAR10', 'GrowScaleImgDataset', 'SinGANDataset', - 'MSCoCoDataset', 'ControlNetDataset' + 'MSCoCoDataset', 'ControlNetDataset', 'DreamBoothDataset', + 'ControlNetDataset', 'SDFinetuneDataset' ] diff --git a/mmedit/datasets/controlnet_dataset.py b/mmedit/datasets/controlnet_dataset.py index 417fb40b93..9f258b8109 100644 --- a/mmedit/datasets/controlnet_dataset.py +++ b/mmedit/datasets/controlnet_dataset.py @@ -27,7 +27,11 @@ class ControlNetDataset(BaseDataset): def __init__(self, ann_file: str = 'prompt.json', data_root: str = './data/fill50k', + control_key='source', + image_key='target', pipeline: List[Union[dict, Callable]] = []): + self.control_key = control_key + self.image_key = image_key super().__init__( ann_file=ann_file, data_root=data_root, pipeline=pipeline) @@ -43,8 +47,10 @@ def load_data_list(self) -> List[dict]: for anno in anno_list: anno = json.loads(anno) - source = anno['source'] - target = anno['target'] + # source = anno['source'] + # target = anno['target'] + source = anno[self.control_key] + target = anno[self.image_key] prompt = anno['prompt'] source = os.path.join(self.data_root, source) diff --git a/mmedit/datasets/dreambooth_dataset.py b/mmedit/datasets/dreambooth_dataset.py new file mode 100644 index 0000000000..c5426790b6 --- /dev/null +++ b/mmedit/datasets/dreambooth_dataset.py @@ -0,0 +1,49 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +from typing import Callable, List, Union + +from mmengine import FileClient +from mmengine.dataset import BaseDataset + +from mmedit.registry import DATASETS + + +@DATASETS.register_module() +class DreamBoothDataset(BaseDataset): + """Dataset for DreamBooth. + + Args: + data_root (str): Path to the data root. + concept_dir (str): Path to the concept images. + prompt (str): Prompt of the concept. + pipeline (list[dict | callable]): A sequence of data transforms. + """ + + def __init__(self, + data_root: str, + concept_dir: str, + prompt: str, + pipeline: List[Union[dict, Callable]] = []): + + data_prefix = dict(img_path=concept_dir) + + self.prompt = prompt + + super().__init__( + data_root=data_root, data_prefix=data_prefix, pipeline=pipeline) + + def load_data_list(self) -> list: + """Load data list from concept_dir and class_dir.""" + data_list = [] + + img_dir = self.data_prefix['img_path'] + file_client = FileClient.infer_client(uri=img_dir) + img_dir = osp.abspath(img_dir) + + for data_name in file_client.list_dir_or_file(img_dir, list_dir=False): + data_info = dict( + img_path=file_client.join_path(img_dir, data_name), + prompt=self.prompt) + data_list.append(data_info) + + return data_list diff --git a/mmedit/models/editors/__init__.py b/mmedit/models/editors/__init__.py index 8e01ec2863..e6cd7679b3 100644 --- a/mmedit/models/editors/__init__.py +++ b/mmedit/models/editors/__init__.py @@ -17,6 +17,7 @@ FeedbackBlockHeatmapAttention, LightCNN, MaxFeature) from .dim import DIM from .disco_diffusion import ClipWrapper, DiscoDiffusion +from .dreambooth import DreamBooth from .edsr import EDSRNet from .edvr import EDVR, EDVRNet from .eg3d import EG3D @@ -87,5 +88,5 @@ 'StyleGAN3Generator', 'InstColorization', 'NAFBaseline', 'NAFBaselineLocal', 'NAFNet', 'NAFNetLocal', 'DenoisingUnet', 'ClipWrapper', 'EG3D', 'Restormer', 'SwinIRNet', 'StableDiffusion', - 'ControlStableDiffusion' + 'ControlStableDiffusion', 'DreamBooth' ] diff --git a/mmedit/models/editors/dreambooth/__init__.py b/mmedit/models/editors/dreambooth/__init__.py new file mode 100644 index 0000000000..5b3fae4809 --- /dev/null +++ b/mmedit/models/editors/dreambooth/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .dreambooth import DreamBooth + +__all__ = ['DreamBooth'] diff --git a/mmedit/models/editors/dreambooth/dreambooth.py b/mmedit/models/editors/dreambooth/dreambooth.py new file mode 100644 index 0000000000..e92eea3f21 --- /dev/null +++ b/mmedit/models/editors/dreambooth/dreambooth.py @@ -0,0 +1,323 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import random +from copy import deepcopy +from typing import Dict, List, Optional, Union + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine import print_log + +from mmedit.models.base_archs import set_lora +from mmedit.registry import MODELS +from mmedit.structures import EditDataSample +from mmedit.utils.typing import SampleList +from ..stable_diffusion.stable_diffusion import StableDiffusion + +ModelType = Union[Dict, nn.Module] + + +@MODELS.register_module() +class DreamBooth(StableDiffusion): + """Implementation of `DreamBooth with Stable Diffusion. + + `_ (DreamBooth). + + Args: + vae (Union[dict, nn.Module]): The config or module for VAE model. + text_encoder (Union[dict, nn.Module]): The config or module for text + encoder. + tokenizer (str): The **name** for CLIP tokenizer. + unet (Union[dict, nn.Module]): The config or module for Unet model. + controlnet (Union[dict, nn.Module]): The config or module for + ControlNet. + schedule (Union[dict, nn.Module]): The config or module for diffusion + scheduler. + test_scheduler (Union[dict, nn.Module], optional): The config or + module for diffusion scheduler in test stage (`self.infer`). If not + passed, will use the same scheduler as `schedule`. Defaults to + None. + lora_config (dict, optional): The config for LoRA finetuning. Defaults + to None. + val_prompts (Union[str, List[str]], optional): The prompts for + validation. Defaults to None. + class_prior_prompt (str, optional): The prompt for class prior loss. + num_class_images (int, optional): The number of images for class prior. + Defaults to 3. + prior_loss_weight (float, optional): The weight for class prior loss. + Defaults to 0. + fine_tune_text_encoder (bool, optional): Whether to fine-tune text + encoder. Defaults to False. + dtype (str, optional): The dtype for the model. Defaults to 'fp16'. + enable_xformers (bool, optional): Whether to use xformers. + Defaults to True. + data_preprocessor (dict, optional): The pre-process config of + :class:`BaseDataPreprocessor`. Defaults to + dict(type='EditDataPreprocessor'). + init_cfg (dict, optional): The weight initialized config for + :class:`BaseModule`. Defaults to None/ + """ + + def __init__(self, + vae: ModelType, + text_encoder: ModelType, + tokenizer: str, + unet: ModelType, + scheduler: ModelType, + test_scheduler: Optional[ModelType] = None, + lora_config: Optional[dict] = None, + val_prompts: Union[str, List[str]] = None, + class_prior_prompt: Optional[str] = None, + num_class_images: Optional[int] = 3, + prior_loss_weight: float = 0, + finetune_text_encoder: bool = False, + dtype: str = 'fp16', + enable_xformers: bool = True, + data_preprocessor: Optional[ModelType] = dict( + type='EditDataPreprocessor'), + init_cfg: Optional[dict] = None): + + super().__init__(vae, text_encoder, tokenizer, unet, scheduler, + test_scheduler, enable_xformers, data_preprocessor, + init_cfg) + self.num_class_images = num_class_images + self.class_prior_prompt = class_prior_prompt + self.prior_loss_weight = prior_loss_weight + self.class_images = [] + + self.dtype = torch.float32 + if dtype == 'fp16': + self.dtype = torch.float16 + elif dtype == 'bf16': + self.dtype = torch.bfloat16 + else: + assert dtype in [ + 'fp32', None + ], ('dtype must be one of \'fp32\', \'fp16\', \'bf16\' or None.') + + self.finetune_text_encoder = finetune_text_encoder + self.val_prompts = val_prompts + self.lora_config = deepcopy(lora_config) + + self.prepare_model() + self.set_lora() + + @torch.no_grad() + def generate_class_prior_images(self, num_batches=None): + """Generate images for class prior loss. + + Args: + num_batches (int): Number of batches to generate images. + If not passed, all images will be generated in one + forward. Defaults to None. + """ + if self.prior_loss_weight == 0: + return + if self.class_images: + return + + assert self.class_prior_prompt is not None, ( + '\'class_prior_prompt\' must be set when \'prior_loss_weight\' is ' + 'larger than 0.') + assert self.num_class_images is not None, ( + '\'num_class_images\' must be set when \'prior_loss_weight\' is ' + 'larger than 0.') + + print_log( + 'Generating class prior images with prompt: ' + f'{self.class_prior_prompt}', 'current') + num_batches = num_batches or self.num_class_images + + unet_dtype = next(self.unet.parameters()).dtype + self.unet.to(self.dtype) + for idx in range(0, self.num_class_images, num_batches): + prompt = self.class_prior_prompt + if self.num_class_images > 1: + prompt += f' {idx + 1} of {self.num_class_images}' + + output = self.infer(prompt, return_type='tensor') + samples = output['samples'] + self.class_images.append(samples.clamp(-1, 1)) + self.unet.to(unet_dtype) + + def prepare_model(self): + """Prepare model for training. + + Move model to target dtype and disable gradient for some models. + """ + self.vae.requires_grad_(False) + print_log('Set VAE untrainable.', 'current') + self.vae.to(self.dtype) + print_log(f'Move VAE to {self.dtype}.', 'current') + if not self.finetune_text_encoder or self.lora_config: + self.text_encoder.requires_grad_(False) + print_log('Set Text Encoder untrainable.', 'current') + self.text_encoder.to(self.dtype) + print_log(f'Move Text Encoder to {self.dtype}.', 'current') + if self.lora_config: + self.unet.requires_grad_(False) + print_log('Set Unet untrainable.', 'current') + + def set_lora(self): + """Set LORA for model.""" + if self.lora_config: + set_lora(self.unet, self.lora_config) + + @torch.no_grad() + def val_step(self, data: dict) -> SampleList: + """Gets the generated image of given data. Calls + ``self.data_preprocessor`` and ``self.infer`` in order. Return the + generated results which will be passed to evaluator or visualizer. + + Args: + data (dict or tuple or list): Data sampled from dataset. + + Returns: + SampleList: Generated image or image dict. + """ + data = self.data_preprocessor(data) + data_samples = data['data_samples'] + if self.val_prompts is None: + prompt = data_samples.prompt + else: + prompt = self.val_prompts + # construct a fake data_sample for destruct + data_samples.split() * len(prompt) + data_samples = EditDataSample.stack(data_samples.split() * + len(prompt)) + + unet_dtype = next(self.unet.parameters()).dtype + self.unet.to(self.dtype) + + output = self.infer(prompt, return_type='tensor') + samples = output['samples'] + + self.unet.to(unet_dtype) + + samples = self.data_preprocessor.destruct(samples, data_samples) + + out_data_sample = EditDataSample(fake_img=samples, prompt=prompt) + data_sample_list = out_data_sample.split() + return data_sample_list + + @torch.no_grad() + def test_step(self, data: dict) -> SampleList: + """Gets the generated image of given data. Calls + ``self.data_preprocessor`` and ``self.infer`` in order. Return the + generated results which will be passed to evaluator or visualizer. + + Args: + data (dict or tuple or list): Data sampled from dataset. + + Returns: + SampleList: Generated image or image dict. + """ + if self.val_prompts is None: + data = self.data_preprocessor(data) + data_samples = data['data_samples'] + prompt = data_samples.prompt + else: + prompt = self.val_prompts + # construct a fake data_sample for destruct + data_samples = EditDataSample.stack(data['data_samples'] * + len(prompt)) + + unet_dtype = next(self.unet.parameters()).dtype + self.unet.to(self.dtype) + + output = self.infer(prompt, return_type='tensor') + samples = output['samples'] + + self.unet.to(unet_dtype) + + samples = self.data_preprocessor.destruct(samples, data_samples) + + out_data_sample = EditDataSample(fake_img=samples, prompt=prompt) + data_sample_list = out_data_sample.split() + return data_sample_list + + def train_step(self, data, optim_wrapper): + + data = self.data_preprocessor(data) + inputs, data_samples = data['inputs'], data['data_samples'] + + with optim_wrapper.optim_context(self.unet): + image = inputs # image for new concept + prompt = data_samples.prompt + num_batches = image.shape[0] + + if self.prior_loss_weight != 0: + # image and prompt for prior preservation + self.generate_class_prior_images(num_batches=num_batches) + class_images_used = [] + for _ in range(num_batches): + idx = random.randint(0, len(self.class_images) - 1) + class_images_used.append(self.class_images[idx]) + + image = torch.cat([image, *class_images_used], dim=0) + prompt = prompt + [self.class_prior_prompt] + + image = image.to(self.dtype) + latents = self.vae.encode(image).latent_dist.sample() + latents = latents * self.vae.config.scaling_factor + + noise = torch.randn_like(latents) + timesteps = torch.randint( + 0, + self.scheduler.num_train_timesteps, (num_batches, ), + device=self.device) + timesteps = timesteps.long() + + noisy_latents = self.scheduler.add_noise(latents, noise, timesteps) + + input_ids = self.tokenizer( + prompt, + max_length=self.tokenizer.model_max_length, + return_tensors='pt', + padding='max_length', + truncation=True)['input_ids'].to(self.device) + + encoder_hidden_states = self.text_encoder(input_ids)[0] + + if self.scheduler.config.prediction_type == 'epsilon': + gt = noise + elif self.scheduler.config.prediction_type == 'v_prediction': + gt = self.scheduler.get_velocity(latents, noise, timesteps) + else: + raise ValueError('Unknown prediction type ' + f'{self.scheduler.config.prediction_type}') + + # NOTE: we train unet in fp32, convert to float manually + model_output = self.unet( + noisy_latents.float(), + timesteps, + encoder_hidden_states=encoder_hidden_states.float()) + model_pred = model_output['sample'] + + loss_dict = dict() + if self.prior_loss_weight != 0: + model_pred, prior_pred = model_pred.split(2, dim=1) + gt, prior_gt = gt.split(2, dim=1) + # calculate loss in FP32 + dreambooth_loss = F.mse_loss(model_pred.float(), gt.float()) + prior_loss = F.mse_loss(prior_pred.float(), prior_gt.float()) + loss_dict['dreambooth_loss'] = dreambooth_loss + loss_dict['prior_loss'] = prior_loss * self.prior_loss_weight + + else: + # calculate loss in FP32 + dreambooth_loss = F.mse_loss(model_pred.float(), gt.float()) + loss_dict['dreambooth_loss'] = dreambooth_loss + + parsed_loss, log_vars = self.parse_losses(loss_dict) + optim_wrapper.update_params(parsed_loss) + + return log_vars + + 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/stable_diffusion.py b/mmedit/models/editors/stable_diffusion/stable_diffusion.py index de18eea99d..5eb0115337 100644 --- a/mmedit/models/editors/stable_diffusion/stable_diffusion.py +++ b/mmedit/models/editors/stable_diffusion/stable_diffusion.py @@ -5,6 +5,7 @@ import torch import torch.nn as nn +import torch.nn.functional as F from mmengine.logging import MMLogger from mmengine.model import BaseModel from mmengine.runner import set_random_seed @@ -14,6 +15,8 @@ from mmedit.models.utils import build_module, set_xformers from mmedit.registry import DIFFUSION_SCHEDULERS, MODELS +from mmedit.structures import EditDataSample +from mmedit.utils.typing import SampleList logger = MMLogger.get_current_instance() @@ -177,6 +180,10 @@ def infer(self, # 2. Define call parameters batch_size = 1 if isinstance(prompt, str) else len(prompt) device = self.device + + img_dtype = self.vae.module.dtype if hasattr(self.vae, 'module') \ + else self.vae.dtype + latent_dtype = next(self.unet.parameters()).dtype # 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 . @@ -195,7 +202,10 @@ def infer(self, timesteps = self.scheduler.timesteps # 5. Prepare latent variables - num_channels_latents = self.unet.in_channels + if hasattr(self.unet, 'module'): + num_channels_latents = self.unet.module.in_channels + else: + num_channels_latents = self.unet.in_channels latents = self.prepare_latents( batch_size * num_images_per_prompt, num_channels_latents, @@ -221,6 +231,8 @@ def infer(self, latent_model_input = self.scheduler.scale_model_input( latent_model_input, t) + latent_model_input = latent_model_input.to(latent_dtype) + text_embeddings = text_embeddings.to(latent_dtype) # predict the noise residual noise_pred = self.unet( latent_model_input, t, @@ -237,7 +249,7 @@ def infer(self, noise_pred, t, latents, **extra_step_kwargs)['prev_sample'] # 8. Post-processing - image = self.decode_latents(latents.to(self.vae.dtype)) + image = self.decode_latents(latents.to(img_dtype)) if return_type == 'image': image = self.output_to_pil(image) elif return_type == 'numpy': @@ -392,7 +404,10 @@ def decode_latents(self, latents): image (torch.Tensor): image result. """ latents = 1 / 0.18215 * latents - image = self.vae.decode(latents)['sample'] + if hasattr(self.vae, 'module'): + image = self.vae.module.decode(latents)['sample'] + else: + image = self.vae.decode(latents)['sample'] # we always cast to float32 as this does not cause # significant overhead and is compatible with bfloa16 return image.float() @@ -511,6 +526,102 @@ def prepare_latents(self, latents = latents * self.scheduler.init_noise_sigma return latents + @torch.no_grad() + def val_step(self, data: dict) -> SampleList: + data = self.data_preprocessor(data) + data_samples = data['data_samples'] + prompt = data_samples.prompt + + output = self.infer(prompt, return_type='tensor') + samples = output['samples'] + + samples = self.data_preprocessor.destruct(samples, data_samples) + gt_img = self.data_preprocessor.destruct(data['inputs'], data_samples) + + out_data_sample = EditDataSample( + fake_img=samples, gt_img=gt_img, prompt=prompt) + + # out_data_sample = EditDataSample(fake_img=samples, prompt=prompt) + data_sample_list = out_data_sample.split() + return data_sample_list + + @torch.no_grad() + def test_step(self, data: dict) -> SampleList: + data = self.data_preprocessor(data) + data_samples = data['data_samples'] + prompt = data_samples.prompt + + output = self.infer(prompt, return_type='tensor') + samples = output['samples'] + + samples = self.data_preprocessor.destruct(samples, data_samples) + gt_img = self.data_preprocessor.destruct(data['inputs'], data_samples) + + out_data_sample = EditDataSample( + fake_img=samples, gt_img=gt_img, prompt=prompt) + data_sample_list = out_data_sample.split() + return data_sample_list + + def train_step(self, data, optim_wrapper_dict): + data = self.data_preprocessor(data) + inputs, data_samples = data['inputs'], data['data_samples'] + + vae = self.vae.module if hasattr(self.vae, 'module') else self.vae + + optim_wrapper = optim_wrapper_dict['unet'] + with optim_wrapper.optim_context(self.unet): + # image = inputs['img'] # image for new concept + image = inputs + prompt = data_samples.prompt + num_batches = image.shape[0] + + image = image.to(self.dtype) + latents = vae.encode(image).latent_dist.sample() + latents = latents * vae.config.scaling_factor + + noise = torch.randn_like(latents) + timesteps = torch.randint( + 0, + self.scheduler.num_train_timesteps, (num_batches, ), + device=self.device) + timesteps = timesteps.long() + + noisy_latents = self.scheduler.add_noise(latents, noise, timesteps) + + input_ids = self.tokenizer( + prompt, + max_length=self.tokenizer.model_max_length, + return_tensors='pt', + padding='max_length', + truncation=True)['input_ids'].to(self.device) + + encoder_hidden_states = self.text_encoder(input_ids)[0] + + if self.scheduler.config.prediction_type == 'epsilon': + gt = noise + elif self.scheduler.config.prediction_type == 'v_prediction': + gt = self.scheduler.get_velocity(latents, noise, timesteps) + else: + raise ValueError('Unknown prediction type ' + f'{self.scheduler.config.prediction_type}') + + # NOTE: convert to float manually + model_output = self.unet( + noisy_latents.float(), + timesteps, + encoder_hidden_states=encoder_hidden_states.float()) + model_pred = model_output['sample'] + + loss_dict = dict() + # calculate loss in FP32 + loss_mse = F.mse_loss(model_pred.float(), gt.float()) + loss_dict['loss_mse'] = loss_mse + + parsed_loss, log_vars = self.parse_losses(loss_dict) + optim_wrapper.update_params(parsed_loss) + + return log_vars + def forward(self, inputs: torch.Tensor, data_samples: Optional[list] = None, diff --git a/model-index.yml b/model-index.yml index 625020429b..c2f648e40a 100644 --- a/model-index.yml +++ b/model-index.yml @@ -13,6 +13,7 @@ Import: - configs/dic/metafile.yml - configs/dim/metafile.yml - configs/disco_diffusion/metafile.yml +- configs/dreambooth/metafile.yml - configs/edsr/metafile.yml - configs/edvr/metafile.yml - configs/eg3d/metafile.yml diff --git a/tests/test_datasets/test_dreambooth_dataset.py b/tests/test_datasets/test_dreambooth_dataset.py new file mode 100644 index 0000000000..e2ed1f0283 --- /dev/null +++ b/tests/test_datasets/test_dreambooth_dataset.py @@ -0,0 +1,20 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os + +from mmedit.datasets import DreamBoothDataset + +# we use controlnet's dataset to test +data_dir = os.path.join(__file__, '../', '../', 'data', 'controlnet') +concept_dir = os.path.join(data_dir, 'source') + + +def test_dreambooth_dataset(): + print(os.path.abspath(data_dir)) + dataset = DreamBoothDataset( + data_root=data_dir, + concept_dir=concept_dir, + prompt='a sks ball', + ) + assert len(dataset) == 2 + for data in dataset: + assert data['prompt'] == 'a sks ball' diff --git a/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py b/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py new file mode 100644 index 0000000000..98dc6e4f70 --- /dev/null +++ b/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py @@ -0,0 +1,151 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import platform +from unittest import TestCase +from unittest.mock import MagicMock + +import pytest +import torch +import torch.nn as nn +from mmengine.utils import digit_version +from mmengine.utils.dl_utils import TORCH_VERSION + +from mmedit.registry import MODELS +from mmedit.structures import EditDataSample +from mmedit.utils import register_all_modules + +test_dir = osp.join(osp.dirname(__file__), '../../../..', 'tests') +config_path = osp.join(test_dir, 'configs', 'diffuser_wrapper_cfg') +model_path = osp.join(test_dir, 'configs', 'tmp_weight') +ckpt_path = osp.join(test_dir, 'configs', 'ckpt') + +register_all_modules() + +stable_diffusion_v15_url = 'runwayml/stable-diffusion-v1-5' +val_prompts = ['a sks dog in basket'] + +config = dict( + type='DreamBooth', + vae=dict(type='AutoencoderKL', sample_size=64), + unet=dict( + sample_size=64, + type='UNet2DConditionModel', + down_block_types=('DownBlock2D', ), + up_block_types=('UpBlock2D', ), + block_out_channels=(32, ), + cross_attention_dim=16, + ), + text_encoder=dict( + type='ClipWrapper', + clip_type='huggingface', + pretrained_model_name_or_path=stable_diffusion_v15_url, + subfolder='text_encoder'), + tokenizer=stable_diffusion_v15_url, + scheduler=dict( + type='DDPMScheduler', + from_pretrained=stable_diffusion_v15_url, + subfolder='scheduler'), + test_scheduler=dict( + type='DDIMScheduler', + from_pretrained=stable_diffusion_v15_url, + subfolder='scheduler'), + dtype='fp32', + data_preprocessor=dict(type='EditDataPreprocessor'), + enable_xformers=False, + val_prompts=val_prompts) + + +@pytest.mark.skipif( + 'win' in platform.system().lower(), + reason='skip on windows due to limited RAM.') +class TestControlStableDiffusion(TestCase): + + def setUp(self): + # mock SiLU + if digit_version(TORCH_VERSION) <= digit_version('1.6.0'): + from mmedit.models.editors.ddpm.denoising_unet import SiLU + torch.nn.SiLU = SiLU + dreambooth = MODELS.build(config) + assert not any([p.requires_grad for p in dreambooth.vae.parameters()]) + assert not any( + [p.requires_grad for p in dreambooth.text_encoder.parameters()]) + self.dreambooth = dreambooth + + def test_val_step(self): + dreambooth = self.dreambooth + data = dict( + inputs=[torch.ones([3, 64, 64])], + data_samples=[ + EditDataSample( + prompt='an insect robot preparing a delicious meal') + ]) + + def mock_encode_prompt(*args, **kwargs): + return torch.randn(2, 5, 16) # 2 for cfg + + def mock_infer(prompt, *args, **kwargs): + length = len(prompt) + return dict(samples=torch.randn(length, 3, 64, 64)) + + encode_prompt = dreambooth._encode_prompt + infer = dreambooth.infer + dreambooth._encode_prompt = mock_encode_prompt + dreambooth.infer = mock_infer + + output = dreambooth.val_step(data) + assert len(output) == 1 + dreambooth._encode_prompt = encode_prompt + dreambooth.infer = infer + + def test_test_step(self): + dreambooth = self.dreambooth + data = dict( + inputs=[torch.ones([3, 64, 64])], + data_samples=[ + EditDataSample( + prompt='an insect robot preparing a delicious meal') + ]) + + def mock_encode_prompt(*args, **kwargs): + return torch.randn(2, 5, 16) # 2 for cfg + + def mock_infer(prompt, *args, **kwargs): + length = len(prompt) + return dict(samples=torch.randn(length, 3, 64, 64)) + + encode_prompt = dreambooth._encode_prompt + infer = dreambooth.infer + dreambooth._encode_prompt = mock_encode_prompt + dreambooth.infer = mock_infer + + output = dreambooth.test_step(data) + assert len(output) == 1 + dreambooth._encode_prompt = encode_prompt + dreambooth.infer = infer + + def test_train_step(self): + return + dreambooth = self.dreambooth + data = dict( + inputs=[torch.ones([3, 64, 64])], + data_samples=[ + EditDataSample( + prompt='an insect robot preparing a delicious meal') + ]) + + optimizer = MagicMock() + update_params = MagicMock() + optimizer.update_params = update_params + optim_wrapper = optimizer + + class mock_text_encoder(nn.Module): + + def __init__(self): + super().__init__() + + def forward(self, *args, **kwargs): + return [torch.randn(1, 5, 16)] + + dreambooth.text_encoder = mock_text_encoder() + + dreambooth.train_step(data, optim_wrapper) From b3c855b5c11435ecb3723834333e6213f6e1f04c Mon Sep 17 00:00:00 2001 From: zhangjingdong <1396925302@qq.com> Date: Wed, 19 Apr 2023 16:20:53 +0800 Subject: [PATCH 15/42] [Rename] rename package to mmagic --- .pre-commit-config.yaml | 2 +- {mmedit => mmagic}/__init__.py | 0 {mmedit => mmagic}/apis/__init__.py | 0 .../apis/inferencers/__init__.py | 2 +- .../inferencers/base_mmedit_inferencer.py | 4 +- .../inferencers/colorization_inferencer.py | 4 +- .../inferencers/conditional_inferencer.py | 2 +- .../controlnet_animation_inferencer.py | 4 +- .../apis/inferencers/eg3d_inferencer.py | 4 +- .../image_super_resolution_inferencer.py | 2 +- .../apis/inferencers/inference_functions.py | 8 +-- .../apis/inferencers/inpainting_inferencer.py | 4 +- .../apis/inferencers/matting_inferencer.py | 2 +- .../apis/inferencers/text2image_inferencer.py | 0 .../inferencers/translation_inferencer.py | 2 +- .../inferencers/unconditional_inferencer.py | 2 +- .../video_interpolation_inferencer.py | 0 .../video_restoration_inferencer.py | 2 +- {mmedit => mmagic}/datasets/__init__.py | 0 .../datasets/basic_conditional_dataset.py | 2 +- .../datasets/basic_frames_dataset.py | 6 +- .../datasets/basic_image_dataset.py | 8 +-- {mmedit => mmagic}/datasets/categories.py | 0 .../datasets/cifar10_dataset.py | 2 +- {mmedit => mmagic}/datasets/comp1k_dataset.py | 2 +- .../datasets/controlnet_dataset.py | 2 +- {mmedit => mmagic}/datasets/data_utils.py | 0 .../datasets/dreambooth_dataset.py | 2 +- .../datasets/grow_scale_image_dataset.py | 2 +- .../datasets/imagenet_dataset.py | 2 +- {mmedit => mmagic}/datasets/mscoco_dataset.py | 2 +- .../datasets/paired_image_dataset.py | 2 +- {mmedit => mmagic}/datasets/singan_dataset.py | 2 +- .../datasets/transforms/__init__.py | 0 .../datasets/transforms/alpha.py | 4 +- .../datasets/transforms/aug_frames.py | 2 +- .../datasets/transforms/aug_pixel.py | 8 +-- .../datasets/transforms/aug_shape.py | 2 +- .../datasets/transforms/blur_kernels.py | 0 .../datasets/transforms/crop.py | 4 +- .../datasets/transforms/fgbg.py | 4 +- .../datasets/transforms/formatting.py | 8 +-- .../datasets/transforms/generate_assistant.py | 4 +- .../transforms/generate_frame_indices.py | 2 +- .../datasets/transforms/get_masked_image.py | 2 +- .../datasets/transforms/loading.py | 4 +- .../datasets/transforms/matlab_like_resize.py | 2 +- .../datasets/transforms/normalization.py | 2 +- .../transforms/random_degradations.py | 4 +- .../transforms/random_down_sampling.py | 2 +- .../datasets/transforms/trimap.py | 2 +- .../datasets/transforms/values.py | 2 +- .../datasets/unpaired_image_dataset.py | 2 +- {mmedit => mmagic}/edit.py | 8 +-- {mmedit => mmagic}/engine/__init__.py | 0 {mmedit => mmagic}/engine/hooks/__init__.py | 0 {mmedit => mmagic}/engine/hooks/ema.py | 0 .../engine/hooks/iter_time_hook.py | 8 +-- .../engine/hooks/pggan_fetch_data_hook.py | 9 ++- .../engine/hooks/pickle_data_hook.py | 2 +- .../engine/hooks/reduce_lr_scheduler_hook.py | 2 +- .../engine/hooks/visualization_hook.py | 8 +-- .../engine/optimizers/__init__.py | 0 .../optimizers/multi_optimizer_constructor.py | 2 +- .../optimizers/pggan_optimizer_constructor.py | 6 +- .../singan_optimizer_constructor.py | 6 +- {mmedit => mmagic}/engine/runner/__init__.py | 0 .../engine/runner/edit_loops.py | 6 +- .../engine/runner/log_processor.py | 4 +- .../engine/runner/loop_utils.py | 0 .../engine/schedulers/__init__.py | 0 .../linear_lr_scheduler_with_interval.py | 2 +- .../engine/schedulers/reduce_lr_scheduler.py | 2 +- {mmedit => mmagic}/evaluation/__init__.py | 0 {mmedit => mmagic}/evaluation/evaluator.py | 14 ++--- .../evaluation/functional/__init__.py | 0 .../evaluation/functional/fid_inception.py | 0 .../evaluation/functional/gaussian_funcs.py | 0 .../evaluation/functional/inception_utils.py | 2 +- .../evaluation/metrics/__init__.py | 0 .../evaluation/metrics/base_gen_metric.py | 4 +- .../metrics/base_sample_wise_metric.py | 2 +- .../evaluation/metrics/connectivity_error.py | 2 +- .../evaluation/metrics/equivariance.py | 2 +- {mmedit => mmagic}/evaluation/metrics/fid.py | 2 +- .../evaluation/metrics/gradient_error.py | 2 +- .../evaluation/metrics/inception_score.py | 2 +- {mmedit => mmagic}/evaluation/metrics/mae.py | 2 +- .../evaluation/metrics/matting_mse.py | 2 +- .../evaluation/metrics/metrics_utils.py | 2 +- .../evaluation/metrics/ms_ssim.py | 2 +- {mmedit => mmagic}/evaluation/metrics/mse.py | 2 +- {mmedit => mmagic}/evaluation/metrics/niqe.py | 6 +- .../evaluation/metrics/niqe_pris_params.npz | Bin {mmedit => mmagic}/evaluation/metrics/ppl.py | 4 +- .../metrics/precision_and_recall.py | 4 +- {mmedit => mmagic}/evaluation/metrics/psnr.py | 2 +- {mmedit => mmagic}/evaluation/metrics/sad.py | 2 +- {mmedit => mmagic}/evaluation/metrics/snr.py | 2 +- {mmedit => mmagic}/evaluation/metrics/ssim.py | 4 +- {mmedit => mmagic}/evaluation/metrics/swd.py | 2 +- {mmedit => mmagic}/models/__init__.py | 0 .../models/base_archs/__init__.py | 4 +- .../models/base_archs/all_gather_layer.py | 0 {mmedit => mmagic}/models/base_archs/aspp.py | 0 {mmedit => mmagic}/models/base_archs/conv.py | 2 +- .../models/base_archs/downsample.py | 0 .../models/base_archs/ensemble.py | 0 .../models/base_archs/gated_conv_module.py | 0 .../models/base_archs/img_normalize.py | 0 .../models/base_archs/linear_module.py | 0 {mmedit => mmagic}/models/base_archs/lora.py | 0 .../models/base_archs/multi_layer_disc.py | 4 +- .../models/base_archs/patch_disc.py | 4 +- .../models/base_archs/resnet.py | 0 .../base_archs/separable_conv_module.py | 0 .../base_archs/simple_encoder_decoder.py | 2 +- .../models/base_archs/smpatch_disc.py | 4 +- .../models/base_archs/sr_backbone.py | 0 .../models/base_archs/upsample.py | 0 {mmedit => mmagic}/models/base_archs/vgg.py | 2 +- .../models/base_archs/wrapper.py | 0 .../models/base_models/__init__.py | 0 .../models/base_models/average_model.py | 2 +- .../base_models/base_conditional_gan.py | 6 +- .../models/base_models/base_edit_model.py | 4 +- .../models/base_models/base_gan.py | 10 ++-- .../models/base_models/base_mattor.py | 4 +- .../base_models/base_translation_model.py | 2 +- .../models/base_models/basic_interpolator.py | 4 +- .../models/base_models/one_stage.py | 6 +- .../models/base_models/two_stage.py | 4 +- .../models/data_preprocessors/__init__.py | 0 .../edit_data_preprocessor.py | 6 +- .../data_preprocessors/mattor_preprocessor.py | 6 +- .../models/diffusion_schedulers/__init__.py | 4 +- .../diffusion_schedulers/ddim_scheduler.py | 4 +- .../diffusion_schedulers/ddpm_scheduler.py | 4 +- {mmedit => mmagic}/models/editors/__init__.py | 0 .../models/editors/aotgan/__init__.py | 0 .../models/editors/aotgan/aot_decoder.py | 2 +- .../models/editors/aotgan/aot_encoder.py | 2 +- .../editors/aotgan/aot_encoder_decoder.py | 2 +- .../models/editors/aotgan/aot_inpaintor.py | 4 +- .../models/editors/aotgan/aot_neck.py | 2 +- .../models/editors/arcface/__init__.py | 0 .../models/editors/arcface/arcface_modules.py | 0 .../models/editors/arcface/id_loss.py | 2 +- .../models/editors/arcface/model_irse.py | 0 .../models/editors/basicvsr/__init__.py | 0 .../models/editors/basicvsr/basicvsr.py | 8 +-- .../models/editors/basicvsr/basicvsr_net.py | 6 +- .../editors/basicvsr_plusplus_net/__init__.py | 0 .../basicvsr_plusplus_net.py | 6 +- .../models/editors/biggan/__init__.py | 0 .../models/editors/biggan/biggan.py | 10 ++-- .../biggan/biggan_deep_discriminator.py | 2 +- .../editors/biggan/biggan_deep_generator.py | 2 +- .../editors/biggan/biggan_discriminator.py | 2 +- .../models/editors/biggan/biggan_generator.py | 2 +- .../models/editors/biggan/biggan_modules.py | 2 +- .../models/editors/biggan/biggan_snmodule.py | 0 .../models/editors/cain/__init__.py | 0 .../models/editors/cain/cain.py | 4 +- .../models/editors/cain/cain_net.py | 6 +- .../models/editors/controlnet/__init__.py | 0 .../models/editors/controlnet/controlnet.py | 10 ++-- .../editors/controlnet/controlnet_utils.py | 0 .../models/editors/cyclegan/__init__.py | 0 .../models/editors/cyclegan/cyclegan.py | 6 +- .../editors/cyclegan/cyclegan_generator.py | 4 +- .../editors/cyclegan/cyclegan_modules.py | 0 .../models/editors/dcgan/__init__.py | 0 .../models/editors/dcgan/dcgan.py | 8 +-- .../editors/dcgan/dcgan_discriminator.py | 2 +- .../models/editors/dcgan/dcgan_generator.py | 2 +- .../models/editors/ddpm/__init__.py | 0 .../models/editors/ddpm/attention.py | 0 .../models/editors/ddpm/denoising_unet.py | 2 +- .../models/editors/ddpm/embeddings.py | 0 .../models/editors/ddpm/res_blocks.py | 0 .../models/editors/ddpm/unet_blocks.py | 0 .../models/editors/deepfillv1/__init__.py | 0 .../deepfillv1/contextual_attention.py | 0 .../deepfillv1/contextual_attention_neck.py | 6 +- .../editors/deepfillv1/deepfill_decoder.py | 4 +- .../editors/deepfillv1/deepfill_disc.py | 2 +- .../editors/deepfillv1/deepfill_encoder.py | 4 +- .../editors/deepfillv1/deepfill_refiner.py | 2 +- .../models/editors/deepfillv1/deepfillv1.py | 6 +- .../models/editors/deepfillv2/__init__.py | 0 .../deepfillv2/two_stage_encoder_decoder.py | 2 +- .../models/editors/dic/__init__.py | 0 {mmedit => mmagic}/models/editors/dic/dic.py | 4 +- .../models/editors/dic/dic_net.py | 4 +- .../models/editors/dic/feedback_hour_glass.py | 2 +- .../models/editors/dic/light_cnn.py | 2 +- .../models/editors/dim/__init__.py | 0 {mmedit => mmagic}/models/editors/dim/dim.py | 6 +- .../editors/disco_diffusion/__init__.py | 0 .../editors/disco_diffusion/clip_wrapper.py | 2 +- .../models/editors/disco_diffusion/disco.py | 2 +- .../models/editors/disco_diffusion/guider.py | 4 +- .../disco_diffusion/secondary_model.py | 2 +- .../models/editors/dreambooth/__init__.py | 0 .../models/editors/dreambooth/dreambooth.py | 8 +-- .../models/editors/duf/__init__.py | 0 {mmedit => mmagic}/models/editors/duf/duf.py | 0 .../models/editors/edsr/__init__.py | 0 .../models/editors/edsr/edsr_net.py | 6 +- .../models/editors/edvr/__init__.py | 0 .../models/editors/edvr/edvr.py | 4 +- .../models/editors/edvr/edvr_net.py | 6 +- .../models/editors/eg3d/__init__.py | 0 .../models/editors/eg3d/camera.py | 4 +- .../models/editors/eg3d/dual_discriminator.py | 2 +- .../models/editors/eg3d/eg3d.py | 12 ++-- .../models/editors/eg3d/eg3d_generator.py | 2 +- .../models/editors/eg3d/eg3d_modules.py | 0 .../models/editors/eg3d/eg3d_utils.py | 0 .../models/editors/eg3d/ray_sampler.py | 0 .../models/editors/eg3d/renderer.py | 0 .../models/editors/esrgan/__init__.py | 0 .../models/editors/esrgan/esrgan.py | 2 +- .../models/editors/esrgan/rrdb_net.py | 6 +- .../models/editors/fba/__init__.py | 0 .../models/editors/fba/fba_decoder.py | 2 +- .../models/editors/fba/fba_encoder.py | 4 +- .../models/editors/flavr/__init__.py | 0 .../models/editors/flavr/flavr.py | 6 +- .../models/editors/flavr/flavr_net.py | 2 +- .../models/editors/gca/__init__.py | 0 {mmedit => mmagic}/models/editors/gca/gca.py | 6 +- .../models/editors/gca/gca_module.py | 0 .../models/editors/gca/resgca_dec.py | 2 +- .../models/editors/gca/resgca_enc.py | 2 +- .../models/editors/ggan/__init__.py | 0 .../models/editors/ggan/ggan.py | 4 +- .../models/editors/glean/__init__.py | 0 .../models/editors/glean/glean_styleganv2.py | 6 +- .../models/editors/global_local/__init__.py | 0 .../models/editors/global_local/gl_decoder.py | 2 +- .../editors/global_local/gl_dilation.py | 4 +- .../models/editors/global_local/gl_disc.py | 4 +- .../models/editors/global_local/gl_encoder.py | 2 +- .../global_local/gl_encoder_decoder.py | 2 +- .../editors/global_local/gl_inpaintor.py | 6 +- .../editors/guided_diffusion/__init__.py | 0 .../models/editors/guided_diffusion/adm.py | 6 +- .../editors/guided_diffusion/classifier.py | 4 +- .../models/editors/iconvsr/__init__.py | 0 .../models/editors/iconvsr/iconvsr_net.py | 6 +- .../models/editors/indexnet/__init__.py | 0 .../models/editors/indexnet/indexnet.py | 6 +- .../editors/indexnet/indexnet_decoder.py | 4 +- .../editors/indexnet/indexnet_encoder.py | 4 +- .../editors/inst_colorization/__init__.py | 0 .../editors/inst_colorization/color_utils.py | 0 .../inst_colorization/colorization_net.py | 2 +- .../editors/inst_colorization/fusion_net.py | 2 +- .../inst_colorization/inst_colorization.py | 4 +- .../editors/inst_colorization/weight_layer.py | 2 +- .../models/editors/liif/__init__.py | 0 .../models/editors/liif/liif.py | 6 +- .../models/editors/liif/liif_net.py | 4 +- .../models/editors/liif/mlp_refiner.py | 2 +- .../models/editors/lsgan/__init__.py | 0 .../models/editors/lsgan/lsgan.py | 8 +-- .../editors/lsgan/lsgan_discriminator.py | 2 +- .../models/editors/lsgan/lsgan_generator.py | 2 +- .../models/editors/mspie/__init__.py | 0 .../models/editors/mspie/mspie_stylegan2.py | 6 +- .../mspie/mspie_stylegan2_discriminator.py | 2 +- .../mspie/mspie_stylegan2_generator.py | 2 +- .../editors/mspie/mspie_stylegan2_modules.py | 0 .../models/editors/mspie/pe_singan.py | 2 +- .../editors/mspie/pe_singan_generator.py | 2 +- .../editors/mspie/positional_encoding.py | 2 +- .../models/editors/nafnet/__init__.py | 0 .../models/editors/nafnet/naf_avgpool2d.py | 0 .../models/editors/nafnet/naf_layerNorm2d.py | 0 .../models/editors/nafnet/nafbaseline_net.py | 2 +- .../models/editors/nafnet/nafnet_net.py | 2 +- .../models/editors/pconv/__init__.py | 0 .../models/editors/pconv/mask_conv_module.py | 0 .../models/editors/pconv/partial_conv.py | 2 +- .../models/editors/pconv/pconv_decoder.py | 2 +- .../models/editors/pconv/pconv_encoder.py | 4 +- .../editors/pconv/pconv_encoder_decoder.py | 2 +- .../models/editors/pconv/pconv_inpaintor.py | 4 +- .../models/editors/pggan/__init__.py | 0 .../models/editors/pggan/pggan.py | 6 +- .../editors/pggan/pggan_discriminator.py | 2 +- .../models/editors/pggan/pggan_generator.py | 2 +- .../models/editors/pggan/pggan_modules.py | 4 +- .../models/editors/pix2pix/__init__.py | 0 .../models/editors/pix2pix/pix2pix.py | 6 +- .../editors/pix2pix/pix2pix_generator.py | 2 +- .../models/editors/pix2pix/pix2pix_modules.py | 0 .../models/editors/plain/__init__.py | 0 .../models/editors/plain/plain_decoder.py | 2 +- .../models/editors/plain/plain_refiner.py | 2 +- .../models/editors/rdn/__init__.py | 0 .../models/editors/rdn/rdn_net.py | 2 +- .../models/editors/real_basicvsr/__init__.py | 0 .../editors/real_basicvsr/real_basicvsr.py | 4 +- .../real_basicvsr/real_basicvsr_net.py | 2 +- .../models/editors/real_esrgan/__init__.py | 0 .../models/editors/real_esrgan/real_esrgan.py | 2 +- .../models/editors/real_esrgan/unet_disc.py | 2 +- .../models/editors/restormer/__init__.py | 0 .../models/editors/restormer/restormer_net.py | 2 +- .../models/editors/sagan/__init__.py | 0 .../models/editors/sagan/sagan.py | 10 ++-- .../editors/sagan/sagan_discriminator.py | 2 +- .../models/editors/sagan/sagan_generator.py | 4 +- .../models/editors/sagan/sagan_modules.py | 6 +- .../models/editors/singan/__init__.py | 0 .../models/editors/singan/singan.py | 12 ++-- .../editors/singan/singan_discriminator.py | 2 +- .../models/editors/singan/singan_generator.py | 2 +- .../models/editors/singan/singan_modules.py | 0 .../models/editors/srcnn/__init__.py | 0 .../models/editors/srcnn/srcnn_net.py | 2 +- .../models/editors/srgan/__init__.py | 0 .../models/editors/srgan/modified_vgg.py | 2 +- .../models/editors/srgan/sr_resnet.py | 6 +- .../models/editors/srgan/srgan.py | 6 +- .../editors/stable_diffusion/__init__.py | 0 .../editors/stable_diffusion/clip_wrapper.py | 2 +- .../stable_diffusion/stable_diffusion.py | 8 +-- .../models/editors/stable_diffusion/vae.py | 2 +- .../models/editors/stylegan1/__init__.py | 0 .../models/editors/stylegan1/stylegan1.py | 8 +-- .../stylegan1/stylegan1_discriminator.py | 2 +- .../editors/stylegan1/stylegan1_generator.py | 2 +- .../editors/stylegan1/stylegan1_modules.py | 2 +- .../editors/stylegan1/stylegan_utils.py | 0 .../models/editors/stylegan2/__init__.py | 0 .../models/editors/stylegan2/ada/__init__.py | 0 .../models/editors/stylegan2/ada/augment.py | 0 .../stylegan2/ada/grid_sample_gradfix.py | 0 .../models/editors/stylegan2/ada/misc.py | 0 .../models/editors/stylegan2/ada/upfirdn2d.py | 0 .../models/editors/stylegan2/stylegan2.py | 12 ++-- .../stylegan2/stylegan2_discriminator.py | 2 +- .../editors/stylegan2/stylegan2_generator.py | 2 +- .../editors/stylegan2/stylegan2_modules.py | 4 +- .../models/editors/stylegan3/__init__.py | 0 .../models/editors/stylegan3/stylegan3.py | 10 ++-- .../editors/stylegan3/stylegan3_generator.py | 2 +- .../editors/stylegan3/stylegan3_modules.py | 2 +- .../editors/stylegan3/stylegan3_utils.py | 0 .../models/editors/swinir/__init__.py | 0 .../models/editors/swinir/swinir_modules.py | 0 .../models/editors/swinir/swinir_net.py | 2 +- .../models/editors/swinir/swinir_rstb.py | 0 .../models/editors/swinir/swinir_utils.py | 0 .../models/editors/tdan/__init__.py | 0 .../models/editors/tdan/tdan.py | 4 +- .../models/editors/tdan/tdan_net.py | 6 +- .../models/editors/tof/__init__.py | 0 .../models/editors/tof/tof_vfi_net.py | 4 +- .../models/editors/tof/tof_vsr_net.py | 4 +- .../models/editors/ttsr/__init__.py | 0 {mmedit => mmagic}/models/editors/ttsr/lte.py | 4 +- .../models/editors/ttsr/search_transformer.py | 2 +- .../models/editors/ttsr/ttsr.py | 6 +- .../models/editors/ttsr/ttsr_disc.py | 2 +- .../models/editors/ttsr/ttsr_net.py | 6 +- .../models/editors/wgan_gp/__init__.py | 0 .../editors/wgan_gp/wgan_discriminator.py | 2 +- .../models/editors/wgan_gp/wgan_generator.py | 4 +- .../models/editors/wgan_gp/wgan_gp.py | 12 ++-- .../models/editors/wgan_gp/wgan_gp_module.py | 2 +- {mmedit => mmagic}/models/losses/__init__.py | 0 {mmedit => mmagic}/models/losses/clip_loss.py | 4 +- .../models/losses/composition_loss.py | 2 +- .../models/losses/face_id_loss.py | 2 +- .../models/losses/feature_loss.py | 4 +- {mmedit => mmagic}/models/losses/gan_loss.py | 2 +- .../models/losses/gradient_loss.py | 2 +- .../models/losses/loss_comps/__init__.py | 0 .../losses/loss_comps/clip_loss_comps.py | 2 +- .../loss_comps/disc_auxiliary_loss_comps.py | 8 +-- .../losses/loss_comps/face_id_loss_comps.py | 2 +- .../losses/loss_comps/gan_loss_comps.py | 2 +- .../loss_comps/gen_auxiliary_loss_comps.py | 4 +- .../models/losses/loss_wrapper.py | 0 .../models/losses/perceptual_loss.py | 2 +- .../models/losses/pixelwise_loss.py | 2 +- {mmedit => mmagic}/models/utils/__init__.py | 0 {mmedit => mmagic}/models/utils/bbox_utils.py | 0 .../models/utils/diffusion_utils.py | 0 {mmedit => mmagic}/models/utils/flow_warp.py | 0 .../models/utils/model_utils.py | 6 +- .../models/utils/sampling_utils.py | 0 .../models/utils/tensor_utils.py | 0 {mmedit => mmagic}/registry.py | 56 +++++++++--------- {mmedit => mmagic}/structures/__init__.py | 0 .../structures/edit_data_sample.py | 6 +- {mmedit => mmagic}/utils/__init__.py | 0 {mmedit => mmagic}/utils/cli.py | 0 {mmedit => mmagic}/utils/collect_env.py | 4 +- {mmedit => mmagic}/utils/img_utils.py | 0 {mmedit => mmagic}/utils/io_utils.py | 4 +- {mmedit => mmagic}/utils/logger.py | 0 {mmedit => mmagic}/utils/sampler.py | 0 {mmedit => mmagic}/utils/setup_env.py | 32 +++++----- {mmedit => mmagic}/utils/trans_utils.py | 0 {mmedit => mmagic}/utils/typing.py | 0 {mmedit => mmagic}/version.py | 0 {mmedit => mmagic}/visualization/__init__.py | 0 .../visualization/concat_visualizer.py | 6 +- .../visualization/gen_visualizer.py | 8 +-- .../visualization/vis_backend.py | 6 +- 416 files changed, 547 insertions(+), 548 deletions(-) rename {mmedit => mmagic}/__init__.py (100%) rename {mmedit => mmagic}/apis/__init__.py (100%) rename {mmedit => mmagic}/apis/inferencers/__init__.py (99%) rename {mmedit => mmagic}/apis/inferencers/base_mmedit_inferencer.py (98%) rename {mmedit => mmagic}/apis/inferencers/colorization_inferencer.py (97%) rename {mmedit => mmagic}/apis/inferencers/conditional_inferencer.py (98%) rename {mmedit => mmagic}/apis/inferencers/controlnet_animation_inferencer.py (98%) rename {mmedit => mmagic}/apis/inferencers/eg3d_inferencer.py (99%) rename {mmedit => mmagic}/apis/inferencers/image_super_resolution_inferencer.py (99%) rename {mmedit => mmagic}/apis/inferencers/inference_functions.py (99%) rename {mmedit => mmagic}/apis/inferencers/inpainting_inferencer.py (97%) rename {mmedit => mmagic}/apis/inferencers/matting_inferencer.py (98%) rename {mmedit => mmagic}/apis/inferencers/text2image_inferencer.py (100%) rename {mmedit => mmagic}/apis/inferencers/translation_inferencer.py (97%) rename {mmedit => mmagic}/apis/inferencers/unconditional_inferencer.py (98%) rename {mmedit => mmagic}/apis/inferencers/video_interpolation_inferencer.py (100%) rename {mmedit => mmagic}/apis/inferencers/video_restoration_inferencer.py (99%) rename {mmedit => mmagic}/datasets/__init__.py (100%) rename {mmedit => mmagic}/datasets/basic_conditional_dataset.py (99%) rename {mmedit => mmagic}/datasets/basic_frames_dataset.py (99%) rename {mmedit => mmagic}/datasets/basic_image_dataset.py (98%) rename {mmedit => mmagic}/datasets/categories.py (100%) rename {mmedit => mmagic}/datasets/cifar10_dataset.py (99%) rename {mmedit => mmagic}/datasets/comp1k_dataset.py (99%) rename {mmedit => mmagic}/datasets/controlnet_dataset.py (98%) rename {mmedit => mmagic}/datasets/data_utils.py (100%) rename {mmedit => mmagic}/datasets/dreambooth_dataset.py (97%) rename {mmedit => mmagic}/datasets/grow_scale_image_dataset.py (99%) rename {mmedit => mmagic}/datasets/imagenet_dataset.py (97%) rename {mmedit => mmagic}/datasets/mscoco_dataset.py (99%) rename {mmedit => mmagic}/datasets/paired_image_dataset.py (98%) rename {mmedit => mmagic}/datasets/singan_dataset.py (99%) rename {mmedit => mmagic}/datasets/transforms/__init__.py (100%) rename {mmedit => mmagic}/datasets/transforms/alpha.py (99%) rename {mmedit => mmagic}/datasets/transforms/aug_frames.py (98%) rename {mmedit => mmagic}/datasets/transforms/aug_pixel.py (99%) rename {mmedit => mmagic}/datasets/transforms/aug_shape.py (99%) rename {mmedit => mmagic}/datasets/transforms/blur_kernels.py (100%) rename {mmedit => mmagic}/datasets/transforms/crop.py (99%) rename {mmedit => mmagic}/datasets/transforms/fgbg.py (99%) rename {mmedit => mmagic}/datasets/transforms/formatting.py (95%) rename {mmedit => mmagic}/datasets/transforms/generate_assistant.py (98%) rename {mmedit => mmagic}/datasets/transforms/generate_frame_indices.py (99%) rename {mmedit => mmagic}/datasets/transforms/get_masked_image.py (98%) rename {mmedit => mmagic}/datasets/transforms/loading.py (99%) rename {mmedit => mmagic}/datasets/transforms/matlab_like_resize.py (99%) rename {mmedit => mmagic}/datasets/transforms/normalization.py (98%) rename {mmedit => mmagic}/datasets/transforms/random_degradations.py (99%) rename {mmedit => mmagic}/datasets/transforms/random_down_sampling.py (99%) rename {mmedit => mmagic}/datasets/transforms/trimap.py (99%) rename {mmedit => mmagic}/datasets/transforms/values.py (98%) rename {mmedit => mmagic}/datasets/unpaired_image_dataset.py (99%) rename {mmedit => mmagic}/edit.py (97%) rename {mmedit => mmagic}/engine/__init__.py (100%) rename {mmedit => mmagic}/engine/hooks/__init__.py (100%) rename {mmedit => mmagic}/engine/hooks/ema.py (100%) rename {mmedit => mmagic}/engine/hooks/iter_time_hook.py (93%) rename {mmedit => mmagic}/engine/hooks/pggan_fetch_data_hook.py (93%) rename {mmedit => mmagic}/engine/hooks/pickle_data_hook.py (99%) rename {mmedit => mmagic}/engine/hooks/reduce_lr_scheduler_hook.py (99%) rename {mmedit => mmagic}/engine/hooks/visualization_hook.py (98%) rename {mmedit => mmagic}/engine/optimizers/__init__.py (100%) rename {mmedit => mmagic}/engine/optimizers/multi_optimizer_constructor.py (99%) rename {mmedit => mmagic}/engine/optimizers/pggan_optimizer_constructor.py (96%) rename {mmedit => mmagic}/engine/optimizers/singan_optimizer_constructor.py (94%) rename {mmedit => mmagic}/engine/runner/__init__.py (100%) rename {mmedit => mmagic}/engine/runner/edit_loops.py (99%) rename {mmedit => mmagic}/engine/runner/log_processor.py (91%) rename {mmedit => mmagic}/engine/runner/loop_utils.py (100%) rename {mmedit => mmagic}/engine/schedulers/__init__.py (100%) rename {mmedit => mmagic}/engine/schedulers/linear_lr_scheduler_with_interval.py (97%) rename {mmedit => mmagic}/engine/schedulers/reduce_lr_scheduler.py (99%) rename {mmedit => mmagic}/evaluation/__init__.py (100%) rename {mmedit => mmagic}/evaluation/evaluator.py (95%) rename {mmedit => mmagic}/evaluation/functional/__init__.py (100%) rename {mmedit => mmagic}/evaluation/functional/fid_inception.py (100%) rename {mmedit => mmagic}/evaluation/functional/gaussian_funcs.py (100%) rename {mmedit => mmagic}/evaluation/functional/inception_utils.py (99%) rename {mmedit => mmagic}/evaluation/metrics/__init__.py (100%) rename {mmedit => mmagic}/evaluation/metrics/base_gen_metric.py (99%) rename {mmedit => mmagic}/evaluation/metrics/base_sample_wise_metric.py (99%) rename {mmedit => mmagic}/evaluation/metrics/connectivity_error.py (99%) rename {mmedit => mmagic}/evaluation/metrics/equivariance.py (99%) rename {mmedit => mmagic}/evaluation/metrics/fid.py (99%) rename {mmedit => mmagic}/evaluation/metrics/gradient_error.py (98%) rename {mmedit => mmagic}/evaluation/metrics/inception_score.py (99%) rename {mmedit => mmagic}/evaluation/metrics/mae.py (98%) rename {mmedit => mmagic}/evaluation/metrics/matting_mse.py (98%) rename {mmedit => mmagic}/evaluation/metrics/metrics_utils.py (99%) rename {mmedit => mmagic}/evaluation/metrics/ms_ssim.py (99%) rename {mmedit => mmagic}/evaluation/metrics/mse.py (97%) rename {mmedit => mmagic}/evaluation/metrics/niqe.py (98%) rename {mmedit => mmagic}/evaluation/metrics/niqe_pris_params.npz (100%) rename {mmedit => mmagic}/evaluation/metrics/ppl.py (99%) rename {mmedit => mmagic}/evaluation/metrics/precision_and_recall.py (99%) rename {mmedit => mmagic}/evaluation/metrics/psnr.py (99%) rename {mmedit => mmagic}/evaluation/metrics/sad.py (98%) rename {mmedit => mmagic}/evaluation/metrics/snr.py (99%) rename {mmedit => mmagic}/evaluation/metrics/ssim.py (98%) rename {mmedit => mmagic}/evaluation/metrics/swd.py (99%) rename {mmedit => mmagic}/models/__init__.py (100%) rename {mmedit => mmagic}/models/base_archs/__init__.py (97%) rename {mmedit => mmagic}/models/base_archs/all_gather_layer.py (100%) rename {mmedit => mmagic}/models/base_archs/aspp.py (100%) rename {mmedit => mmagic}/models/base_archs/conv.py (81%) rename {mmedit => mmagic}/models/base_archs/downsample.py (100%) rename {mmedit => mmagic}/models/base_archs/ensemble.py (100%) rename {mmedit => mmagic}/models/base_archs/gated_conv_module.py (100%) rename {mmedit => mmagic}/models/base_archs/img_normalize.py (100%) rename {mmedit => mmagic}/models/base_archs/linear_module.py (100%) rename {mmedit => mmagic}/models/base_archs/lora.py (100%) rename {mmedit => mmagic}/models/base_archs/multi_layer_disc.py (98%) rename {mmedit => mmagic}/models/base_archs/patch_disc.py (98%) rename {mmedit => mmagic}/models/base_archs/resnet.py (100%) rename {mmedit => mmagic}/models/base_archs/separable_conv_module.py (100%) rename {mmedit => mmagic}/models/base_archs/simple_encoder_decoder.py (96%) rename {mmedit => mmagic}/models/base_archs/smpatch_disc.py (97%) rename {mmedit => mmagic}/models/base_archs/sr_backbone.py (100%) rename {mmedit => mmagic}/models/base_archs/upsample.py (100%) rename {mmedit => mmagic}/models/base_archs/vgg.py (99%) rename {mmedit => mmagic}/models/base_archs/wrapper.py (100%) rename {mmedit => mmagic}/models/base_models/__init__.py (100%) rename {mmedit => mmagic}/models/base_models/average_model.py (99%) rename {mmedit => mmagic}/models/base_models/base_conditional_gan.py (98%) rename {mmedit => mmagic}/models/base_models/base_edit_model.py (99%) rename {mmedit => mmagic}/models/base_models/base_gan.py (98%) rename {mmedit => mmagic}/models/base_models/base_mattor.py (99%) rename {mmedit => mmagic}/models/base_models/base_translation_model.py (99%) rename {mmedit => mmagic}/models/base_models/basic_interpolator.py (98%) rename {mmedit => mmagic}/models/base_models/one_stage.py (99%) rename {mmedit => mmagic}/models/base_models/two_stage.py (99%) rename {mmedit => mmagic}/models/data_preprocessors/__init__.py (100%) rename {mmedit => mmagic}/models/data_preprocessors/edit_data_preprocessor.py (99%) rename {mmedit => mmagic}/models/data_preprocessors/mattor_preprocessor.py (98%) rename {mmedit => mmagic}/models/diffusion_schedulers/__init__.py (98%) rename {mmedit => mmagic}/models/diffusion_schedulers/ddim_scheduler.py (98%) rename {mmedit => mmagic}/models/diffusion_schedulers/ddpm_scheduler.py (98%) rename {mmedit => mmagic}/models/editors/__init__.py (100%) rename {mmedit => mmagic}/models/editors/aotgan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/aotgan/aot_decoder.py (98%) rename {mmedit => mmagic}/models/editors/aotgan/aot_encoder.py (98%) rename {mmedit => mmagic}/models/editors/aotgan/aot_encoder_decoder.py (96%) rename {mmedit => mmagic}/models/editors/aotgan/aot_inpaintor.py (98%) rename {mmedit => mmagic}/models/editors/aotgan/aot_neck.py (99%) rename {mmedit => mmagic}/models/editors/arcface/__init__.py (100%) rename {mmedit => mmagic}/models/editors/arcface/arcface_modules.py (100%) rename {mmedit => mmagic}/models/editors/arcface/id_loss.py (98%) rename {mmedit => mmagic}/models/editors/arcface/model_irse.py (100%) rename {mmedit => mmagic}/models/editors/basicvsr/__init__.py (100%) rename {mmedit => mmagic}/models/editors/basicvsr/basicvsr.py (96%) rename {mmedit => mmagic}/models/editors/basicvsr/basicvsr_net.py (98%) rename {mmedit => mmagic}/models/editors/basicvsr_plusplus_net/__init__.py (100%) rename {mmedit => mmagic}/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py (99%) rename {mmedit => mmagic}/models/editors/biggan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/biggan/biggan.py (96%) rename {mmedit => mmagic}/models/editors/biggan/biggan_deep_discriminator.py (99%) rename {mmedit => mmagic}/models/editors/biggan/biggan_deep_generator.py (99%) rename {mmedit => mmagic}/models/editors/biggan/biggan_discriminator.py (99%) rename {mmedit => mmagic}/models/editors/biggan/biggan_generator.py (99%) rename {mmedit => mmagic}/models/editors/biggan/biggan_modules.py (99%) rename {mmedit => mmagic}/models/editors/biggan/biggan_snmodule.py (100%) rename {mmedit => mmagic}/models/editors/cain/__init__.py (100%) rename {mmedit => mmagic}/models/editors/cain/cain.py (95%) rename {mmedit => mmagic}/models/editors/cain/cain_net.py (98%) rename {mmedit => mmagic}/models/editors/controlnet/__init__.py (100%) rename {mmedit => mmagic}/models/editors/controlnet/controlnet.py (99%) rename {mmedit => mmagic}/models/editors/controlnet/controlnet_utils.py (100%) rename {mmedit => mmagic}/models/editors/cyclegan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/cyclegan/cyclegan.py (98%) rename {mmedit => mmagic}/models/editors/cyclegan/cyclegan_generator.py (98%) rename {mmedit => mmagic}/models/editors/cyclegan/cyclegan_modules.py (100%) rename {mmedit => mmagic}/models/editors/dcgan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/dcgan/dcgan.py (95%) rename {mmedit => mmagic}/models/editors/dcgan/dcgan_discriminator.py (99%) rename {mmedit => mmagic}/models/editors/dcgan/dcgan_generator.py (99%) rename {mmedit => mmagic}/models/editors/ddpm/__init__.py (100%) rename {mmedit => mmagic}/models/editors/ddpm/attention.py (100%) rename {mmedit => mmagic}/models/editors/ddpm/denoising_unet.py (99%) rename {mmedit => mmagic}/models/editors/ddpm/embeddings.py (100%) rename {mmedit => mmagic}/models/editors/ddpm/res_blocks.py (100%) rename {mmedit => mmagic}/models/editors/ddpm/unet_blocks.py (100%) rename {mmedit => mmagic}/models/editors/deepfillv1/__init__.py (100%) rename {mmedit => mmagic}/models/editors/deepfillv1/contextual_attention.py (100%) rename {mmedit => mmagic}/models/editors/deepfillv1/contextual_attention_neck.py (93%) rename {mmedit => mmagic}/models/editors/deepfillv1/deepfill_decoder.py (97%) rename {mmedit => mmagic}/models/editors/deepfillv1/deepfill_disc.py (98%) rename {mmedit => mmagic}/models/editors/deepfillv1/deepfill_encoder.py (96%) rename {mmedit => mmagic}/models/editors/deepfillv1/deepfill_refiner.py (98%) rename {mmedit => mmagic}/models/editors/deepfillv1/deepfillv1.py (99%) rename {mmedit => mmagic}/models/editors/deepfillv2/__init__.py (100%) rename {mmedit => mmagic}/models/editors/deepfillv2/two_stage_encoder_decoder.py (98%) rename {mmedit => mmagic}/models/editors/dic/__init__.py (100%) rename {mmedit => mmagic}/models/editors/dic/dic.py (98%) rename {mmedit => mmagic}/models/editors/dic/dic_net.py (99%) rename {mmedit => mmagic}/models/editors/dic/feedback_hour_glass.py (99%) rename {mmedit => mmagic}/models/editors/dic/light_cnn.py (99%) rename {mmedit => mmagic}/models/editors/dim/__init__.py (100%) rename {mmedit => mmagic}/models/editors/dim/dim.py (98%) rename {mmedit => mmagic}/models/editors/disco_diffusion/__init__.py (100%) rename {mmedit => mmagic}/models/editors/disco_diffusion/clip_wrapper.py (99%) rename {mmedit => mmagic}/models/editors/disco_diffusion/disco.py (99%) rename {mmedit => mmagic}/models/editors/disco_diffusion/guider.py (99%) rename {mmedit => mmagic}/models/editors/disco_diffusion/secondary_model.py (99%) rename {mmedit => mmagic}/models/editors/dreambooth/__init__.py (100%) rename {mmedit => mmagic}/models/editors/dreambooth/dreambooth.py (98%) rename {mmedit => mmagic}/models/editors/duf/__init__.py (100%) rename {mmedit => mmagic}/models/editors/duf/duf.py (100%) rename {mmedit => mmagic}/models/editors/edsr/__init__.py (100%) rename {mmedit => mmagic}/models/editors/edsr/edsr_net.py (96%) rename {mmedit => mmagic}/models/editors/edvr/__init__.py (100%) rename {mmedit => mmagic}/models/editors/edvr/edvr.py (97%) rename {mmedit => mmagic}/models/editors/edvr/edvr_net.py (99%) rename {mmedit => mmagic}/models/editors/eg3d/__init__.py (100%) rename {mmedit => mmagic}/models/editors/eg3d/camera.py (99%) rename {mmedit => mmagic}/models/editors/eg3d/dual_discriminator.py (99%) rename {mmedit => mmagic}/models/editors/eg3d/eg3d.py (97%) rename {mmedit => mmagic}/models/editors/eg3d/eg3d_generator.py (99%) rename {mmedit => mmagic}/models/editors/eg3d/eg3d_modules.py (100%) rename {mmedit => mmagic}/models/editors/eg3d/eg3d_utils.py (100%) rename {mmedit => mmagic}/models/editors/eg3d/ray_sampler.py (100%) rename {mmedit => mmagic}/models/editors/eg3d/renderer.py (100%) rename {mmedit => mmagic}/models/editors/esrgan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/esrgan/esrgan.py (99%) rename {mmedit => mmagic}/models/editors/esrgan/rrdb_net.py (97%) rename {mmedit => mmagic}/models/editors/fba/__init__.py (100%) rename {mmedit => mmagic}/models/editors/fba/fba_decoder.py (99%) rename {mmedit => mmagic}/models/editors/fba/fba_encoder.py (93%) rename {mmedit => mmagic}/models/editors/flavr/__init__.py (100%) rename {mmedit => mmagic}/models/editors/flavr/flavr.py (94%) rename {mmedit => mmagic}/models/editors/flavr/flavr_net.py (99%) rename {mmedit => mmagic}/models/editors/gca/__init__.py (100%) rename {mmedit => mmagic}/models/editors/gca/gca.py (95%) rename {mmedit => mmagic}/models/editors/gca/gca_module.py (100%) rename {mmedit => mmagic}/models/editors/gca/resgca_dec.py (99%) rename {mmedit => mmagic}/models/editors/gca/resgca_enc.py (99%) rename {mmedit => mmagic}/models/editors/ggan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/ggan/ggan.py (98%) rename {mmedit => mmagic}/models/editors/glean/__init__.py (100%) rename {mmedit => mmagic}/models/editors/glean/glean_styleganv2.py (98%) rename {mmedit => mmagic}/models/editors/global_local/__init__.py (100%) rename {mmedit => mmagic}/models/editors/global_local/gl_decoder.py (98%) rename {mmedit => mmagic}/models/editors/global_local/gl_dilation.py (95%) rename {mmedit => mmagic}/models/editors/global_local/gl_disc.py (94%) rename {mmedit => mmagic}/models/editors/global_local/gl_encoder.py (97%) rename {mmedit => mmagic}/models/editors/global_local/gl_encoder_decoder.py (97%) rename {mmedit => mmagic}/models/editors/global_local/gl_inpaintor.py (98%) rename {mmedit => mmagic}/models/editors/guided_diffusion/__init__.py (100%) rename {mmedit => mmagic}/models/editors/guided_diffusion/adm.py (98%) rename {mmedit => mmagic}/models/editors/guided_diffusion/classifier.py (99%) rename {mmedit => mmagic}/models/editors/iconvsr/__init__.py (100%) rename {mmedit => mmagic}/models/editors/iconvsr/iconvsr_net.py (98%) rename {mmedit => mmagic}/models/editors/indexnet/__init__.py (100%) rename {mmedit => mmagic}/models/editors/indexnet/indexnet.py (95%) rename {mmedit => mmagic}/models/editors/indexnet/indexnet_decoder.py (98%) rename {mmedit => mmagic}/models/editors/indexnet/indexnet_encoder.py (99%) rename {mmedit => mmagic}/models/editors/inst_colorization/__init__.py (100%) rename {mmedit => mmagic}/models/editors/inst_colorization/color_utils.py (100%) rename {mmedit => mmagic}/models/editors/inst_colorization/colorization_net.py (99%) rename {mmedit => mmagic}/models/editors/inst_colorization/fusion_net.py (99%) rename {mmedit => mmagic}/models/editors/inst_colorization/inst_colorization.py (99%) rename {mmedit => mmagic}/models/editors/inst_colorization/weight_layer.py (99%) rename {mmedit => mmagic}/models/editors/liif/__init__.py (100%) rename {mmedit => mmagic}/models/editors/liif/liif.py (94%) rename {mmedit => mmagic}/models/editors/liif/liif_net.py (99%) rename {mmedit => mmagic}/models/editors/liif/mlp_refiner.py (96%) rename {mmedit => mmagic}/models/editors/lsgan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/lsgan/lsgan.py (95%) rename {mmedit => mmagic}/models/editors/lsgan/lsgan_discriminator.py (99%) rename {mmedit => mmagic}/models/editors/lsgan/lsgan_generator.py (99%) rename {mmedit => mmagic}/models/editors/mspie/__init__.py (100%) rename {mmedit => mmagic}/models/editors/mspie/mspie_stylegan2.py (98%) rename {mmedit => mmagic}/models/editors/mspie/mspie_stylegan2_discriminator.py (98%) rename {mmedit => mmagic}/models/editors/mspie/mspie_stylegan2_generator.py (99%) rename {mmedit => mmagic}/models/editors/mspie/mspie_stylegan2_modules.py (100%) rename {mmedit => mmagic}/models/editors/mspie/pe_singan.py (98%) rename {mmedit => mmagic}/models/editors/mspie/pe_singan_generator.py (99%) rename {mmedit => mmagic}/models/editors/mspie/positional_encoding.py (99%) rename {mmedit => mmagic}/models/editors/nafnet/__init__.py (100%) rename {mmedit => mmagic}/models/editors/nafnet/naf_avgpool2d.py (100%) rename {mmedit => mmagic}/models/editors/nafnet/naf_layerNorm2d.py (100%) rename {mmedit => mmagic}/models/editors/nafnet/nafbaseline_net.py (99%) rename {mmedit => mmagic}/models/editors/nafnet/nafnet_net.py (99%) rename {mmedit => mmagic}/models/editors/pconv/__init__.py (100%) rename {mmedit => mmagic}/models/editors/pconv/mask_conv_module.py (100%) rename {mmedit => mmagic}/models/editors/pconv/partial_conv.py (99%) rename {mmedit => mmagic}/models/editors/pconv/pconv_decoder.py (99%) rename {mmedit => mmagic}/models/editors/pconv/pconv_encoder.py (97%) rename {mmedit => mmagic}/models/editors/pconv/pconv_encoder_decoder.py (96%) rename {mmedit => mmagic}/models/editors/pconv/pconv_inpaintor.py (96%) rename {mmedit => mmagic}/models/editors/pggan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/pggan/pggan.py (99%) rename {mmedit => mmagic}/models/editors/pggan/pggan_discriminator.py (99%) rename {mmedit => mmagic}/models/editors/pggan/pggan_generator.py (99%) rename {mmedit => mmagic}/models/editors/pggan/pggan_modules.py (99%) rename {mmedit => mmagic}/models/editors/pix2pix/__init__.py (100%) rename {mmedit => mmagic}/models/editors/pix2pix/pix2pix.py (98%) rename {mmedit => mmagic}/models/editors/pix2pix/pix2pix_generator.py (99%) rename {mmedit => mmagic}/models/editors/pix2pix/pix2pix_modules.py (100%) rename {mmedit => mmagic}/models/editors/plain/__init__.py (100%) rename {mmedit => mmagic}/models/editors/plain/plain_decoder.py (99%) rename {mmedit => mmagic}/models/editors/plain/plain_refiner.py (98%) rename {mmedit => mmagic}/models/editors/rdn/__init__.py (100%) rename {mmedit => mmagic}/models/editors/rdn/rdn_net.py (99%) rename {mmedit => mmagic}/models/editors/real_basicvsr/__init__.py (100%) rename {mmedit => mmagic}/models/editors/real_basicvsr/real_basicvsr.py (98%) rename {mmedit => mmagic}/models/editors/real_basicvsr/real_basicvsr_net.py (99%) rename {mmedit => mmagic}/models/editors/real_esrgan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/real_esrgan/real_esrgan.py (99%) rename {mmedit => mmagic}/models/editors/real_esrgan/unet_disc.py (98%) rename {mmedit => mmagic}/models/editors/restormer/__init__.py (100%) rename {mmedit => mmagic}/models/editors/restormer/restormer_net.py (99%) rename {mmedit => mmagic}/models/editors/sagan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/sagan/sagan.py (96%) rename {mmedit => mmagic}/models/editors/sagan/sagan_discriminator.py (99%) rename {mmedit => mmagic}/models/editors/sagan/sagan_generator.py (99%) rename {mmedit => mmagic}/models/editors/sagan/sagan_modules.py (99%) rename {mmedit => mmagic}/models/editors/singan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/singan/singan.py (98%) rename {mmedit => mmagic}/models/editors/singan/singan_discriminator.py (98%) rename {mmedit => mmagic}/models/editors/singan/singan_generator.py (99%) rename {mmedit => mmagic}/models/editors/singan/singan_modules.py (100%) rename {mmedit => mmagic}/models/editors/srcnn/__init__.py (100%) rename {mmedit => mmagic}/models/editors/srcnn/srcnn_net.py (98%) rename {mmedit => mmagic}/models/editors/srgan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/srgan/modified_vgg.py (99%) rename {mmedit => mmagic}/models/editors/srgan/sr_resnet.py (95%) rename {mmedit => mmagic}/models/editors/srgan/srgan.py (98%) rename {mmedit => mmagic}/models/editors/stable_diffusion/__init__.py (100%) rename {mmedit => mmagic}/models/editors/stable_diffusion/clip_wrapper.py (99%) rename {mmedit => mmagic}/models/editors/stable_diffusion/stable_diffusion.py (99%) rename {mmedit => mmagic}/models/editors/stable_diffusion/vae.py (99%) rename {mmedit => mmagic}/models/editors/stylegan1/__init__.py (100%) rename {mmedit => mmagic}/models/editors/stylegan1/stylegan1.py (96%) rename {mmedit => mmagic}/models/editors/stylegan1/stylegan1_discriminator.py (99%) rename {mmedit => mmagic}/models/editors/stylegan1/stylegan1_generator.py (99%) rename {mmedit => mmagic}/models/editors/stylegan1/stylegan1_modules.py (99%) rename {mmedit => mmagic}/models/editors/stylegan1/stylegan_utils.py (100%) rename {mmedit => mmagic}/models/editors/stylegan2/__init__.py (100%) rename {mmedit => mmagic}/models/editors/stylegan2/ada/__init__.py (100%) rename {mmedit => mmagic}/models/editors/stylegan2/ada/augment.py (100%) rename {mmedit => mmagic}/models/editors/stylegan2/ada/grid_sample_gradfix.py (100%) rename {mmedit => mmagic}/models/editors/stylegan2/ada/misc.py (100%) rename {mmedit => mmagic}/models/editors/stylegan2/ada/upfirdn2d.py (100%) rename {mmedit => mmagic}/models/editors/stylegan2/stylegan2.py (97%) rename {mmedit => mmagic}/models/editors/stylegan2/stylegan2_discriminator.py (99%) rename {mmedit => mmagic}/models/editors/stylegan2/stylegan2_generator.py (99%) rename {mmedit => mmagic}/models/editors/stylegan2/stylegan2_modules.py (99%) rename {mmedit => mmagic}/models/editors/stylegan3/__init__.py (100%) rename {mmedit => mmagic}/models/editors/stylegan3/stylegan3.py (97%) rename {mmedit => mmagic}/models/editors/stylegan3/stylegan3_generator.py (99%) rename {mmedit => mmagic}/models/editors/stylegan3/stylegan3_modules.py (99%) rename {mmedit => mmagic}/models/editors/stylegan3/stylegan3_utils.py (100%) rename {mmedit => mmagic}/models/editors/swinir/__init__.py (100%) rename {mmedit => mmagic}/models/editors/swinir/swinir_modules.py (100%) rename {mmedit => mmagic}/models/editors/swinir/swinir_net.py (99%) rename {mmedit => mmagic}/models/editors/swinir/swinir_rstb.py (100%) rename {mmedit => mmagic}/models/editors/swinir/swinir_utils.py (100%) rename {mmedit => mmagic}/models/editors/tdan/__init__.py (100%) rename {mmedit => mmagic}/models/editors/tdan/tdan.py (97%) rename {mmedit => mmagic}/models/editors/tdan/tdan_net.py (97%) rename {mmedit => mmagic}/models/editors/tof/__init__.py (100%) rename {mmedit => mmagic}/models/editors/tof/tof_vfi_net.py (99%) rename {mmedit => mmagic}/models/editors/tof/tof_vsr_net.py (98%) rename {mmedit => mmagic}/models/editors/ttsr/__init__.py (100%) rename {mmedit => mmagic}/models/editors/ttsr/lte.py (96%) rename {mmedit => mmagic}/models/editors/ttsr/search_transformer.py (99%) rename {mmedit => mmagic}/models/editors/ttsr/ttsr.py (98%) rename {mmedit => mmagic}/models/editors/ttsr/ttsr_disc.py (97%) rename {mmedit => mmagic}/models/editors/ttsr/ttsr_net.py (98%) rename {mmedit => mmagic}/models/editors/wgan_gp/__init__.py (100%) rename {mmedit => mmagic}/models/editors/wgan_gp/wgan_discriminator.py (99%) rename {mmedit => mmagic}/models/editors/wgan_gp/wgan_generator.py (98%) rename {mmedit => mmagic}/models/editors/wgan_gp/wgan_gp.py (93%) rename {mmedit => mmagic}/models/editors/wgan_gp/wgan_gp_module.py (99%) rename {mmedit => mmagic}/models/losses/__init__.py (100%) rename {mmedit => mmagic}/models/losses/clip_loss.py (98%) rename {mmedit => mmagic}/models/losses/composition_loss.py (99%) rename {mmedit => mmagic}/models/losses/face_id_loss.py (98%) rename {mmedit => mmagic}/models/losses/feature_loss.py (97%) rename {mmedit => mmagic}/models/losses/gan_loss.py (99%) rename {mmedit => mmagic}/models/losses/gradient_loss.py (98%) rename {mmedit => mmagic}/models/losses/loss_comps/__init__.py (100%) rename {mmedit => mmagic}/models/losses/loss_comps/clip_loss_comps.py (99%) rename {mmedit => mmagic}/models/losses/loss_comps/disc_auxiliary_loss_comps.py (98%) rename {mmedit => mmagic}/models/losses/loss_comps/face_id_loss_comps.py (99%) rename {mmedit => mmagic}/models/losses/loss_comps/gan_loss_comps.py (99%) rename {mmedit => mmagic}/models/losses/loss_comps/gen_auxiliary_loss_comps.py (98%) rename {mmedit => mmagic}/models/losses/loss_wrapper.py (100%) rename {mmedit => mmagic}/models/losses/perceptual_loss.py (99%) rename {mmedit => mmagic}/models/losses/pixelwise_loss.py (99%) rename {mmedit => mmagic}/models/utils/__init__.py (100%) rename {mmedit => mmagic}/models/utils/bbox_utils.py (100%) rename {mmedit => mmagic}/models/utils/diffusion_utils.py (100%) rename {mmedit => mmagic}/models/utils/flow_warp.py (100%) rename {mmedit => mmagic}/models/utils/model_utils.py (98%) rename {mmedit => mmagic}/models/utils/sampling_utils.py (100%) rename {mmedit => mmagic}/models/utils/tensor_utils.py (100%) rename {mmedit => mmagic}/registry.py (82%) rename {mmedit => mmagic}/structures/__init__.py (100%) rename {mmedit => mmagic}/structures/edit_data_sample.py (98%) rename {mmedit => mmagic}/utils/__init__.py (100%) rename {mmedit => mmagic}/utils/cli.py (100%) rename {mmedit => mmagic}/utils/collect_env.py (82%) rename {mmedit => mmagic}/utils/img_utils.py (100%) rename {mmedit => mmagic}/utils/io_utils.py (98%) rename {mmedit => mmagic}/utils/logger.py (100%) rename {mmedit => mmagic}/utils/sampler.py (100%) rename {mmedit => mmagic}/utils/setup_env.py (67%) rename {mmedit => mmagic}/utils/trans_utils.py (100%) rename {mmedit => mmagic}/utils/typing.py (100%) rename {mmedit => mmagic}/version.py (100%) rename {mmedit => mmagic}/visualization/__init__.py (100%) rename {mmedit => mmagic}/visualization/concat_visualizer.py (97%) rename {mmedit => mmagic}/visualization/gen_visualizer.py (98%) rename {mmedit => mmagic}/visualization/vis_backend.py (99%) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 17ae33ce5e..60074bfbff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -62,7 +62,7 @@ repos: hooks: - id: check-algo-readme - id: check-copyright - args: ["demo", "mmedit", "tests", "tools"] + args: ["demo", "mmagic", "tests", "tools"] - id: remove-improper-eol-in-cn-docs - repo: local hooks: diff --git a/mmedit/__init__.py b/mmagic/__init__.py similarity index 100% rename from mmedit/__init__.py rename to mmagic/__init__.py diff --git a/mmedit/apis/__init__.py b/mmagic/apis/__init__.py similarity index 100% rename from mmedit/apis/__init__.py rename to mmagic/apis/__init__.py diff --git a/mmedit/apis/inferencers/__init__.py b/mmagic/apis/inferencers/__init__.py similarity index 99% rename from mmedit/apis/inferencers/__init__.py rename to mmagic/apis/inferencers/__init__.py index 620950b062..4bcf954b69 100644 --- a/mmedit/apis/inferencers/__init__.py +++ b/mmagic/apis/inferencers/__init__.py @@ -3,7 +3,7 @@ import torch -from mmedit.utils import ConfigType +from mmagic.utils import ConfigType from .colorization_inferencer import ColorizationInferencer from .conditional_inferencer import ConditionalInferencer from .controlnet_animation_inferencer import ControlnetAnimationInferencer diff --git a/mmedit/apis/inferencers/base_mmedit_inferencer.py b/mmagic/apis/inferencers/base_mmedit_inferencer.py similarity index 98% rename from mmedit/apis/inferencers/base_mmedit_inferencer.py rename to mmagic/apis/inferencers/base_mmedit_inferencer.py index c32b5ced36..7807d44276 100644 --- a/mmedit/apis/inferencers/base_mmedit_inferencer.py +++ b/mmagic/apis/inferencers/base_mmedit_inferencer.py @@ -11,8 +11,8 @@ from mmengine.structures import BaseDataElement from torchvision import utils -from mmedit.registry import MODELS -from mmedit.utils import ConfigType, SampleList, register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import ConfigType, SampleList, register_all_modules from .inference_functions import set_random_seed InputType = Union[str, int, np.ndarray] diff --git a/mmedit/apis/inferencers/colorization_inferencer.py b/mmagic/apis/inferencers/colorization_inferencer.py similarity index 97% rename from mmedit/apis/inferencers/colorization_inferencer.py rename to mmagic/apis/inferencers/colorization_inferencer.py index 83c4a5dad5..5bd06ffaa9 100644 --- a/mmedit/apis/inferencers/colorization_inferencer.py +++ b/mmagic/apis/inferencers/colorization_inferencer.py @@ -9,8 +9,8 @@ from mmengine.dataset import Compose from mmengine.dataset.utils import default_collate as collate -from mmedit.structures import EditDataSample -from mmedit.utils import tensor2img +from mmagic.structures import EditDataSample +from mmagic.utils import tensor2img from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType diff --git a/mmedit/apis/inferencers/conditional_inferencer.py b/mmagic/apis/inferencers/conditional_inferencer.py similarity index 98% rename from mmedit/apis/inferencers/conditional_inferencer.py rename to mmagic/apis/inferencers/conditional_inferencer.py index 9c103d2dc0..f0c9a0a4d5 100644 --- a/mmedit/apis/inferencers/conditional_inferencer.py +++ b/mmagic/apis/inferencers/conditional_inferencer.py @@ -7,7 +7,7 @@ from mmengine import mkdir_or_exist from torchvision import utils -from mmedit.structures import EditDataSample +from mmagic.structures import EditDataSample from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType diff --git a/mmedit/apis/inferencers/controlnet_animation_inferencer.py b/mmagic/apis/inferencers/controlnet_animation_inferencer.py similarity index 98% rename from mmedit/apis/inferencers/controlnet_animation_inferencer.py rename to mmagic/apis/inferencers/controlnet_animation_inferencer.py index 7b3c42cd44..fa32c4abfb 100644 --- a/mmedit/apis/inferencers/controlnet_animation_inferencer.py +++ b/mmagic/apis/inferencers/controlnet_animation_inferencer.py @@ -12,8 +12,8 @@ from mmengine.config import Config from mmengine.runner import set_random_seed -from mmedit.registry import DIFFUSION_SCHEDULERS, MODELS -from mmedit.utils import ConfigType +from mmagic.registry import DIFFUSION_SCHEDULERS, MODELS +from mmagic.utils import ConfigType from .base_mmedit_inferencer import BaseMMEditInferencer VIDEO_EXTENSIONS = ('.mp4', '.mov', '.avi') diff --git a/mmedit/apis/inferencers/eg3d_inferencer.py b/mmagic/apis/inferencers/eg3d_inferencer.py similarity index 99% rename from mmedit/apis/inferencers/eg3d_inferencer.py rename to mmagic/apis/inferencers/eg3d_inferencer.py index 861fa684a9..d5e59a18e3 100644 --- a/mmedit/apis/inferencers/eg3d_inferencer.py +++ b/mmagic/apis/inferencers/eg3d_inferencer.py @@ -13,8 +13,8 @@ from torch.nn import functional as F from torchvision.utils import make_grid -from mmedit.structures import EditDataSample -from mmedit.utils import ForwardInputs, try_import +from mmagic.structures import EditDataSample +from mmagic.utils import ForwardInputs, try_import from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType from .inference_functions import calculate_grid_size diff --git a/mmedit/apis/inferencers/image_super_resolution_inferencer.py b/mmagic/apis/inferencers/image_super_resolution_inferencer.py similarity index 99% rename from mmedit/apis/inferencers/image_super_resolution_inferencer.py rename to mmagic/apis/inferencers/image_super_resolution_inferencer.py index 59ba88fea7..180ba50ead 100644 --- a/mmedit/apis/inferencers/image_super_resolution_inferencer.py +++ b/mmagic/apis/inferencers/image_super_resolution_inferencer.py @@ -9,7 +9,7 @@ from mmengine.dataset import Compose from mmengine.dataset.utils import default_collate as collate -from mmedit.utils import tensor2img +from mmagic.utils import tensor2img from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType diff --git a/mmedit/apis/inferencers/inference_functions.py b/mmagic/apis/inferencers/inference_functions.py similarity index 99% rename from mmedit/apis/inferencers/inference_functions.py rename to mmagic/apis/inferencers/inference_functions.py index 18d4f10a53..97a595968b 100644 --- a/mmedit/apis/inferencers/inference_functions.py +++ b/mmagic/apis/inferencers/inference_functions.py @@ -19,9 +19,9 @@ from mmengine.utils import ProgressBar from torch.nn.parallel import scatter -from mmedit.models.base_models import BaseTranslationModel -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models.base_models import BaseTranslationModel +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample VIDEO_EXTENSIONS = ('.mp4', '.mov', '.avi') FILE_CLIENT = get_file_backend(backend_args={'backend': 'local'}) @@ -82,7 +82,7 @@ def init_model(config, checkpoint=None, device='cuda:0'): # config.test_cfg.metrics = None delete_cfg(config.model, 'init_cfg') - init_default_scope(config.get('default_scope', 'mmedit')) + init_default_scope(config.get('default_scope', 'mmagic')) model = MODELS.build(config.model) diff --git a/mmedit/apis/inferencers/inpainting_inferencer.py b/mmagic/apis/inferencers/inpainting_inferencer.py similarity index 97% rename from mmedit/apis/inferencers/inpainting_inferencer.py rename to mmagic/apis/inferencers/inpainting_inferencer.py index 6dfd4d1193..97c1189aa7 100644 --- a/mmedit/apis/inferencers/inpainting_inferencer.py +++ b/mmagic/apis/inferencers/inpainting_inferencer.py @@ -10,8 +10,8 @@ from mmengine.dataset.utils import default_collate as collate from torch.nn.parallel import scatter -from mmedit.structures import EditDataSample -from mmedit.utils import tensor2img +from mmagic.structures import EditDataSample +from mmagic.utils import tensor2img from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType diff --git a/mmedit/apis/inferencers/matting_inferencer.py b/mmagic/apis/inferencers/matting_inferencer.py similarity index 98% rename from mmedit/apis/inferencers/matting_inferencer.py rename to mmagic/apis/inferencers/matting_inferencer.py index 1c4ad351b5..e2679590c6 100644 --- a/mmedit/apis/inferencers/matting_inferencer.py +++ b/mmagic/apis/inferencers/matting_inferencer.py @@ -10,7 +10,7 @@ from mmengine.dataset.utils import default_collate as collate from torch.nn.parallel import scatter -from mmedit.structures import EditDataSample +from mmagic.structures import EditDataSample from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType diff --git a/mmedit/apis/inferencers/text2image_inferencer.py b/mmagic/apis/inferencers/text2image_inferencer.py similarity index 100% rename from mmedit/apis/inferencers/text2image_inferencer.py rename to mmagic/apis/inferencers/text2image_inferencer.py diff --git a/mmedit/apis/inferencers/translation_inferencer.py b/mmagic/apis/inferencers/translation_inferencer.py similarity index 97% rename from mmedit/apis/inferencers/translation_inferencer.py rename to mmagic/apis/inferencers/translation_inferencer.py index 63976fba40..c5ffc8e29b 100644 --- a/mmedit/apis/inferencers/translation_inferencer.py +++ b/mmagic/apis/inferencers/translation_inferencer.py @@ -9,7 +9,7 @@ from mmengine.dataset.utils import default_collate as collate from torchvision import utils -from mmedit.models.base_models import BaseTranslationModel +from mmagic.models.base_models import BaseTranslationModel from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType diff --git a/mmedit/apis/inferencers/unconditional_inferencer.py b/mmagic/apis/inferencers/unconditional_inferencer.py similarity index 98% rename from mmedit/apis/inferencers/unconditional_inferencer.py rename to mmagic/apis/inferencers/unconditional_inferencer.py index 1088080c35..0510f2a037 100644 --- a/mmedit/apis/inferencers/unconditional_inferencer.py +++ b/mmagic/apis/inferencers/unconditional_inferencer.py @@ -7,7 +7,7 @@ from mmengine import mkdir_or_exist from torchvision import utils -from mmedit.structures import EditDataSample +from mmagic.structures import EditDataSample from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType diff --git a/mmedit/apis/inferencers/video_interpolation_inferencer.py b/mmagic/apis/inferencers/video_interpolation_inferencer.py similarity index 100% rename from mmedit/apis/inferencers/video_interpolation_inferencer.py rename to mmagic/apis/inferencers/video_interpolation_inferencer.py diff --git a/mmedit/apis/inferencers/video_restoration_inferencer.py b/mmagic/apis/inferencers/video_restoration_inferencer.py similarity index 99% rename from mmedit/apis/inferencers/video_restoration_inferencer.py rename to mmagic/apis/inferencers/video_restoration_inferencer.py index 5f71a2c3d7..c35011692c 100644 --- a/mmedit/apis/inferencers/video_restoration_inferencer.py +++ b/mmagic/apis/inferencers/video_restoration_inferencer.py @@ -11,7 +11,7 @@ from mmengine.dataset import Compose from mmengine.logging import MMLogger -from mmedit.utils import tensor2img +from mmagic.utils import tensor2img from .base_mmedit_inferencer import (BaseMMEditInferencer, InputsType, PredType, ResType) from .inference_functions import VIDEO_EXTENSIONS, pad_sequence diff --git a/mmedit/datasets/__init__.py b/mmagic/datasets/__init__.py similarity index 100% rename from mmedit/datasets/__init__.py rename to mmagic/datasets/__init__.py diff --git a/mmedit/datasets/basic_conditional_dataset.py b/mmagic/datasets/basic_conditional_dataset.py similarity index 99% rename from mmedit/datasets/basic_conditional_dataset.py rename to mmagic/datasets/basic_conditional_dataset.py index 562f9f3f17..2b6e3342c2 100644 --- a/mmedit/datasets/basic_conditional_dataset.py +++ b/mmagic/datasets/basic_conditional_dataset.py @@ -7,7 +7,7 @@ from mmengine.fileio import get_file_backend from mmengine.logging import MMLogger -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS from .data_utils import expanduser, find_folders, get_samples diff --git a/mmedit/datasets/basic_frames_dataset.py b/mmagic/datasets/basic_frames_dataset.py similarity index 99% rename from mmedit/datasets/basic_frames_dataset.py rename to mmagic/datasets/basic_frames_dataset.py index 0197cc4e05..745702c9d3 100644 --- a/mmedit/datasets/basic_frames_dataset.py +++ b/mmagic/datasets/basic_frames_dataset.py @@ -11,7 +11,7 @@ @DATASETS.register_module() class BasicFramesDataset(BaseDataset): - """BasicFramesDataset for open source projects in OpenMMLab/MMEditing. + """BasicFramesDataset for open source projects in OpenMMLab/MMagic. This dataset is designed for low-level vision tasks with frames, such as video super-resolution and video frame interpolation. @@ -70,8 +70,8 @@ class BasicFramesDataset(BaseDataset): Assume the file structure as the following: - mmediting (root) - ├── mmedit + mmagic (root) + ├── mmagic ├── tools ├── configs ├── data diff --git a/mmedit/datasets/basic_image_dataset.py b/mmagic/datasets/basic_image_dataset.py similarity index 98% rename from mmedit/datasets/basic_image_dataset.py rename to mmagic/datasets/basic_image_dataset.py index 0a7660d9ae..bb63bf1dc7 100644 --- a/mmedit/datasets/basic_image_dataset.py +++ b/mmagic/datasets/basic_image_dataset.py @@ -7,7 +7,7 @@ from mmengine.dataset import BaseDataset from mmengine.fileio import get_file_backend, list_from_file -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS IMG_EXTENSIONS = ('.jpg', '.JPG', '.jpeg', '.JPEG', '.png', '.PNG', '.ppm', '.PPM', '.bmp', '.BMP', '.tif', '.TIF', '.tiff', '.TIFF') @@ -15,7 +15,7 @@ @DATASETS.register_module() class BasicImageDataset(BaseDataset): - """BasicImageDataset for open source projects in OpenMMLab/MMEditing. + """BasicImageDataset for open source projects in OpenMMLab/MMagic. This dataset is designed for low-level vision tasks with image, such as super-resolution and inpainting. @@ -72,8 +72,8 @@ class BasicImageDataset(BaseDataset): .. code-block:: none - mmediting (root) - ├── mmedit + mmagic (root) + ├── mmagic ├── tools ├── configs ├── data diff --git a/mmedit/datasets/categories.py b/mmagic/datasets/categories.py similarity index 100% rename from mmedit/datasets/categories.py rename to mmagic/datasets/categories.py diff --git a/mmedit/datasets/cifar10_dataset.py b/mmagic/datasets/cifar10_dataset.py similarity index 99% rename from mmedit/datasets/cifar10_dataset.py rename to mmagic/datasets/cifar10_dataset.py index 5816f66dfe..569052c6c4 100644 --- a/mmedit/datasets/cifar10_dataset.py +++ b/mmagic/datasets/cifar10_dataset.py @@ -6,7 +6,7 @@ import numpy as np from mmengine.fileio import get_file_backend -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS from .basic_conditional_dataset import BasicConditionalDataset from .categories import CIFAR10_CATEGORIES from .data_utils import check_md5, download_and_extract_archive diff --git a/mmedit/datasets/comp1k_dataset.py b/mmagic/datasets/comp1k_dataset.py similarity index 99% rename from mmedit/datasets/comp1k_dataset.py rename to mmagic/datasets/comp1k_dataset.py index f3308a4733..3e8380b3d7 100644 --- a/mmedit/datasets/comp1k_dataset.py +++ b/mmagic/datasets/comp1k_dataset.py @@ -6,7 +6,7 @@ from mmengine.dataset import BaseDataset from mmengine.fileio import load -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS @DATASETS.register_module() diff --git a/mmedit/datasets/controlnet_dataset.py b/mmagic/datasets/controlnet_dataset.py similarity index 98% rename from mmedit/datasets/controlnet_dataset.py rename to mmagic/datasets/controlnet_dataset.py index 9f258b8109..6a1ac9180d 100644 --- a/mmedit/datasets/controlnet_dataset.py +++ b/mmagic/datasets/controlnet_dataset.py @@ -5,7 +5,7 @@ from mmengine.dataset import BaseDataset -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS @DATASETS.register_module() diff --git a/mmedit/datasets/data_utils.py b/mmagic/datasets/data_utils.py similarity index 100% rename from mmedit/datasets/data_utils.py rename to mmagic/datasets/data_utils.py diff --git a/mmedit/datasets/dreambooth_dataset.py b/mmagic/datasets/dreambooth_dataset.py similarity index 97% rename from mmedit/datasets/dreambooth_dataset.py rename to mmagic/datasets/dreambooth_dataset.py index c5426790b6..8250d59bb8 100644 --- a/mmedit/datasets/dreambooth_dataset.py +++ b/mmagic/datasets/dreambooth_dataset.py @@ -5,7 +5,7 @@ from mmengine import FileClient from mmengine.dataset import BaseDataset -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS @DATASETS.register_module() diff --git a/mmedit/datasets/grow_scale_image_dataset.py b/mmagic/datasets/grow_scale_image_dataset.py similarity index 99% rename from mmedit/datasets/grow_scale_image_dataset.py rename to mmagic/datasets/grow_scale_image_dataset.py index 345b4712db..0109c9be22 100644 --- a/mmedit/datasets/grow_scale_image_dataset.py +++ b/mmagic/datasets/grow_scale_image_dataset.py @@ -5,7 +5,7 @@ from mmengine.dataset import BaseDataset from mmengine.fileio import get_file_backend -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS @DATASETS.register_module() diff --git a/mmedit/datasets/imagenet_dataset.py b/mmagic/datasets/imagenet_dataset.py similarity index 97% rename from mmedit/datasets/imagenet_dataset.py rename to mmagic/datasets/imagenet_dataset.py index fc19171e6f..969d2292ae 100644 --- a/mmedit/datasets/imagenet_dataset.py +++ b/mmagic/datasets/imagenet_dataset.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. from typing import Optional, Union -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS from .basic_conditional_dataset import BasicConditionalDataset from .categories import IMAGENET_CATEGORIES diff --git a/mmedit/datasets/mscoco_dataset.py b/mmagic/datasets/mscoco_dataset.py similarity index 99% rename from mmedit/datasets/mscoco_dataset.py rename to mmagic/datasets/mscoco_dataset.py index 19591db114..20d9232a6b 100644 --- a/mmedit/datasets/mscoco_dataset.py +++ b/mmagic/datasets/mscoco_dataset.py @@ -6,7 +6,7 @@ import mmengine from mmengine.fileio import get_file_backend -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS from .basic_conditional_dataset import BasicConditionalDataset diff --git a/mmedit/datasets/paired_image_dataset.py b/mmagic/datasets/paired_image_dataset.py similarity index 98% rename from mmedit/datasets/paired_image_dataset.py rename to mmagic/datasets/paired_image_dataset.py index 2dc23836a4..ebf80d6a34 100644 --- a/mmedit/datasets/paired_image_dataset.py +++ b/mmagic/datasets/paired_image_dataset.py @@ -5,7 +5,7 @@ from mmengine.dataset import BaseDataset from mmengine.fileio import get_file_backend -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS IMG_EXTENSIONS = ('.jpg', '.JPG', '.jpeg', '.JPEG', '.png', '.PNG', '.ppm', '.PPM', '.bmp', '.BMP', '.tif', '.TIF', '.tiff', '.TIFF') diff --git a/mmedit/datasets/singan_dataset.py b/mmagic/datasets/singan_dataset.py similarity index 99% rename from mmedit/datasets/singan_dataset.py rename to mmagic/datasets/singan_dataset.py index 5bb049b57f..b23891ccda 100644 --- a/mmedit/datasets/singan_dataset.py +++ b/mmagic/datasets/singan_dataset.py @@ -5,7 +5,7 @@ import numpy as np from mmengine.dataset import BaseDataset -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS def create_real_pyramid(real, min_size, max_size, scale_factor_init): diff --git a/mmedit/datasets/transforms/__init__.py b/mmagic/datasets/transforms/__init__.py similarity index 100% rename from mmedit/datasets/transforms/__init__.py rename to mmagic/datasets/transforms/__init__.py diff --git a/mmedit/datasets/transforms/alpha.py b/mmagic/datasets/transforms/alpha.py similarity index 99% rename from mmedit/datasets/transforms/alpha.py rename to mmagic/datasets/transforms/alpha.py index 523307ef17..10ceda68e5 100644 --- a/mmedit/datasets/transforms/alpha.py +++ b/mmagic/datasets/transforms/alpha.py @@ -9,8 +9,8 @@ from mmcv.transforms import BaseTransform from mmengine.utils import is_list_of, is_tuple_of -from mmedit.registry import TRANSFORMS -from mmedit.utils import random_choose_unknown +from mmagic.registry import TRANSFORMS +from mmagic.utils import random_choose_unknown @TRANSFORMS.register_module() diff --git a/mmedit/datasets/transforms/aug_frames.py b/mmagic/datasets/transforms/aug_frames.py similarity index 98% rename from mmedit/datasets/transforms/aug_frames.py rename to mmagic/datasets/transforms/aug_frames.py index c8c45a0e28..5dcab2b0bd 100644 --- a/mmedit/datasets/transforms/aug_frames.py +++ b/mmagic/datasets/transforms/aug_frames.py @@ -2,7 +2,7 @@ import numpy as np from mmcv.transforms import BaseTransform -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS @TRANSFORMS.register_module() diff --git a/mmedit/datasets/transforms/aug_pixel.py b/mmagic/datasets/transforms/aug_pixel.py similarity index 99% rename from mmedit/datasets/transforms/aug_pixel.py rename to mmagic/datasets/transforms/aug_pixel.py index 96cb303df7..64d3cf5785 100644 --- a/mmedit/datasets/transforms/aug_pixel.py +++ b/mmagic/datasets/transforms/aug_pixel.py @@ -11,7 +11,7 @@ from mmcv.transforms import BaseTransform from PIL import Image -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS class BinarizeImage(BaseTransform): @@ -144,8 +144,8 @@ def __repr__(self): @TRANSFORMS.register_module() class ColorJitter(BaseTransform): - """An interface for torch color jitter so that it can be invoked in - mmediting pipeline. + """An interface for torch color jitter so that it can be invoked in mmagic + pipeline. Randomly change the brightness, contrast and saturation of an image. Modified keys are the attributes specified in "keys". @@ -380,7 +380,7 @@ def _get_params(degrees, translate, scale_ranges, shears, flip_ratio, # Because `flip` is used as a multiplier in line 479 and 480, # so -1 stands for flip and 1 stands for no flip. Thus `flip` # should be an 'inverse' flag as the result of the comparison. - # See https://github.com/open-mmlab/mmediting/pull/799 for more detail + # See https://github.com/open-mmlab/mmagic/pull/799 for more detail flip = (np.random.rand(2) > flip_ratio).astype(np.int32) * 2 - 1 return angle, translations, scale, shear, flip diff --git a/mmedit/datasets/transforms/aug_shape.py b/mmagic/datasets/transforms/aug_shape.py similarity index 99% rename from mmedit/datasets/transforms/aug_shape.py rename to mmagic/datasets/transforms/aug_shape.py index b482d9477b..8e69d9320f 100644 --- a/mmedit/datasets/transforms/aug_shape.py +++ b/mmagic/datasets/transforms/aug_shape.py @@ -8,7 +8,7 @@ from mmcv.transforms import BaseTransform from mmengine.utils import is_tuple_of -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS @TRANSFORMS.register_module() diff --git a/mmedit/datasets/transforms/blur_kernels.py b/mmagic/datasets/transforms/blur_kernels.py similarity index 100% rename from mmedit/datasets/transforms/blur_kernels.py rename to mmagic/datasets/transforms/blur_kernels.py diff --git a/mmedit/datasets/transforms/crop.py b/mmagic/datasets/transforms/crop.py similarity index 99% rename from mmedit/datasets/transforms/crop.py rename to mmagic/datasets/transforms/crop.py index a24b4e3c4e..bd12d458fd 100644 --- a/mmedit/datasets/transforms/crop.py +++ b/mmagic/datasets/transforms/crop.py @@ -12,8 +12,8 @@ from mmengine.utils import is_list_of, is_tuple_of from torch.nn.modules.utils import _pair -from mmedit.registry import TRANSFORMS -from mmedit.utils import get_box_info, random_choose_unknown, try_import +from mmagic.registry import TRANSFORMS +from mmagic.utils import get_box_info, random_choose_unknown, try_import mmdet_apis = try_import('mmdet.apis') diff --git a/mmedit/datasets/transforms/fgbg.py b/mmagic/datasets/transforms/fgbg.py similarity index 99% rename from mmedit/datasets/transforms/fgbg.py rename to mmagic/datasets/transforms/fgbg.py index e56c54441f..7e814e4f07 100644 --- a/mmedit/datasets/transforms/fgbg.py +++ b/mmagic/datasets/transforms/fgbg.py @@ -9,8 +9,8 @@ from mmcv.transforms import BaseTransform from mmengine.fileio import get_file_backend -from mmedit.registry import TRANSFORMS -from mmedit.utils import add_gaussian_noise, adjust_gamma +from mmagic.registry import TRANSFORMS +from mmagic.utils import add_gaussian_noise, adjust_gamma @TRANSFORMS.register_module() diff --git a/mmedit/datasets/transforms/formatting.py b/mmagic/datasets/transforms/formatting.py similarity index 95% rename from mmedit/datasets/transforms/formatting.py rename to mmagic/datasets/transforms/formatting.py index b525257d4b..e9a6423f90 100644 --- a/mmedit/datasets/transforms/formatting.py +++ b/mmagic/datasets/transforms/formatting.py @@ -3,16 +3,16 @@ from mmcv.transforms.base import BaseTransform -from mmedit.registry import TRANSFORMS -from mmedit.structures import EditDataSample -from mmedit.utils import all_to_tensor +from mmagic.registry import TRANSFORMS +from mmagic.structures import EditDataSample +from mmagic.utils import all_to_tensor @TRANSFORMS.register_module() class PackEditInputs(BaseTransform): """Pack data into EditDataSample for training, evaluation and testing. - MMediting follows the design of data structure from MMEngine. + MMagic follows the design of data structure from MMEngine. Data from the loader will be packed into data field of EditDataSample. More details of DataSample refer to the documentation of MMEngine: https://mmengine.readthedocs.io/en/latest/advanced_tutorials/data_element.html diff --git a/mmedit/datasets/transforms/generate_assistant.py b/mmagic/datasets/transforms/generate_assistant.py similarity index 98% rename from mmedit/datasets/transforms/generate_assistant.py rename to mmagic/datasets/transforms/generate_assistant.py index f305b34d0f..cb0634b072 100644 --- a/mmedit/datasets/transforms/generate_assistant.py +++ b/mmagic/datasets/transforms/generate_assistant.py @@ -3,8 +3,8 @@ import torch from mmcv.transforms.base import BaseTransform -from mmedit.registry import TRANSFORMS -from mmedit.utils import all_to_tensor, make_coord +from mmagic.registry import TRANSFORMS +from mmagic.utils import all_to_tensor, make_coord try: import face_alignment diff --git a/mmedit/datasets/transforms/generate_frame_indices.py b/mmagic/datasets/transforms/generate_frame_indices.py similarity index 99% rename from mmedit/datasets/transforms/generate_frame_indices.py rename to mmagic/datasets/transforms/generate_frame_indices.py index 705f325c58..8980fc223a 100644 --- a/mmedit/datasets/transforms/generate_frame_indices.py +++ b/mmagic/datasets/transforms/generate_frame_indices.py @@ -5,7 +5,7 @@ import numpy as np from mmcv.transforms import BaseTransform -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS @TRANSFORMS.register_module() diff --git a/mmedit/datasets/transforms/get_masked_image.py b/mmagic/datasets/transforms/get_masked_image.py similarity index 98% rename from mmedit/datasets/transforms/get_masked_image.py rename to mmagic/datasets/transforms/get_masked_image.py index ea65c3e122..9459940185 100644 --- a/mmedit/datasets/transforms/get_masked_image.py +++ b/mmagic/datasets/transforms/get_masked_image.py @@ -4,7 +4,7 @@ import numpy as np from mmcv.transforms.base import BaseTransform -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS @TRANSFORMS.register_module() diff --git a/mmedit/datasets/transforms/loading.py b/mmagic/datasets/transforms/loading.py similarity index 99% rename from mmedit/datasets/transforms/loading.py rename to mmagic/datasets/transforms/loading.py index e2efb5af65..a2ad5293bf 100644 --- a/mmedit/datasets/transforms/loading.py +++ b/mmagic/datasets/transforms/loading.py @@ -7,8 +7,8 @@ from mmcv.transforms import BaseTransform from mmengine.fileio import get_file_backend, list_from_file -from mmedit.registry import TRANSFORMS -from mmedit.utils import (bbox2mask, brush_stroke_mask, get_irregular_mask, +from mmagic.registry import TRANSFORMS +from mmagic.utils import (bbox2mask, brush_stroke_mask, get_irregular_mask, random_bbox) diff --git a/mmedit/datasets/transforms/matlab_like_resize.py b/mmagic/datasets/transforms/matlab_like_resize.py similarity index 99% rename from mmedit/datasets/transforms/matlab_like_resize.py rename to mmagic/datasets/transforms/matlab_like_resize.py index 52dcfca8e6..be9959ca78 100644 --- a/mmedit/datasets/transforms/matlab_like_resize.py +++ b/mmagic/datasets/transforms/matlab_like_resize.py @@ -5,7 +5,7 @@ import numpy as np from mmcv.transforms import BaseTransform -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS def get_size_from_scale(input_size, scale_factor): diff --git a/mmedit/datasets/transforms/normalization.py b/mmagic/datasets/transforms/normalization.py similarity index 98% rename from mmedit/datasets/transforms/normalization.py rename to mmagic/datasets/transforms/normalization.py index 0d239b62b3..9b4f8508e4 100644 --- a/mmedit/datasets/transforms/normalization.py +++ b/mmagic/datasets/transforms/normalization.py @@ -3,7 +3,7 @@ import numpy as np from mmcv.transforms import BaseTransform -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS @TRANSFORMS.register_module() diff --git a/mmedit/datasets/transforms/random_degradations.py b/mmagic/datasets/transforms/random_degradations.py similarity index 99% rename from mmedit/datasets/transforms/random_degradations.py rename to mmagic/datasets/transforms/random_degradations.py index 26232eb604..3abd72e11d 100644 --- a/mmedit/datasets/transforms/random_degradations.py +++ b/mmagic/datasets/transforms/random_degradations.py @@ -6,8 +6,8 @@ import cv2 import numpy as np -from mmedit.datasets.transforms import blur_kernels -from mmedit.registry import TRANSFORMS +from mmagic.datasets.transforms import blur_kernels +from mmagic.registry import TRANSFORMS try: import av diff --git a/mmedit/datasets/transforms/random_down_sampling.py b/mmagic/datasets/transforms/random_down_sampling.py similarity index 99% rename from mmedit/datasets/transforms/random_down_sampling.py rename to mmagic/datasets/transforms/random_down_sampling.py index ac85d82332..fdead932ae 100644 --- a/mmedit/datasets/transforms/random_down_sampling.py +++ b/mmagic/datasets/transforms/random_down_sampling.py @@ -6,7 +6,7 @@ from mmcv import imresize from mmcv.transforms import BaseTransform -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS @TRANSFORMS.register_module() diff --git a/mmedit/datasets/transforms/trimap.py b/mmagic/datasets/transforms/trimap.py similarity index 99% rename from mmedit/datasets/transforms/trimap.py rename to mmagic/datasets/transforms/trimap.py index 228dd2282e..d58c583648 100644 --- a/mmedit/datasets/transforms/trimap.py +++ b/mmagic/datasets/transforms/trimap.py @@ -6,7 +6,7 @@ from mmcv.transforms import BaseTransform from mmengine.utils import is_tuple_of -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS @TRANSFORMS.register_module() diff --git a/mmedit/datasets/transforms/values.py b/mmagic/datasets/transforms/values.py similarity index 98% rename from mmedit/datasets/transforms/values.py rename to mmagic/datasets/transforms/values.py index 0d42da4b9c..de5be079b2 100644 --- a/mmedit/datasets/transforms/values.py +++ b/mmagic/datasets/transforms/values.py @@ -4,7 +4,7 @@ from mmcv.transforms import BaseTransform -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS @TRANSFORMS.register_module() diff --git a/mmedit/datasets/unpaired_image_dataset.py b/mmagic/datasets/unpaired_image_dataset.py similarity index 99% rename from mmedit/datasets/unpaired_image_dataset.py rename to mmagic/datasets/unpaired_image_dataset.py index 5e43109a96..e3bb286fa8 100644 --- a/mmedit/datasets/unpaired_image_dataset.py +++ b/mmagic/datasets/unpaired_image_dataset.py @@ -6,7 +6,7 @@ from mmengine.dataset import BaseDataset, force_full_init from mmengine.fileio import get_file_backend -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS IMG_EXTENSIONS = ('.jpg', '.JPG', '.jpeg', '.JPEG', '.png', '.PNG', '.ppm', '.PPM', '.bmp', '.BMP', '.tif', '.TIF', '.tiff', '.TIFF') diff --git a/mmedit/edit.py b/mmagic/edit.py similarity index 97% rename from mmedit/edit.py rename to mmagic/edit.py index 3f531b8b13..ac35d66930 100644 --- a/mmedit/edit.py +++ b/mmagic/edit.py @@ -8,12 +8,12 @@ import yaml from mmengine.registry import init_default_scope -from mmedit.apis import Inferencers -from mmedit.apis.inferencers.base_mmedit_inferencer import InputsType +from mmagic.apis import Inferencers +from mmagic.apis.inferencers.base_mmedit_inferencer import InputsType class MMEdit: - """MMEdit API for mmediting models inference. + """MMEdit API for mmagic models inference. Args: model_name (str): Name of the editing model. @@ -118,7 +118,7 @@ def __init__(self, extra_parameters: Dict = None, seed: int = 2022, **kwargs) -> None: - init_default_scope('mmedit') + init_default_scope('mmagic') MMEdit.init_inference_supported_models_cfg() inferencer_kwargs = {} inferencer_kwargs.update( diff --git a/mmedit/engine/__init__.py b/mmagic/engine/__init__.py similarity index 100% rename from mmedit/engine/__init__.py rename to mmagic/engine/__init__.py diff --git a/mmedit/engine/hooks/__init__.py b/mmagic/engine/hooks/__init__.py similarity index 100% rename from mmedit/engine/hooks/__init__.py rename to mmagic/engine/hooks/__init__.py diff --git a/mmedit/engine/hooks/ema.py b/mmagic/engine/hooks/ema.py similarity index 100% rename from mmedit/engine/hooks/ema.py rename to mmagic/engine/hooks/ema.py diff --git a/mmedit/engine/hooks/iter_time_hook.py b/mmagic/engine/hooks/iter_time_hook.py similarity index 93% rename from mmedit/engine/hooks/iter_time_hook.py rename to mmagic/engine/hooks/iter_time_hook.py index fd0761a534..b3945eacc7 100644 --- a/mmedit/engine/hooks/iter_time_hook.py +++ b/mmagic/engine/hooks/iter_time_hook.py @@ -15,8 +15,8 @@ class EditIterTimerHook(IterTimerHook): and overwrites :meth:`self._after_iter`. This hooks should be used along with - :class:`mmedit.engine.runner.GenValLoop` and - :class:`mmedit.engine.runner.GenTestLoop`. + :class:`mmagic.engine.runner.GenValLoop` and + :class:`mmagic.engine.runner.GenTestLoop`. """ def _after_iter(self, @@ -33,8 +33,8 @@ def _after_iter(self, `runner.val_loop.total_length` or `runner.test_loop.total_length` as total number of iterations. If you want to know how `total_length` is calculated, please refers to - :meth:`mmedit.engine.runner.GenValLoop.run` and - :meth:`mmedit.engine.runner.GenTestLoop.run`. + :meth:`mmagic.engine.runner.GenValLoop.run` and + :meth:`mmagic.engine.runner.GenTestLoop.run`. Args: runner (Runner): The runner of the training validation and diff --git a/mmedit/engine/hooks/pggan_fetch_data_hook.py b/mmagic/engine/hooks/pggan_fetch_data_hook.py similarity index 93% rename from mmedit/engine/hooks/pggan_fetch_data_hook.py rename to mmagic/engine/hooks/pggan_fetch_data_hook.py index 2e0afa6850..8809697159 100644 --- a/mmedit/engine/hooks/pggan_fetch_data_hook.py +++ b/mmagic/engine/hooks/pggan_fetch_data_hook.py @@ -9,7 +9,7 @@ from mmengine.runner.loops import _InfiniteDataloaderIterator from torch.utils.data.dataloader import DataLoader -from mmedit.registry import HOOKS +from mmagic.registry import HOOKS DATA_BATCH = Optional[Sequence[dict]] @@ -77,10 +77,9 @@ def update_dataloader(self, dataloader: DataLoader, seed = sampler_orig.seed sampler = InfiniteSampler(dataset, shuffle, seed) else: - raise ValueError( - 'MMEditing only support \'DefaultSampler\' and ' - '\'InfiniteSampler\' as sampler. But receive ' - f'\'{type(sampler_orig)}\'.') + raise ValueError('MMagic only support \'DefaultSampler\' and ' + '\'InfiniteSampler\' as sampler. But receive ' + f'\'{type(sampler_orig)}\'.') num_workers = dataloader.num_workers worker_init_fn = dataloader.worker_init_fn diff --git a/mmedit/engine/hooks/pickle_data_hook.py b/mmagic/engine/hooks/pickle_data_hook.py similarity index 99% rename from mmedit/engine/hooks/pickle_data_hook.py rename to mmagic/engine/hooks/pickle_data_hook.py index 1621a07876..4b28b750d9 100644 --- a/mmedit/engine/hooks/pickle_data_hook.py +++ b/mmagic/engine/hooks/pickle_data_hook.py @@ -13,7 +13,7 @@ from mmengine.runner import Runner from torch import Tensor -from mmedit.registry import HOOKS +from mmagic.registry import HOOKS DATA_BATCH = Optional[Sequence[dict]] diff --git a/mmedit/engine/hooks/reduce_lr_scheduler_hook.py b/mmagic/engine/hooks/reduce_lr_scheduler_hook.py similarity index 99% rename from mmedit/engine/hooks/reduce_lr_scheduler_hook.py rename to mmagic/engine/hooks/reduce_lr_scheduler_hook.py index 54e27ffcd4..e715fb210e 100644 --- a/mmedit/engine/hooks/reduce_lr_scheduler_hook.py +++ b/mmagic/engine/hooks/reduce_lr_scheduler_hook.py @@ -5,7 +5,7 @@ from mmengine.hooks import ParamSchedulerHook from mmengine.runner import Runner -from mmedit.registry import HOOKS +from mmagic.registry import HOOKS DATA_BATCH = Optional[Sequence[dict]] diff --git a/mmedit/engine/hooks/visualization_hook.py b/mmagic/engine/hooks/visualization_hook.py similarity index 98% rename from mmedit/engine/hooks/visualization_hook.py rename to mmagic/engine/hooks/visualization_hook.py index b4e0d1a257..b9f153de43 100644 --- a/mmedit/engine/hooks/visualization_hook.py +++ b/mmagic/engine/hooks/visualization_hook.py @@ -15,8 +15,8 @@ from mmengine.utils import is_list_of from mmengine.visualization import Visualizer -from mmedit.structures import EditDataSample -from mmedit.utils import get_sampler +from mmagic.structures import EditDataSample +from mmagic.utils import get_sampler @HOOKS.register_module() @@ -88,7 +88,7 @@ class GenVisualizationHook(Hook): - Required key words: - 'type': Value must be string. Denotes what kind of sampler is used to - generate image. Refers to :meth:`~mmedit.utils.get_sampler`. + generate image. Refers to :meth:`~mmagic.utils.get_sampler`. - Optional key words (If not passed, will use the default value): - 'n_row': Value must be int. The number of images in one row. - 'num_samples': Value must be int. The number of samples to visualize. @@ -103,7 +103,7 @@ class GenVisualizationHook(Hook): `sample_kwargs['type']` as default. For convenience, we also define a group of alias of samplers' type for - models supported in MMEditing. Refers to + models supported in MMagic. Refers to `:attr:self.SAMPLER_TYPE_MAPPING`. Example: diff --git a/mmedit/engine/optimizers/__init__.py b/mmagic/engine/optimizers/__init__.py similarity index 100% rename from mmedit/engine/optimizers/__init__.py rename to mmagic/engine/optimizers/__init__.py diff --git a/mmedit/engine/optimizers/multi_optimizer_constructor.py b/mmagic/engine/optimizers/multi_optimizer_constructor.py similarity index 99% rename from mmedit/engine/optimizers/multi_optimizer_constructor.py rename to mmagic/engine/optimizers/multi_optimizer_constructor.py index 8f8eaf4a20..2df8f8dd03 100644 --- a/mmedit/engine/optimizers/multi_optimizer_constructor.py +++ b/mmagic/engine/optimizers/multi_optimizer_constructor.py @@ -7,7 +7,7 @@ from mmengine.optim import (DefaultOptimWrapperConstructor, OptimWrapper, OptimWrapperDict) -from mmedit.registry import (OPTIM_WRAPPER_CONSTRUCTORS, OPTIM_WRAPPERS, +from mmagic.registry import (OPTIM_WRAPPER_CONSTRUCTORS, OPTIM_WRAPPERS, OPTIMIZERS) diff --git a/mmedit/engine/optimizers/pggan_optimizer_constructor.py b/mmagic/engine/optimizers/pggan_optimizer_constructor.py similarity index 96% rename from mmedit/engine/optimizers/pggan_optimizer_constructor.py rename to mmagic/engine/optimizers/pggan_optimizer_constructor.py index 837c1e2e04..e87a6995cf 100644 --- a/mmedit/engine/optimizers/pggan_optimizer_constructor.py +++ b/mmagic/engine/optimizers/pggan_optimizer_constructor.py @@ -6,7 +6,7 @@ from mmengine.model import is_model_wrapper from mmengine.optim import DefaultOptimWrapperConstructor, OptimWrapperDict -from mmedit.registry import OPTIM_WRAPPER_CONSTRUCTORS +from mmagic.registry import OPTIM_WRAPPER_CONSTRUCTORS @OPTIM_WRAPPER_CONSTRUCTORS.register_module() @@ -18,8 +18,8 @@ class PGGANOptimWrapperConstructor: the scale is the index of the resolution scale. More detail about the resolution scale and naming rule please refers to - :class:`~mmedit.models.editors.pggan.PGGANGenerator` and - :class:`~mmedit.models.editors.pggan.PGGANDiscriminator`. + :class:`~mmagic.models.editors.pggan.PGGANGenerator` and + :class:`~mmagic.models.editors.pggan.PGGANDiscriminator`. Example: >>> # build PGGAN model diff --git a/mmedit/engine/optimizers/singan_optimizer_constructor.py b/mmagic/engine/optimizers/singan_optimizer_constructor.py similarity index 94% rename from mmedit/engine/optimizers/singan_optimizer_constructor.py rename to mmagic/engine/optimizers/singan_optimizer_constructor.py index 26ceacd168..b53d3ae6d9 100644 --- a/mmedit/engine/optimizers/singan_optimizer_constructor.py +++ b/mmagic/engine/optimizers/singan_optimizer_constructor.py @@ -4,7 +4,7 @@ import torch.nn as nn from mmengine.optim import DefaultOptimWrapperConstructor, OptimWrapperDict -from mmedit.registry import OPTIM_WRAPPER_CONSTRUCTORS +from mmagic.registry import OPTIM_WRAPPER_CONSTRUCTORS @OPTIM_WRAPPER_CONSTRUCTORS.register_module() @@ -16,8 +16,8 @@ class SinGANOptimWrapperConstructor: the scale is the index of the resolution scale. More detail about the resolution scale and naming rule please refers to - :class:`~mmedit.models.editors.singan.SinGANMultiScaleGenerator` and - :class:`~mmedit.models.editors.singan.SinGANMultiScaleDiscriminator`. + :class:`~mmagic.models.editors.singan.SinGANMultiScaleGenerator` and + :class:`~mmagic.models.editors.singan.SinGANMultiScaleDiscriminator`. Example: >>> # build SinGAN model diff --git a/mmedit/engine/runner/__init__.py b/mmagic/engine/runner/__init__.py similarity index 100% rename from mmedit/engine/runner/__init__.py rename to mmagic/engine/runner/__init__.py diff --git a/mmedit/engine/runner/edit_loops.py b/mmagic/engine/runner/edit_loops.py similarity index 99% rename from mmedit/engine/runner/edit_loops.py rename to mmagic/engine/runner/edit_loops.py index 76581680b0..ad6e3350f3 100644 --- a/mmedit/engine/runner/edit_loops.py +++ b/mmagic/engine/runner/edit_loops.py @@ -8,7 +8,7 @@ from mmengine.runner.base_loop import BaseLoop from torch.utils.data import DataLoader -from mmedit.registry import LOOPS +from mmagic.registry import LOOPS from .loop_utils import is_evaluator, update_and_check_evaluator DATALOADER_TYPE = Union[DataLoader, Dict, List] @@ -17,7 +17,7 @@ @LOOPS.register_module() class EditValLoop(BaseLoop): - """Validation loop for MMEditing models. This class support evaluate: + """Validation loop for MMagic models. This class support evaluate: 1. Metrics (metric) on a single dataset (e.g. PSNR and SSIM on DIV2K dataset) @@ -271,7 +271,7 @@ def run_iter(self, idx, data_batch: dict, metrics: Sequence[BaseMetric]): @LOOPS.register_module() class EditTestLoop(BaseLoop): - """Test loop for MMEditing models. This class support evaluate: + """Test loop for MMagic models. This class support evaluate: 1. Metrics (metric) on a single dataset (e.g. PSNR and SSIM on DIV2K dataset) diff --git a/mmedit/engine/runner/log_processor.py b/mmagic/engine/runner/log_processor.py similarity index 91% rename from mmedit/engine/runner/log_processor.py rename to mmagic/engine/runner/log_processor.py index f59894a94c..b1f4f76636 100644 --- a/mmedit/engine/runner/log_processor.py +++ b/mmagic/engine/runner/log_processor.py @@ -9,8 +9,8 @@ class EditLogProcessor(LogProcessor): overwrites :meth:`self.get_log_after_iter`. This log processor should be used along with - :class:`mmedit.engine.runner.EditValLoop` and - :class:`mmedit.engine.runner.EditTestLoop`. + :class:`mmagic.engine.runner.EditValLoop` and + :class:`mmagic.engine.runner.EditTestLoop`. """ def _get_dataloader_size(self, runner, mode) -> int: diff --git a/mmedit/engine/runner/loop_utils.py b/mmagic/engine/runner/loop_utils.py similarity index 100% rename from mmedit/engine/runner/loop_utils.py rename to mmagic/engine/runner/loop_utils.py diff --git a/mmedit/engine/schedulers/__init__.py b/mmagic/engine/schedulers/__init__.py similarity index 100% rename from mmedit/engine/schedulers/__init__.py rename to mmagic/engine/schedulers/__init__.py diff --git a/mmedit/engine/schedulers/linear_lr_scheduler_with_interval.py b/mmagic/engine/schedulers/linear_lr_scheduler_with_interval.py similarity index 97% rename from mmedit/engine/schedulers/linear_lr_scheduler_with_interval.py rename to mmagic/engine/schedulers/linear_lr_scheduler_with_interval.py index d6826b16c8..351f1389b9 100644 --- a/mmedit/engine/schedulers/linear_lr_scheduler_with_interval.py +++ b/mmagic/engine/schedulers/linear_lr_scheduler_with_interval.py @@ -2,7 +2,7 @@ from mmengine import MessageHub from mmengine.optim import LinearLR -from mmedit.registry import PARAM_SCHEDULERS +from mmagic.registry import PARAM_SCHEDULERS @PARAM_SCHEDULERS.register_module() diff --git a/mmedit/engine/schedulers/reduce_lr_scheduler.py b/mmagic/engine/schedulers/reduce_lr_scheduler.py similarity index 99% rename from mmedit/engine/schedulers/reduce_lr_scheduler.py rename to mmagic/engine/schedulers/reduce_lr_scheduler.py index f9ffc0ac58..af5166bde1 100644 --- a/mmedit/engine/schedulers/reduce_lr_scheduler.py +++ b/mmagic/engine/schedulers/reduce_lr_scheduler.py @@ -2,7 +2,7 @@ from mmengine import MessageHub from mmengine.optim import _ParamScheduler -from mmedit.registry import PARAM_SCHEDULERS +from mmagic.registry import PARAM_SCHEDULERS @PARAM_SCHEDULERS.register_module() diff --git a/mmedit/evaluation/__init__.py b/mmagic/evaluation/__init__.py similarity index 100% rename from mmedit/evaluation/__init__.py rename to mmagic/evaluation/__init__.py diff --git a/mmedit/evaluation/evaluator.py b/mmagic/evaluation/evaluator.py similarity index 95% rename from mmedit/evaluation/evaluator.py rename to mmagic/evaluation/evaluator.py index ff408ea234..dc98ef0775 100644 --- a/mmedit/evaluation/evaluator.py +++ b/mmagic/evaluation/evaluator.py @@ -7,8 +7,8 @@ from mmengine.model import BaseModel from torch.utils.data.dataloader import DataLoader -from mmedit.registry import EVALUATORS -from mmedit.structures import EditDataSample +from mmagic.registry import EVALUATORS +from mmagic.structures import EditDataSample from .metrics.base_gen_metric import GenMetric @@ -16,12 +16,12 @@ class EditEvaluator(Evaluator): """Evaluator for generative models. Unlike high-level vision tasks, metrics for generative models have various input types. For example, Inception - Score (IS, :class:`~mmedit.evaluation.InceptionScore`) only needs to + Score (IS, :class:`~mmagic.evaluation.InceptionScore`) only needs to take fake images as input. However, Frechet Inception Distance (FID, - :class:`~mmedit.evaluation.FrechetInceptionDistance`) needs to take + :class:`~mmagic.evaluation.FrechetInceptionDistance`) needs to take both real images and fake images as input, and the numbers of real images and fake images can be set arbitrarily. For Perceptual path length (PPL, - :class:`~mmedit.evaluation.PerceptualPathLength`), generator need + :class:`~mmagic.evaluation.PerceptualPathLength`), generator need to sample images along a latent path. In order to be compatible with different metrics, we designed two critical @@ -36,8 +36,8 @@ class EditEvaluator(Evaluator): same sample mode can share the sampler. The whole evaluation process can be found in - :meth:`mmedit.engine.runner.GenValLoop.run` and - :meth:`mmedit.engine.runner.GenTestLoop.run`. + :meth:`mmagic.engine.runner.GenValLoop.run` and + :meth:`mmagic.engine.runner.GenTestLoop.run`. Args: metrics (dict or BaseMetric or Sequence): The config of metrics. diff --git a/mmedit/evaluation/functional/__init__.py b/mmagic/evaluation/functional/__init__.py similarity index 100% rename from mmedit/evaluation/functional/__init__.py rename to mmagic/evaluation/functional/__init__.py diff --git a/mmedit/evaluation/functional/fid_inception.py b/mmagic/evaluation/functional/fid_inception.py similarity index 100% rename from mmedit/evaluation/functional/fid_inception.py rename to mmagic/evaluation/functional/fid_inception.py diff --git a/mmedit/evaluation/functional/gaussian_funcs.py b/mmagic/evaluation/functional/gaussian_funcs.py similarity index 100% rename from mmedit/evaluation/functional/gaussian_funcs.py rename to mmagic/evaluation/functional/gaussian_funcs.py diff --git a/mmedit/evaluation/functional/inception_utils.py b/mmagic/evaluation/functional/inception_utils.py similarity index 99% rename from mmedit/evaluation/functional/inception_utils.py rename to mmagic/evaluation/functional/inception_utils.py index 1e850d766b..009add27db 100644 --- a/mmedit/evaluation/functional/inception_utils.py +++ b/mmagic/evaluation/functional/inception_utils.py @@ -21,7 +21,7 @@ from torch.utils.data.dataset import Dataset from torchvision.models.inception import inception_v3 -from mmedit.utils import MMEDIT_CACHE_DIR, download_from_url +from mmagic.utils import MMEDIT_CACHE_DIR, download_from_url from . import InceptionV3 ALLOWED_INCEPTION = ['StyleGAN', 'PyTorch'] diff --git a/mmedit/evaluation/metrics/__init__.py b/mmagic/evaluation/metrics/__init__.py similarity index 100% rename from mmedit/evaluation/metrics/__init__.py rename to mmagic/evaluation/metrics/__init__.py diff --git a/mmedit/evaluation/metrics/base_gen_metric.py b/mmagic/evaluation/metrics/base_gen_metric.py similarity index 99% rename from mmedit/evaluation/metrics/base_gen_metric.py rename to mmagic/evaluation/metrics/base_gen_metric.py index f4dbdfddca..1ee6dfcec0 100644 --- a/mmedit/evaluation/metrics/base_gen_metric.py +++ b/mmagic/evaluation/metrics/base_gen_metric.py @@ -15,11 +15,11 @@ from torch import Tensor from torch.utils.data.dataloader import DataLoader -from mmedit.structures import EditDataSample +from mmagic.structures import EditDataSample class GenMetric(BaseMetric): - """Metric for MMEditing. + """Metric for MMagic. Args: fake_nums (int): Numbers of the generated image need for the metric. diff --git a/mmedit/evaluation/metrics/base_sample_wise_metric.py b/mmagic/evaluation/metrics/base_sample_wise_metric.py similarity index 99% rename from mmedit/evaluation/metrics/base_sample_wise_metric.py rename to mmagic/evaluation/metrics/base_sample_wise_metric.py index 3c42e96dd3..a4aa687a19 100644 --- a/mmedit/evaluation/metrics/base_sample_wise_metric.py +++ b/mmagic/evaluation/metrics/base_sample_wise_metric.py @@ -8,7 +8,7 @@ from mmengine.model import is_model_wrapper from torch.utils.data.dataloader import DataLoader -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .metrics_utils import average, obtain_data diff --git a/mmedit/evaluation/metrics/connectivity_error.py b/mmagic/evaluation/metrics/connectivity_error.py similarity index 99% rename from mmedit/evaluation/metrics/connectivity_error.py rename to mmagic/evaluation/metrics/connectivity_error.py index 0579b07f34..c719dd6c86 100644 --- a/mmedit/evaluation/metrics/connectivity_error.py +++ b/mmagic/evaluation/metrics/connectivity_error.py @@ -9,7 +9,7 @@ from mmengine.model import is_model_wrapper from torch.utils.data.dataloader import DataLoader -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .base_sample_wise_metric import BaseSampleWiseMetric from .metrics_utils import _fetch_data_and_check, average diff --git a/mmedit/evaluation/metrics/equivariance.py b/mmagic/evaluation/metrics/equivariance.py similarity index 99% rename from mmedit/evaluation/metrics/equivariance.py rename to mmagic/evaluation/metrics/equivariance.py index c9916d007d..81a15cb945 100644 --- a/mmedit/evaluation/metrics/equivariance.py +++ b/mmagic/evaluation/metrics/equivariance.py @@ -9,7 +9,7 @@ from mmengine.dist import all_gather from torch.utils.data.dataloader import DataLoader -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .base_gen_metric import GenerativeMetric diff --git a/mmedit/evaluation/metrics/fid.py b/mmagic/evaluation/metrics/fid.py similarity index 99% rename from mmedit/evaluation/metrics/fid.py rename to mmagic/evaluation/metrics/fid.py index e218f2d934..470317862d 100644 --- a/mmedit/evaluation/metrics/fid.py +++ b/mmagic/evaluation/metrics/fid.py @@ -9,7 +9,7 @@ from torch import Tensor from torch.utils.data.dataloader import DataLoader -from mmedit.registry import METRICS +from mmagic.registry import METRICS from ..functional import (disable_gpu_fuser_on_pt19, load_inception, prepare_inception_feat) from .base_gen_metric import GenerativeMetric diff --git a/mmedit/evaluation/metrics/gradient_error.py b/mmagic/evaluation/metrics/gradient_error.py similarity index 98% rename from mmedit/evaluation/metrics/gradient_error.py rename to mmagic/evaluation/metrics/gradient_error.py index d69fdd0323..cbd9340945 100644 --- a/mmedit/evaluation/metrics/gradient_error.py +++ b/mmagic/evaluation/metrics/gradient_error.py @@ -7,7 +7,7 @@ from mmengine.model import is_model_wrapper from torch.utils.data.dataloader import DataLoader -from mmedit.registry import METRICS +from mmagic.registry import METRICS from ..functional import gauss_gradient from .base_sample_wise_metric import BaseSampleWiseMetric from .metrics_utils import _fetch_data_and_check, average diff --git a/mmedit/evaluation/metrics/inception_score.py b/mmagic/evaluation/metrics/inception_score.py similarity index 99% rename from mmedit/evaluation/metrics/inception_score.py rename to mmagic/evaluation/metrics/inception_score.py index 1f4035d636..1ac6468f54 100644 --- a/mmedit/evaluation/metrics/inception_score.py +++ b/mmagic/evaluation/metrics/inception_score.py @@ -11,7 +11,7 @@ from torch import Tensor from torch.utils.data.dataloader import DataLoader -from mmedit.registry import METRICS +from mmagic.registry import METRICS # from .inception_utils import disable_gpu_fuser_on_pt19, load_inception from ..functional import disable_gpu_fuser_on_pt19, load_inception from .base_gen_metric import GenerativeMetric diff --git a/mmedit/evaluation/metrics/mae.py b/mmagic/evaluation/metrics/mae.py similarity index 98% rename from mmedit/evaluation/metrics/mae.py rename to mmagic/evaluation/metrics/mae.py index 0acd972a63..47a55739f4 100644 --- a/mmedit/evaluation/metrics/mae.py +++ b/mmagic/evaluation/metrics/mae.py @@ -3,7 +3,7 @@ import numpy as np -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .base_sample_wise_metric import BaseSampleWiseMetric diff --git a/mmedit/evaluation/metrics/matting_mse.py b/mmagic/evaluation/metrics/matting_mse.py similarity index 98% rename from mmedit/evaluation/metrics/matting_mse.py rename to mmagic/evaluation/metrics/matting_mse.py index 824ffe21ac..a0cb3e7f05 100644 --- a/mmedit/evaluation/metrics/matting_mse.py +++ b/mmagic/evaluation/metrics/matting_mse.py @@ -5,7 +5,7 @@ from mmengine.model import is_model_wrapper from torch.utils.data.dataloader import DataLoader -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .base_sample_wise_metric import BaseSampleWiseMetric from .metrics_utils import _fetch_data_and_check, average diff --git a/mmedit/evaluation/metrics/metrics_utils.py b/mmagic/evaluation/metrics/metrics_utils.py similarity index 99% rename from mmedit/evaluation/metrics/metrics_utils.py rename to mmagic/evaluation/metrics/metrics_utils.py index 6e5552c555..e521693b23 100644 --- a/mmedit/evaluation/metrics/metrics_utils.py +++ b/mmagic/evaluation/metrics/metrics_utils.py @@ -3,7 +3,7 @@ import numpy as np import torch -from mmedit.utils import reorder_image +from mmagic.utils import reorder_image def _assert_ndim(input, name, ndim, shape_hint): diff --git a/mmedit/evaluation/metrics/ms_ssim.py b/mmagic/evaluation/metrics/ms_ssim.py similarity index 99% rename from mmedit/evaluation/metrics/ms_ssim.py rename to mmagic/evaluation/metrics/ms_ssim.py index 06cf6e517a..4c3c1d2ee4 100644 --- a/mmedit/evaluation/metrics/ms_ssim.py +++ b/mmagic/evaluation/metrics/ms_ssim.py @@ -7,7 +7,7 @@ from mmengine.dist import all_gather, get_world_size, is_main_process from scipy import signal -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .base_gen_metric import GenerativeMetric diff --git a/mmedit/evaluation/metrics/mse.py b/mmagic/evaluation/metrics/mse.py similarity index 97% rename from mmedit/evaluation/metrics/mse.py rename to mmagic/evaluation/metrics/mse.py index 863fbb97cf..826afcca81 100644 --- a/mmedit/evaluation/metrics/mse.py +++ b/mmagic/evaluation/metrics/mse.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. """Evaluation metrics based on pixels.""" -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .base_sample_wise_metric import BaseSampleWiseMetric diff --git a/mmedit/evaluation/metrics/niqe.py b/mmagic/evaluation/metrics/niqe.py similarity index 98% rename from mmedit/evaluation/metrics/niqe.py rename to mmagic/evaluation/metrics/niqe.py index 2615917ad7..c842c1a8d0 100644 --- a/mmedit/evaluation/metrics/niqe.py +++ b/mmagic/evaluation/metrics/niqe.py @@ -9,9 +9,9 @@ from scipy.ndimage import convolve from scipy.special import gamma -from mmedit.datasets.transforms import MATLABLikeResize -from mmedit.registry import METRICS -from mmedit.utils import reorder_image, to_numpy +from mmagic.datasets.transforms import MATLABLikeResize +from mmagic.registry import METRICS +from mmagic.utils import reorder_image, to_numpy from .base_sample_wise_metric import BaseSampleWiseMetric diff --git a/mmedit/evaluation/metrics/niqe_pris_params.npz b/mmagic/evaluation/metrics/niqe_pris_params.npz similarity index 100% rename from mmedit/evaluation/metrics/niqe_pris_params.npz rename to mmagic/evaluation/metrics/niqe_pris_params.npz diff --git a/mmedit/evaluation/metrics/ppl.py b/mmagic/evaluation/metrics/ppl.py similarity index 99% rename from mmedit/evaluation/metrics/ppl.py rename to mmagic/evaluation/metrics/ppl.py index 01a118ccac..4a89659cb8 100644 --- a/mmedit/evaluation/metrics/ppl.py +++ b/mmagic/evaluation/metrics/ppl.py @@ -8,8 +8,8 @@ import torch.nn.functional as F from torch.utils.data.dataloader import DataLoader -from mmedit.models.utils import get_module_device, normalize_vecs -from mmedit.registry import METRICS +from mmagic.models.utils import get_module_device, normalize_vecs +from mmagic.registry import METRICS from .base_gen_metric import GenerativeMetric diff --git a/mmedit/evaluation/metrics/precision_and_recall.py b/mmagic/evaluation/metrics/precision_and_recall.py similarity index 99% rename from mmedit/evaluation/metrics/precision_and_recall.py rename to mmagic/evaluation/metrics/precision_and_recall.py index 7d4963a5a6..64060b5cf1 100644 --- a/mmedit/evaluation/metrics/precision_and_recall.py +++ b/mmagic/evaluation/metrics/precision_and_recall.py @@ -10,8 +10,8 @@ from torch.utils.data.dataloader import DataLoader from torchvision import models as torchvision_models -from mmedit.models.utils import get_module_device -from mmedit.registry import METRICS +from mmagic.models.utils import get_module_device +from mmagic.registry import METRICS from ..functional import prepare_vgg_feat from .base_gen_metric import GenerativeMetric diff --git a/mmedit/evaluation/metrics/psnr.py b/mmagic/evaluation/metrics/psnr.py similarity index 99% rename from mmedit/evaluation/metrics/psnr.py rename to mmagic/evaluation/metrics/psnr.py index 9aec992b1a..a96f687ebb 100644 --- a/mmedit/evaluation/metrics/psnr.py +++ b/mmagic/evaluation/metrics/psnr.py @@ -3,7 +3,7 @@ import numpy as np -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .base_sample_wise_metric import BaseSampleWiseMetric from .metrics_utils import img_transform diff --git a/mmedit/evaluation/metrics/sad.py b/mmagic/evaluation/metrics/sad.py similarity index 98% rename from mmedit/evaluation/metrics/sad.py rename to mmagic/evaluation/metrics/sad.py index f10f01aef2..4a9ad47192 100644 --- a/mmedit/evaluation/metrics/sad.py +++ b/mmagic/evaluation/metrics/sad.py @@ -6,7 +6,7 @@ from mmengine.model import is_model_wrapper from torch.utils.data.dataloader import DataLoader -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .base_sample_wise_metric import BaseSampleWiseMetric from .metrics_utils import _fetch_data_and_check, average diff --git a/mmedit/evaluation/metrics/snr.py b/mmagic/evaluation/metrics/snr.py similarity index 99% rename from mmedit/evaluation/metrics/snr.py rename to mmagic/evaluation/metrics/snr.py index e94d35c4f6..c50889458c 100644 --- a/mmedit/evaluation/metrics/snr.py +++ b/mmagic/evaluation/metrics/snr.py @@ -3,7 +3,7 @@ import numpy as np -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .base_sample_wise_metric import BaseSampleWiseMetric from .metrics_utils import img_transform diff --git a/mmedit/evaluation/metrics/ssim.py b/mmagic/evaluation/metrics/ssim.py similarity index 98% rename from mmedit/evaluation/metrics/ssim.py rename to mmagic/evaluation/metrics/ssim.py index 73eb37fe47..5aeed02cca 100644 --- a/mmedit/evaluation/metrics/ssim.py +++ b/mmagic/evaluation/metrics/ssim.py @@ -4,8 +4,8 @@ import cv2 import numpy as np -from mmedit.registry import METRICS -from mmedit.utils import to_numpy +from mmagic.registry import METRICS +from mmagic.utils import to_numpy from .base_sample_wise_metric import BaseSampleWiseMetric from .metrics_utils import img_transform diff --git a/mmedit/evaluation/metrics/swd.py b/mmagic/evaluation/metrics/swd.py similarity index 99% rename from mmedit/evaluation/metrics/swd.py rename to mmagic/evaluation/metrics/swd.py index d9da0bfc16..ce4bd2c076 100644 --- a/mmedit/evaluation/metrics/swd.py +++ b/mmagic/evaluation/metrics/swd.py @@ -6,7 +6,7 @@ import torch.nn.functional as F from mmengine.dist import all_gather, get_world_size -from mmedit.registry import METRICS +from mmagic.registry import METRICS from .base_gen_metric import GenMetric diff --git a/mmedit/models/__init__.py b/mmagic/models/__init__.py similarity index 100% rename from mmedit/models/__init__.py rename to mmagic/models/__init__.py diff --git a/mmedit/models/base_archs/__init__.py b/mmagic/models/base_archs/__init__.py similarity index 97% rename from mmedit/models/base_archs/__init__.py rename to mmagic/models/base_archs/__init__.py index 3ce03b350d..7d54fd88df 100644 --- a/mmedit/models/base_archs/__init__.py +++ b/mmagic/models/base_archs/__init__.py @@ -3,7 +3,7 @@ import warnings from typing import List -from mmedit.utils import try_import +from mmagic.utils import try_import from .all_gather_layer import AllGatherLayer from .aspp import ASPP from .conv import * # noqa: F401, F403 @@ -37,7 +37,7 @@ def register_diffusers_models() -> List[str]: """ import inspect - from mmedit.registry import MODELS + from mmagic.registry import MODELS diffusers = try_import('diffusers') if diffusers is None: diff --git a/mmedit/models/base_archs/all_gather_layer.py b/mmagic/models/base_archs/all_gather_layer.py similarity index 100% rename from mmedit/models/base_archs/all_gather_layer.py rename to mmagic/models/base_archs/all_gather_layer.py diff --git a/mmedit/models/base_archs/aspp.py b/mmagic/models/base_archs/aspp.py similarity index 100% rename from mmedit/models/base_archs/aspp.py rename to mmagic/models/base_archs/aspp.py diff --git a/mmedit/models/base_archs/conv.py b/mmagic/models/base_archs/conv.py similarity index 81% rename from mmedit/models/base_archs/conv.py rename to mmagic/models/base_archs/conv.py index b6cb4d8f17..0db6e64b38 100644 --- a/mmedit/models/base_archs/conv.py +++ b/mmagic/models/base_archs/conv.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. from torch import nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS MODELS.register_module('Deconv', module=nn.ConvTranspose2d) # TODO: octave conv diff --git a/mmedit/models/base_archs/downsample.py b/mmagic/models/base_archs/downsample.py similarity index 100% rename from mmedit/models/base_archs/downsample.py rename to mmagic/models/base_archs/downsample.py diff --git a/mmedit/models/base_archs/ensemble.py b/mmagic/models/base_archs/ensemble.py similarity index 100% rename from mmedit/models/base_archs/ensemble.py rename to mmagic/models/base_archs/ensemble.py diff --git a/mmedit/models/base_archs/gated_conv_module.py b/mmagic/models/base_archs/gated_conv_module.py similarity index 100% rename from mmedit/models/base_archs/gated_conv_module.py rename to mmagic/models/base_archs/gated_conv_module.py diff --git a/mmedit/models/base_archs/img_normalize.py b/mmagic/models/base_archs/img_normalize.py similarity index 100% rename from mmedit/models/base_archs/img_normalize.py rename to mmagic/models/base_archs/img_normalize.py diff --git a/mmedit/models/base_archs/linear_module.py b/mmagic/models/base_archs/linear_module.py similarity index 100% rename from mmedit/models/base_archs/linear_module.py rename to mmagic/models/base_archs/linear_module.py diff --git a/mmedit/models/base_archs/lora.py b/mmagic/models/base_archs/lora.py similarity index 100% rename from mmedit/models/base_archs/lora.py rename to mmagic/models/base_archs/lora.py diff --git a/mmedit/models/base_archs/multi_layer_disc.py b/mmagic/models/base_archs/multi_layer_disc.py similarity index 98% rename from mmedit/models/base_archs/multi_layer_disc.py rename to mmagic/models/base_archs/multi_layer_disc.py index 841b9b5d5d..5d720fd6b8 100644 --- a/mmedit/models/base_archs/multi_layer_disc.py +++ b/mmagic/models/base_archs/multi_layer_disc.py @@ -7,8 +7,8 @@ from mmengine.runner import load_checkpoint from torch import Tensor -from mmedit.models.base_archs import LinearModule -from mmedit.registry import MODELS +from mmagic.models.base_archs import LinearModule +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/base_archs/patch_disc.py b/mmagic/models/base_archs/patch_disc.py similarity index 98% rename from mmedit/models/base_archs/patch_disc.py rename to mmagic/models/base_archs/patch_disc.py index b65c9d9e87..4cc210cf72 100644 --- a/mmedit/models/base_archs/patch_disc.py +++ b/mmagic/models/base_archs/patch_disc.py @@ -7,8 +7,8 @@ from mmengine.runner import load_checkpoint from torch import Tensor -from mmedit.models.utils import generation_init_weights -from mmedit.registry import MODELS +from mmagic.models.utils import generation_init_weights +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/base_archs/resnet.py b/mmagic/models/base_archs/resnet.py similarity index 100% rename from mmedit/models/base_archs/resnet.py rename to mmagic/models/base_archs/resnet.py diff --git a/mmedit/models/base_archs/separable_conv_module.py b/mmagic/models/base_archs/separable_conv_module.py similarity index 100% rename from mmedit/models/base_archs/separable_conv_module.py rename to mmagic/models/base_archs/separable_conv_module.py diff --git a/mmedit/models/base_archs/simple_encoder_decoder.py b/mmagic/models/base_archs/simple_encoder_decoder.py similarity index 96% rename from mmedit/models/base_archs/simple_encoder_decoder.py rename to mmagic/models/base_archs/simple_encoder_decoder.py index 76f542377c..dac615e730 100644 --- a/mmedit/models/base_archs/simple_encoder_decoder.py +++ b/mmagic/models/base_archs/simple_encoder_decoder.py @@ -4,7 +4,7 @@ from mmengine.model import BaseModule from torch import Tensor -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/base_archs/smpatch_disc.py b/mmagic/models/base_archs/smpatch_disc.py similarity index 97% rename from mmedit/models/base_archs/smpatch_disc.py rename to mmagic/models/base_archs/smpatch_disc.py index 634a2b16d5..3d33b3aa9d 100644 --- a/mmedit/models/base_archs/smpatch_disc.py +++ b/mmagic/models/base_archs/smpatch_disc.py @@ -6,8 +6,8 @@ from mmengine.model import BaseModule from torch import Tensor -from mmedit.models.utils import generation_init_weights -from mmedit.registry import MODELS +from mmagic.models.utils import generation_init_weights +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/base_archs/sr_backbone.py b/mmagic/models/base_archs/sr_backbone.py similarity index 100% rename from mmedit/models/base_archs/sr_backbone.py rename to mmagic/models/base_archs/sr_backbone.py diff --git a/mmedit/models/base_archs/upsample.py b/mmagic/models/base_archs/upsample.py similarity index 100% rename from mmedit/models/base_archs/upsample.py rename to mmagic/models/base_archs/upsample.py diff --git a/mmedit/models/base_archs/vgg.py b/mmagic/models/base_archs/vgg.py similarity index 99% rename from mmedit/models/base_archs/vgg.py rename to mmagic/models/base_archs/vgg.py index 3dd0161d11..6cbdc254b3 100644 --- a/mmedit/models/base_archs/vgg.py +++ b/mmagic/models/base_archs/vgg.py @@ -6,7 +6,7 @@ from mmengine.model.weight_init import constant_init, xavier_init from torch import Tensor -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..base_archs.aspp import ASPP diff --git a/mmedit/models/base_archs/wrapper.py b/mmagic/models/base_archs/wrapper.py similarity index 100% rename from mmedit/models/base_archs/wrapper.py rename to mmagic/models/base_archs/wrapper.py diff --git a/mmedit/models/base_models/__init__.py b/mmagic/models/base_models/__init__.py similarity index 100% rename from mmedit/models/base_models/__init__.py rename to mmagic/models/base_models/__init__.py diff --git a/mmedit/models/base_models/average_model.py b/mmagic/models/base_models/average_model.py similarity index 99% rename from mmedit/models/base_models/average_model.py rename to mmagic/models/base_models/average_model.py index 7dcd5bbbf8..25d8e4a5c9 100644 --- a/mmedit/models/base_models/average_model.py +++ b/mmagic/models/base_models/average_model.py @@ -8,7 +8,7 @@ from mmengine.model import BaseAveragedModel from torch import Tensor -from mmedit.registry import MODELS +from mmagic.registry import MODELS # NOTICE: Since mmengine do not support loading ``state_dict`` without wrap # ema module with ``BaseAveragedModel`` currently, we rewrite diff --git a/mmedit/models/base_models/base_conditional_gan.py b/mmagic/models/base_models/base_conditional_gan.py similarity index 98% rename from mmedit/models/base_models/base_conditional_gan.py rename to mmagic/models/base_models/base_conditional_gan.py index 9d18cd3db2..83e2f251a0 100644 --- a/mmedit/models/base_models/base_conditional_gan.py +++ b/mmagic/models/base_models/base_conditional_gan.py @@ -8,8 +8,8 @@ from mmengine.optim import OptimWrapper from torch import Tensor -from mmedit.structures import EditDataSample -from mmedit.utils.typing import ForwardInputs, LabelVar +from mmagic.structures import EditDataSample +from mmagic.utils.typing import ForwardInputs, LabelVar from ..utils import get_valid_num_batches, label_sample_fn from .base_gan import BaseGAN @@ -24,7 +24,7 @@ class BaseConditionalGAN(BaseGAN): discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmedit.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.EditDataPreprocessor`. generator_steps (int): The number of times the generator is completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): The number of times the discriminator is diff --git a/mmedit/models/base_models/base_edit_model.py b/mmagic/models/base_models/base_edit_model.py similarity index 99% rename from mmedit/models/base_models/base_edit_model.py rename to mmagic/models/base_models/base_edit_model.py index 7d819e1919..4c7720d2a5 100644 --- a/mmedit/models/base_models/base_edit_model.py +++ b/mmagic/models/base_models/base_edit_model.py @@ -4,8 +4,8 @@ import torch from mmengine.model import BaseModel -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample @MODELS.register_module() diff --git a/mmedit/models/base_models/base_gan.py b/mmagic/models/base_models/base_gan.py similarity index 98% rename from mmedit/models/base_models/base_gan.py rename to mmagic/models/base_models/base_gan.py index 5b78b4557d..66126d75d2 100644 --- a/mmedit/models/base_models/base_gan.py +++ b/mmagic/models/base_models/base_gan.py @@ -10,9 +10,9 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import ForwardInputs, NoiseVar, SampleList +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import ForwardInputs, NoiseVar, SampleList from ..utils import (get_valid_noise_size, get_valid_num_batches, noise_sample_fn, set_requires_grad) @@ -27,7 +27,7 @@ class BaseGAN(BaseModel, metaclass=ABCMeta): discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmedit.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.EditDataPreprocessor`. generator_steps (int): The number of times the generator is completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): The number of times the discriminator is @@ -422,7 +422,7 @@ def test_step(self, data: dict) -> SampleList: def train_step(self, data: dict, optim_wrapper: OptimWrapperDict) -> Dict[str, Tensor]: """Train GAN model. In the training of GAN models, generator and - discriminator are updated alternatively. In MMEditing's design, + discriminator are updated alternatively. In MMagic's design, `self.train_step` is called with data input. Therefore we always update discriminator, whose updating is relay on real data, and then determine if the generator needs to be updated based on the current number of diff --git a/mmedit/models/base_models/base_mattor.py b/mmagic/models/base_models/base_mattor.py similarity index 99% rename from mmedit/models/base_models/base_mattor.py rename to mmagic/models/base_models/base_mattor.py index 8068f97986..35bbd4bfd8 100644 --- a/mmedit/models/base_models/base_mattor.py +++ b/mmagic/models/base_models/base_mattor.py @@ -7,8 +7,8 @@ from mmengine.config import Config, ConfigDict from mmengine.model import BaseModel -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample DataSamples = Optional[Union[list, torch.Tensor]] ForwardResults = Union[Dict[str, torch.Tensor], List[EditDataSample], diff --git a/mmedit/models/base_models/base_translation_model.py b/mmagic/models/base_models/base_translation_model.py similarity index 99% rename from mmedit/models/base_models/base_translation_model.py rename to mmagic/models/base_models/base_translation_model.py index 7450816477..42f9c6daa2 100644 --- a/mmedit/models/base_models/base_translation_model.py +++ b/mmagic/models/base_models/base_translation_model.py @@ -6,7 +6,7 @@ import torch.nn as nn from mmengine.model import BaseModel, is_model_wrapper -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/base_models/basic_interpolator.py b/mmagic/models/base_models/basic_interpolator.py similarity index 98% rename from mmedit/models/base_models/basic_interpolator.py rename to mmagic/models/base_models/basic_interpolator.py index 7a88fc34eb..53b9fbf9d5 100644 --- a/mmedit/models/base_models/basic_interpolator.py +++ b/mmagic/models/base_models/basic_interpolator.py @@ -3,8 +3,8 @@ import torch -from mmedit.registry import MODELS -from mmedit.utils import tensor2img +from mmagic.registry import MODELS +from mmagic.utils import tensor2img from .base_edit_model import BaseEditModel # TODO tensor2img will be move diff --git a/mmedit/models/base_models/one_stage.py b/mmagic/models/base_models/one_stage.py similarity index 99% rename from mmedit/models/base_models/one_stage.py rename to mmagic/models/base_models/one_stage.py index feea0e5df1..c925694be3 100644 --- a/mmedit/models/base_models/one_stage.py +++ b/mmagic/models/base_models/one_stage.py @@ -6,9 +6,9 @@ from mmengine.model import BaseModel from mmengine.optim import OptimWrapperDict -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import SampleList +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import SampleList from ..utils import set_requires_grad FORWARD_RETURN_TYPE = Union[dict, torch.Tensor, diff --git a/mmedit/models/base_models/two_stage.py b/mmagic/models/base_models/two_stage.py similarity index 99% rename from mmedit/models/base_models/two_stage.py rename to mmagic/models/base_models/two_stage.py index 9c9304941a..fca64a484e 100644 --- a/mmedit/models/base_models/two_stage.py +++ b/mmagic/models/base_models/two_stage.py @@ -5,8 +5,8 @@ from mmengine.config import Config from mmengine.optim import OptimWrapperDict -from mmedit.registry import MODELS -from mmedit.utils import SampleList +from mmagic.registry import MODELS +from mmagic.utils import SampleList from ..utils import set_requires_grad from .one_stage import OneStageInpaintor diff --git a/mmedit/models/data_preprocessors/__init__.py b/mmagic/models/data_preprocessors/__init__.py similarity index 100% rename from mmedit/models/data_preprocessors/__init__.py rename to mmagic/models/data_preprocessors/__init__.py diff --git a/mmedit/models/data_preprocessors/edit_data_preprocessor.py b/mmagic/models/data_preprocessors/edit_data_preprocessor.py similarity index 99% rename from mmedit/models/data_preprocessors/edit_data_preprocessor.py rename to mmagic/models/data_preprocessors/edit_data_preprocessor.py index 3b220fb3e0..cc98fe43b3 100644 --- a/mmedit/models/data_preprocessors/edit_data_preprocessor.py +++ b/mmagic/models/data_preprocessors/edit_data_preprocessor.py @@ -10,9 +10,9 @@ from mmengine.utils import is_seq_of from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import SampleList +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import SampleList CastData = Union[tuple, dict, EditDataSample, Tensor, list] diff --git a/mmedit/models/data_preprocessors/mattor_preprocessor.py b/mmagic/models/data_preprocessors/mattor_preprocessor.py similarity index 98% rename from mmedit/models/data_preprocessors/mattor_preprocessor.py rename to mmagic/models/data_preprocessors/mattor_preprocessor.py index b007e832d8..b07d9198ff 100644 --- a/mmedit/models/data_preprocessors/mattor_preprocessor.py +++ b/mmagic/models/data_preprocessors/mattor_preprocessor.py @@ -6,9 +6,9 @@ import torch from mmengine import print_log -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import SampleList +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import SampleList from .edit_data_preprocessor import EditDataPreprocessor DataSamples = Optional[Union[list, torch.Tensor]] diff --git a/mmedit/models/diffusion_schedulers/__init__.py b/mmagic/models/diffusion_schedulers/__init__.py similarity index 98% rename from mmedit/models/diffusion_schedulers/__init__.py rename to mmagic/models/diffusion_schedulers/__init__.py index acc958f8b6..4eefaf2fde 100644 --- a/mmedit/models/diffusion_schedulers/__init__.py +++ b/mmagic/models/diffusion_schedulers/__init__.py @@ -2,7 +2,7 @@ import warnings from typing import Any, List -from mmedit.utils import try_import +from mmagic.utils import try_import from .ddim_scheduler import EditDDIMScheduler from .ddpm_scheduler import EditDDPMScheduler @@ -104,7 +104,7 @@ def register_diffusers_schedulers() -> List[str]: import inspect - from mmedit.registry import DIFFUSION_SCHEDULERS + from mmagic.registry import DIFFUSION_SCHEDULERS diffusers = try_import('diffusers') if diffusers is None: diff --git a/mmedit/models/diffusion_schedulers/ddim_scheduler.py b/mmagic/models/diffusion_schedulers/ddim_scheduler.py similarity index 98% rename from mmedit/models/diffusion_schedulers/ddim_scheduler.py rename to mmagic/models/diffusion_schedulers/ddim_scheduler.py index cab9264446..0a95804004 100644 --- a/mmedit/models/diffusion_schedulers/ddim_scheduler.py +++ b/mmagic/models/diffusion_schedulers/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 mmagic.models.utils.diffusion_utils import betas_for_alpha_bar +from mmagic.registry import DIFFUSION_SCHEDULERS @DIFFUSION_SCHEDULERS.register_module() diff --git a/mmedit/models/diffusion_schedulers/ddpm_scheduler.py b/mmagic/models/diffusion_schedulers/ddpm_scheduler.py similarity index 98% rename from mmedit/models/diffusion_schedulers/ddpm_scheduler.py rename to mmagic/models/diffusion_schedulers/ddpm_scheduler.py index 0047020c2d..40d19c405c 100644 --- a/mmedit/models/diffusion_schedulers/ddpm_scheduler.py +++ b/mmagic/models/diffusion_schedulers/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 mmagic.models.utils.diffusion_utils import betas_for_alpha_bar +from mmagic.registry import DIFFUSION_SCHEDULERS @DIFFUSION_SCHEDULERS.register_module() diff --git a/mmedit/models/editors/__init__.py b/mmagic/models/editors/__init__.py similarity index 100% rename from mmedit/models/editors/__init__.py rename to mmagic/models/editors/__init__.py diff --git a/mmedit/models/editors/aotgan/__init__.py b/mmagic/models/editors/aotgan/__init__.py similarity index 100% rename from mmedit/models/editors/aotgan/__init__.py rename to mmagic/models/editors/aotgan/__init__.py diff --git a/mmedit/models/editors/aotgan/aot_decoder.py b/mmagic/models/editors/aotgan/aot_decoder.py similarity index 98% rename from mmedit/models/editors/aotgan/aot_decoder.py rename to mmagic/models/editors/aotgan/aot_decoder.py index ef875de509..d03dfd308c 100644 --- a/mmedit/models/editors/aotgan/aot_decoder.py +++ b/mmagic/models/editors/aotgan/aot_decoder.py @@ -4,7 +4,7 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/aotgan/aot_encoder.py b/mmagic/models/editors/aotgan/aot_encoder.py similarity index 98% rename from mmedit/models/editors/aotgan/aot_encoder.py rename to mmagic/models/editors/aotgan/aot_encoder.py index c5c60b75d4..e4f67c4c67 100644 --- a/mmedit/models/editors/aotgan/aot_encoder.py +++ b/mmagic/models/editors/aotgan/aot_encoder.py @@ -3,7 +3,7 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/aotgan/aot_encoder_decoder.py b/mmagic/models/editors/aotgan/aot_encoder_decoder.py similarity index 96% rename from mmedit/models/editors/aotgan/aot_encoder_decoder.py rename to mmagic/models/editors/aotgan/aot_encoder_decoder.py index 29b3f01672..b1781ea816 100644 --- a/mmedit/models/editors/aotgan/aot_encoder_decoder.py +++ b/mmagic/models/editors/aotgan/aot_encoder_decoder.py @@ -1,6 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..global_local import GLEncoderDecoder diff --git a/mmedit/models/editors/aotgan/aot_inpaintor.py b/mmagic/models/editors/aotgan/aot_inpaintor.py similarity index 98% rename from mmedit/models/editors/aotgan/aot_inpaintor.py rename to mmagic/models/editors/aotgan/aot_inpaintor.py index 501e766f42..4fa6b901f5 100644 --- a/mmedit/models/editors/aotgan/aot_inpaintor.py +++ b/mmagic/models/editors/aotgan/aot_inpaintor.py @@ -3,8 +3,8 @@ import torch -from mmedit.models.base_models import OneStageInpaintor -from mmedit.registry import MODELS +from mmagic.models.base_models import OneStageInpaintor +from mmagic.registry import MODELS from ...utils import set_requires_grad diff --git a/mmedit/models/editors/aotgan/aot_neck.py b/mmagic/models/editors/aotgan/aot_neck.py similarity index 99% rename from mmedit/models/editors/aotgan/aot_neck.py rename to mmagic/models/editors/aotgan/aot_neck.py index 0f4df2e471..3815d7394d 100644 --- a/mmedit/models/editors/aotgan/aot_neck.py +++ b/mmagic/models/editors/aotgan/aot_neck.py @@ -4,7 +4,7 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/arcface/__init__.py b/mmagic/models/editors/arcface/__init__.py similarity index 100% rename from mmedit/models/editors/arcface/__init__.py rename to mmagic/models/editors/arcface/__init__.py diff --git a/mmedit/models/editors/arcface/arcface_modules.py b/mmagic/models/editors/arcface/arcface_modules.py similarity index 100% rename from mmedit/models/editors/arcface/arcface_modules.py rename to mmagic/models/editors/arcface/arcface_modules.py diff --git a/mmedit/models/editors/arcface/id_loss.py b/mmagic/models/editors/arcface/id_loss.py similarity index 98% rename from mmedit/models/editors/arcface/id_loss.py rename to mmagic/models/editors/arcface/id_loss.py index 2af1e14564..0294f1831d 100644 --- a/mmedit/models/editors/arcface/id_loss.py +++ b/mmagic/models/editors/arcface/id_loss.py @@ -3,7 +3,7 @@ import torch from torch import nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .model_irse import Backbone diff --git a/mmedit/models/editors/arcface/model_irse.py b/mmagic/models/editors/arcface/model_irse.py similarity index 100% rename from mmedit/models/editors/arcface/model_irse.py rename to mmagic/models/editors/arcface/model_irse.py diff --git a/mmedit/models/editors/basicvsr/__init__.py b/mmagic/models/editors/basicvsr/__init__.py similarity index 100% rename from mmedit/models/editors/basicvsr/__init__.py rename to mmagic/models/editors/basicvsr/__init__.py diff --git a/mmedit/models/editors/basicvsr/basicvsr.py b/mmagic/models/editors/basicvsr/basicvsr.py similarity index 96% rename from mmedit/models/editors/basicvsr/basicvsr.py rename to mmagic/models/editors/basicvsr/basicvsr.py index 1dd726f699..80b9cc10f0 100644 --- a/mmedit/models/editors/basicvsr/basicvsr.py +++ b/mmagic/models/editors/basicvsr/basicvsr.py @@ -1,9 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models import BaseEditModel -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models import BaseEditModel +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample @MODELS.register_module() @@ -55,7 +55,7 @@ def __init__(self, self.forward_ensemble = None if ensemble is not None: if ensemble['type'] == 'SpatialTemporalEnsemble': - from mmedit.models.base_archs import SpatialTemporalEnsemble + from mmagic.models.base_archs import SpatialTemporalEnsemble is_temporal = ensemble.get('is_temporal_ensemble', False) self.forward_ensemble = SpatialTemporalEnsemble(is_temporal) else: diff --git a/mmedit/models/editors/basicvsr/basicvsr_net.py b/mmagic/models/editors/basicvsr/basicvsr_net.py similarity index 98% rename from mmedit/models/editors/basicvsr/basicvsr_net.py rename to mmagic/models/editors/basicvsr/basicvsr_net.py index f1ea3f0839..295f908171 100644 --- a/mmedit/models/editors/basicvsr/basicvsr_net.py +++ b/mmagic/models/editors/basicvsr/basicvsr_net.py @@ -9,9 +9,9 @@ from mmengine.model import BaseModule from mmengine.runner import load_checkpoint -from mmedit.models.base_archs import PixelShufflePack, ResidualBlockNoBN -from mmedit.models.utils import flow_warp, make_layer -from mmedit.registry import MODELS +from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.utils import flow_warp, make_layer +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/basicvsr_plusplus_net/__init__.py b/mmagic/models/editors/basicvsr_plusplus_net/__init__.py similarity index 100% rename from mmedit/models/editors/basicvsr_plusplus_net/__init__.py rename to mmagic/models/editors/basicvsr_plusplus_net/__init__.py diff --git a/mmedit/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py b/mmagic/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py similarity index 99% rename from mmedit/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py rename to mmagic/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py index bea6c60822..b360d1cba1 100644 --- a/mmedit/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py +++ b/mmagic/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py @@ -6,9 +6,9 @@ from mmengine.model import BaseModule from mmengine.model.weight_init import constant_init -from mmedit.models.base_archs import PixelShufflePack -from mmedit.models.utils import flow_warp -from mmedit.registry import MODELS +from mmagic.models.base_archs import PixelShufflePack +from mmagic.models.utils import flow_warp +from mmagic.registry import MODELS from ..basicvsr.basicvsr_net import ResidualBlocksWithInputConv, SPyNet diff --git a/mmedit/models/editors/biggan/__init__.py b/mmagic/models/editors/biggan/__init__.py similarity index 100% rename from mmedit/models/editors/biggan/__init__.py rename to mmagic/models/editors/biggan/__init__.py diff --git a/mmedit/models/editors/biggan/biggan.py b/mmagic/models/editors/biggan/biggan.py similarity index 96% rename from mmedit/models/editors/biggan/biggan.py rename to mmagic/models/editors/biggan/biggan.py index 3112fb54b6..0d1301d7d1 100644 --- a/mmedit/models/editors/biggan/biggan.py +++ b/mmagic/models/editors/biggan/biggan.py @@ -8,8 +8,8 @@ from mmengine.optim import OptimWrapper from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample from ...base_models import BaseConditionalGAN ModelType = Union[Dict, nn.Module] @@ -22,16 +22,16 @@ class BigGAN(BaseConditionalGAN): Image Synthesis `_ (BigGAN). Detailed architecture can be found in - :class:`~mmedit.models.editors.biggan.BigGANGenerator` + :class:`~mmagic.models.editors.biggan.BigGANGenerator` and - :class:`~mmedit.models.editors.biggan.BigGANDiscriminator` + :class:`~mmagic.models.editors.biggan.BigGANDiscriminator` Args: generator (ModelType): The config or model of the generator. discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmedit.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.EditDataPreprocessor`. generator_steps (int): Number of times the generator was completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): Number of times the discriminator was diff --git a/mmedit/models/editors/biggan/biggan_deep_discriminator.py b/mmagic/models/editors/biggan/biggan_deep_discriminator.py similarity index 99% rename from mmedit/models/editors/biggan/biggan_deep_discriminator.py rename to mmagic/models/editors/biggan/biggan_deep_discriminator.py index 452a6d9769..c71ab28727 100644 --- a/mmedit/models/editors/biggan/biggan_deep_discriminator.py +++ b/mmagic/models/editors/biggan/biggan_deep_discriminator.py @@ -10,7 +10,7 @@ from mmengine.runner.checkpoint import _load_checkpoint_with_prefix from torch.nn.utils import spectral_norm -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .biggan_modules import SelfAttentionBlock, SNConvModule from .biggan_snmodule import SNEmbedding, SNLinear diff --git a/mmedit/models/editors/biggan/biggan_deep_generator.py b/mmagic/models/editors/biggan/biggan_deep_generator.py similarity index 99% rename from mmedit/models/editors/biggan/biggan_deep_generator.py rename to mmagic/models/editors/biggan/biggan_deep_generator.py index 0cd6d3de18..2d312df66b 100644 --- a/mmedit/models/editors/biggan/biggan_deep_generator.py +++ b/mmagic/models/editors/biggan/biggan_deep_generator.py @@ -10,7 +10,7 @@ from mmengine.runner.checkpoint import _load_checkpoint_with_prefix from torch.nn.utils import spectral_norm -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ...utils import get_module_device from .biggan_modules import SelfAttentionBlock, SNConvModule from .biggan_snmodule import SNLinear diff --git a/mmedit/models/editors/biggan/biggan_discriminator.py b/mmagic/models/editors/biggan/biggan_discriminator.py similarity index 99% rename from mmedit/models/editors/biggan/biggan_discriminator.py rename to mmagic/models/editors/biggan/biggan_discriminator.py index 5df47d06e6..aa187e3b44 100644 --- a/mmedit/models/editors/biggan/biggan_discriminator.py +++ b/mmagic/models/editors/biggan/biggan_discriminator.py @@ -10,7 +10,7 @@ from mmengine.runner.checkpoint import _load_checkpoint_with_prefix from torch.nn.utils import spectral_norm -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .biggan_modules import SelfAttentionBlock from .biggan_snmodule import SNEmbedding, SNLinear diff --git a/mmedit/models/editors/biggan/biggan_generator.py b/mmagic/models/editors/biggan/biggan_generator.py similarity index 99% rename from mmedit/models/editors/biggan/biggan_generator.py rename to mmagic/models/editors/biggan/biggan_generator.py index 49ac4230f9..5d7c0a58b4 100644 --- a/mmedit/models/editors/biggan/biggan_generator.py +++ b/mmagic/models/editors/biggan/biggan_generator.py @@ -10,7 +10,7 @@ from mmengine.runner.checkpoint import _load_checkpoint_with_prefix from torch.nn.utils import spectral_norm -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ...utils import get_module_device from .biggan_modules import SelfAttentionBlock, SNConvModule from .biggan_snmodule import SNLinear diff --git a/mmedit/models/editors/biggan/biggan_modules.py b/mmagic/models/editors/biggan/biggan_modules.py similarity index 99% rename from mmedit/models/editors/biggan/biggan_modules.py rename to mmagic/models/editors/biggan/biggan_modules.py index bd347516cd..1b4aadb2a5 100644 --- a/mmedit/models/editors/biggan/biggan_modules.py +++ b/mmagic/models/editors/biggan/biggan_modules.py @@ -10,7 +10,7 @@ from torch.nn.modules.batchnorm import SyncBatchNorm from torch.nn.utils import spectral_norm -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .biggan_snmodule import SNConv2d, SNLinear diff --git a/mmedit/models/editors/biggan/biggan_snmodule.py b/mmagic/models/editors/biggan/biggan_snmodule.py similarity index 100% rename from mmedit/models/editors/biggan/biggan_snmodule.py rename to mmagic/models/editors/biggan/biggan_snmodule.py diff --git a/mmedit/models/editors/cain/__init__.py b/mmagic/models/editors/cain/__init__.py similarity index 100% rename from mmedit/models/editors/cain/__init__.py rename to mmagic/models/editors/cain/__init__.py diff --git a/mmedit/models/editors/cain/cain.py b/mmagic/models/editors/cain/cain.py similarity index 95% rename from mmedit/models/editors/cain/cain.py rename to mmagic/models/editors/cain/cain.py index 922a66a76b..06ee7b827e 100644 --- a/mmedit/models/editors/cain/cain.py +++ b/mmagic/models/editors/cain/cain.py @@ -1,6 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.models.base_models import BasicInterpolator -from mmedit.registry import MODELS +from mmagic.models.base_models import BasicInterpolator +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/cain/cain_net.py b/mmagic/models/editors/cain/cain_net.py similarity index 98% rename from mmedit/models/editors/cain/cain_net.py rename to mmagic/models/editors/cain/cain_net.py index fdcdcfeabb..d804f6c114 100644 --- a/mmedit/models/editors/cain/cain_net.py +++ b/mmagic/models/editors/cain/cain_net.py @@ -4,9 +4,9 @@ import torch.nn.functional as F from mmengine.model import BaseModule -from mmedit.models.base_archs import pixel_unshuffle -from mmedit.models.utils import make_layer -from mmedit.registry import MODELS +from mmagic.models.base_archs import pixel_unshuffle +from mmagic.models.utils import make_layer +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/controlnet/__init__.py b/mmagic/models/editors/controlnet/__init__.py similarity index 100% rename from mmedit/models/editors/controlnet/__init__.py rename to mmagic/models/editors/controlnet/__init__.py diff --git a/mmedit/models/editors/controlnet/controlnet.py b/mmagic/models/editors/controlnet/controlnet.py similarity index 99% rename from mmedit/models/editors/controlnet/controlnet.py rename to mmagic/models/editors/controlnet/controlnet.py index a0a3b225cb..5fc7ae5577 100644 --- a/mmedit/models/editors/controlnet/controlnet.py +++ b/mmagic/models/editors/controlnet/controlnet.py @@ -13,10 +13,10 @@ from torch import Tensor from tqdm import tqdm -from mmedit.models.utils import build_module -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import SampleList +from mmagic.models.utils import build_module +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import SampleList from ..stable_diffusion import StableDiffusion from .controlnet_utils import change_base_model @@ -77,7 +77,7 @@ def init_weights(self): """Initialize the weights. Noted that this function will only be called at train. If you want to inference with a different unet model, you can call this function manually or use - `mmedit.models.editors.controlnet.controlnet_utils.change_base_model` + `mmagic.models.editors.controlnet.controlnet_utils.change_base_model` to convert the weight of ControlNet manually. Example: diff --git a/mmedit/models/editors/controlnet/controlnet_utils.py b/mmagic/models/editors/controlnet/controlnet_utils.py similarity index 100% rename from mmedit/models/editors/controlnet/controlnet_utils.py rename to mmagic/models/editors/controlnet/controlnet_utils.py diff --git a/mmedit/models/editors/cyclegan/__init__.py b/mmagic/models/editors/cyclegan/__init__.py similarity index 100% rename from mmedit/models/editors/cyclegan/__init__.py rename to mmagic/models/editors/cyclegan/__init__.py diff --git a/mmedit/models/editors/cyclegan/cyclegan.py b/mmagic/models/editors/cyclegan/cyclegan.py similarity index 98% rename from mmedit/models/editors/cyclegan/cyclegan.py rename to mmagic/models/editors/cyclegan/cyclegan.py index 2baf06b2fa..ce80e00b96 100644 --- a/mmedit/models/editors/cyclegan/cyclegan.py +++ b/mmagic/models/editors/cyclegan/cyclegan.py @@ -4,9 +4,9 @@ from mmengine import MessageHub from mmengine.optim import OptimWrapperDict -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import SampleList +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import SampleList from ...base_models import BaseTranslationModel from ...utils import set_requires_grad from .cyclegan_modules import GANImageBuffer diff --git a/mmedit/models/editors/cyclegan/cyclegan_generator.py b/mmagic/models/editors/cyclegan/cyclegan_generator.py similarity index 98% rename from mmedit/models/editors/cyclegan/cyclegan_generator.py rename to mmagic/models/editors/cyclegan/cyclegan_generator.py index 0ea70bb420..1416032782 100644 --- a/mmedit/models/editors/cyclegan/cyclegan_generator.py +++ b/mmagic/models/editors/cyclegan/cyclegan_generator.py @@ -4,8 +4,8 @@ from mmengine.logging import MMLogger from mmengine.runner import load_checkpoint -from mmedit.models.utils import generation_init_weights -from mmedit.registry import MODELS +from mmagic.models.utils import generation_init_weights +from mmagic.registry import MODELS from .cyclegan_modules import ResidualBlockWithDropout diff --git a/mmedit/models/editors/cyclegan/cyclegan_modules.py b/mmagic/models/editors/cyclegan/cyclegan_modules.py similarity index 100% rename from mmedit/models/editors/cyclegan/cyclegan_modules.py rename to mmagic/models/editors/cyclegan/cyclegan_modules.py diff --git a/mmedit/models/editors/dcgan/__init__.py b/mmagic/models/editors/dcgan/__init__.py similarity index 100% rename from mmedit/models/editors/dcgan/__init__.py rename to mmagic/models/editors/dcgan/__init__.py diff --git a/mmedit/models/editors/dcgan/dcgan.py b/mmagic/models/editors/dcgan/dcgan.py similarity index 95% rename from mmedit/models/editors/dcgan/dcgan.py rename to mmagic/models/editors/dcgan/dcgan.py index eafb78952c..b412f7b57b 100644 --- a/mmedit/models/editors/dcgan/dcgan.py +++ b/mmagic/models/editors/dcgan/dcgan.py @@ -6,8 +6,8 @@ from mmengine.optim import OptimWrapper from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample from ...base_models import BaseGAN @@ -20,9 +20,9 @@ class DCGAN(BaseGAN): `_ (DCGAN). Detailed architecture can be found in - :class:`~mmedit.models.editors.dcgan.DCGANGenerator` # noqa + :class:`~mmagic.models.editors.dcgan.DCGANGenerator` # noqa and - :class:`~mmedit.models.editors.dcgan.DCGANDiscriminator` # noqa + :class:`~mmagic.models.editors.dcgan.DCGANDiscriminator` # noqa """ def disc_loss(self, disc_pred_fake: Tensor, diff --git a/mmedit/models/editors/dcgan/dcgan_discriminator.py b/mmagic/models/editors/dcgan/dcgan_discriminator.py similarity index 99% rename from mmedit/models/editors/dcgan/dcgan_discriminator.py rename to mmagic/models/editors/dcgan/dcgan_discriminator.py index dd34e876a4..070ab3d5ad 100644 --- a/mmedit/models/editors/dcgan/dcgan_discriminator.py +++ b/mmagic/models/editors/dcgan/dcgan_discriminator.py @@ -7,7 +7,7 @@ from mmengine.runner import load_checkpoint from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/dcgan/dcgan_generator.py b/mmagic/models/editors/dcgan/dcgan_generator.py similarity index 99% rename from mmedit/models/editors/dcgan/dcgan_generator.py rename to mmagic/models/editors/dcgan/dcgan_generator.py index 7c705a03f2..2e914bd2ea 100644 --- a/mmedit/models/editors/dcgan/dcgan_generator.py +++ b/mmagic/models/editors/dcgan/dcgan_generator.py @@ -8,7 +8,7 @@ from mmengine.runner import load_checkpoint from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ...utils import get_module_device diff --git a/mmedit/models/editors/ddpm/__init__.py b/mmagic/models/editors/ddpm/__init__.py similarity index 100% rename from mmedit/models/editors/ddpm/__init__.py rename to mmagic/models/editors/ddpm/__init__.py diff --git a/mmedit/models/editors/ddpm/attention.py b/mmagic/models/editors/ddpm/attention.py similarity index 100% rename from mmedit/models/editors/ddpm/attention.py rename to mmagic/models/editors/ddpm/attention.py diff --git a/mmedit/models/editors/ddpm/denoising_unet.py b/mmagic/models/editors/ddpm/denoising_unet.py similarity index 99% rename from mmedit/models/editors/ddpm/denoising_unet.py rename to mmagic/models/editors/ddpm/denoising_unet.py index 86bb34dc2e..52f6e5b7c9 100644 --- a/mmedit/models/editors/ddpm/denoising_unet.py +++ b/mmagic/models/editors/ddpm/denoising_unet.py @@ -17,7 +17,7 @@ from mmengine.utils.dl_utils import TORCH_VERSION from mmengine.utils.version_utils import digit_version -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .embeddings import TimestepEmbedding, Timesteps from .unet_blocks import UNetMidBlock2DCrossAttn, get_down_block, get_up_block diff --git a/mmedit/models/editors/ddpm/embeddings.py b/mmagic/models/editors/ddpm/embeddings.py similarity index 100% rename from mmedit/models/editors/ddpm/embeddings.py rename to mmagic/models/editors/ddpm/embeddings.py diff --git a/mmedit/models/editors/ddpm/res_blocks.py b/mmagic/models/editors/ddpm/res_blocks.py similarity index 100% rename from mmedit/models/editors/ddpm/res_blocks.py rename to mmagic/models/editors/ddpm/res_blocks.py diff --git a/mmedit/models/editors/ddpm/unet_blocks.py b/mmagic/models/editors/ddpm/unet_blocks.py similarity index 100% rename from mmedit/models/editors/ddpm/unet_blocks.py rename to mmagic/models/editors/ddpm/unet_blocks.py diff --git a/mmedit/models/editors/deepfillv1/__init__.py b/mmagic/models/editors/deepfillv1/__init__.py similarity index 100% rename from mmedit/models/editors/deepfillv1/__init__.py rename to mmagic/models/editors/deepfillv1/__init__.py diff --git a/mmedit/models/editors/deepfillv1/contextual_attention.py b/mmagic/models/editors/deepfillv1/contextual_attention.py similarity index 100% rename from mmedit/models/editors/deepfillv1/contextual_attention.py rename to mmagic/models/editors/deepfillv1/contextual_attention.py diff --git a/mmedit/models/editors/deepfillv1/contextual_attention_neck.py b/mmagic/models/editors/deepfillv1/contextual_attention_neck.py similarity index 93% rename from mmedit/models/editors/deepfillv1/contextual_attention_neck.py rename to mmagic/models/editors/deepfillv1/contextual_attention_neck.py index a6881f1335..5286301c79 100644 --- a/mmedit/models/editors/deepfillv1/contextual_attention_neck.py +++ b/mmagic/models/editors/deepfillv1/contextual_attention_neck.py @@ -2,10 +2,10 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmedit.models.base_archs import SimpleGatedConvModule -from mmedit.models.editors.deepfillv1.contextual_attention import \ +from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.editors.deepfillv1.contextual_attention import \ ContextualAttentionModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/deepfillv1/deepfill_decoder.py b/mmagic/models/editors/deepfillv1/deepfill_decoder.py similarity index 97% rename from mmedit/models/editors/deepfillv1/deepfill_decoder.py rename to mmagic/models/editors/deepfillv1/deepfill_decoder.py index c87061231f..5bccc467b8 100644 --- a/mmedit/models/editors/deepfillv1/deepfill_decoder.py +++ b/mmagic/models/editors/deepfillv1/deepfill_decoder.py @@ -8,8 +8,8 @@ from mmengine.model import BaseModule # from ...modules import SimpleGatedConvModule -from mmedit.models.base_archs import SimpleGatedConvModule -from mmedit.registry import MODELS +from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/deepfillv1/deepfill_disc.py b/mmagic/models/editors/deepfillv1/deepfill_disc.py similarity index 98% rename from mmedit/models/editors/deepfillv1/deepfill_disc.py rename to mmagic/models/editors/deepfillv1/deepfill_disc.py index 6b0b2d4cc7..d772baf6bb 100644 --- a/mmedit/models/editors/deepfillv1/deepfill_disc.py +++ b/mmagic/models/editors/deepfillv1/deepfill_disc.py @@ -3,7 +3,7 @@ from mmengine.model import BaseModule from mmengine.model.weight_init import normal_init -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/deepfillv1/deepfill_encoder.py b/mmagic/models/editors/deepfillv1/deepfill_encoder.py similarity index 96% rename from mmedit/models/editors/deepfillv1/deepfill_encoder.py rename to mmagic/models/editors/deepfillv1/deepfill_encoder.py index 6a8ff2093d..d32b32f9e8 100644 --- a/mmedit/models/editors/deepfillv1/deepfill_encoder.py +++ b/mmagic/models/editors/deepfillv1/deepfill_encoder.py @@ -2,8 +2,8 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmedit.models.base_archs import SimpleGatedConvModule -from mmedit.registry import MODELS +from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/deepfillv1/deepfill_refiner.py b/mmagic/models/editors/deepfillv1/deepfill_refiner.py similarity index 98% rename from mmedit/models/editors/deepfillv1/deepfill_refiner.py rename to mmagic/models/editors/deepfillv1/deepfill_refiner.py index 432aa24729..1171236f6b 100644 --- a/mmedit/models/editors/deepfillv1/deepfill_refiner.py +++ b/mmagic/models/editors/deepfillv1/deepfill_refiner.py @@ -3,7 +3,7 @@ import torch.nn.functional as F from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/deepfillv1/deepfillv1.py b/mmagic/models/editors/deepfillv1/deepfillv1.py similarity index 99% rename from mmedit/models/editors/deepfillv1/deepfillv1.py rename to mmagic/models/editors/deepfillv1/deepfillv1.py index 8fcedc49fb..ab34f2e865 100644 --- a/mmedit/models/editors/deepfillv1/deepfillv1.py +++ b/mmagic/models/editors/deepfillv1/deepfillv1.py @@ -3,9 +3,9 @@ import torch -from mmedit.models.base_models import TwoStageInpaintor -from mmedit.models.utils import extract_around_bbox, extract_bbox_patch -from mmedit.registry import MODELS +from mmagic.models.base_models import TwoStageInpaintor +from mmagic.models.utils import extract_around_bbox, extract_bbox_patch +from mmagic.registry import MODELS from ...utils import set_requires_grad diff --git a/mmedit/models/editors/deepfillv2/__init__.py b/mmagic/models/editors/deepfillv2/__init__.py similarity index 100% rename from mmedit/models/editors/deepfillv2/__init__.py rename to mmagic/models/editors/deepfillv2/__init__.py diff --git a/mmedit/models/editors/deepfillv2/two_stage_encoder_decoder.py b/mmagic/models/editors/deepfillv2/two_stage_encoder_decoder.py similarity index 98% rename from mmedit/models/editors/deepfillv2/two_stage_encoder_decoder.py rename to mmagic/models/editors/deepfillv2/two_stage_encoder_decoder.py index d7ed690620..72fef2d7e4 100644 --- a/mmedit/models/editors/deepfillv2/two_stage_encoder_decoder.py +++ b/mmagic/models/editors/deepfillv2/two_stage_encoder_decoder.py @@ -5,7 +5,7 @@ from mmengine.model.weight_init import constant_init, normal_init from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/dic/__init__.py b/mmagic/models/editors/dic/__init__.py similarity index 100% rename from mmedit/models/editors/dic/__init__.py rename to mmagic/models/editors/dic/__init__.py diff --git a/mmedit/models/editors/dic/dic.py b/mmagic/models/editors/dic/dic.py similarity index 98% rename from mmedit/models/editors/dic/dic.py rename to mmagic/models/editors/dic/dic.py index e4cc027271..1d256c5088 100644 --- a/mmedit/models/editors/dic/dic.py +++ b/mmagic/models/editors/dic/dic.py @@ -4,8 +4,8 @@ import torch from mmengine.optim import OptimWrapperDict -from mmedit.models.utils import set_requires_grad -from mmedit.registry import MODELS +from mmagic.models.utils import set_requires_grad +from mmagic.registry import MODELS from ..srgan import SRGAN diff --git a/mmedit/models/editors/dic/dic_net.py b/mmagic/models/editors/dic/dic_net.py similarity index 99% rename from mmedit/models/editors/dic/dic_net.py rename to mmagic/models/editors/dic/dic_net.py index 53e1ddf254..a5e4ad2267 100644 --- a/mmedit/models/editors/dic/dic_net.py +++ b/mmagic/models/editors/dic/dic_net.py @@ -3,8 +3,8 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.models.utils import make_layer -from mmedit.registry import MODELS +from mmagic.models.utils import make_layer +from mmagic.registry import MODELS from .feedback_hour_glass import FeedbackHourglass, reduce_to_five_heatmaps diff --git a/mmedit/models/editors/dic/feedback_hour_glass.py b/mmagic/models/editors/dic/feedback_hour_glass.py similarity index 99% rename from mmedit/models/editors/dic/feedback_hour_glass.py rename to mmagic/models/editors/dic/feedback_hour_glass.py index f2e27af8ff..abf6a39715 100644 --- a/mmedit/models/editors/dic/feedback_hour_glass.py +++ b/mmagic/models/editors/dic/feedback_hour_glass.py @@ -3,7 +3,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/dic/light_cnn.py b/mmagic/models/editors/dic/light_cnn.py similarity index 99% rename from mmedit/models/editors/dic/light_cnn.py rename to mmagic/models/editors/dic/light_cnn.py index f166f18d79..14a1ff076e 100644 --- a/mmedit/models/editors/dic/light_cnn.py +++ b/mmagic/models/editors/dic/light_cnn.py @@ -5,7 +5,7 @@ from mmengine.model import BaseModule from mmengine.runner import load_checkpoint -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/dim/__init__.py b/mmagic/models/editors/dim/__init__.py similarity index 100% rename from mmedit/models/editors/dim/__init__.py rename to mmagic/models/editors/dim/__init__.py diff --git a/mmedit/models/editors/dim/dim.py b/mmagic/models/editors/dim/dim.py similarity index 98% rename from mmedit/models/editors/dim/dim.py rename to mmagic/models/editors/dim/dim.py index 4b74666621..725a1650a7 100644 --- a/mmedit/models/editors/dim/dim.py +++ b/mmagic/models/editors/dim/dim.py @@ -4,9 +4,9 @@ import torch from mmengine.logging import MMLogger -from mmedit.models.base_models import BaseMattor -from mmedit.models.utils import get_unknown_tensor -from mmedit.registry import MODELS +from mmagic.models.base_models import BaseMattor +from mmagic.models.utils import get_unknown_tensor +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/disco_diffusion/__init__.py b/mmagic/models/editors/disco_diffusion/__init__.py similarity index 100% rename from mmedit/models/editors/disco_diffusion/__init__.py rename to mmagic/models/editors/disco_diffusion/__init__.py diff --git a/mmedit/models/editors/disco_diffusion/clip_wrapper.py b/mmagic/models/editors/disco_diffusion/clip_wrapper.py similarity index 99% rename from mmedit/models/editors/disco_diffusion/clip_wrapper.py rename to mmagic/models/editors/disco_diffusion/clip_wrapper.py index 3aa83742fa..c006369ab4 100644 --- a/mmedit/models/editors/disco_diffusion/clip_wrapper.py +++ b/mmagic/models/editors/disco_diffusion/clip_wrapper.py @@ -2,7 +2,7 @@ import torch.nn as nn from mmengine import print_log -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/disco_diffusion/disco.py b/mmagic/models/editors/disco_diffusion/disco.py similarity index 99% rename from mmedit/models/editors/disco_diffusion/disco.py rename to mmagic/models/editors/disco_diffusion/disco.py index f46c4f2cf4..084bf72a3c 100644 --- a/mmedit/models/editors/disco_diffusion/disco.py +++ b/mmagic/models/editors/disco_diffusion/disco.py @@ -10,7 +10,7 @@ _load_checkpoint_with_prefix) from tqdm import tqdm -from mmedit.registry import DIFFUSION_SCHEDULERS, MODELS +from mmagic.registry import DIFFUSION_SCHEDULERS, MODELS from .guider import ImageTextGuider ModelType = Union[Dict, nn.Module] diff --git a/mmedit/models/editors/disco_diffusion/guider.py b/mmagic/models/editors/disco_diffusion/guider.py similarity index 99% rename from mmedit/models/editors/disco_diffusion/guider.py rename to mmagic/models/editors/disco_diffusion/guider.py index c3a0183a31..bff1e2c49b 100644 --- a/mmedit/models/editors/disco_diffusion/guider.py +++ b/mmagic/models/editors/disco_diffusion/guider.py @@ -13,8 +13,8 @@ from resize_right import resize from torchvision import __version__ as TORCHVISION_VERSION -from mmedit.models.losses import tv_loss -from mmedit.utils import try_import +from mmagic.models.losses import tv_loss +from mmagic.utils import try_import from .secondary_model import alpha_sigma_to_t clip = try_import('clip') diff --git a/mmedit/models/editors/disco_diffusion/secondary_model.py b/mmagic/models/editors/disco_diffusion/secondary_model.py similarity index 99% rename from mmedit/models/editors/disco_diffusion/secondary_model.py rename to mmagic/models/editors/disco_diffusion/secondary_model.py index 0fd0646c3d..862ed29666 100644 --- a/mmedit/models/editors/disco_diffusion/secondary_model.py +++ b/mmagic/models/editors/disco_diffusion/secondary_model.py @@ -5,7 +5,7 @@ import torch import torch.nn as nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS # Note: This model is copied from Disco-Diffusion colab. # SourceCode: https://colab.research.google.com/drive/1uGKaBOEACeinAA7jX1_zSFtj_ZW-huHS#scrollTo=XIqUfrmvLIhg # noqa diff --git a/mmedit/models/editors/dreambooth/__init__.py b/mmagic/models/editors/dreambooth/__init__.py similarity index 100% rename from mmedit/models/editors/dreambooth/__init__.py rename to mmagic/models/editors/dreambooth/__init__.py diff --git a/mmedit/models/editors/dreambooth/dreambooth.py b/mmagic/models/editors/dreambooth/dreambooth.py similarity index 98% rename from mmedit/models/editors/dreambooth/dreambooth.py rename to mmagic/models/editors/dreambooth/dreambooth.py index e92eea3f21..42cb936ac4 100644 --- a/mmedit/models/editors/dreambooth/dreambooth.py +++ b/mmagic/models/editors/dreambooth/dreambooth.py @@ -8,10 +8,10 @@ import torch.nn.functional as F from mmengine import print_log -from mmedit.models.base_archs import set_lora -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import SampleList +from mmagic.models.base_archs import set_lora +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import SampleList from ..stable_diffusion.stable_diffusion import StableDiffusion ModelType = Union[Dict, nn.Module] diff --git a/mmedit/models/editors/duf/__init__.py b/mmagic/models/editors/duf/__init__.py similarity index 100% rename from mmedit/models/editors/duf/__init__.py rename to mmagic/models/editors/duf/__init__.py diff --git a/mmedit/models/editors/duf/duf.py b/mmagic/models/editors/duf/duf.py similarity index 100% rename from mmedit/models/editors/duf/duf.py rename to mmagic/models/editors/duf/duf.py diff --git a/mmedit/models/editors/edsr/__init__.py b/mmagic/models/editors/edsr/__init__.py similarity index 100% rename from mmedit/models/editors/edsr/__init__.py rename to mmagic/models/editors/edsr/__init__.py diff --git a/mmedit/models/editors/edsr/edsr_net.py b/mmagic/models/editors/edsr/edsr_net.py similarity index 96% rename from mmedit/models/editors/edsr/edsr_net.py rename to mmagic/models/editors/edsr/edsr_net.py index bfb11ac0ba..243bfdc27f 100644 --- a/mmedit/models/editors/edsr/edsr_net.py +++ b/mmagic/models/editors/edsr/edsr_net.py @@ -5,9 +5,9 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.models.base_archs import PixelShufflePack, ResidualBlockNoBN -from mmedit.models.utils import make_layer -from mmedit.registry import MODELS +from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.utils import make_layer +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/edvr/__init__.py b/mmagic/models/editors/edvr/__init__.py similarity index 100% rename from mmedit/models/editors/edvr/__init__.py rename to mmagic/models/editors/edvr/__init__.py diff --git a/mmedit/models/editors/edvr/edvr.py b/mmagic/models/editors/edvr/edvr.py similarity index 97% rename from mmedit/models/editors/edvr/edvr.py rename to mmagic/models/editors/edvr/edvr.py index b1a5e4a12e..20f6192b2d 100644 --- a/mmedit/models/editors/edvr/edvr.py +++ b/mmagic/models/editors/edvr/edvr.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models import BaseEditModel -from mmedit.registry import MODELS +from mmagic.models import BaseEditModel +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/edvr/edvr_net.py b/mmagic/models/editors/edvr/edvr_net.py similarity index 99% rename from mmedit/models/editors/edvr/edvr_net.py rename to mmagic/models/editors/edvr/edvr_net.py index 997a5ab701..5547aa2156 100644 --- a/mmedit/models/editors/edvr/edvr_net.py +++ b/mmagic/models/editors/edvr/edvr_net.py @@ -7,9 +7,9 @@ from mmengine.model.weight_init import constant_init, kaiming_init from torch.nn.modules.utils import _pair -from mmedit.models.base_archs import PixelShufflePack, ResidualBlockNoBN -from mmedit.models.utils import make_layer -from mmedit.registry import MODELS +from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.utils import make_layer +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/eg3d/__init__.py b/mmagic/models/editors/eg3d/__init__.py similarity index 100% rename from mmedit/models/editors/eg3d/__init__.py rename to mmagic/models/editors/eg3d/__init__.py diff --git a/mmedit/models/editors/eg3d/camera.py b/mmagic/models/editors/eg3d/camera.py similarity index 99% rename from mmedit/models/editors/eg3d/camera.py rename to mmagic/models/editors/eg3d/camera.py index 7d652471d6..fa9a66ce47 100644 --- a/mmedit/models/editors/eg3d/camera.py +++ b/mmagic/models/editors/eg3d/camera.py @@ -6,8 +6,8 @@ from mmengine.utils import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -from mmedit.models.utils import normalize_vecs -from mmedit.registry import MODELS +from mmagic.models.utils import normalize_vecs +from mmagic.registry import MODELS DeviceType = Optional[Union[str, int]] VectorType = Optional[Union[list, torch.Tensor]] diff --git a/mmedit/models/editors/eg3d/dual_discriminator.py b/mmagic/models/editors/eg3d/dual_discriminator.py similarity index 99% rename from mmedit/models/editors/eg3d/dual_discriminator.py rename to mmagic/models/editors/eg3d/dual_discriminator.py index 467a0d5317..3b558008f1 100644 --- a/mmedit/models/editors/eg3d/dual_discriminator.py +++ b/mmagic/models/editors/eg3d/dual_discriminator.py @@ -9,7 +9,7 @@ from mmengine.utils.dl_utils import TORCH_VERSION from torch import Tensor -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..stylegan2 import StyleGAN2Discriminator diff --git a/mmedit/models/editors/eg3d/eg3d.py b/mmagic/models/editors/eg3d/eg3d.py similarity index 97% rename from mmedit/models/editors/eg3d/eg3d.py rename to mmagic/models/editors/eg3d/eg3d.py index 6826f906d8..d1f9243a6d 100644 --- a/mmedit/models/editors/eg3d/eg3d.py +++ b/mmagic/models/editors/eg3d/eg3d.py @@ -8,9 +8,9 @@ from mmengine.utils import ProgressBar from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import ForwardInputs, SampleList +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import ForwardInputs, SampleList from ...base_models import BaseConditionalGAN from ...utils import get_valid_num_batches @@ -25,9 +25,9 @@ class EG3D(BaseConditionalGAN): _ (EG3D). # noqa Detailed architecture can be found in - :class:`~mmedit.models.editors.eg3d.eg3d_generator.TriplaneGenerator` + :class:`~mmagic.models.editors.eg3d.eg3d_generator.TriplaneGenerator` and - :class:`~mmedit.models.editors.eg3d.dual_discriminator.DualDiscriminator` + :class:`~mmagic.models.editors.eg3d.dual_discriminator.DualDiscriminator` Args: generator (ModelType): The config or model of the generator. @@ -37,7 +37,7 @@ class EG3D(BaseConditionalGAN): camera position. If you want to generate images or videos via high-level API, you must set this argument. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmedit.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.EditDataPreprocessor`. generator_steps (int): Number of times the generator was completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): Number of times the discriminator was diff --git a/mmedit/models/editors/eg3d/eg3d_generator.py b/mmagic/models/editors/eg3d/eg3d_generator.py similarity index 99% rename from mmedit/models/editors/eg3d/eg3d_generator.py rename to mmagic/models/editors/eg3d/eg3d_generator.py index 95676951bf..f22052c56b 100644 --- a/mmedit/models/editors/eg3d/eg3d_generator.py +++ b/mmagic/models/editors/eg3d/eg3d_generator.py @@ -6,7 +6,7 @@ from mmengine.model import BaseModule from torch import Tensor -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .eg3d_modules import SuperResolutionModule, TriPlaneBackbone from .ray_sampler import sample_rays from .renderer import EG3DRenderer diff --git a/mmedit/models/editors/eg3d/eg3d_modules.py b/mmagic/models/editors/eg3d/eg3d_modules.py similarity index 100% rename from mmedit/models/editors/eg3d/eg3d_modules.py rename to mmagic/models/editors/eg3d/eg3d_modules.py diff --git a/mmedit/models/editors/eg3d/eg3d_utils.py b/mmagic/models/editors/eg3d/eg3d_utils.py similarity index 100% rename from mmedit/models/editors/eg3d/eg3d_utils.py rename to mmagic/models/editors/eg3d/eg3d_utils.py diff --git a/mmedit/models/editors/eg3d/ray_sampler.py b/mmagic/models/editors/eg3d/ray_sampler.py similarity index 100% rename from mmedit/models/editors/eg3d/ray_sampler.py rename to mmagic/models/editors/eg3d/ray_sampler.py diff --git a/mmedit/models/editors/eg3d/renderer.py b/mmagic/models/editors/eg3d/renderer.py similarity index 100% rename from mmedit/models/editors/eg3d/renderer.py rename to mmagic/models/editors/eg3d/renderer.py diff --git a/mmedit/models/editors/esrgan/__init__.py b/mmagic/models/editors/esrgan/__init__.py similarity index 100% rename from mmedit/models/editors/esrgan/__init__.py rename to mmagic/models/editors/esrgan/__init__.py diff --git a/mmedit/models/editors/esrgan/esrgan.py b/mmagic/models/editors/esrgan/esrgan.py similarity index 99% rename from mmedit/models/editors/esrgan/esrgan.py rename to mmagic/models/editors/esrgan/esrgan.py index 48799a467e..62917a6de7 100644 --- a/mmedit/models/editors/esrgan/esrgan.py +++ b/mmagic/models/editors/esrgan/esrgan.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..srgan import SRGAN diff --git a/mmedit/models/editors/esrgan/rrdb_net.py b/mmagic/models/editors/esrgan/rrdb_net.py similarity index 97% rename from mmedit/models/editors/esrgan/rrdb_net.py rename to mmagic/models/editors/esrgan/rrdb_net.py index e2f0607b52..4c574bf1e0 100644 --- a/mmedit/models/editors/esrgan/rrdb_net.py +++ b/mmagic/models/editors/esrgan/rrdb_net.py @@ -4,9 +4,9 @@ import torch.nn.functional as F from mmengine.model import BaseModule -from mmedit.models.base_archs import pixel_unshuffle -from mmedit.models.utils import default_init_weights, make_layer -from mmedit.registry import MODELS +from mmagic.models.base_archs import pixel_unshuffle +from mmagic.models.utils import default_init_weights, make_layer +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/fba/__init__.py b/mmagic/models/editors/fba/__init__.py similarity index 100% rename from mmedit/models/editors/fba/__init__.py rename to mmagic/models/editors/fba/__init__.py diff --git a/mmedit/models/editors/fba/fba_decoder.py b/mmagic/models/editors/fba/fba_decoder.py similarity index 99% rename from mmedit/models/editors/fba/fba_decoder.py rename to mmagic/models/editors/fba/fba_decoder.py index 8ff51f6b55..78c43a1d24 100644 --- a/mmedit/models/editors/fba/fba_decoder.py +++ b/mmagic/models/editors/fba/fba_decoder.py @@ -7,7 +7,7 @@ from mmengine.runner import load_checkpoint from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/fba/fba_encoder.py b/mmagic/models/editors/fba/fba_encoder.py similarity index 93% rename from mmedit/models/editors/fba/fba_encoder.py rename to mmagic/models/editors/fba/fba_encoder.py index e030c059a0..daf49f7202 100644 --- a/mmedit/models/editors/fba/fba_encoder.py +++ b/mmagic/models/editors/fba/fba_encoder.py @@ -1,6 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.models.base_archs import ResNet -from mmedit.registry import MODELS +from mmagic.models.base_archs import ResNet +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/flavr/__init__.py b/mmagic/models/editors/flavr/__init__.py similarity index 100% rename from mmedit/models/editors/flavr/__init__.py rename to mmagic/models/editors/flavr/__init__.py diff --git a/mmedit/models/editors/flavr/flavr.py b/mmagic/models/editors/flavr/flavr.py similarity index 94% rename from mmedit/models/editors/flavr/flavr.py rename to mmagic/models/editors/flavr/flavr.py index a2339d4d34..dbec368f2a 100644 --- a/mmedit/models/editors/flavr/flavr.py +++ b/mmagic/models/editors/flavr/flavr.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.models.base_models import BasicInterpolator -from mmedit.registry import MODELS -from mmedit.utils import tensor2img +from mmagic.models.base_models import BasicInterpolator +from mmagic.registry import MODELS +from mmagic.utils import tensor2img # TODO tensor2img will be move diff --git a/mmedit/models/editors/flavr/flavr_net.py b/mmagic/models/editors/flavr/flavr_net.py similarity index 99% rename from mmedit/models/editors/flavr/flavr_net.py rename to mmagic/models/editors/flavr/flavr_net.py index 0fdffef7fd..03a98ea680 100644 --- a/mmedit/models/editors/flavr/flavr_net.py +++ b/mmagic/models/editors/flavr/flavr_net.py @@ -4,7 +4,7 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/gca/__init__.py b/mmagic/models/editors/gca/__init__.py similarity index 100% rename from mmedit/models/editors/gca/__init__.py rename to mmagic/models/editors/gca/__init__.py diff --git a/mmedit/models/editors/gca/gca.py b/mmagic/models/editors/gca/gca.py similarity index 95% rename from mmedit/models/editors/gca/gca.py rename to mmagic/models/editors/gca/gca.py index 3a0a970b46..1a292ba0e1 100644 --- a/mmedit/models/editors/gca/gca.py +++ b/mmagic/models/editors/gca/gca.py @@ -1,9 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. from typing import Optional -from mmedit.models.base_models import BaseMattor -from mmedit.models.utils import get_unknown_tensor -from mmedit.registry import MODELS +from mmagic.models.base_models import BaseMattor +from mmagic.models.utils import get_unknown_tensor +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/gca/gca_module.py b/mmagic/models/editors/gca/gca_module.py similarity index 100% rename from mmedit/models/editors/gca/gca_module.py rename to mmagic/models/editors/gca/gca_module.py diff --git a/mmedit/models/editors/gca/resgca_dec.py b/mmagic/models/editors/gca/resgca_dec.py similarity index 99% rename from mmedit/models/editors/gca/resgca_dec.py rename to mmagic/models/editors/gca/resgca_dec.py index 3cd6dd3ee8..2138d0a104 100644 --- a/mmedit/models/editors/gca/resgca_dec.py +++ b/mmagic/models/editors/gca/resgca_dec.py @@ -6,7 +6,7 @@ from mmengine.model import BaseModule from mmengine.model.weight_init import constant_init -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .gca_module import GCAModule from .resgca_enc import BasicBlock diff --git a/mmedit/models/editors/gca/resgca_enc.py b/mmagic/models/editors/gca/resgca_enc.py similarity index 99% rename from mmedit/models/editors/gca/resgca_enc.py rename to mmagic/models/editors/gca/resgca_enc.py index eb6423e0d0..5ff85ba807 100644 --- a/mmedit/models/editors/gca/resgca_enc.py +++ b/mmagic/models/editors/gca/resgca_enc.py @@ -7,7 +7,7 @@ from mmengine.model import BaseModule from mmengine.model.weight_init import constant_init -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .gca_module import GCAModule diff --git a/mmedit/models/editors/ggan/__init__.py b/mmagic/models/editors/ggan/__init__.py similarity index 100% rename from mmedit/models/editors/ggan/__init__.py rename to mmagic/models/editors/ggan/__init__.py diff --git a/mmedit/models/editors/ggan/ggan.py b/mmagic/models/editors/ggan/ggan.py similarity index 98% rename from mmedit/models/editors/ggan/ggan.py rename to mmagic/models/editors/ggan/ggan.py index 69f05c9458..811dd5d448 100644 --- a/mmedit/models/editors/ggan/ggan.py +++ b/mmagic/models/editors/ggan/ggan.py @@ -6,8 +6,8 @@ from mmengine.optim import OptimWrapper from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample from ...base_models import BaseGAN diff --git a/mmedit/models/editors/glean/__init__.py b/mmagic/models/editors/glean/__init__.py similarity index 100% rename from mmedit/models/editors/glean/__init__.py rename to mmagic/models/editors/glean/__init__.py diff --git a/mmedit/models/editors/glean/glean_styleganv2.py b/mmagic/models/editors/glean/glean_styleganv2.py similarity index 98% rename from mmedit/models/editors/glean/glean_styleganv2.py rename to mmagic/models/editors/glean/glean_styleganv2.py index 2a9df539b8..1ab017fcc5 100644 --- a/mmedit/models/editors/glean/glean_styleganv2.py +++ b/mmagic/models/editors/glean/glean_styleganv2.py @@ -4,9 +4,9 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.models.base_archs import PixelShufflePack -from mmedit.models.utils import make_layer -from mmedit.registry import MODELS +from mmagic.models.base_archs import PixelShufflePack +from mmagic.models.utils import make_layer +from mmagic.registry import MODELS from ..esrgan.rrdb_net import RRDB diff --git a/mmedit/models/editors/global_local/__init__.py b/mmagic/models/editors/global_local/__init__.py similarity index 100% rename from mmedit/models/editors/global_local/__init__.py rename to mmagic/models/editors/global_local/__init__.py diff --git a/mmedit/models/editors/global_local/gl_decoder.py b/mmagic/models/editors/global_local/gl_decoder.py similarity index 98% rename from mmedit/models/editors/global_local/gl_decoder.py rename to mmagic/models/editors/global_local/gl_decoder.py index a59976d23f..0c3f3dc975 100644 --- a/mmedit/models/editors/global_local/gl_decoder.py +++ b/mmagic/models/editors/global_local/gl_decoder.py @@ -6,7 +6,7 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/global_local/gl_dilation.py b/mmagic/models/editors/global_local/gl_dilation.py similarity index 95% rename from mmedit/models/editors/global_local/gl_dilation.py rename to mmagic/models/editors/global_local/gl_dilation.py index f37c4f33fb..f418a70d9a 100644 --- a/mmedit/models/editors/global_local/gl_dilation.py +++ b/mmagic/models/editors/global_local/gl_dilation.py @@ -3,8 +3,8 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmedit.models.base_archs import SimpleGatedConvModule -from mmedit.registry import MODELS +from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/global_local/gl_disc.py b/mmagic/models/editors/global_local/gl_disc.py similarity index 94% rename from mmedit/models/editors/global_local/gl_disc.py rename to mmagic/models/editors/global_local/gl_disc.py index d8384218eb..ce4174879a 100644 --- a/mmedit/models/editors/global_local/gl_disc.py +++ b/mmagic/models/editors/global_local/gl_disc.py @@ -3,8 +3,8 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.models.base_archs import MultiLayerDiscriminator -from mmedit.registry import MODELS +from mmagic.models.base_archs import MultiLayerDiscriminator +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/global_local/gl_encoder.py b/mmagic/models/editors/global_local/gl_encoder.py similarity index 97% rename from mmedit/models/editors/global_local/gl_encoder.py rename to mmagic/models/editors/global_local/gl_encoder.py index 5c240d9dc1..a8c3d97350 100644 --- a/mmedit/models/editors/global_local/gl_encoder.py +++ b/mmagic/models/editors/global_local/gl_encoder.py @@ -2,7 +2,7 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/global_local/gl_encoder_decoder.py b/mmagic/models/editors/global_local/gl_encoder_decoder.py similarity index 97% rename from mmedit/models/editors/global_local/gl_encoder_decoder.py rename to mmagic/models/editors/global_local/gl_encoder_decoder.py index f4e99898af..35c5580233 100644 --- a/mmedit/models/editors/global_local/gl_encoder_decoder.py +++ b/mmagic/models/editors/global_local/gl_encoder_decoder.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/global_local/gl_inpaintor.py b/mmagic/models/editors/global_local/gl_inpaintor.py similarity index 98% rename from mmedit/models/editors/global_local/gl_inpaintor.py rename to mmagic/models/editors/global_local/gl_inpaintor.py index 06cfe49794..1d2d82dd5b 100644 --- a/mmedit/models/editors/global_local/gl_inpaintor.py +++ b/mmagic/models/editors/global_local/gl_inpaintor.py @@ -3,9 +3,9 @@ import torch -from mmedit.models.base_models import OneStageInpaintor -from mmedit.models.utils import extract_around_bbox, extract_bbox_patch -from mmedit.registry import MODELS +from mmagic.models.base_models import OneStageInpaintor +from mmagic.models.utils import extract_around_bbox, extract_bbox_patch +from mmagic.registry import MODELS from ...utils import set_requires_grad diff --git a/mmedit/models/editors/guided_diffusion/__init__.py b/mmagic/models/editors/guided_diffusion/__init__.py similarity index 100% rename from mmedit/models/editors/guided_diffusion/__init__.py rename to mmagic/models/editors/guided_diffusion/__init__.py diff --git a/mmedit/models/editors/guided_diffusion/adm.py b/mmagic/models/editors/guided_diffusion/adm.py similarity index 98% rename from mmedit/models/editors/guided_diffusion/adm.py rename to mmagic/models/editors/guided_diffusion/adm.py index 962c8eee15..724cd9d527 100644 --- a/mmedit/models/editors/guided_diffusion/adm.py +++ b/mmagic/models/editors/guided_diffusion/adm.py @@ -12,9 +12,9 @@ from mmengine.runner.checkpoint import _load_checkpoint_with_prefix from tqdm import tqdm -from mmedit.registry import DIFFUSION_SCHEDULERS, MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import ForwardInputs, SampleList +from mmagic.registry import DIFFUSION_SCHEDULERS, MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import ForwardInputs, SampleList def classifier_grad(classifier, x, t, y=None, classifier_scale=1.0): diff --git a/mmedit/models/editors/guided_diffusion/classifier.py b/mmagic/models/editors/guided_diffusion/classifier.py similarity index 99% rename from mmedit/models/editors/guided_diffusion/classifier.py rename to mmagic/models/editors/guided_diffusion/classifier.py index 6adb067e35..51170eb2c7 100644 --- a/mmedit/models/editors/guided_diffusion/classifier.py +++ b/mmagic/models/editors/guided_diffusion/classifier.py @@ -6,11 +6,11 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.models.editors.ddpm.denoising_unet import (QKVAttention, +from mmagic.models.editors.ddpm.denoising_unet import (QKVAttention, QKVAttentionLegacy, convert_module_to_f16, convert_module_to_f32) -from mmedit.registry import MODELS +from mmagic.registry import MODELS def checkpoint(func, inputs, params, flag): diff --git a/mmedit/models/editors/iconvsr/__init__.py b/mmagic/models/editors/iconvsr/__init__.py similarity index 100% rename from mmedit/models/editors/iconvsr/__init__.py rename to mmagic/models/editors/iconvsr/__init__.py diff --git a/mmedit/models/editors/iconvsr/iconvsr_net.py b/mmagic/models/editors/iconvsr/iconvsr_net.py similarity index 98% rename from mmedit/models/editors/iconvsr/iconvsr_net.py rename to mmagic/models/editors/iconvsr/iconvsr_net.py index 4b9c68cb27..184bac5712 100644 --- a/mmedit/models/editors/iconvsr/iconvsr_net.py +++ b/mmagic/models/editors/iconvsr/iconvsr_net.py @@ -9,9 +9,9 @@ from mmengine.model import BaseModule from mmengine.runner import load_checkpoint -from mmedit.models.base_archs import PixelShufflePack, ResidualBlockNoBN -from mmedit.models.utils import flow_warp, make_layer -from mmedit.registry import MODELS +from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.utils import flow_warp, make_layer +from mmagic.registry import MODELS from ..basicvsr.basicvsr_net import ResidualBlocksWithInputConv, SPyNet from ..edvr.edvr_net import PCDAlignment, TSAFusion diff --git a/mmedit/models/editors/indexnet/__init__.py b/mmagic/models/editors/indexnet/__init__.py similarity index 100% rename from mmedit/models/editors/indexnet/__init__.py rename to mmagic/models/editors/indexnet/__init__.py diff --git a/mmedit/models/editors/indexnet/indexnet.py b/mmagic/models/editors/indexnet/indexnet.py similarity index 95% rename from mmedit/models/editors/indexnet/indexnet.py rename to mmagic/models/editors/indexnet/indexnet.py index 4f9aa1859b..4c29777a3a 100644 --- a/mmedit/models/editors/indexnet/indexnet.py +++ b/mmagic/models/editors/indexnet/indexnet.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.models.base_models import BaseMattor -from mmedit.models.utils import get_unknown_tensor -from mmedit.registry import MODELS +from mmagic.models.base_models import BaseMattor +from mmagic.models.utils import get_unknown_tensor +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/indexnet/indexnet_decoder.py b/mmagic/models/editors/indexnet/indexnet_decoder.py similarity index 98% rename from mmedit/models/editors/indexnet/indexnet_decoder.py rename to mmagic/models/editors/indexnet/indexnet_decoder.py index a2931f218b..f7c9260075 100644 --- a/mmedit/models/editors/indexnet/indexnet_decoder.py +++ b/mmagic/models/editors/indexnet/indexnet_decoder.py @@ -9,8 +9,8 @@ from mmengine.model import BaseModule from mmengine.model.weight_init import kaiming_init, normal_init -from mmedit.models.base_archs import DepthwiseSeparableConvModule -from mmedit.registry import MODELS +from mmagic.models.base_archs import DepthwiseSeparableConvModule +from mmagic.registry import MODELS class IndexedUpsample(BaseModule): diff --git a/mmedit/models/editors/indexnet/indexnet_encoder.py b/mmagic/models/editors/indexnet/indexnet_encoder.py similarity index 99% rename from mmedit/models/editors/indexnet/indexnet_encoder.py rename to mmagic/models/editors/indexnet/indexnet_encoder.py index 8be5ba9892..3041c8323f 100644 --- a/mmedit/models/editors/indexnet/indexnet_encoder.py +++ b/mmagic/models/editors/indexnet/indexnet_encoder.py @@ -10,8 +10,8 @@ from mmengine.model.weight_init import constant_init, xavier_init from mmengine.utils.dl_utils.parrots_wrapper import SyncBatchNorm -from mmedit.models.base_archs import ASPP, DepthwiseSeparableConvModule -from mmedit.registry import MODELS +from mmagic.models.base_archs import ASPP, DepthwiseSeparableConvModule +from mmagic.registry import MODELS def build_index_block(in_channels, diff --git a/mmedit/models/editors/inst_colorization/__init__.py b/mmagic/models/editors/inst_colorization/__init__.py similarity index 100% rename from mmedit/models/editors/inst_colorization/__init__.py rename to mmagic/models/editors/inst_colorization/__init__.py diff --git a/mmedit/models/editors/inst_colorization/color_utils.py b/mmagic/models/editors/inst_colorization/color_utils.py similarity index 100% rename from mmedit/models/editors/inst_colorization/color_utils.py rename to mmagic/models/editors/inst_colorization/color_utils.py diff --git a/mmedit/models/editors/inst_colorization/colorization_net.py b/mmagic/models/editors/inst_colorization/colorization_net.py similarity index 99% rename from mmedit/models/editors/inst_colorization/colorization_net.py rename to mmagic/models/editors/inst_colorization/colorization_net.py index ac92aaee6e..00d8407ae0 100644 --- a/mmedit/models/editors/inst_colorization/colorization_net.py +++ b/mmagic/models/editors/inst_colorization/colorization_net.py @@ -4,7 +4,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .weight_layer import get_norm_layer diff --git a/mmedit/models/editors/inst_colorization/fusion_net.py b/mmagic/models/editors/inst_colorization/fusion_net.py similarity index 99% rename from mmedit/models/editors/inst_colorization/fusion_net.py rename to mmagic/models/editors/inst_colorization/fusion_net.py index 977f2e60be..2930f5f50b 100644 --- a/mmedit/models/editors/inst_colorization/fusion_net.py +++ b/mmagic/models/editors/inst_colorization/fusion_net.py @@ -3,7 +3,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .weight_layer import WeightLayer, get_norm_layer diff --git a/mmedit/models/editors/inst_colorization/inst_colorization.py b/mmagic/models/editors/inst_colorization/inst_colorization.py similarity index 99% rename from mmedit/models/editors/inst_colorization/inst_colorization.py rename to mmagic/models/editors/inst_colorization/inst_colorization.py index 5a2cec76c3..78a33d9a4b 100644 --- a/mmedit/models/editors/inst_colorization/inst_colorization.py +++ b/mmagic/models/editors/inst_colorization/inst_colorization.py @@ -6,8 +6,8 @@ from mmengine.model import BaseModel from mmengine.optim import OptimWrapperDict -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample from .color_utils import get_colorization_data, lab2rgb diff --git a/mmedit/models/editors/inst_colorization/weight_layer.py b/mmagic/models/editors/inst_colorization/weight_layer.py similarity index 99% rename from mmedit/models/editors/inst_colorization/weight_layer.py rename to mmagic/models/editors/inst_colorization/weight_layer.py index 52050a4e3c..a787fc8913 100644 --- a/mmedit/models/editors/inst_colorization/weight_layer.py +++ b/mmagic/models/editors/inst_colorization/weight_layer.py @@ -5,7 +5,7 @@ from mmengine.model import BaseModule from torch import nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS def get_norm_layer(norm_type='instance'): diff --git a/mmedit/models/editors/liif/__init__.py b/mmagic/models/editors/liif/__init__.py similarity index 100% rename from mmedit/models/editors/liif/__init__.py rename to mmagic/models/editors/liif/__init__.py diff --git a/mmedit/models/editors/liif/liif.py b/mmagic/models/editors/liif/liif.py similarity index 94% rename from mmedit/models/editors/liif/liif.py rename to mmagic/models/editors/liif/liif.py index 8f225e05d8..8e7bda5c1e 100644 --- a/mmedit/models/editors/liif/liif.py +++ b/mmagic/models/editors/liif/liif.py @@ -3,9 +3,9 @@ import torch -from mmedit.models.base_models import BaseEditModel -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models.base_models import BaseEditModel +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample @MODELS.register_module() diff --git a/mmedit/models/editors/liif/liif_net.py b/mmagic/models/editors/liif/liif_net.py similarity index 99% rename from mmedit/models/editors/liif/liif_net.py rename to mmagic/models/editors/liif/liif_net.py index e7c58b7fef..a34687f40a 100644 --- a/mmedit/models/editors/liif/liif_net.py +++ b/mmagic/models/editors/liif/liif_net.py @@ -4,8 +4,8 @@ import torch.nn.functional as F from mmengine.model import BaseModule -from mmedit.registry import MODELS -from mmedit.utils import make_coord +from mmagic.registry import MODELS +from mmagic.utils import make_coord class LIIFNet(BaseModule): diff --git a/mmedit/models/editors/liif/mlp_refiner.py b/mmagic/models/editors/liif/mlp_refiner.py similarity index 96% rename from mmedit/models/editors/liif/mlp_refiner.py rename to mmagic/models/editors/liif/mlp_refiner.py index f9af805013..df231a84b1 100644 --- a/mmedit/models/editors/liif/mlp_refiner.py +++ b/mmagic/models/editors/liif/mlp_refiner.py @@ -2,7 +2,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/lsgan/__init__.py b/mmagic/models/editors/lsgan/__init__.py similarity index 100% rename from mmedit/models/editors/lsgan/__init__.py rename to mmagic/models/editors/lsgan/__init__.py diff --git a/mmedit/models/editors/lsgan/lsgan.py b/mmagic/models/editors/lsgan/lsgan.py similarity index 95% rename from mmedit/models/editors/lsgan/lsgan.py rename to mmagic/models/editors/lsgan/lsgan.py index 58cfde71bf..f879ed52e8 100644 --- a/mmedit/models/editors/lsgan/lsgan.py +++ b/mmagic/models/editors/lsgan/lsgan.py @@ -6,8 +6,8 @@ from mmengine.optim import OptimWrapper from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample from ...base_models import BaseGAN @@ -18,9 +18,9 @@ class LSGAN(BaseGAN): Paper link: https://arxiv.org/pdf/1611.04076.pdf Detailed architecture can be found in - :class:`~mmedit.models.editors.lsgan.LSGANGenerator` + :class:`~mmagic.models.editors.lsgan.LSGANGenerator` and - :class:`~mmedit.models.editors.lsgan.LSGANDiscriminator` + :class:`~mmagic.models.editors.lsgan.LSGANDiscriminator` """ def disc_loss(self, disc_pred_fake: Tensor, diff --git a/mmedit/models/editors/lsgan/lsgan_discriminator.py b/mmagic/models/editors/lsgan/lsgan_discriminator.py similarity index 99% rename from mmedit/models/editors/lsgan/lsgan_discriminator.py rename to mmagic/models/editors/lsgan/lsgan_discriminator.py index 03fed5e690..4377fa49c3 100644 --- a/mmedit/models/editors/lsgan/lsgan_discriminator.py +++ b/mmagic/models/editors/lsgan/lsgan_discriminator.py @@ -3,7 +3,7 @@ import torch.nn as nn from mmcv.cnn import ConvModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/lsgan/lsgan_generator.py b/mmagic/models/editors/lsgan/lsgan_generator.py similarity index 99% rename from mmedit/models/editors/lsgan/lsgan_generator.py rename to mmagic/models/editors/lsgan/lsgan_generator.py index d25d85e147..bbe69eb792 100644 --- a/mmedit/models/editors/lsgan/lsgan_generator.py +++ b/mmagic/models/editors/lsgan/lsgan_generator.py @@ -4,7 +4,7 @@ import torch.nn as nn from mmcv.cnn import ConvModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ...utils import get_module_device diff --git a/mmedit/models/editors/mspie/__init__.py b/mmagic/models/editors/mspie/__init__.py similarity index 100% rename from mmedit/models/editors/mspie/__init__.py rename to mmagic/models/editors/mspie/__init__.py diff --git a/mmedit/models/editors/mspie/mspie_stylegan2.py b/mmagic/models/editors/mspie/mspie_stylegan2.py similarity index 98% rename from mmedit/models/editors/mspie/mspie_stylegan2.py rename to mmagic/models/editors/mspie/mspie_stylegan2.py index 97eb0adedb..6e5e5aac1c 100644 --- a/mmedit/models/editors/mspie/mspie_stylegan2.py +++ b/mmagic/models/editors/mspie/mspie_stylegan2.py @@ -13,8 +13,8 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample from ...utils import set_requires_grad from ..stylegan2 import StyleGAN2 @@ -52,7 +52,7 @@ def __init__(self, *args, train_settings=dict(), **kwargs): def train_step(self, data: dict, optim_wrapper: OptimWrapperDict) -> Dict[str, Tensor]: """Train GAN model. In the training of GAN models, generator and - discriminator are updated alternatively. In MMEditing's design, + discriminator are updated alternatively. In MMagic's design, `self.train_step` is called with data input. Therefore we always update discriminator, whose updating is relay on real data, and then determine if the generator needs to be updated based on the current number of diff --git a/mmedit/models/editors/mspie/mspie_stylegan2_discriminator.py b/mmagic/models/editors/mspie/mspie_stylegan2_discriminator.py similarity index 98% rename from mmedit/models/editors/mspie/mspie_stylegan2_discriminator.py rename to mmagic/models/editors/mspie/mspie_stylegan2_discriminator.py index 990d98d1f3..f326716300 100644 --- a/mmedit/models/editors/mspie/mspie_stylegan2_discriminator.py +++ b/mmagic/models/editors/mspie/mspie_stylegan2_discriminator.py @@ -2,7 +2,7 @@ import numpy as np import torch.nn as nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..stylegan1 import EqualLinearActModule from ..stylegan2 import ConvDownLayer, ModMBStddevLayer, ResBlock diff --git a/mmedit/models/editors/mspie/mspie_stylegan2_generator.py b/mmagic/models/editors/mspie/mspie_stylegan2_generator.py similarity index 99% rename from mmedit/models/editors/mspie/mspie_stylegan2_generator.py rename to mmagic/models/editors/mspie/mspie_stylegan2_generator.py index 6b35959e44..b15a39288d 100644 --- a/mmedit/models/editors/mspie/mspie_stylegan2_generator.py +++ b/mmagic/models/editors/mspie/mspie_stylegan2_generator.py @@ -8,7 +8,7 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ...utils import get_module_device from ..pggan import PixelNorm from ..stylegan1 import (ConstantInput, EqualLinearActModule, get_mean_latent, diff --git a/mmedit/models/editors/mspie/mspie_stylegan2_modules.py b/mmagic/models/editors/mspie/mspie_stylegan2_modules.py similarity index 100% rename from mmedit/models/editors/mspie/mspie_stylegan2_modules.py rename to mmagic/models/editors/mspie/mspie_stylegan2_modules.py diff --git a/mmedit/models/editors/mspie/pe_singan.py b/mmagic/models/editors/mspie/pe_singan.py similarity index 98% rename from mmedit/models/editors/mspie/pe_singan.py rename to mmagic/models/editors/mspie/pe_singan.py index a4677f27c0..9f00d2dbbc 100644 --- a/mmedit/models/editors/mspie/pe_singan.py +++ b/mmagic/models/editors/mspie/pe_singan.py @@ -6,7 +6,7 @@ from mmengine import Config from torch import Tensor -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..singan import SinGAN ModelType = Union[Dict, nn.Module] diff --git a/mmedit/models/editors/mspie/pe_singan_generator.py b/mmagic/models/editors/mspie/pe_singan_generator.py similarity index 99% rename from mmedit/models/editors/mspie/pe_singan_generator.py rename to mmagic/models/editors/mspie/pe_singan_generator.py index d09a54bbb3..959eeb4634 100644 --- a/mmedit/models/editors/mspie/pe_singan_generator.py +++ b/mmagic/models/editors/mspie/pe_singan_generator.py @@ -7,7 +7,7 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..singan.singan_generator import SinGANMultiScaleGenerator from ..singan.singan_modules import GeneratorBlock diff --git a/mmedit/models/editors/mspie/positional_encoding.py b/mmagic/models/editors/mspie/positional_encoding.py similarity index 99% rename from mmedit/models/editors/mspie/positional_encoding.py rename to mmagic/models/editors/mspie/positional_encoding.py index b2401d8ae8..4d229a3321 100644 --- a/mmedit/models/editors/mspie/positional_encoding.py +++ b/mmagic/models/editors/mspie/positional_encoding.py @@ -3,7 +3,7 @@ import torch import torch.nn as nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module('SPE') diff --git a/mmedit/models/editors/nafnet/__init__.py b/mmagic/models/editors/nafnet/__init__.py similarity index 100% rename from mmedit/models/editors/nafnet/__init__.py rename to mmagic/models/editors/nafnet/__init__.py diff --git a/mmedit/models/editors/nafnet/naf_avgpool2d.py b/mmagic/models/editors/nafnet/naf_avgpool2d.py similarity index 100% rename from mmedit/models/editors/nafnet/naf_avgpool2d.py rename to mmagic/models/editors/nafnet/naf_avgpool2d.py diff --git a/mmedit/models/editors/nafnet/naf_layerNorm2d.py b/mmagic/models/editors/nafnet/naf_layerNorm2d.py similarity index 100% rename from mmedit/models/editors/nafnet/naf_layerNorm2d.py rename to mmagic/models/editors/nafnet/naf_layerNorm2d.py diff --git a/mmedit/models/editors/nafnet/nafbaseline_net.py b/mmagic/models/editors/nafnet/nafbaseline_net.py similarity index 99% rename from mmedit/models/editors/nafnet/nafbaseline_net.py rename to mmagic/models/editors/nafnet/nafbaseline_net.py index 8bf6a30239..1b6bd5b94a 100644 --- a/mmedit/models/editors/nafnet/nafbaseline_net.py +++ b/mmagic/models/editors/nafnet/nafbaseline_net.py @@ -5,7 +5,7 @@ import torch.nn.functional as F from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .naf_avgpool2d import Local_Base from .naf_layerNorm2d import LayerNorm2d diff --git a/mmedit/models/editors/nafnet/nafnet_net.py b/mmagic/models/editors/nafnet/nafnet_net.py similarity index 99% rename from mmedit/models/editors/nafnet/nafnet_net.py rename to mmagic/models/editors/nafnet/nafnet_net.py index f4b627d88d..72705fa72d 100644 --- a/mmedit/models/editors/nafnet/nafnet_net.py +++ b/mmagic/models/editors/nafnet/nafnet_net.py @@ -5,7 +5,7 @@ import torch.nn.functional as F from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .naf_avgpool2d import Local_Base from .naf_layerNorm2d import LayerNorm2d diff --git a/mmedit/models/editors/pconv/__init__.py b/mmagic/models/editors/pconv/__init__.py similarity index 100% rename from mmedit/models/editors/pconv/__init__.py rename to mmagic/models/editors/pconv/__init__.py diff --git a/mmedit/models/editors/pconv/mask_conv_module.py b/mmagic/models/editors/pconv/mask_conv_module.py similarity index 100% rename from mmedit/models/editors/pconv/mask_conv_module.py rename to mmagic/models/editors/pconv/mask_conv_module.py diff --git a/mmedit/models/editors/pconv/partial_conv.py b/mmagic/models/editors/pconv/partial_conv.py similarity index 99% rename from mmedit/models/editors/pconv/partial_conv.py rename to mmagic/models/editors/pconv/partial_conv.py index 7919a8ff6a..28941d348e 100644 --- a/mmedit/models/editors/pconv/partial_conv.py +++ b/mmagic/models/editors/pconv/partial_conv.py @@ -4,7 +4,7 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module(name='PConv') diff --git a/mmedit/models/editors/pconv/pconv_decoder.py b/mmagic/models/editors/pconv/pconv_decoder.py similarity index 99% rename from mmedit/models/editors/pconv/pconv_decoder.py rename to mmagic/models/editors/pconv/pconv_decoder.py index 5530b7f4a2..ddeda42eb7 100644 --- a/mmedit/models/editors/pconv/pconv_decoder.py +++ b/mmagic/models/editors/pconv/pconv_decoder.py @@ -3,7 +3,7 @@ import torch.nn.functional as F from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .mask_conv_module import MaskConvModule diff --git a/mmedit/models/editors/pconv/pconv_encoder.py b/mmagic/models/editors/pconv/pconv_encoder.py similarity index 97% rename from mmedit/models/editors/pconv/pconv_encoder.py rename to mmagic/models/editors/pconv/pconv_encoder.py index 3dff1f11a5..27aa9a2d3b 100644 --- a/mmedit/models/editors/pconv/pconv_encoder.py +++ b/mmagic/models/editors/pconv/pconv_encoder.py @@ -2,8 +2,8 @@ from mmengine.model import BaseModule from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm -from mmedit.models.editors.pconv.mask_conv_module import MaskConvModule -from mmedit.registry import MODELS +from mmagic.models.editors.pconv.mask_conv_module import MaskConvModule +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/pconv/pconv_encoder_decoder.py b/mmagic/models/editors/pconv/pconv_encoder_decoder.py similarity index 96% rename from mmedit/models/editors/pconv/pconv_encoder_decoder.py rename to mmagic/models/editors/pconv/pconv_encoder_decoder.py index 35e0f8cac4..a90dbfb790 100644 --- a/mmedit/models/editors/pconv/pconv_encoder_decoder.py +++ b/mmagic/models/editors/pconv/pconv_encoder_decoder.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/pconv/pconv_inpaintor.py b/mmagic/models/editors/pconv/pconv_inpaintor.py similarity index 96% rename from mmedit/models/editors/pconv/pconv_inpaintor.py rename to mmagic/models/editors/pconv/pconv_inpaintor.py index dd764c47e9..5e4e6d006c 100644 --- a/mmedit/models/editors/pconv/pconv_inpaintor.py +++ b/mmagic/models/editors/pconv/pconv_inpaintor.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. from typing import List -from mmedit.models.base_models import OneStageInpaintor -from mmedit.registry import MODELS +from mmagic.models.base_models import OneStageInpaintor +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/pggan/__init__.py b/mmagic/models/editors/pggan/__init__.py similarity index 100% rename from mmedit/models/editors/pggan/__init__.py rename to mmagic/models/editors/pggan/__init__.py diff --git a/mmedit/models/editors/pggan/pggan.py b/mmagic/models/editors/pggan/pggan.py similarity index 99% rename from mmedit/models/editors/pggan/pggan.py rename to mmagic/models/editors/pggan/pggan.py index c4527906cc..c38075d29c 100644 --- a/mmedit/models/editors/pggan/pggan.py +++ b/mmagic/models/editors/pggan/pggan.py @@ -14,9 +14,9 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import ForwardInputs, SampleList +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import ForwardInputs, SampleList from ...base_models import BaseGAN from ...utils import get_valid_num_batches, set_requires_grad diff --git a/mmedit/models/editors/pggan/pggan_discriminator.py b/mmagic/models/editors/pggan/pggan_discriminator.py similarity index 99% rename from mmedit/models/editors/pggan/pggan_discriminator.py rename to mmagic/models/editors/pggan/pggan_discriminator.py index eb172c7feb..49f88de06b 100644 --- a/mmedit/models/editors/pggan/pggan_discriminator.py +++ b/mmagic/models/editors/pggan/pggan_discriminator.py @@ -6,7 +6,7 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .pggan_modules import (EqualizedLRConvDownModule, EqualizedLRConvModule, MiniBatchStddevLayer, PGGANDecisionHead) diff --git a/mmedit/models/editors/pggan/pggan_generator.py b/mmagic/models/editors/pggan/pggan_generator.py similarity index 99% rename from mmedit/models/editors/pggan/pggan_generator.py rename to mmagic/models/editors/pggan/pggan_generator.py index e337c21797..7639ec7673 100644 --- a/mmedit/models/editors/pggan/pggan_generator.py +++ b/mmagic/models/editors/pggan/pggan_generator.py @@ -5,7 +5,7 @@ import torch import torch.nn as nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ...utils import get_module_device from .pggan_modules import (EqualizedLRConvModule, EqualizedLRConvUpModule, PGGANNoiseTo2DFeat) diff --git a/mmedit/models/editors/pggan/pggan_modules.py b/mmagic/models/editors/pggan/pggan_modules.py similarity index 99% rename from mmedit/models/editors/pggan/pggan_modules.py rename to mmagic/models/editors/pggan/pggan_modules.py index cc03c00554..ebae867aa6 100644 --- a/mmedit/models/editors/pggan/pggan_modules.py +++ b/mmagic/models/editors/pggan/pggan_modules.py @@ -9,8 +9,8 @@ from mmengine.model import normal_init from torch.nn.init import _calculate_correct_fan -from mmedit.models.base_archs import AllGatherLayer -from mmedit.registry import MODELS +from mmagic.models.base_archs import AllGatherLayer +from mmagic.registry import MODELS class EqualizedLR: diff --git a/mmedit/models/editors/pix2pix/__init__.py b/mmagic/models/editors/pix2pix/__init__.py similarity index 100% rename from mmedit/models/editors/pix2pix/__init__.py rename to mmagic/models/editors/pix2pix/__init__.py diff --git a/mmedit/models/editors/pix2pix/pix2pix.py b/mmagic/models/editors/pix2pix/pix2pix.py similarity index 98% rename from mmedit/models/editors/pix2pix/pix2pix.py rename to mmagic/models/editors/pix2pix/pix2pix.py index 9ec6b84489..88c0ec64d5 100644 --- a/mmedit/models/editors/pix2pix/pix2pix.py +++ b/mmagic/models/editors/pix2pix/pix2pix.py @@ -3,9 +3,9 @@ import torch.nn.functional as F from mmengine import MessageHub -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import SampleList +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import SampleList from ...base_models import BaseTranslationModel from ...utils import set_requires_grad diff --git a/mmedit/models/editors/pix2pix/pix2pix_generator.py b/mmagic/models/editors/pix2pix/pix2pix_generator.py similarity index 99% rename from mmedit/models/editors/pix2pix/pix2pix_generator.py rename to mmagic/models/editors/pix2pix/pix2pix_generator.py index 4ed310dbea..071aff1882 100644 --- a/mmedit/models/editors/pix2pix/pix2pix_generator.py +++ b/mmagic/models/editors/pix2pix/pix2pix_generator.py @@ -3,7 +3,7 @@ from mmengine.logging import MMLogger from mmengine.runner import load_checkpoint -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ...utils import generation_init_weights from .pix2pix_modules import UnetSkipConnectionBlock diff --git a/mmedit/models/editors/pix2pix/pix2pix_modules.py b/mmagic/models/editors/pix2pix/pix2pix_modules.py similarity index 100% rename from mmedit/models/editors/pix2pix/pix2pix_modules.py rename to mmagic/models/editors/pix2pix/pix2pix_modules.py diff --git a/mmedit/models/editors/plain/__init__.py b/mmagic/models/editors/plain/__init__.py similarity index 100% rename from mmedit/models/editors/plain/__init__.py rename to mmagic/models/editors/plain/__init__.py diff --git a/mmedit/models/editors/plain/plain_decoder.py b/mmagic/models/editors/plain/plain_decoder.py similarity index 99% rename from mmedit/models/editors/plain/plain_decoder.py rename to mmagic/models/editors/plain/plain_decoder.py index 1bb996df57..c0f049827f 100644 --- a/mmedit/models/editors/plain/plain_decoder.py +++ b/mmagic/models/editors/plain/plain_decoder.py @@ -10,7 +10,7 @@ from torch.nn.modules.pooling import _MaxUnpoolNd from torch.nn.modules.utils import _pair -from mmedit.registry import MODELS +from mmagic.registry import MODELS class MaxUnpool2dop(Function): diff --git a/mmedit/models/editors/plain/plain_refiner.py b/mmagic/models/editors/plain/plain_refiner.py similarity index 98% rename from mmedit/models/editors/plain/plain_refiner.py rename to mmagic/models/editors/plain/plain_refiner.py index a21475f945..84949ad9d2 100644 --- a/mmedit/models/editors/plain/plain_refiner.py +++ b/mmagic/models/editors/plain/plain_refiner.py @@ -4,7 +4,7 @@ from mmengine.model import BaseModule from mmengine.model.weight_init import xavier_init -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/rdn/__init__.py b/mmagic/models/editors/rdn/__init__.py similarity index 100% rename from mmedit/models/editors/rdn/__init__.py rename to mmagic/models/editors/rdn/__init__.py diff --git a/mmedit/models/editors/rdn/rdn_net.py b/mmagic/models/editors/rdn/rdn_net.py similarity index 99% rename from mmedit/models/editors/rdn/rdn_net.py rename to mmagic/models/editors/rdn/rdn_net.py index f294772885..413e20169d 100644 --- a/mmedit/models/editors/rdn/rdn_net.py +++ b/mmagic/models/editors/rdn/rdn_net.py @@ -2,7 +2,7 @@ from mmengine.model import BaseModule from torch import nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/real_basicvsr/__init__.py b/mmagic/models/editors/real_basicvsr/__init__.py similarity index 100% rename from mmedit/models/editors/real_basicvsr/__init__.py rename to mmagic/models/editors/real_basicvsr/__init__.py diff --git a/mmedit/models/editors/real_basicvsr/real_basicvsr.py b/mmagic/models/editors/real_basicvsr/real_basicvsr.py similarity index 98% rename from mmedit/models/editors/real_basicvsr/real_basicvsr.py rename to mmagic/models/editors/real_basicvsr/real_basicvsr.py index 8a924745fb..c5aa23bd2f 100644 --- a/mmedit/models/editors/real_basicvsr/real_basicvsr.py +++ b/mmagic/models/editors/real_basicvsr/real_basicvsr.py @@ -5,8 +5,8 @@ import torch.nn.functional as F from mmengine.optim import OptimWrapperDict -from mmedit.models.utils import set_requires_grad -from mmedit.registry import MODELS +from mmagic.models.utils import set_requires_grad +from mmagic.registry import MODELS from ..real_esrgan import RealESRGAN diff --git a/mmedit/models/editors/real_basicvsr/real_basicvsr_net.py b/mmagic/models/editors/real_basicvsr/real_basicvsr_net.py similarity index 99% rename from mmedit/models/editors/real_basicvsr/real_basicvsr_net.py rename to mmagic/models/editors/real_basicvsr/real_basicvsr_net.py index b2edccc7e5..18f73fb4d7 100644 --- a/mmedit/models/editors/real_basicvsr/real_basicvsr_net.py +++ b/mmagic/models/editors/real_basicvsr/real_basicvsr_net.py @@ -3,7 +3,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..basicvsr.basicvsr_net import BasicVSRNet, ResidualBlocksWithInputConv diff --git a/mmedit/models/editors/real_esrgan/__init__.py b/mmagic/models/editors/real_esrgan/__init__.py similarity index 100% rename from mmedit/models/editors/real_esrgan/__init__.py rename to mmagic/models/editors/real_esrgan/__init__.py diff --git a/mmedit/models/editors/real_esrgan/real_esrgan.py b/mmagic/models/editors/real_esrgan/real_esrgan.py similarity index 99% rename from mmedit/models/editors/real_esrgan/real_esrgan.py rename to mmagic/models/editors/real_esrgan/real_esrgan.py index db268ad9e4..f22e0069fa 100644 --- a/mmedit/models/editors/real_esrgan/real_esrgan.py +++ b/mmagic/models/editors/real_esrgan/real_esrgan.py @@ -3,7 +3,7 @@ import torch -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..srgan import SRGAN diff --git a/mmedit/models/editors/real_esrgan/unet_disc.py b/mmagic/models/editors/real_esrgan/unet_disc.py similarity index 98% rename from mmedit/models/editors/real_esrgan/unet_disc.py rename to mmagic/models/editors/real_esrgan/unet_disc.py index a63ae7208f..df987b8599 100644 --- a/mmedit/models/editors/real_esrgan/unet_disc.py +++ b/mmagic/models/editors/real_esrgan/unet_disc.py @@ -3,7 +3,7 @@ from mmengine.model import BaseModule from torch.nn.utils import spectral_norm -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/restormer/__init__.py b/mmagic/models/editors/restormer/__init__.py similarity index 100% rename from mmedit/models/editors/restormer/__init__.py rename to mmagic/models/editors/restormer/__init__.py diff --git a/mmedit/models/editors/restormer/restormer_net.py b/mmagic/models/editors/restormer/restormer_net.py similarity index 99% rename from mmedit/models/editors/restormer/restormer_net.py rename to mmagic/models/editors/restormer/restormer_net.py index bc3c68bf09..d088175373 100644 --- a/mmedit/models/editors/restormer/restormer_net.py +++ b/mmagic/models/editors/restormer/restormer_net.py @@ -8,7 +8,7 @@ from einops import rearrange from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS def to_3d(x): diff --git a/mmedit/models/editors/sagan/__init__.py b/mmagic/models/editors/sagan/__init__.py similarity index 100% rename from mmedit/models/editors/sagan/__init__.py rename to mmagic/models/editors/sagan/__init__.py diff --git a/mmedit/models/editors/sagan/sagan.py b/mmagic/models/editors/sagan/sagan.py similarity index 96% rename from mmedit/models/editors/sagan/sagan.py rename to mmagic/models/editors/sagan/sagan.py index b241e2af21..20e9d419ea 100644 --- a/mmedit/models/editors/sagan/sagan.py +++ b/mmagic/models/editors/sagan/sagan.py @@ -8,8 +8,8 @@ from mmengine.optim import OptimWrapper from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample from ...base_models import BaseConditionalGAN ModelType = Union[Dict, nn.Module] @@ -27,16 +27,16 @@ class SAGAN(BaseConditionalGAN): `_ (Proj-GAN). Detailed architecture can be found in - :class:`~mmedit.models.editors.sagan.SNGANGenerator` + :class:`~mmagic.models.editors.sagan.SNGANGenerator` and - :class:`~mmedit.models.editors.sagan.ProjDiscriminator` + :class:`~mmagic.models.editors.sagan.ProjDiscriminator` Args: generator (ModelType): The config or model of the generator. discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmedit.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.EditDataPreprocessor`. generator_steps (int): Number of times the generator was completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): Number of times the discriminator was diff --git a/mmedit/models/editors/sagan/sagan_discriminator.py b/mmagic/models/editors/sagan/sagan_discriminator.py similarity index 99% rename from mmedit/models/editors/sagan/sagan_discriminator.py rename to mmagic/models/editors/sagan/sagan_discriminator.py index 1f09e8188a..4792b3fb5c 100644 --- a/mmedit/models/editors/sagan/sagan_discriminator.py +++ b/mmagic/models/editors/sagan/sagan_discriminator.py @@ -11,7 +11,7 @@ from torch.nn.init import xavier_uniform_ from torch.nn.utils import spectral_norm -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module('SAGANDiscriminator') diff --git a/mmedit/models/editors/sagan/sagan_generator.py b/mmagic/models/editors/sagan/sagan_generator.py similarity index 99% rename from mmedit/models/editors/sagan/sagan_generator.py rename to mmagic/models/editors/sagan/sagan_generator.py index 6af0c5c900..822d922e50 100644 --- a/mmedit/models/editors/sagan/sagan_generator.py +++ b/mmagic/models/editors/sagan/sagan_generator.py @@ -14,8 +14,8 @@ from torch.nn.init import xavier_uniform_ from torch.nn.utils import spectral_norm -from mmedit.models.utils import get_module_device -from mmedit.registry import MODELS +from mmagic.models.utils import get_module_device +from mmagic.registry import MODELS @MODELS.register_module('SAGANGenerator') diff --git a/mmedit/models/editors/sagan/sagan_modules.py b/mmagic/models/editors/sagan/sagan_modules.py similarity index 99% rename from mmedit/models/editors/sagan/sagan_modules.py rename to mmagic/models/editors/sagan/sagan_modules.py index 51bdba9d24..777426ae59 100644 --- a/mmedit/models/editors/sagan/sagan_modules.py +++ b/mmagic/models/editors/sagan/sagan_modules.py @@ -10,9 +10,9 @@ from torch.nn.init import xavier_uniform_ from torch.nn.utils import spectral_norm -from mmedit.models.editors.biggan.biggan_modules import SNConvModule -from mmedit.models.editors.biggan.biggan_snmodule import SNEmbedding -from mmedit.registry import MODELS +from mmagic.models.editors.biggan.biggan_modules import SNConvModule +from mmagic.models.editors.biggan.biggan_snmodule import SNEmbedding +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/singan/__init__.py b/mmagic/models/editors/singan/__init__.py similarity index 100% rename from mmedit/models/editors/singan/__init__.py rename to mmagic/models/editors/singan/__init__.py diff --git a/mmedit/models/editors/singan/singan.py b/mmagic/models/editors/singan/singan.py similarity index 98% rename from mmedit/models/editors/singan/singan.py rename to mmagic/models/editors/singan/singan.py index 689e5f6f4f..4f1c5abfac 100644 --- a/mmedit/models/editors/singan/singan.py +++ b/mmagic/models/editors/singan/singan.py @@ -13,10 +13,10 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch import Tensor -from mmedit.models.utils import get_module_device -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import ForwardInputs, SampleList +from mmagic.models.utils import get_module_device +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import ForwardInputs, SampleList from ...base_models import BaseGAN from ...utils import set_requires_grad @@ -53,7 +53,7 @@ class SinGAN(BaseGAN): discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmedit.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.EditDataPreprocessor`. generator_steps (int): The number of times the generator is completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): The number of times the discriminator is @@ -468,7 +468,7 @@ def train_discriminator(self, inputs: dict, def train_gan(self, inputs_dict: dict, data_sample: List[EditDataSample], optim_wrapper: OptimWrapperDict) -> Dict[str, torch.Tensor]: """Train GAN model. In the training of GAN models, generator and - discriminator are updated alternatively. In MMEditing's design, + discriminator are updated alternatively. In MMagic's design, `self.train_step` is called with data input. Therefore we always update discriminator, whose updating is relay on real data, and then determine if the generator needs to be updated based on the current number of diff --git a/mmedit/models/editors/singan/singan_discriminator.py b/mmagic/models/editors/singan/singan_discriminator.py similarity index 98% rename from mmedit/models/editors/singan/singan_discriminator.py rename to mmagic/models/editors/singan/singan_discriminator.py index b2c3656e90..63f174ba25 100644 --- a/mmedit/models/editors/singan/singan_discriminator.py +++ b/mmagic/models/editors/singan/singan_discriminator.py @@ -3,7 +3,7 @@ import torch.nn as nn from mmengine import print_log -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .singan_modules import DiscriminatorBlock diff --git a/mmedit/models/editors/singan/singan_generator.py b/mmagic/models/editors/singan/singan_generator.py similarity index 99% rename from mmedit/models/editors/singan/singan_generator.py rename to mmagic/models/editors/singan/singan_generator.py index 4862a3561d..e0627b38aa 100644 --- a/mmedit/models/editors/singan/singan_generator.py +++ b/mmagic/models/editors/singan/singan_generator.py @@ -8,7 +8,7 @@ from mmengine.logging import MMLogger from mmengine.runner import load_state_dict -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .singan_modules import GeneratorBlock diff --git a/mmedit/models/editors/singan/singan_modules.py b/mmagic/models/editors/singan/singan_modules.py similarity index 100% rename from mmedit/models/editors/singan/singan_modules.py rename to mmagic/models/editors/singan/singan_modules.py diff --git a/mmedit/models/editors/srcnn/__init__.py b/mmagic/models/editors/srcnn/__init__.py similarity index 100% rename from mmedit/models/editors/srcnn/__init__.py rename to mmagic/models/editors/srcnn/__init__.py diff --git a/mmedit/models/editors/srcnn/srcnn_net.py b/mmagic/models/editors/srcnn/srcnn_net.py similarity index 98% rename from mmedit/models/editors/srcnn/srcnn_net.py rename to mmagic/models/editors/srcnn/srcnn_net.py index 59ef87ec9e..9a11f201ea 100644 --- a/mmedit/models/editors/srcnn/srcnn_net.py +++ b/mmagic/models/editors/srcnn/srcnn_net.py @@ -2,7 +2,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/srgan/__init__.py b/mmagic/models/editors/srgan/__init__.py similarity index 100% rename from mmedit/models/editors/srgan/__init__.py rename to mmagic/models/editors/srgan/__init__.py diff --git a/mmedit/models/editors/srgan/modified_vgg.py b/mmagic/models/editors/srgan/modified_vgg.py similarity index 99% rename from mmedit/models/editors/srgan/modified_vgg.py rename to mmagic/models/editors/srgan/modified_vgg.py index 05554ee6a4..9a7a97b620 100644 --- a/mmedit/models/editors/srgan/modified_vgg.py +++ b/mmagic/models/editors/srgan/modified_vgg.py @@ -2,7 +2,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/srgan/sr_resnet.py b/mmagic/models/editors/srgan/sr_resnet.py similarity index 95% rename from mmedit/models/editors/srgan/sr_resnet.py rename to mmagic/models/editors/srgan/sr_resnet.py index df02377c16..5f7aa79bd2 100644 --- a/mmedit/models/editors/srgan/sr_resnet.py +++ b/mmagic/models/editors/srgan/sr_resnet.py @@ -2,9 +2,9 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.models.base_archs import PixelShufflePack, ResidualBlockNoBN -from mmedit.models.utils import default_init_weights, make_layer -from mmedit.registry import MODELS +from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.utils import default_init_weights, make_layer +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/srgan/srgan.py b/mmagic/models/editors/srgan/srgan.py similarity index 98% rename from mmedit/models/editors/srgan/srgan.py rename to mmagic/models/editors/srgan/srgan.py index 168febdac1..42ee3c7750 100644 --- a/mmedit/models/editors/srgan/srgan.py +++ b/mmagic/models/editors/srgan/srgan.py @@ -4,9 +4,9 @@ import torch from mmengine.optim import OptimWrapperDict -from mmedit.models.base_models import BaseEditModel -from mmedit.models.utils import set_requires_grad -from mmedit.registry import MODELS +from mmagic.models.base_models import BaseEditModel +from mmagic.models.utils import set_requires_grad +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/stable_diffusion/__init__.py b/mmagic/models/editors/stable_diffusion/__init__.py similarity index 100% rename from mmedit/models/editors/stable_diffusion/__init__.py rename to mmagic/models/editors/stable_diffusion/__init__.py diff --git a/mmedit/models/editors/stable_diffusion/clip_wrapper.py b/mmagic/models/editors/stable_diffusion/clip_wrapper.py similarity index 99% rename from mmedit/models/editors/stable_diffusion/clip_wrapper.py rename to mmagic/models/editors/stable_diffusion/clip_wrapper.py index dc867fe279..f3f0c0025f 100644 --- a/mmedit/models/editors/stable_diffusion/clip_wrapper.py +++ b/mmagic/models/editors/stable_diffusion/clip_wrapper.py @@ -5,7 +5,7 @@ import torch.nn as nn from mmengine.logging import MMLogger -from mmedit.utils import try_import +from mmagic.utils import try_import transformers = try_import('transformers') diff --git a/mmedit/models/editors/stable_diffusion/stable_diffusion.py b/mmagic/models/editors/stable_diffusion/stable_diffusion.py similarity index 99% rename from mmedit/models/editors/stable_diffusion/stable_diffusion.py rename to mmagic/models/editors/stable_diffusion/stable_diffusion.py index 5eb0115337..f92a6ef212 100644 --- a/mmedit/models/editors/stable_diffusion/stable_diffusion.py +++ b/mmagic/models/editors/stable_diffusion/stable_diffusion.py @@ -13,10 +13,10 @@ from tqdm.auto import tqdm from transformers import CLIPTokenizer -from mmedit.models.utils import build_module, set_xformers -from mmedit.registry import DIFFUSION_SCHEDULERS, MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import SampleList +from mmagic.models.utils import build_module, set_xformers +from mmagic.registry import DIFFUSION_SCHEDULERS, MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import SampleList logger = MMLogger.get_current_instance() diff --git a/mmedit/models/editors/stable_diffusion/vae.py b/mmagic/models/editors/stable_diffusion/vae.py similarity index 99% rename from mmedit/models/editors/stable_diffusion/vae.py rename to mmagic/models/editors/stable_diffusion/vae.py index 064018828c..76b7c337f9 100644 --- a/mmedit/models/editors/stable_diffusion/vae.py +++ b/mmagic/models/editors/stable_diffusion/vae.py @@ -11,7 +11,7 @@ from mmengine.utils.dl_utils import TORCH_VERSION from mmengine.utils.version_utils import digit_version -from mmedit.registry import MODELS +from mmagic.registry import MODELS class Downsample2D(nn.Module): diff --git a/mmedit/models/editors/stylegan1/__init__.py b/mmagic/models/editors/stylegan1/__init__.py similarity index 100% rename from mmedit/models/editors/stylegan1/__init__.py rename to mmagic/models/editors/stylegan1/__init__.py diff --git a/mmedit/models/editors/stylegan1/stylegan1.py b/mmagic/models/editors/stylegan1/stylegan1.py similarity index 96% rename from mmedit/models/editors/stylegan1/stylegan1.py rename to mmagic/models/editors/stylegan1/stylegan1.py index 99a9433c9e..349fee3480 100644 --- a/mmedit/models/editors/stylegan1/stylegan1.py +++ b/mmagic/models/editors/stylegan1/stylegan1.py @@ -8,7 +8,7 @@ from mmengine import Config from torch import Tensor -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..pggan import ProgressiveGrowingGAN ModelType = Union[Dict, nn.Module] @@ -27,16 +27,16 @@ class StyleGAN1(ProgressiveGrowingGAN): :class:`~ProgressiveGrowingGAN` to support progressive training. Detailed architecture can be found in - :class:`~mmedit.models.editors.stylegan1.StyleGAN1Generator` + :class:`~mmagic.models.editors.stylegan1.StyleGAN1Generator` and - :class:`~mmedit.models.editors.stylegan1.StyleGAN1Discriminator` + :class:`~mmagic.models.editors.stylegan1.StyleGAN1Discriminator` Args: generator (ModelType): The config or model of the generator. discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmedit.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.EditDataPreprocessor`. style_channels (int): The number of channels for style code. Defaults to 128. nkimgs_per_scale (dict): The number of images need for each diff --git a/mmedit/models/editors/stylegan1/stylegan1_discriminator.py b/mmagic/models/editors/stylegan1/stylegan1_discriminator.py similarity index 99% rename from mmedit/models/editors/stylegan1/stylegan1_discriminator.py rename to mmagic/models/editors/stylegan1/stylegan1_discriminator.py index 31041c17dd..c30c928c4a 100644 --- a/mmedit/models/editors/stylegan1/stylegan1_discriminator.py +++ b/mmagic/models/editors/stylegan1/stylegan1_discriminator.py @@ -3,7 +3,7 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..pggan import (EqualizedLRConvDownModule, EqualizedLRConvModule, MiniBatchStddevLayer) from .stylegan1_modules import Blur, EqualLinearActModule diff --git a/mmedit/models/editors/stylegan1/stylegan1_generator.py b/mmagic/models/editors/stylegan1/stylegan1_generator.py similarity index 99% rename from mmedit/models/editors/stylegan1/stylegan1_generator.py rename to mmagic/models/editors/stylegan1/stylegan1_generator.py index 22dd1f1caf..bc8db25b2d 100644 --- a/mmedit/models/editors/stylegan1/stylegan1_generator.py +++ b/mmagic/models/editors/stylegan1/stylegan1_generator.py @@ -7,7 +7,7 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ...utils import get_module_device from ..pggan import EqualizedLRConvModule, PixelNorm from .stylegan1_modules import EqualLinearActModule, StyleConv diff --git a/mmedit/models/editors/stylegan1/stylegan1_modules.py b/mmagic/models/editors/stylegan1/stylegan1_modules.py similarity index 99% rename from mmedit/models/editors/stylegan1/stylegan1_modules.py rename to mmagic/models/editors/stylegan1/stylegan1_modules.py index 5987411526..c62f0d63f6 100644 --- a/mmedit/models/editors/stylegan1/stylegan1_modules.py +++ b/mmagic/models/editors/stylegan1/stylegan1_modules.py @@ -8,7 +8,7 @@ from mmcv.ops.fused_bias_leakyrelu import fused_bias_leakyrelu from mmcv.ops.upfirdn2d import upfirdn2d -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..pggan import (EqualizedLRConvModule, EqualizedLRConvUpModule, EqualizedLRLinearModule) diff --git a/mmedit/models/editors/stylegan1/stylegan_utils.py b/mmagic/models/editors/stylegan1/stylegan_utils.py similarity index 100% rename from mmedit/models/editors/stylegan1/stylegan_utils.py rename to mmagic/models/editors/stylegan1/stylegan_utils.py diff --git a/mmedit/models/editors/stylegan2/__init__.py b/mmagic/models/editors/stylegan2/__init__.py similarity index 100% rename from mmedit/models/editors/stylegan2/__init__.py rename to mmagic/models/editors/stylegan2/__init__.py diff --git a/mmedit/models/editors/stylegan2/ada/__init__.py b/mmagic/models/editors/stylegan2/ada/__init__.py similarity index 100% rename from mmedit/models/editors/stylegan2/ada/__init__.py rename to mmagic/models/editors/stylegan2/ada/__init__.py diff --git a/mmedit/models/editors/stylegan2/ada/augment.py b/mmagic/models/editors/stylegan2/ada/augment.py similarity index 100% rename from mmedit/models/editors/stylegan2/ada/augment.py rename to mmagic/models/editors/stylegan2/ada/augment.py diff --git a/mmedit/models/editors/stylegan2/ada/grid_sample_gradfix.py b/mmagic/models/editors/stylegan2/ada/grid_sample_gradfix.py similarity index 100% rename from mmedit/models/editors/stylegan2/ada/grid_sample_gradfix.py rename to mmagic/models/editors/stylegan2/ada/grid_sample_gradfix.py diff --git a/mmedit/models/editors/stylegan2/ada/misc.py b/mmagic/models/editors/stylegan2/ada/misc.py similarity index 100% rename from mmedit/models/editors/stylegan2/ada/misc.py rename to mmagic/models/editors/stylegan2/ada/misc.py diff --git a/mmedit/models/editors/stylegan2/ada/upfirdn2d.py b/mmagic/models/editors/stylegan2/ada/upfirdn2d.py similarity index 100% rename from mmedit/models/editors/stylegan2/ada/upfirdn2d.py rename to mmagic/models/editors/stylegan2/ada/upfirdn2d.py diff --git a/mmedit/models/editors/stylegan2/stylegan2.py b/mmagic/models/editors/stylegan2/stylegan2.py similarity index 97% rename from mmedit/models/editors/stylegan2/stylegan2.py rename to mmagic/models/editors/stylegan2/stylegan2.py index b734e709a7..4224ffd7f8 100644 --- a/mmedit/models/editors/stylegan2/stylegan2.py +++ b/mmagic/models/editors/stylegan2/stylegan2.py @@ -10,8 +10,8 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample from ...base_models import BaseGAN from ...losses import gen_path_regularizer, r1_gradient_penalty_loss from ...utils import set_requires_grad @@ -26,16 +26,16 @@ class StyleGAN2(BaseGAN): Paper link: https://openaccess.thecvf.com/content_CVPR_2020/html/Karras_Analyzing_and_Improving_the_Image_Quality_of_StyleGAN_CVPR_2020_paper.html. # noqa - :class:`~mmedit.models.editors.stylegan2.StyleGAN2Generator` + :class:`~mmagic.models.editors.stylegan2.StyleGAN2Generator` and - :class:`~mmedit.models.editors.stylegan2.StyleGAN2Discriminator` + :class:`~mmagic.models.editors.stylegan2.StyleGAN2Discriminator` Args: generator (ModelType): The config or model of the generator. discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmedit.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.EditDataPreprocessor`. generator_steps (int): The number of times the generator is completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): The number of times the discriminator is @@ -226,7 +226,7 @@ def train_generator(self, inputs: dict, data_samples: EditDataSample, def train_step(self, data: dict, optim_wrapper: OptimWrapperDict) -> Dict[str, Tensor]: """Train GAN model. In the training of GAN models, generator and - discriminator are updated alternatively. In MMEditing's design, + discriminator are updated alternatively. In MMagic's design, `self.train_step` is called with data input. Therefore we always update discriminator, whose updating is relay on real data, and then determine if the generator needs to be updated based on the current number of diff --git a/mmedit/models/editors/stylegan2/stylegan2_discriminator.py b/mmagic/models/editors/stylegan2/stylegan2_discriminator.py similarity index 99% rename from mmedit/models/editors/stylegan2/stylegan2_discriminator.py rename to mmagic/models/editors/stylegan2/stylegan2_discriminator.py index ddb2ae22c5..c015207158 100644 --- a/mmedit/models/editors/stylegan2/stylegan2_discriminator.py +++ b/mmagic/models/editors/stylegan2/stylegan2_discriminator.py @@ -10,7 +10,7 @@ from mmengine.runner.checkpoint import _load_checkpoint_with_prefix from torch import Tensor -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..stylegan1 import EqualLinearActModule from ..stylegan3.stylegan3_modules import MappingNetwork from .ada.augment import AugmentPipe diff --git a/mmedit/models/editors/stylegan2/stylegan2_generator.py b/mmagic/models/editors/stylegan2/stylegan2_generator.py similarity index 99% rename from mmedit/models/editors/stylegan2/stylegan2_generator.py rename to mmagic/models/editors/stylegan2/stylegan2_generator.py index 53537c6768..707939b4aa 100644 --- a/mmedit/models/editors/stylegan2/stylegan2_generator.py +++ b/mmagic/models/editors/stylegan2/stylegan2_generator.py @@ -8,7 +8,7 @@ from mmengine.runner.amp import autocast from mmengine.runner.checkpoint import _load_checkpoint_with_prefix -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ...utils import get_module_device from ..pggan import PixelNorm from ..stylegan1 import (ConstantInput, EqualLinearActModule, get_mean_latent, diff --git a/mmedit/models/editors/stylegan2/stylegan2_modules.py b/mmagic/models/editors/stylegan2/stylegan2_modules.py similarity index 99% rename from mmedit/models/editors/stylegan2/stylegan2_modules.py rename to mmagic/models/editors/stylegan2/stylegan2_modules.py index db7fd163e8..d9cbc3d41b 100644 --- a/mmedit/models/editors/stylegan2/stylegan2_modules.py +++ b/mmagic/models/editors/stylegan2/stylegan2_modules.py @@ -9,7 +9,7 @@ from mmengine.dist import get_dist_info from mmengine.runner.amp import autocast -from mmedit.models.base_archs import AllGatherLayer +from mmagic.models.base_archs import AllGatherLayer from ..pggan import EqualizedLRConvModule, equalized_lr from ..stylegan1 import Blur, EqualLinearActModule, NoiseInjection, make_kernel @@ -678,7 +678,7 @@ def __init__(self, if self.sync_std: assert torch.distributed.is_initialized( ), 'Only in distributed training can the sync_std be activated.' - mmengine.print_log('Adopt synced minibatch stddev layer', 'mmedit') + mmengine.print_log('Adopt synced minibatch stddev layer', 'mmagic') def forward(self, x): """Forward function. diff --git a/mmedit/models/editors/stylegan3/__init__.py b/mmagic/models/editors/stylegan3/__init__.py similarity index 100% rename from mmedit/models/editors/stylegan3/__init__.py rename to mmagic/models/editors/stylegan3/__init__.py diff --git a/mmedit/models/editors/stylegan3/stylegan3.py b/mmagic/models/editors/stylegan3/stylegan3.py similarity index 97% rename from mmedit/models/editors/stylegan3/stylegan3.py rename to mmagic/models/editors/stylegan3/stylegan3.py index 6e8e393943..255a4f7b3c 100644 --- a/mmedit/models/editors/stylegan3/stylegan3.py +++ b/mmagic/models/editors/stylegan3/stylegan3.py @@ -8,9 +8,9 @@ from mmengine.optim import OptimWrapper from torch import Tensor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import SampleList +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import SampleList from ...utils import get_module_device, get_valid_num_batches from ..stylegan2 import StyleGAN2 from .stylegan3_utils import (apply_fractional_pseudo_rotation, @@ -29,9 +29,9 @@ class StyleGAN3(StyleGAN2): Detailed architecture can be found in - :class:`~mmedit.models.editors.stylegan3.StyleGAN3Generator` + :class:`~mmagic.models.editors.stylegan3.StyleGAN3Generator` and - :class:`~mmedit.models.editors.stylegan2.StyleGAN2Discriminator` + :class:`~mmagic.models.editors.stylegan2.StyleGAN2Discriminator` """ def __init__(self, diff --git a/mmedit/models/editors/stylegan3/stylegan3_generator.py b/mmagic/models/editors/stylegan3/stylegan3_generator.py similarity index 99% rename from mmedit/models/editors/stylegan3/stylegan3_generator.py rename to mmagic/models/editors/stylegan3/stylegan3_generator.py index d82cc6ba04..1a3036be61 100644 --- a/mmedit/models/editors/stylegan3/stylegan3_generator.py +++ b/mmagic/models/editors/stylegan3/stylegan3_generator.py @@ -6,7 +6,7 @@ import torch.nn as nn from mmengine.runner.checkpoint import _load_checkpoint_with_prefix -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ...utils import get_module_device from ..stylegan1 import get_mean_latent diff --git a/mmedit/models/editors/stylegan3/stylegan3_modules.py b/mmagic/models/editors/stylegan3/stylegan3_modules.py similarity index 99% rename from mmedit/models/editors/stylegan3/stylegan3_modules.py rename to mmagic/models/editors/stylegan3/stylegan3_modules.py index 215a6afa5d..9ddd9a36cc 100644 --- a/mmedit/models/editors/stylegan3/stylegan3_modules.py +++ b/mmagic/models/editors/stylegan3/stylegan3_modules.py @@ -15,7 +15,7 @@ from mmengine.runner.amp import autocast -from mmedit.registry import MODELS +from mmagic.registry import MODELS def modulated_conv2d( diff --git a/mmedit/models/editors/stylegan3/stylegan3_utils.py b/mmagic/models/editors/stylegan3/stylegan3_utils.py similarity index 100% rename from mmedit/models/editors/stylegan3/stylegan3_utils.py rename to mmagic/models/editors/stylegan3/stylegan3_utils.py diff --git a/mmedit/models/editors/swinir/__init__.py b/mmagic/models/editors/swinir/__init__.py similarity index 100% rename from mmedit/models/editors/swinir/__init__.py rename to mmagic/models/editors/swinir/__init__.py diff --git a/mmedit/models/editors/swinir/swinir_modules.py b/mmagic/models/editors/swinir/swinir_modules.py similarity index 100% rename from mmedit/models/editors/swinir/swinir_modules.py rename to mmagic/models/editors/swinir/swinir_modules.py diff --git a/mmedit/models/editors/swinir/swinir_net.py b/mmagic/models/editors/swinir/swinir_net.py similarity index 99% rename from mmedit/models/editors/swinir/swinir_net.py rename to mmagic/models/editors/swinir/swinir_net.py index 859cfa634b..63e85cc464 100644 --- a/mmedit/models/editors/swinir/swinir_net.py +++ b/mmagic/models/editors/swinir/swinir_net.py @@ -5,7 +5,7 @@ from mmengine.model import BaseModule from mmengine.model.weight_init import trunc_normal_ -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .swinir_modules import PatchEmbed, PatchUnEmbed, Upsample, UpsampleOneStep from .swinir_rstb import RSTB diff --git a/mmedit/models/editors/swinir/swinir_rstb.py b/mmagic/models/editors/swinir/swinir_rstb.py similarity index 100% rename from mmedit/models/editors/swinir/swinir_rstb.py rename to mmagic/models/editors/swinir/swinir_rstb.py diff --git a/mmedit/models/editors/swinir/swinir_utils.py b/mmagic/models/editors/swinir/swinir_utils.py similarity index 100% rename from mmedit/models/editors/swinir/swinir_utils.py rename to mmagic/models/editors/swinir/swinir_utils.py diff --git a/mmedit/models/editors/tdan/__init__.py b/mmagic/models/editors/tdan/__init__.py similarity index 100% rename from mmedit/models/editors/tdan/__init__.py rename to mmagic/models/editors/tdan/__init__.py diff --git a/mmedit/models/editors/tdan/tdan.py b/mmagic/models/editors/tdan/tdan.py similarity index 97% rename from mmedit/models/editors/tdan/tdan.py rename to mmagic/models/editors/tdan/tdan.py index 57461a91c5..e51a6040ac 100644 --- a/mmedit/models/editors/tdan/tdan.py +++ b/mmagic/models/editors/tdan/tdan.py @@ -1,6 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.models import BaseEditModel -from mmedit.registry import MODELS +from mmagic.models import BaseEditModel +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/tdan/tdan_net.py b/mmagic/models/editors/tdan/tdan_net.py similarity index 97% rename from mmedit/models/editors/tdan/tdan_net.py rename to mmagic/models/editors/tdan/tdan_net.py index 68b190f6e0..bb4b4e0026 100644 --- a/mmedit/models/editors/tdan/tdan_net.py +++ b/mmagic/models/editors/tdan/tdan_net.py @@ -7,9 +7,9 @@ from mmengine.model.weight_init import constant_init from torch.nn.modules.utils import _pair -from mmedit.models.base_archs import PixelShufflePack, ResidualBlockNoBN -from mmedit.models.utils import make_layer -from mmedit.registry import MODELS +from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.utils import make_layer +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/tof/__init__.py b/mmagic/models/editors/tof/__init__.py similarity index 100% rename from mmedit/models/editors/tof/__init__.py rename to mmagic/models/editors/tof/__init__.py diff --git a/mmedit/models/editors/tof/tof_vfi_net.py b/mmagic/models/editors/tof/tof_vfi_net.py similarity index 99% rename from mmedit/models/editors/tof/tof_vfi_net.py rename to mmagic/models/editors/tof/tof_vfi_net.py index badea6a085..1ca2bb41e9 100644 --- a/mmedit/models/editors/tof/tof_vfi_net.py +++ b/mmagic/models/editors/tof/tof_vfi_net.py @@ -7,8 +7,8 @@ from mmengine.model import BaseModule from mmengine.runner import load_checkpoint -from mmedit.models.utils import flow_warp -from mmedit.registry import MODELS +from mmagic.models.utils import flow_warp +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/tof/tof_vsr_net.py b/mmagic/models/editors/tof/tof_vsr_net.py similarity index 98% rename from mmedit/models/editors/tof/tof_vsr_net.py rename to mmagic/models/editors/tof/tof_vsr_net.py index 0ff4fc8df4..9c529b994f 100644 --- a/mmedit/models/editors/tof/tof_vsr_net.py +++ b/mmagic/models/editors/tof/tof_vsr_net.py @@ -5,8 +5,8 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmedit.models.utils import flow_warp -from mmedit.registry import MODELS +from mmagic.models.utils import flow_warp +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/ttsr/__init__.py b/mmagic/models/editors/ttsr/__init__.py similarity index 100% rename from mmedit/models/editors/ttsr/__init__.py rename to mmagic/models/editors/ttsr/__init__.py diff --git a/mmedit/models/editors/ttsr/lte.py b/mmagic/models/editors/ttsr/lte.py similarity index 96% rename from mmedit/models/editors/ttsr/lte.py rename to mmagic/models/editors/ttsr/lte.py index f695064f63..7c2bd789ba 100644 --- a/mmedit/models/editors/ttsr/lte.py +++ b/mmagic/models/editors/ttsr/lte.py @@ -3,8 +3,8 @@ from mmengine.model import BaseModule from torchvision import models -from mmedit.models.base_archs import ImgNormalize -from mmedit.registry import MODELS +from mmagic.models.base_archs import ImgNormalize +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/ttsr/search_transformer.py b/mmagic/models/editors/ttsr/search_transformer.py similarity index 99% rename from mmedit/models/editors/ttsr/search_transformer.py rename to mmagic/models/editors/ttsr/search_transformer.py index 236339d4b6..db06baa0ca 100644 --- a/mmedit/models/editors/ttsr/search_transformer.py +++ b/mmagic/models/editors/ttsr/search_transformer.py @@ -3,7 +3,7 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/ttsr/ttsr.py b/mmagic/models/editors/ttsr/ttsr.py similarity index 98% rename from mmedit/models/editors/ttsr/ttsr.py rename to mmagic/models/editors/ttsr/ttsr.py index 8094e89e0b..4389015de3 100644 --- a/mmedit/models/editors/ttsr/ttsr.py +++ b/mmagic/models/editors/ttsr/ttsr.py @@ -4,9 +4,9 @@ import torch from mmengine.optim import OptimWrapperDict -from mmedit.models.utils import set_requires_grad -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models.utils import set_requires_grad +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample from ..srgan import SRGAN diff --git a/mmedit/models/editors/ttsr/ttsr_disc.py b/mmagic/models/editors/ttsr/ttsr_disc.py similarity index 97% rename from mmedit/models/editors/ttsr/ttsr_disc.py rename to mmagic/models/editors/ttsr/ttsr_disc.py index cf12510f1c..f90da10cd1 100644 --- a/mmedit/models/editors/ttsr/ttsr_disc.py +++ b/mmagic/models/editors/ttsr/ttsr_disc.py @@ -2,7 +2,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/editors/ttsr/ttsr_net.py b/mmagic/models/editors/ttsr/ttsr_net.py similarity index 98% rename from mmedit/models/editors/ttsr/ttsr_net.py rename to mmagic/models/editors/ttsr/ttsr_net.py index 871abe7daf..db4ae4c061 100644 --- a/mmedit/models/editors/ttsr/ttsr_net.py +++ b/mmagic/models/editors/ttsr/ttsr_net.py @@ -6,9 +6,9 @@ from mmcv.cnn import build_conv_layer from mmengine.model import BaseModule -from mmedit.models.base_archs import PixelShufflePack, ResidualBlockNoBN -from mmedit.models.utils import make_layer -from mmedit.registry import MODELS +from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.utils import make_layer +from mmagic.registry import MODELS # Use partial to specify some default arguments _conv3x3_layer = partial( diff --git a/mmedit/models/editors/wgan_gp/__init__.py b/mmagic/models/editors/wgan_gp/__init__.py similarity index 100% rename from mmedit/models/editors/wgan_gp/__init__.py rename to mmagic/models/editors/wgan_gp/__init__.py diff --git a/mmedit/models/editors/wgan_gp/wgan_discriminator.py b/mmagic/models/editors/wgan_gp/wgan_discriminator.py similarity index 99% rename from mmedit/models/editors/wgan_gp/wgan_discriminator.py rename to mmagic/models/editors/wgan_gp/wgan_discriminator.py index 41d676fbe1..3247c2a180 100644 --- a/mmedit/models/editors/wgan_gp/wgan_discriminator.py +++ b/mmagic/models/editors/wgan_gp/wgan_discriminator.py @@ -5,7 +5,7 @@ import torch.nn as nn from mmcv.cnn import ConvModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .wgan_gp_module import ConvLNModule, WGANDecisionHead diff --git a/mmedit/models/editors/wgan_gp/wgan_generator.py b/mmagic/models/editors/wgan_gp/wgan_generator.py similarity index 98% rename from mmedit/models/editors/wgan_gp/wgan_generator.py rename to mmagic/models/editors/wgan_gp/wgan_generator.py index c156b67c33..49174f3211 100644 --- a/mmedit/models/editors/wgan_gp/wgan_generator.py +++ b/mmagic/models/editors/wgan_gp/wgan_generator.py @@ -6,8 +6,8 @@ import torch.nn as nn from mmcv.cnn import ConvModule -from mmedit.models.utils import get_module_device -from mmedit.registry import MODELS +from mmagic.models.utils import get_module_device +from mmagic.registry import MODELS from .wgan_gp_module import WGANNoiseTo2DFeat diff --git a/mmedit/models/editors/wgan_gp/wgan_gp.py b/mmagic/models/editors/wgan_gp/wgan_gp.py similarity index 93% rename from mmedit/models/editors/wgan_gp/wgan_gp.py rename to mmagic/models/editors/wgan_gp/wgan_gp.py index d6674d6c94..49903388a7 100644 --- a/mmedit/models/editors/wgan_gp/wgan_gp.py +++ b/mmagic/models/editors/wgan_gp/wgan_gp.py @@ -5,10 +5,10 @@ from mmengine.optim import OptimWrapper from torch import Tensor -from mmedit.models.base_models import BaseGAN -from mmedit.models.losses import gradient_penalty_loss -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models.base_models import BaseGAN +from mmagic.models.losses import gradient_penalty_loss +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample @MODELS.register_module() @@ -18,9 +18,9 @@ class WGANGP(BaseGAN): Paper link: https://arxiv.org/pdf/1704.00028 Detailed architecture can be found in - :class:`~mmedit.models.editors.wgan_gp.WGANGPGenerator` + :class:`~mmagic.models.editors.wgan_gp.WGANGPGenerator` and - :class:`~mmedit.models.editors.wgan_gp.WGANGPDiscriminator` + :class:`~mmagic.models.editors.wgan_gp.WGANGPDiscriminator` """ def __init__(self, *args, **kwargs): diff --git a/mmedit/models/editors/wgan_gp/wgan_gp_module.py b/mmagic/models/editors/wgan_gp/wgan_gp_module.py similarity index 99% rename from mmedit/models/editors/wgan_gp/wgan_gp_module.py rename to mmagic/models/editors/wgan_gp/wgan_gp_module.py index 38330381a6..f0716129f3 100644 --- a/mmedit/models/editors/wgan_gp/wgan_gp_module.py +++ b/mmagic/models/editors/wgan_gp/wgan_gp_module.py @@ -6,7 +6,7 @@ from mmcv.cnn import ConvModule, build_norm_layer from mmengine.model import constant_init -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/losses/__init__.py b/mmagic/models/losses/__init__.py similarity index 100% rename from mmedit/models/losses/__init__.py rename to mmagic/models/losses/__init__.py diff --git a/mmedit/models/losses/clip_loss.py b/mmagic/models/losses/clip_loss.py similarity index 98% rename from mmedit/models/losses/clip_loss.py rename to mmagic/models/losses/clip_loss.py index 1a25b7c59c..892084131d 100644 --- a/mmedit/models/losses/clip_loss.py +++ b/mmagic/models/losses/clip_loss.py @@ -4,8 +4,8 @@ import torch import torch.nn as nn -from mmedit.registry import MODELS -from mmedit.utils import try_import +from mmagic.registry import MODELS +from mmagic.utils import try_import clip = try_import('clip') diff --git a/mmedit/models/losses/composition_loss.py b/mmagic/models/losses/composition_loss.py similarity index 99% rename from mmedit/models/losses/composition_loss.py rename to mmagic/models/losses/composition_loss.py index b09a2ff1c4..2d013564c9 100644 --- a/mmedit/models/losses/composition_loss.py +++ b/mmagic/models/losses/composition_loss.py @@ -4,7 +4,7 @@ import torch import torch.nn as nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .pixelwise_loss import charbonnier_loss, l1_loss, mse_loss _reduction_modes = ['none', 'mean', 'sum'] diff --git a/mmedit/models/losses/face_id_loss.py b/mmagic/models/losses/face_id_loss.py similarity index 98% rename from mmedit/models/losses/face_id_loss.py rename to mmagic/models/losses/face_id_loss.py index f83af9d9a8..f2a7fce2a9 100644 --- a/mmedit/models/losses/face_id_loss.py +++ b/mmagic/models/losses/face_id_loss.py @@ -4,7 +4,7 @@ import torch import torch.nn as nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/losses/feature_loss.py b/mmagic/models/losses/feature_loss.py similarity index 97% rename from mmedit/models/losses/feature_loss.py rename to mmagic/models/losses/feature_loss.py index cce779a415..2f09a555a9 100644 --- a/mmedit/models/losses/feature_loss.py +++ b/mmagic/models/losses/feature_loss.py @@ -7,8 +7,8 @@ from mmengine import MMLogger from mmengine.runner import load_checkpoint -from mmedit.models.editors.dic import LightCNN -from mmedit.registry import MODELS +from mmagic.models.editors.dic import LightCNN +from mmagic.registry import MODELS class LightCNNFeature(nn.Module): diff --git a/mmedit/models/losses/gan_loss.py b/mmagic/models/losses/gan_loss.py similarity index 99% rename from mmedit/models/losses/gan_loss.py rename to mmagic/models/losses/gan_loss.py index e5da0b7a2d..247adba5a3 100644 --- a/mmedit/models/losses/gan_loss.py +++ b/mmagic/models/losses/gan_loss.py @@ -11,7 +11,7 @@ from torch.cuda.amp.grad_scaler import GradScaler from torch.nn.functional import conv2d -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/losses/gradient_loss.py b/mmagic/models/losses/gradient_loss.py similarity index 98% rename from mmedit/models/losses/gradient_loss.py rename to mmagic/models/losses/gradient_loss.py index b723ec6139..9a61b1ff16 100644 --- a/mmedit/models/losses/gradient_loss.py +++ b/mmagic/models/losses/gradient_loss.py @@ -5,7 +5,7 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .pixelwise_loss import l1_loss _reduction_modes = ['none', 'mean', 'sum'] diff --git a/mmedit/models/losses/loss_comps/__init__.py b/mmagic/models/losses/loss_comps/__init__.py similarity index 100% rename from mmedit/models/losses/loss_comps/__init__.py rename to mmagic/models/losses/loss_comps/__init__.py diff --git a/mmedit/models/losses/loss_comps/clip_loss_comps.py b/mmagic/models/losses/loss_comps/clip_loss_comps.py similarity index 99% rename from mmedit/models/losses/loss_comps/clip_loss_comps.py rename to mmagic/models/losses/loss_comps/clip_loss_comps.py index 0281e65182..4ae48c9bc9 100644 --- a/mmedit/models/losses/loss_comps/clip_loss_comps.py +++ b/mmagic/models/losses/loss_comps/clip_loss_comps.py @@ -4,7 +4,7 @@ import torch import torch.nn as nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..clip_loss import CLIPLossModel diff --git a/mmedit/models/losses/loss_comps/disc_auxiliary_loss_comps.py b/mmagic/models/losses/loss_comps/disc_auxiliary_loss_comps.py similarity index 98% rename from mmedit/models/losses/loss_comps/disc_auxiliary_loss_comps.py rename to mmagic/models/losses/loss_comps/disc_auxiliary_loss_comps.py index 21826d41a1..864373a4e0 100644 --- a/mmedit/models/losses/loss_comps/disc_auxiliary_loss_comps.py +++ b/mmagic/models/losses/loss_comps/disc_auxiliary_loss_comps.py @@ -4,7 +4,7 @@ import torch import torch.nn as nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..gan_loss import (disc_shift_loss, gradient_penalty_loss, r1_gradient_penalty_loss) @@ -16,7 +16,7 @@ class DiscShiftLossComps(nn.Module): This loss is proposed in PGGAN as an auxiliary loss for discriminator. **Note for the design of ``data_info``:** - In ``MMEditing``, almost all of loss modules contain the argument + In ``MMagic``, almost all of loss modules contain the argument ``data_info``, which can be used for constructing the link between the input items (needed in loss calculation) and the data from the generative model. For example, in the training of GAN model, we will collect all of @@ -140,7 +140,7 @@ class GradientPenaltyLossComps(nn.Module): want. **Note for the design of ``data_info``:** - In ``MMEditing``, almost all of loss modules contain the argument + In ``MMagic``, almost all of loss modules contain the argument ``data_info``, which can be used for constructing the link between the input items (needed in loss calculation) and the data from the generative model. For example, in the training of GAN model, we will collect all of @@ -273,7 +273,7 @@ class R1GradientPenaltyComps(nn.Module): gradient w.r.t. real data. **Note for the design of ``data_info``:** - In ``MMEditing``, almost all of loss modules contain the argument + In ``MMagic``, almost all of loss modules contain the argument ``data_info``, which can be used for constructing the link between the input items (needed in loss calculation) and the data from the generative model. For example, in the training of GAN model, we will collect all of diff --git a/mmedit/models/losses/loss_comps/face_id_loss_comps.py b/mmagic/models/losses/loss_comps/face_id_loss_comps.py similarity index 99% rename from mmedit/models/losses/loss_comps/face_id_loss_comps.py rename to mmagic/models/losses/loss_comps/face_id_loss_comps.py index f1abb8167d..fd1571bd0e 100644 --- a/mmedit/models/losses/loss_comps/face_id_loss_comps.py +++ b/mmagic/models/losses/loss_comps/face_id_loss_comps.py @@ -4,7 +4,7 @@ import torch import torch.nn as nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/losses/loss_comps/gan_loss_comps.py b/mmagic/models/losses/loss_comps/gan_loss_comps.py similarity index 99% rename from mmedit/models/losses/loss_comps/gan_loss_comps.py rename to mmagic/models/losses/loss_comps/gan_loss_comps.py index 722c11ab34..4470896b2e 100644 --- a/mmedit/models/losses/loss_comps/gan_loss_comps.py +++ b/mmagic/models/losses/loss_comps/gan_loss_comps.py @@ -5,7 +5,7 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/mmedit/models/losses/loss_comps/gen_auxiliary_loss_comps.py b/mmagic/models/losses/loss_comps/gen_auxiliary_loss_comps.py similarity index 98% rename from mmedit/models/losses/loss_comps/gen_auxiliary_loss_comps.py rename to mmagic/models/losses/loss_comps/gen_auxiliary_loss_comps.py index 29f01b06a6..8b6724b036 100644 --- a/mmedit/models/losses/loss_comps/gen_auxiliary_loss_comps.py +++ b/mmagic/models/losses/loss_comps/gen_auxiliary_loss_comps.py @@ -4,7 +4,7 @@ import torch import torch.nn as nn -from mmedit.registry import MODELS +from mmagic.registry import MODELS from ..gan_loss import gen_path_regularizer @@ -20,7 +20,7 @@ class GeneratorPathRegularizerComps(nn.Module): here. **Note for the design of ``data_info``:** - In ``MMEditing``, almost all of loss modules contain the argument + In ``MMagic``, almost all of loss modules contain the argument ``data_info``, which can be used for constructing the link between the input items (needed in loss calculation) and the data from the generative model. For example, in the training of GAN model, we will collect all of diff --git a/mmedit/models/losses/loss_wrapper.py b/mmagic/models/losses/loss_wrapper.py similarity index 100% rename from mmedit/models/losses/loss_wrapper.py rename to mmagic/models/losses/loss_wrapper.py diff --git a/mmedit/models/losses/perceptual_loss.py b/mmagic/models/losses/perceptual_loss.py similarity index 99% rename from mmedit/models/losses/perceptual_loss.py rename to mmagic/models/losses/perceptual_loss.py index de2038cfc9..605e6c1d44 100644 --- a/mmedit/models/losses/perceptual_loss.py +++ b/mmagic/models/losses/perceptual_loss.py @@ -8,7 +8,7 @@ from mmengine.runner import load_checkpoint from torch.nn import functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS class PerceptualVGG(nn.Module): diff --git a/mmedit/models/losses/pixelwise_loss.py b/mmagic/models/losses/pixelwise_loss.py similarity index 99% rename from mmedit/models/losses/pixelwise_loss.py rename to mmagic/models/losses/pixelwise_loss.py index 3992090b7d..5a76fb6197 100644 --- a/mmedit/models/losses/pixelwise_loss.py +++ b/mmagic/models/losses/pixelwise_loss.py @@ -5,7 +5,7 @@ import torch.nn as nn import torch.nn.functional as F -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .loss_wrapper import masked_loss _reduction_modes = ['none', 'mean', 'sum'] diff --git a/mmedit/models/utils/__init__.py b/mmagic/models/utils/__init__.py similarity index 100% rename from mmedit/models/utils/__init__.py rename to mmagic/models/utils/__init__.py diff --git a/mmedit/models/utils/bbox_utils.py b/mmagic/models/utils/bbox_utils.py similarity index 100% rename from mmedit/models/utils/bbox_utils.py rename to mmagic/models/utils/bbox_utils.py diff --git a/mmedit/models/utils/diffusion_utils.py b/mmagic/models/utils/diffusion_utils.py similarity index 100% rename from mmedit/models/utils/diffusion_utils.py rename to mmagic/models/utils/diffusion_utils.py diff --git a/mmedit/models/utils/flow_warp.py b/mmagic/models/utils/flow_warp.py similarity index 100% rename from mmedit/models/utils/flow_warp.py rename to mmagic/models/utils/flow_warp.py diff --git a/mmedit/models/utils/model_utils.py b/mmagic/models/utils/model_utils.py similarity index 98% rename from mmedit/models/utils/model_utils.py rename to mmagic/models/utils/model_utils.py index cabe4a6f9d..bd6441d9a4 100644 --- a/mmedit/models/utils/model_utils.py +++ b/mmagic/models/utils/model_utils.py @@ -12,8 +12,8 @@ from torch import Tensor from torch.nn import init -from mmedit.structures import EditDataSample -from mmedit.utils.typing import ForwardInputs +from mmagic.structures import EditDataSample +from mmagic.utils.typing import ForwardInputs def default_init_weights(module, scale=1): @@ -264,7 +264,7 @@ def xformers_is_enable(verbose: bool = False) -> bool: Returns: bool: Whether xformers is installed. """ - from mmedit.utils import try_import + from mmagic.utils import try_import xformers = try_import('xformers') if xformers is None and verbose: print_log('Do not support Xformers.', 'current') diff --git a/mmedit/models/utils/sampling_utils.py b/mmagic/models/utils/sampling_utils.py similarity index 100% rename from mmedit/models/utils/sampling_utils.py rename to mmagic/models/utils/sampling_utils.py diff --git a/mmedit/models/utils/tensor_utils.py b/mmagic/models/utils/tensor_utils.py similarity index 100% rename from mmedit/models/utils/tensor_utils.py rename to mmagic/models/utils/tensor_utils.py diff --git a/mmedit/registry.py b/mmagic/registry.py similarity index 82% rename from mmedit/registry.py rename to mmagic/registry.py index 38c3dace11..72af766a1c 100644 --- a/mmedit/registry.py +++ b/mmagic/registry.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. -"""Registries and utilities in MMEditing. +"""Registries and utilities in MMagic. -MMEditing provides 17 registry nodes to support using modules across projects. +MMagic provides 17 registry nodes to support using modules across projects. Each node is a child of the root registry in MMEngine. More details can be found at @@ -43,151 +43,151 @@ ] ####################################################################### -# mmedit.engine # +# mmagic.engine # ####################################################################### # Runners like `EpochBasedRunner` and `IterBasedRunner` RUNNERS = Registry( 'runner', parent=MMENGINE_RUNNERS, - locations=['mmedit.engine'], + locations=['mmagic.engine'], ) # Runner constructors that define how to initialize runners RUNNER_CONSTRUCTORS = Registry( 'runner constructor', parent=MMENGINE_RUNNER_CONSTRUCTORS, - locations=['mmedit.engine'], + locations=['mmagic.engine'], ) # Loops which define the training or test process, like `EpochBasedTrainLoop` LOOPS = Registry( 'loop', parent=MMENGINE_LOOPS, - locations=['mmedit.engine'], + locations=['mmagic.engine'], ) # Hooks to add additional functions during running, like `CheckpointHook` HOOKS = Registry( 'hook', parent=MMENGINE_HOOKS, - locations=['mmedit.engine'], + locations=['mmagic.engine'], ) # Log processors to process the scalar log data. LOG_PROCESSORS = Registry( 'log processor', parent=MMENGINE_LOG_PROCESSORS, - locations=['mmedit.engine'], + locations=['mmagic.engine'], ) # Optimizers to optimize the model weights, like `SGD` and `Adam`. OPTIMIZERS = Registry( 'optimizer', parent=MMENGINE_OPTIMIZERS, - locations=['mmedit.engine'], + locations=['mmagic.engine'], ) # Optimizer wrappers to enhance the optimization process. OPTIM_WRAPPERS = Registry( 'optimizer_wrapper', parent=MMENGINE_OPTIM_WRAPPERS, - locations=['mmedit.engine'], + locations=['mmagic.engine'], ) # Optimizer constructors to customize the hyper-parameters of optimizers. OPTIM_WRAPPER_CONSTRUCTORS = Registry( 'optimizer wrapper constructor', parent=MMENGINE_OPTIM_WRAPPER_CONSTRUCTORS, - locations=['mmedit.engine'], + locations=['mmagic.engine'], ) # Parameter schedulers to dynamically adjust optimization parameters. PARAM_SCHEDULERS = Registry( 'parameter scheduler', parent=MMENGINE_PARAM_SCHEDULERS, - locations=['mmedit.engine'], + locations=['mmagic.engine'], ) ####################################################################### -# mmedit.datasets # +# mmagic.datasets # ####################################################################### # Datasets like `ImageNet` and `CIFAR10`. DATASETS = Registry( 'dataset', parent=MMENGINE_DATASETS, - locations=['mmedit.datasets'], + locations=['mmagic.datasets'], ) # Samplers to sample the dataset. DATA_SAMPLERS = Registry( 'data sampler', parent=MMENGINE_DATA_SAMPLERS, - locations=['mmedit.datasets'], + locations=['mmagic.datasets'], ) # Transforms to process the samples from the dataset. TRANSFORMS = Registry( 'transform', parent=MMENGINE_TRANSFORMS, - locations=['mmedit.datasets.transforms'], + locations=['mmagic.datasets.transforms'], ) ####################################################################### -# mmedit.models # +# mmagic.models # ####################################################################### # Neural network modules inheriting `nn.Module`. MODELS = Registry( 'model', parent=MMENGINE_MODELS, - locations=['mmedit.models'], + locations=['mmagic.models'], ) # Model wrappers like 'MMDistributedDataParallel' MODEL_WRAPPERS = Registry( 'model_wrapper', parent=MMENGINE_MODEL_WRAPPERS, - locations=['mmedit.models'], + locations=['mmagic.models'], ) # Weight initialization methods like uniform, xavier. WEIGHT_INITIALIZERS = Registry( 'weight initializer', parent=MMENGINE_WEIGHT_INITIALIZERS, - locations=['mmedit.models'], + locations=['mmagic.models'], ) # Task-specific modules like anchor generators and box coders TASK_UTILS = Registry( 'task util', parent=MMENGINE_TASK_UTILS, - locations=['mmedit.models'], + locations=['mmagic.models'], ) # modules for diffusion models that support adding noise and denoising DIFFUSION_SCHEDULERS = Registry( 'diffusion scheduler', - locations=['mmedit.models.diffusion_schedulers'], + locations=['mmagic.models.diffusion_schedulers'], ) ####################################################################### -# mmedit.evaluation # +# mmagic.evaluation # ####################################################################### # Metrics to evaluate the model prediction results. METRICS = Registry( 'metric', parent=MMENGINE_METRICS, - locations=['mmedit.evaluation'], + locations=['mmagic.evaluation'], ) # Evaluators to define the evaluation process. EVALUATORS = Registry( 'evaluator', parent=MMENGINE_EVALUATOR, - locations=['mmedit.evaluation'], + locations=['mmagic.evaluation'], ) ####################################################################### -# mmedit.visualization # +# mmagic.visualization # ####################################################################### # Visualizers to display task-specific results. VISUALIZERS = Registry( 'visualizer', parent=MMENGINE_VISUALIZERS, - locations=['mmedit.visualization'], + locations=['mmagic.visualization'], ) # Backends to save the visualization results, like TensorBoard, WandB. VISBACKENDS = Registry( 'vis_backend', parent=MMENGINE_VISBACKENDS, - locations=['mmedit.visualization'], + locations=['mmagic.visualization'], ) diff --git a/mmedit/structures/__init__.py b/mmagic/structures/__init__.py similarity index 100% rename from mmedit/structures/__init__.py rename to mmagic/structures/__init__.py diff --git a/mmedit/structures/edit_data_sample.py b/mmagic/structures/edit_data_sample.py similarity index 98% rename from mmedit/structures/edit_data_sample.py rename to mmagic/structures/edit_data_sample.py index c35f541191..ddbd71ebef 100644 --- a/mmedit/structures/edit_data_sample.py +++ b/mmagic/structures/edit_data_sample.py @@ -10,7 +10,7 @@ import torch from mmengine.structures import BaseDataElement, LabelData -from mmedit.utils import all_to_tensor +from mmagic.utils import all_to_tensor def format_label(value: Union[torch.Tensor, np.ndarray, Sequence, int], @@ -72,7 +72,7 @@ def is_splitable_var(var: Any) -> bool: class EditDataSample(BaseDataElement): - """A data structure interface of MMEditing. They are used as interfaces + """A data structure interface of MMagic. They are used as interfaces between different components, e.g., model, visualizer, evaluator, etc. Typically, EditDataSample contains all the information and data from ground-truth and predictions. @@ -103,7 +103,7 @@ class EditDataSample(BaseDataElement): >>> import torch >>> import numpy as np - >>> from mmedit.structures import EditDataSample + >>> from mmagic.structures import EditDataSample >>> img_meta = dict(img_shape=(800, 1196, 3)) >>> img = torch.rand((3, 800, 1196)) >>> data_sample = EditDataSample(gt_img=img, metainfo=img_meta) diff --git a/mmedit/utils/__init__.py b/mmagic/utils/__init__.py similarity index 100% rename from mmedit/utils/__init__.py rename to mmagic/utils/__init__.py diff --git a/mmedit/utils/cli.py b/mmagic/utils/cli.py similarity index 100% rename from mmedit/utils/cli.py rename to mmagic/utils/cli.py diff --git a/mmedit/utils/collect_env.py b/mmagic/utils/collect_env.py similarity index 82% rename from mmedit/utils/collect_env.py rename to mmagic/utils/collect_env.py index 9105896a50..999a35dba5 100644 --- a/mmedit/utils/collect_env.py +++ b/mmagic/utils/collect_env.py @@ -2,13 +2,13 @@ from mmcv.utils import collect_env as collect_base_env from mmengine.utils import get_git_hash -import mmedit +import mmagic def collect_env(): """Collect the information of the running environments.""" env_info = collect_base_env() - env_info['MMEditing'] = f'{mmedit.__version__}+{get_git_hash()[:7]}' + env_info['MMagic'] = f'{mmagic.__version__}+{get_git_hash()[:7]}' return env_info diff --git a/mmedit/utils/img_utils.py b/mmagic/utils/img_utils.py similarity index 100% rename from mmedit/utils/img_utils.py rename to mmagic/utils/img_utils.py diff --git a/mmedit/utils/io_utils.py b/mmagic/utils/io_utils.py similarity index 98% rename from mmedit/utils/io_utils.py rename to mmagic/utils/io_utils.py index 64f6dda996..a776134d00 100644 --- a/mmedit/utils/io_utils.py +++ b/mmagic/utils/io_utils.py @@ -9,7 +9,7 @@ from mmengine.dist import get_dist_info from requests.exceptions import InvalidURL, RequestException, Timeout -MMEDIT_CACHE_DIR = os.path.expanduser('~') + '/.cache/openmmlab/mmedit/' +MMEDIT_CACHE_DIR = os.path.expanduser('~') + '/.cache/openmmlab/mmagic/' def get_content_from_url(url, timeout=15, stream=False): @@ -42,7 +42,7 @@ def download_from_url(url, url (str): URL of the object to download. dest_path (str): Path where object will be saved. dest_dir (str): The directory of the destination. Defaults to - ``'~/.cache/openmmlab/mmedit/'``. + ``'~/.cache/openmmlab/mmagic/'``. hash_prefix (string, optional): If not None, the SHA256 downloaded file should start with `hash_prefix`. Default: None. diff --git a/mmedit/utils/logger.py b/mmagic/utils/logger.py similarity index 100% rename from mmedit/utils/logger.py rename to mmagic/utils/logger.py diff --git a/mmedit/utils/sampler.py b/mmagic/utils/sampler.py similarity index 100% rename from mmedit/utils/sampler.py rename to mmagic/utils/sampler.py diff --git a/mmedit/utils/setup_env.py b/mmagic/utils/setup_env.py similarity index 67% rename from mmedit/utils/setup_env.py rename to mmagic/utils/setup_env.py index 89a8a8919c..da8f400415 100644 --- a/mmedit/utils/setup_env.py +++ b/mmagic/utils/setup_env.py @@ -9,39 +9,39 @@ def register_all_modules(init_default_scope: bool = True) -> None: - """Register all modules in mmedit into the registries. + """Register all modules in mmagic into the registries. Args: - init_default_scope (bool): Whether initialize the mmedit default scope. + init_default_scope (bool): Whether initialize the mmagic default scope. When `init_default_scope=True`, the global default scope will be - set to `mmedit`, and all registries will build modules from - mmedit's registry node. + set to `mmagic`, and all registries will build modules from + mmagic's registry node. To understand more about the registry, please refer to https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/registry.md Defaults to True. """ # noqa - import mmedit.datasets # noqa: F401,F403 - import mmedit.engine # noqa: F401,F403 - import mmedit.evaluation # noqa: F401,F403 - import mmedit.models # noqa: F401,F403 - import mmedit.visualization # noqa: F401,F403 + import mmagic.datasets # noqa: F401,F403 + import mmagic.engine # noqa: F401,F403 + import mmagic.evaluation # noqa: F401,F403 + import mmagic.models # noqa: F401,F403 + import mmagic.visualization # noqa: F401,F403 if init_default_scope: never_created = DefaultScope.get_current_instance() is None \ - or not DefaultScope.check_instance_created('mmedit') + or not DefaultScope.check_instance_created('mmagic') if never_created: - DefaultScope.get_instance('mmedit', scope_name='mmedit') + DefaultScope.get_instance('mmagic', scope_name='mmagic') return current_scope = DefaultScope.get_current_instance() - if current_scope.scope_name != 'mmedit': + if current_scope.scope_name != 'mmagic': warnings.warn('The current default scope ' - f'"{current_scope.scope_name}" is not "mmedit", ' + f'"{current_scope.scope_name}" is not "mmagic", ' '`register_all_modules` will force the current' - 'default scope to be "mmedit". If this is not ' + 'default scope to be "mmagic". If this is not ' 'expected, please set `init_default_scope=False`.') # avoid name conflict - new_instance_name = f'mmedit-{datetime.datetime.now()}' - DefaultScope.get_instance(new_instance_name, scope_name='mmedit') + new_instance_name = f'mmagic-{datetime.datetime.now()}' + DefaultScope.get_instance(new_instance_name, scope_name='mmagic') def try_import(name: str) -> Optional[ModuleType]: diff --git a/mmedit/utils/trans_utils.py b/mmagic/utils/trans_utils.py similarity index 100% rename from mmedit/utils/trans_utils.py rename to mmagic/utils/trans_utils.py diff --git a/mmedit/utils/typing.py b/mmagic/utils/typing.py similarity index 100% rename from mmedit/utils/typing.py rename to mmagic/utils/typing.py diff --git a/mmedit/version.py b/mmagic/version.py similarity index 100% rename from mmedit/version.py rename to mmagic/version.py diff --git a/mmedit/visualization/__init__.py b/mmagic/visualization/__init__.py similarity index 100% rename from mmedit/visualization/__init__.py rename to mmagic/visualization/__init__.py diff --git a/mmedit/visualization/concat_visualizer.py b/mmagic/visualization/concat_visualizer.py similarity index 97% rename from mmedit/visualization/concat_visualizer.py rename to mmagic/visualization/concat_visualizer.py index 13b738a48a..d24d04d2ec 100644 --- a/mmedit/visualization/concat_visualizer.py +++ b/mmagic/visualization/concat_visualizer.py @@ -7,9 +7,9 @@ import torch from mmengine.visualization import Visualizer -from mmedit.registry import VISUALIZERS -from mmedit.structures import EditDataSample -from mmedit.utils import print_colored_log +from mmagic.registry import VISUALIZERS +from mmagic.structures import EditDataSample +from mmagic.utils import print_colored_log @VISUALIZERS.register_module() diff --git a/mmedit/visualization/gen_visualizer.py b/mmagic/visualization/gen_visualizer.py similarity index 98% rename from mmedit/visualization/gen_visualizer.py rename to mmagic/visualization/gen_visualizer.py index 7262cb3b00..6554652db2 100644 --- a/mmedit/visualization/gen_visualizer.py +++ b/mmagic/visualization/gen_visualizer.py @@ -9,16 +9,16 @@ from torch import Tensor from torchvision.utils import make_grid -from mmedit.registry import VISUALIZERS -from mmedit.structures import EditDataSample -from mmedit.utils.typing import SampleList +from mmagic.registry import VISUALIZERS +from mmagic.structures import EditDataSample +from mmagic.utils.typing import SampleList mean_std_type = Optional[Sequence[Union[float, int]]] @VISUALIZERS.register_module() class GenVisualizer(Visualizer): - """MMEditing Visualizer. + """MMagic Visualizer. Args: name (str): Name of the instance. Defaults to 'visualizer'. diff --git a/mmedit/visualization/vis_backend.py b/mmagic/visualization/vis_backend.py similarity index 99% rename from mmedit/visualization/vis_backend.py rename to mmagic/visualization/vis_backend.py index b2dde33178..13de0a6c1f 100644 --- a/mmedit/visualization/vis_backend.py +++ b/mmagic/visualization/vis_backend.py @@ -14,7 +14,7 @@ WandbVisBackend) from mmengine.visualization.vis_backend import force_init_env -from mmedit.registry import VISBACKENDS +from mmagic.registry import VISBACKENDS @VISBACKENDS.register_module() @@ -24,7 +24,7 @@ class GenVisBackend(BaseVisBackend): backend through the experiment property for custom drawing. Examples: - >>> from mmedit.visualization import GenVisBackend + >>> from mmagic.visualization import GenVisBackend >>> import numpy as np >>> vis_backend = GenVisBackend(save_dir='temp_dir', >>> ceph_path='s3://temp-bucket') @@ -397,7 +397,7 @@ def add_scalars(self, @VISBACKENDS.register_module() class WandbGenVisBackend(WandbVisBackend): - """Wandb visualization backend for MMEditing.""" + """Wandb visualization backend for MMagic.""" def _init_env(self): """Setup env for wandb.""" From 2acc31c788d4dfdf1cbabe5ddd78ec9b4f4fc253 Mon Sep 17 00:00:00 2001 From: zhangjingdong <1396925302@qq.com> Date: Wed, 19 Apr 2023 16:26:36 +0800 Subject: [PATCH 16/42] rename to mmagic in tools --- tools/analysis_tools/get_flops.py | 4 ++-- tools/dataset_converters/celeba-hq/README.md | 4 ++-- .../celeba-hq/README_zh-CN.md | 4 ++-- tools/dataset_converters/classic5/README.md | 4 ++-- .../classic5/README_zh-CN.md | 4 ++-- tools/dataset_converters/comp1k/README.md | 10 +++++----- .../dataset_converters/comp1k/README_zh-CN.md | 10 +++++----- .../comp1k/evaluate_comp1k.py | 4 ++-- .../comp1k/preprocess_comp1k_dataset.py | 2 +- tools/dataset_converters/denoising/README.md | 4 ++-- .../denoising/README_zh-CN.md | 4 ++-- tools/dataset_converters/deraining/README.md | 4 ++-- .../deraining/README_zh-CN.md | 4 ++-- tools/dataset_converters/df2k_ost/README.md | 8 ++++---- .../df2k_ost/README_zh-CN.md | 8 ++++---- tools/dataset_converters/div2k/README.md | 8 ++++---- .../dataset_converters/div2k/README_zh-CN.md | 8 ++++---- tools/dataset_converters/dpdd/README.md | 4 ++-- tools/dataset_converters/dpdd/README_zh-CN.md | 4 ++-- tools/dataset_converters/glean/README.md | 20 +++++++++---------- .../dataset_converters/glean/README_zh-CN.md | 20 +++++++++---------- .../glean/preprocess_cat_test_dataset.py | 2 +- .../glean/preprocess_cat_train_dataset.py | 2 +- .../glean/preprocess_ffhq_celebahq_dataset.py | 2 +- tools/dataset_converters/gopro/README.md | 4 ++-- .../dataset_converters/gopro/README_zh-CN.md | 4 ++-- tools/dataset_converters/hide/README.md | 4 ++-- tools/dataset_converters/hide/README_zh-CN.md | 4 ++-- tools/dataset_converters/live1/README.md | 4 ++-- .../dataset_converters/live1/README_zh-CN.md | 4 ++-- .../ntire21_decompression/README.md | 4 ++-- .../ntire21_decompression/README_zh-CN.md | 4 ++-- .../paired-pix2pix/README.md | 4 ++-- .../paired-pix2pix/README_zh-CN.md | 4 ++-- .../paris-street-view/README.md | 4 ++-- .../paris-street-view/README_zh-CN.md | 4 ++-- tools/dataset_converters/places365/README.md | 4 ++-- .../places365/README_zh-CN.md | 4 ++-- tools/dataset_converters/realblur/README.md | 4 ++-- .../realblur/README_zh-CN.md | 4 ++-- tools/dataset_converters/realsrset/README.md | 4 ++-- .../realsrset/README_zh-CN.md | 4 ++-- tools/dataset_converters/reds/README.md | 10 +++++----- tools/dataset_converters/reds/README_zh-CN.md | 10 +++++----- tools/dataset_converters/sidd/README.md | 4 ++-- tools/dataset_converters/sidd/README_zh-CN.md | 4 ++-- tools/dataset_converters/spmcs/README.md | 4 ++-- .../dataset_converters/spmcs/README_zh-CN.md | 4 ++-- tools/dataset_converters/udm10/README.md | 4 ++-- .../dataset_converters/udm10/README_zh-CN.md | 4 ++-- .../unconditional_gans/README.md | 4 ++-- .../unpaired-cyclegan/README.md | 4 ++-- .../unpaired-cyclegan/README_zh-CN.md | 4 ++-- tools/dataset_converters/vid4/README.md | 4 ++-- tools/dataset_converters/vid4/README_zh-CN.md | 4 ++-- .../vid4/preprocess_vid4_dataset.py | 2 +- tools/dataset_converters/videolq/README.md | 4 ++-- .../videolq/README_zh-CN.md | 4 ++-- .../vimeo90k-triplet/README.md | 4 ++-- .../vimeo90k-triplet/README_zh-CN.md | 4 ++-- tools/dataset_converters/vimeo90k/README.md | 4 ++-- .../vimeo90k/README_zh-CN.md | 4 ++-- .../vimeo90k/preprocess_vimeo90k_dataset.py | 4 ++-- tools/gui/README.md | 12 +++++------ tools/gui/gui.py | 2 +- tools/model_converters/pytorch2onnx.py | 10 +++++----- tools/test.py | 2 +- tools/train.py | 2 +- 68 files changed, 171 insertions(+), 171 deletions(-) diff --git a/tools/analysis_tools/get_flops.py b/tools/analysis_tools/get_flops.py index 0a1141b2df..b9965ca3b8 100644 --- a/tools/analysis_tools/get_flops.py +++ b/tools/analysis_tools/get_flops.py @@ -5,7 +5,7 @@ from mmengine import Config from mmengine.registry import init_default_scope -from mmedit.registry import MODELS +from mmagic.registry import MODELS try: from mmengine.analysis import get_model_complexity_info @@ -83,7 +83,7 @@ def main(): cfg = Config.fromfile(args.config) - init_default_scope(cfg.get('default_scope', 'mmedit')) + init_default_scope(cfg.get('default_scope', 'mmagic')) model = MODELS.build(cfg.model) inputs = torch.randn(1, *input_shape) diff --git a/tools/dataset_converters/celeba-hq/README.md b/tools/dataset_converters/celeba-hq/README.md index 8c6b9a07a4..3ca7d9045e 100644 --- a/tools/dataset_converters/celeba-hq/README.md +++ b/tools/dataset_converters/celeba-hq/README.md @@ -14,8 +14,8 @@ Follow the instructions [here](https://github.com/tkarras/progressive_growing_of_gans#preparing-datasets-for-training) to prepare the dataset. ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/celeba-hq/README_zh-CN.md b/tools/dataset_converters/celeba-hq/README_zh-CN.md index 3ac91a8234..1be8c8d9c3 100644 --- a/tools/dataset_converters/celeba-hq/README_zh-CN.md +++ b/tools/dataset_converters/celeba-hq/README_zh-CN.md @@ -14,8 +14,8 @@ 请按照[此处](https://github.com/tkarras/progressive_growing_of_gans#preparing-datasets-for-training)准备数据集。 ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/classic5/README.md b/tools/dataset_converters/classic5/README.md index ccf33e47c3..8da220c350 100644 --- a/tools/dataset_converters/classic5/README.md +++ b/tools/dataset_converters/classic5/README.md @@ -19,8 +19,8 @@ The test datasets can be download from [here](https://github.com/cszn/DnCNN/tree The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/classic5/README_zh-CN.md b/tools/dataset_converters/classic5/README_zh-CN.md index 531fa9b772..6c48b50b63 100644 --- a/tools/dataset_converters/classic5/README_zh-CN.md +++ b/tools/dataset_converters/classic5/README_zh-CN.md @@ -19,8 +19,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/comp1k/README.md b/tools/dataset_converters/comp1k/README.md index c42f3df3bd..7401beb84d 100644 --- a/tools/dataset_converters/comp1k/README.md +++ b/tools/dataset_converters/comp1k/README.md @@ -28,7 +28,7 @@ It is needed to merge `fg` with COCO data (training) or VOC data (test) before t 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 +# The script is run under the root folder of MMagic python tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py data/adobe_composition-1k data/coco data/VOCdevkit --composite ``` @@ -54,8 +54,8 @@ python tools/data/matting/comp1k/preprocess_comp1k_dataset.py data/adobe_composi The result folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -108,8 +108,8 @@ python tools/dataset_converters/matting/comp1k/extend_fg.py data/adobe_compositi The final folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/comp1k/README_zh-CN.md b/tools/dataset_converters/comp1k/README_zh-CN.md index d65c4f42fb..2ccec37e6b 100644 --- a/tools/dataset_converters/comp1k/README_zh-CN.md +++ b/tools/dataset_converters/comp1k/README_zh-CN.md @@ -25,7 +25,7 @@ Adobe Composition-1k 数据集由前景图像及其相应的 alpha 图像组成 Adobe composition-1k 数据集仅包含 `alpha` 和 `fg`(以及测试集中的 `trimap`)。在训练或评估之前,需要将 `fg` 与 COCO 数据(训练)或 VOC 数据(测试)合并。使用以下脚本执行图像合成并生成用于训练或测试的注释文件: ```shell -# 在 MMEditing 的根文件夹下运行脚本 +# 在 MMagic 的根文件夹下运行脚本 python tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py data/adobe_composition-1k data/coco data/VOCdevkit --composite ``` @@ -50,8 +50,8 @@ python tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py data 最终的文件夹结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -102,8 +102,8 @@ python tools/dataset_converters/matting/comp1k/extend_fg.py data/adobe_compositi 最终的文件夹结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/comp1k/evaluate_comp1k.py b/tools/dataset_converters/comp1k/evaluate_comp1k.py index 5548b0d22e..78e6b30fbb 100644 --- a/tools/dataset_converters/comp1k/evaluate_comp1k.py +++ b/tools/dataset_converters/comp1k/evaluate_comp1k.py @@ -8,8 +8,8 @@ import mmengine import numpy as np -from mmedit.evaluation import gauss_gradient -from mmedit.utils import modify_args +from mmagic.evaluation import gauss_gradient +from mmagic.utils import modify_args def sad(alpha, trimap, pred_alpha): diff --git a/tools/dataset_converters/comp1k/preprocess_comp1k_dataset.py b/tools/dataset_converters/comp1k/preprocess_comp1k_dataset.py index 3573fa96c0..474f60d5c2 100644 --- a/tools/dataset_converters/comp1k/preprocess_comp1k_dataset.py +++ b/tools/dataset_converters/comp1k/preprocess_comp1k_dataset.py @@ -9,7 +9,7 @@ import numpy as np from PIL import Image -from mmedit.utils import modify_args +from mmagic.utils import modify_args def fix_png_files(directory): diff --git a/tools/dataset_converters/denoising/README.md b/tools/dataset_converters/denoising/README.md index 0d9cd25fbb..131610d7aa 100644 --- a/tools/dataset_converters/denoising/README.md +++ b/tools/dataset_converters/denoising/README.md @@ -16,8 +16,8 @@ The test datasets (Set12, BSD68, CBSD68, Kodak, McMaster, Urban100) can be downl The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/denoising/README_zh-CN.md b/tools/dataset_converters/denoising/README_zh-CN.md index 62164d864a..b21c1ff752 100644 --- a/tools/dataset_converters/denoising/README_zh-CN.md +++ b/tools/dataset_converters/denoising/README_zh-CN.md @@ -16,8 +16,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/deraining/README.md b/tools/dataset_converters/deraining/README.md index 9bb004b7bb..9269dc71a8 100644 --- a/tools/dataset_converters/deraining/README.md +++ b/tools/dataset_converters/deraining/README.md @@ -16,8 +16,8 @@ The test datasets (Rain100H, Rain100L, Test100, Test1200, Test2800) can be downl The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/deraining/README_zh-CN.md b/tools/dataset_converters/deraining/README_zh-CN.md index c5e9bf5f40..3e8a406fda 100644 --- a/tools/dataset_converters/deraining/README_zh-CN.md +++ b/tools/dataset_converters/deraining/README_zh-CN.md @@ -16,8 +16,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/df2k_ost/README.md b/tools/dataset_converters/df2k_ost/README.md index a18b74a56b..d40a2df4a9 100644 --- a/tools/dataset_converters/df2k_ost/README.md +++ b/tools/dataset_converters/df2k_ost/README.md @@ -19,8 +19,8 @@ Please first put all the images into the `GT` folder (naming does not need to be in order): ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -43,8 +43,8 @@ python tools/dataset_converters/df2k_ost/preprocess_df2k_ost_dataset.py --data-r The generated data is stored under `df2k_ost` and the data structure is as follows, where `_sub` indicates the sub-images. ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/df2k_ost/README_zh-CN.md b/tools/dataset_converters/df2k_ost/README_zh-CN.md index 875dcd4b41..9f83a67d81 100644 --- a/tools/dataset_converters/df2k_ost/README_zh-CN.md +++ b/tools/dataset_converters/df2k_ost/README_zh-CN.md @@ -19,8 +19,8 @@ 请先将所有图片放入 `GT` 文件夹(命名不需要按顺序): ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -43,8 +43,8 @@ python tools/dataset_converters/df2k_ost/preprocess_df2k_ost_dataset.py --data-r 生成的数据存放在 `df2k_ost` 下,数据结构如下,其中 `_sub` 表示子图像。 ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/div2k/README.md b/tools/dataset_converters/div2k/README.md index dd51dcf5c7..b7077fbd39 100644 --- a/tools/dataset_converters/div2k/README.md +++ b/tools/dataset_converters/div2k/README.md @@ -18,8 +18,8 @@ Note that we merge the original val dataset (image names from 0801 to 0900) to the original train dataset (image names from 0001 to 0800). The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -64,8 +64,8 @@ python tools/dataset_converters/div2k/preprocess_div2k_dataset.py --data-root ./ The generated data is stored under `DIV2K` and the data structure is as follows, where `_sub` indicates the sub-images. ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/div2k/README_zh-CN.md b/tools/dataset_converters/div2k/README_zh-CN.md index 2f683e2979..069b272fde 100644 --- a/tools/dataset_converters/div2k/README_zh-CN.md +++ b/tools/dataset_converters/div2k/README_zh-CN.md @@ -18,8 +18,8 @@ 请注意,我们将原始的验证集(文件名 0801 到 0900)合并进了原始的训练集(文件名 0001 到 0800)。文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -64,8 +64,8 @@ python tools/dataset_converters/div2k/preprocess_div2k_dataset.py --data-root ./ 生成的数据保存在 `DIV2K` 目录下,其文件结构如下所示,其中 `_sub` 表示子图: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/dpdd/README.md b/tools/dataset_converters/dpdd/README.md index 9eee774cb5..49e83bfcc7 100644 --- a/tools/dataset_converters/dpdd/README.md +++ b/tools/dataset_converters/dpdd/README.md @@ -16,8 +16,8 @@ The test datasets can be download from [here](https://drive.google.com/file/d/1d The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/dpdd/README_zh-CN.md b/tools/dataset_converters/dpdd/README_zh-CN.md index 38907c94c7..8f375eb30e 100644 --- a/tools/dataset_converters/dpdd/README_zh-CN.md +++ b/tools/dataset_converters/dpdd/README_zh-CN.md @@ -16,8 +16,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/glean/README.md b/tools/dataset_converters/glean/README.md index a0cbade8b4..028e2a7dca 100644 --- a/tools/dataset_converters/glean/README.md +++ b/tools/dataset_converters/glean/README.md @@ -28,8 +28,8 @@ python tools/dataset_converters/glean/preprocess_cat_train_dataset.py --lmdb-pat The generated data is stored under `cat_train` and the folder structure is as follows. ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -58,8 +58,8 @@ python tools/dataset_converters/glean/preprocess_cat_test_dataset.py --data-path The generated data is stored under `cat_test` and the folder structure is as follows. ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -99,8 +99,8 @@ python tools/dataset_converters/glean/preprocess_ffhq_celebahq_dataset.py --data The generated data is stored under `ffhq` and the folder structure is as follows. ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -140,8 +140,8 @@ python tools/dataset_converters/glean/preprocess_ffhq_celebahq_dataset.py --data The generated data is stored under `CelebA-HQ` and the folder structure is as follows. ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configsdata ├── data @@ -160,8 +160,8 @@ We merge FFHQ(`ffhq/images`) and CelebA-HQ(`CelebA-HQ/GT`) to generate FFHQ_Cele The folder structure should looks like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/glean/README_zh-CN.md b/tools/dataset_converters/glean/README_zh-CN.md index 4a88e7fdbc..eedb76e026 100644 --- a/tools/dataset_converters/glean/README_zh-CN.md +++ b/tools/dataset_converters/glean/README_zh-CN.md @@ -28,8 +28,8 @@ python tools/dataset_converters/glean/preprocess_cat_train_dataset.py --lmdb-pat 生成的数据存储在 `cat_train` 目录下,目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -58,8 +58,8 @@ python tools/dataset_converters/glean/preprocess_cat_test_dataset.py --data-path 生成的数据存储在 `cat_test` 目录下,目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -99,8 +99,8 @@ python tools/dataset_converters/glean/preprocess_ffhq_celebahq_dataset.py --data 生成的数据存储在 `ffhq` 目录下,目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -140,8 +140,8 @@ python tools/dataset_converters/glean/preprocess_ffhq_celebahq_dataset.py --data 生成的数据存储在 `CelebA-HQ` 目录下,目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configsdata ├── data @@ -160,8 +160,8 @@ mmediting 文件目录重构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/glean/preprocess_cat_test_dataset.py b/tools/dataset_converters/glean/preprocess_cat_test_dataset.py index 06d1a16944..9253fb7cb4 100644 --- a/tools/dataset_converters/glean/preprocess_cat_test_dataset.py +++ b/tools/dataset_converters/glean/preprocess_cat_test_dataset.py @@ -9,7 +9,7 @@ from skimage import img_as_float from skimage.io import imread, imsave -from mmedit.datasets.transforms import MATLABLikeResize +from mmagic.datasets.transforms import MATLABLikeResize def imresize(img_path, output_path, scale=None, output_shape=None): diff --git a/tools/dataset_converters/glean/preprocess_cat_train_dataset.py b/tools/dataset_converters/glean/preprocess_cat_train_dataset.py index 58781f931f..8cae59aa38 100644 --- a/tools/dataset_converters/glean/preprocess_cat_train_dataset.py +++ b/tools/dataset_converters/glean/preprocess_cat_train_dataset.py @@ -11,7 +11,7 @@ from skimage import img_as_float from skimage.io import imread, imsave -from mmedit.datasets.transforms import MATLABLikeResize +from mmagic.datasets.transforms import MATLABLikeResize def export_images(lmdb_path, meta_file_path, out_dir): diff --git a/tools/dataset_converters/glean/preprocess_ffhq_celebahq_dataset.py b/tools/dataset_converters/glean/preprocess_ffhq_celebahq_dataset.py index 18bf8f7fca..0ed7b63fde 100644 --- a/tools/dataset_converters/glean/preprocess_ffhq_celebahq_dataset.py +++ b/tools/dataset_converters/glean/preprocess_ffhq_celebahq_dataset.py @@ -9,7 +9,7 @@ from skimage import img_as_float from skimage.io import imread, imsave -from mmedit.datasets.transforms import MATLABLikeResize +from mmagic.datasets.transforms import MATLABLikeResize def imresize(img_path, output_path, scale=None, output_shape=None): diff --git a/tools/dataset_converters/gopro/README.md b/tools/dataset_converters/gopro/README.md index 6d2015b5ca..941a285314 100644 --- a/tools/dataset_converters/gopro/README.md +++ b/tools/dataset_converters/gopro/README.md @@ -16,8 +16,8 @@ The train datasets can be download from [here](https://drive.google.com/file/d/1 The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/gopro/README_zh-CN.md b/tools/dataset_converters/gopro/README_zh-CN.md index 32652e6064..9b6dd086ca 100644 --- a/tools/dataset_converters/gopro/README_zh-CN.md +++ b/tools/dataset_converters/gopro/README_zh-CN.md @@ -16,8 +16,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/hide/README.md b/tools/dataset_converters/hide/README.md index b925ea7f45..8745b75373 100644 --- a/tools/dataset_converters/hide/README.md +++ b/tools/dataset_converters/hide/README.md @@ -16,8 +16,8 @@ The test datasets can be download from [here](https://drive.google.com/file/d/1X The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/hide/README_zh-CN.md b/tools/dataset_converters/hide/README_zh-CN.md index 81f3ea4868..88e0758116 100644 --- a/tools/dataset_converters/hide/README_zh-CN.md +++ b/tools/dataset_converters/hide/README_zh-CN.md @@ -16,8 +16,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/live1/README.md b/tools/dataset_converters/live1/README.md index 8db4cee15a..f6cd693877 100644 --- a/tools/dataset_converters/live1/README.md +++ b/tools/dataset_converters/live1/README.md @@ -19,8 +19,8 @@ The test datasets can be download from [here](https://github.com/cszn/DnCNN/tree The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/live1/README_zh-CN.md b/tools/dataset_converters/live1/README_zh-CN.md index f3bb5483aa..f4405d22a3 100644 --- a/tools/dataset_converters/live1/README_zh-CN.md +++ b/tools/dataset_converters/live1/README_zh-CN.md @@ -19,8 +19,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/ntire21_decompression/README.md b/tools/dataset_converters/ntire21_decompression/README.md index e5814eecf0..78aa477feb 100644 --- a/tools/dataset_converters/ntire21_decompression/README.md +++ b/tools/dataset_converters/ntire21_decompression/README.md @@ -19,8 +19,8 @@ Please follows the tutorials of the [Homepage](https://github.com/RenYang-home/N The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/ntire21_decompression/README_zh-CN.md b/tools/dataset_converters/ntire21_decompression/README_zh-CN.md index b02bc45b15..82fce149bb 100644 --- a/tools/dataset_converters/ntire21_decompression/README_zh-CN.md +++ b/tools/dataset_converters/ntire21_decompression/README_zh-CN.md @@ -18,8 +18,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/paired-pix2pix/README.md b/tools/dataset_converters/paired-pix2pix/README.md index 534c1c3ac7..7f6c7f5a75 100644 --- a/tools/dataset_converters/paired-pix2pix/README.md +++ b/tools/dataset_converters/paired-pix2pix/README.md @@ -16,8 +16,8 @@ You can download paired datasets from [here](http://efrosgans.eecs.berkeley.edu/ Then, you need to unzip and move corresponding datasets to follow the folder structure shown above. The datasets have been well-prepared by the original authors. ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/paired-pix2pix/README_zh-CN.md b/tools/dataset_converters/paired-pix2pix/README_zh-CN.md index b077adb664..319cadc9ee 100644 --- a/tools/dataset_converters/paired-pix2pix/README_zh-CN.md +++ b/tools/dataset_converters/paired-pix2pix/README_zh-CN.md @@ -15,8 +15,8 @@ 您可以从[此处](http://efrosgans.eecs.berkeley.edu/pix2pix/datasets/)下载配对数据集。然后,您需要解压缩并移动相应的数据集以遵循如下所示的文件夹结构。数据集已经由原作者准备好了。 ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/paris-street-view/README.md b/tools/dataset_converters/paris-street-view/README.md index a3320eaf66..b43ab8d3cd 100644 --- a/tools/dataset_converters/paris-street-view/README.md +++ b/tools/dataset_converters/paris-street-view/README.md @@ -15,8 +15,8 @@ Obtain the dataset [here](https://github.com/pathak22/context-encoder/issues/24). ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/paris-street-view/README_zh-CN.md b/tools/dataset_converters/paris-street-view/README_zh-CN.md index bfd2849cd9..8980112704 100644 --- a/tools/dataset_converters/paris-street-view/README_zh-CN.md +++ b/tools/dataset_converters/paris-street-view/README_zh-CN.md @@ -15,8 +15,8 @@ 请从[此处](https://github.com/pathak22/context-encoder/issues/24)获取数据集。 ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/places365/README.md b/tools/dataset_converters/places365/README.md index 0af59e3a1e..350ba61616 100644 --- a/tools/dataset_converters/places365/README.md +++ b/tools/dataset_converters/places365/README.md @@ -16,8 +16,8 @@ Prepare the data from [Places365](http://places2.csail.mit.edu/download.html). ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/places365/README_zh-CN.md b/tools/dataset_converters/places365/README_zh-CN.md index 0e2b4655ee..4522885cea 100644 --- a/tools/dataset_converters/places365/README_zh-CN.md +++ b/tools/dataset_converters/places365/README_zh-CN.md @@ -16,8 +16,8 @@ 请从 [Places365](http://places2.csail.mit.edu/download.html) 下载并准备数据。 ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/realblur/README.md b/tools/dataset_converters/realblur/README.md index cc14d25efd..261c43b082 100644 --- a/tools/dataset_converters/realblur/README.md +++ b/tools/dataset_converters/realblur/README.md @@ -17,8 +17,8 @@ The test datasets RealBlurJ can be download from [here](https://drive.google.com The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/realblur/README_zh-CN.md b/tools/dataset_converters/realblur/README_zh-CN.md index b6009879a9..fdd149c7a9 100644 --- a/tools/dataset_converters/realblur/README_zh-CN.md +++ b/tools/dataset_converters/realblur/README_zh-CN.md @@ -17,8 +17,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/realsrset/README.md b/tools/dataset_converters/realsrset/README.md index 39ed3167fc..3e0cb69bbd 100644 --- a/tools/dataset_converters/realsrset/README.md +++ b/tools/dataset_converters/realsrset/README.md @@ -19,8 +19,8 @@ The datasets RealSRSet+5images can be download from [here](https://github.com/Ji The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/realsrset/README_zh-CN.md b/tools/dataset_converters/realsrset/README_zh-CN.md index 690dd45056..b8b331bfbb 100644 --- a/tools/dataset_converters/realsrset/README_zh-CN.md +++ b/tools/dataset_converters/realsrset/README_zh-CN.md @@ -19,8 +19,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/reds/README.md b/tools/dataset_converters/reds/README.md index 143aa30306..4546c7ea97 100644 --- a/tools/dataset_converters/reds/README.md +++ b/tools/dataset_converters/reds/README.md @@ -25,8 +25,8 @@ python tools/dataset_converters/reds/preprocess_reds_dataset.py --root-path ./da ``` ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -60,7 +60,7 @@ python tools/dataset_converters/reds/preprocess_reds_dataset.py --root-path ./da ## Crop to sub-images -MMEditing also supports cropping REDS images to sub-images for faster IO. We provide such a script: +MMagic also supports cropping REDS images to sub-images for faster IO. We provide such a script: ```shell python tools/dataset_converters/reds/crop_sub_images.py --data-root ./data/REDS -scales 4 @@ -69,8 +69,8 @@ python tools/dataset_converters/reds/crop_sub_images.py --data-root ./data/REDS The generated data is stored under `REDS` and the data structure is as follows, where `_sub` indicates the sub-images. ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/reds/README_zh-CN.md b/tools/dataset_converters/reds/README_zh-CN.md index a160ee72c0..f7833632ec 100644 --- a/tools/dataset_converters/reds/README_zh-CN.md +++ b/tools/dataset_converters/reds/README_zh-CN.md @@ -26,8 +26,8 @@ python tools/dataset_converters/reds/preprocess_reds_dataset.py ./data/REDS ``` ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data @@ -61,7 +61,7 @@ python tools/dataset_converters/reds/preprocess_reds_dataset.py --root-path ./da ## 裁剪为子图 -MMEditing 支持将 REDS 图像裁剪为子图像以加快 IO。我们提供了这样一个脚本: +MMagic 支持将 REDS 图像裁剪为子图像以加快 IO。我们提供了这样一个脚本: ```shell python tools/dataset_converters/reds/crop_sub_images.py --data-root ./data/REDS -scales 4 @@ -70,8 +70,8 @@ python tools/dataset_converters/reds/crop_sub_images.py --data-root ./data/REDS 生成的数据存储在 `REDS` 下,数据结构如下,其中`_sub`表示子图像。 ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/sidd/README.md b/tools/dataset_converters/sidd/README.md index bf52558500..76768b8c0c 100644 --- a/tools/dataset_converters/sidd/README.md +++ b/tools/dataset_converters/sidd/README.md @@ -22,8 +22,8 @@ python tools/dataset_converters/sidd/preprocess_sidd_test_dataset.py --data-root The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/sidd/README_zh-CN.md b/tools/dataset_converters/sidd/README_zh-CN.md index 7a4de40bda..a24e08cfe9 100644 --- a/tools/dataset_converters/sidd/README_zh-CN.md +++ b/tools/dataset_converters/sidd/README_zh-CN.md @@ -22,8 +22,8 @@ python tools/dataset_converters/sidd/preprocess_sidd_test_dataset.py --data-root 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/spmcs/README.md b/tools/dataset_converters/spmcs/README.md index 256c293af4..95a8ea48b3 100644 --- a/tools/dataset_converters/spmcs/README.md +++ b/tools/dataset_converters/spmcs/README.md @@ -17,8 +17,8 @@ The datasets can be download from [here](https://opendatalab.org.cn/SPMCS). The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/spmcs/README_zh-CN.md b/tools/dataset_converters/spmcs/README_zh-CN.md index 685fc34459..c9dfaa3e98 100644 --- a/tools/dataset_converters/spmcs/README_zh-CN.md +++ b/tools/dataset_converters/spmcs/README_zh-CN.md @@ -17,8 +17,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/udm10/README.md b/tools/dataset_converters/udm10/README.md index 07c8e07beb..182194fde8 100644 --- a/tools/dataset_converters/udm10/README.md +++ b/tools/dataset_converters/udm10/README.md @@ -17,8 +17,8 @@ The datasets can be downloaded from [here](https://drive.google.com/file/d/1G4V4 The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/udm10/README_zh-CN.md b/tools/dataset_converters/udm10/README_zh-CN.md index e1f289428e..7142c5bda0 100644 --- a/tools/dataset_converters/udm10/README_zh-CN.md +++ b/tools/dataset_converters/udm10/README_zh-CN.md @@ -17,8 +17,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/unconditional_gans/README.md b/tools/dataset_converters/unconditional_gans/README.md index f5024af12b..86ea7c8079 100644 --- a/tools/dataset_converters/unconditional_gans/README.md +++ b/tools/dataset_converters/unconditional_gans/README.md @@ -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 `EditDataSample`. 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 `mmagic/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: @@ -66,7 +66,7 @@ train_dataloader = dict( ``` 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. +For the resizing methods in the data pre-processing, we adopt bilinear interpolation methods in all of the experiments studied in MMagic. 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. diff --git a/tools/dataset_converters/unpaired-cyclegan/README.md b/tools/dataset_converters/unpaired-cyclegan/README.md index 9f91be2e65..fc2d93479a 100644 --- a/tools/dataset_converters/unpaired-cyclegan/README.md +++ b/tools/dataset_converters/unpaired-cyclegan/README.md @@ -16,8 +16,8 @@ You can download unpaired datasets from [here](https://people.eecs.berkeley.edu/ Then, you need to unzip and move corresponding datasets to follow the folder structure shown above. The datasets have been well-prepared by the original authors. ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/unpaired-cyclegan/README_zh-CN.md b/tools/dataset_converters/unpaired-cyclegan/README_zh-CN.md index dab57234f4..d8ca0dbff0 100644 --- a/tools/dataset_converters/unpaired-cyclegan/README_zh-CN.md +++ b/tools/dataset_converters/unpaired-cyclegan/README_zh-CN.md @@ -15,8 +15,8 @@ 您可以从[此处](https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/)下载未配对的数据集。然后,您需要解压缩并移动相应的数据集以遵循如上所示的文件夹结构。数据集已经由原作者准备好了。 ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/vid4/README.md b/tools/dataset_converters/vid4/README.md index 3d9511ab7c..8347ad498a 100644 --- a/tools/dataset_converters/vid4/README.md +++ b/tools/dataset_converters/vid4/README.md @@ -38,8 +38,8 @@ python tools/dataset_converters/vid4/preprocess_vid4_dataset.py --data-root ./da The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/vid4/README_zh-CN.md b/tools/dataset_converters/vid4/README_zh-CN.md index 21e00fc92f..4c29718c20 100644 --- a/tools/dataset_converters/vid4/README_zh-CN.md +++ b/tools/dataset_converters/vid4/README_zh-CN.md @@ -38,8 +38,8 @@ python tools/dataset_converters/vid4/preprocess_vid4_dataset.py --data-root ./da 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/vid4/preprocess_vid4_dataset.py b/tools/dataset_converters/vid4/preprocess_vid4_dataset.py index 26d34b28d3..b50b44e35f 100644 --- a/tools/dataset_converters/vid4/preprocess_vid4_dataset.py +++ b/tools/dataset_converters/vid4/preprocess_vid4_dataset.py @@ -9,7 +9,7 @@ from skimage import img_as_float from skimage.io import imread, imsave -from mmedit.datasets.transforms import MATLABLikeResize +from mmagic.datasets.transforms import MATLABLikeResize def imresize(img_path, output_path, scale=None, output_shape=None): diff --git a/tools/dataset_converters/videolq/README.md b/tools/dataset_converters/videolq/README.md index 68ccb8776c..99908aaeb2 100644 --- a/tools/dataset_converters/videolq/README.md +++ b/tools/dataset_converters/videolq/README.md @@ -16,8 +16,8 @@ You can download the dataset using [Dropbox](https://www.dropbox.com/sh/hc06f1li The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/videolq/README_zh-CN.md b/tools/dataset_converters/videolq/README_zh-CN.md index cff8da1459..cf0f107bc6 100644 --- a/tools/dataset_converters/videolq/README_zh-CN.md +++ b/tools/dataset_converters/videolq/README_zh-CN.md @@ -16,8 +16,8 @@ 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/vimeo90k-triplet/README.md b/tools/dataset_converters/vimeo90k-triplet/README.md index e4072c96f8..e6f458a58e 100644 --- a/tools/dataset_converters/vimeo90k-triplet/README.md +++ b/tools/dataset_converters/vimeo90k-triplet/README.md @@ -20,8 +20,8 @@ The training and test datasets can be download from [here](http://toflow.csail.m The Vimeo90K-triplet dataset has a `clip/sequence/img` folder structure: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/vimeo90k-triplet/README_zh-CN.md b/tools/dataset_converters/vimeo90k-triplet/README_zh-CN.md index 1800ba179a..e19a7d6e88 100644 --- a/tools/dataset_converters/vimeo90k-triplet/README_zh-CN.md +++ b/tools/dataset_converters/vimeo90k-triplet/README_zh-CN.md @@ -20,8 +20,8 @@ Vimeo90K-triplet 数据集包含了如下所示的 `clip/sequence/img` 目录结构: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/vimeo90k/README.md b/tools/dataset_converters/vimeo90k/README.md index 9f455014b4..4047e6bced 100644 --- a/tools/dataset_converters/vimeo90k/README.md +++ b/tools/dataset_converters/vimeo90k/README.md @@ -45,8 +45,8 @@ python tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py --data-r The folder structure should look like: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/vimeo90k/README_zh-CN.md b/tools/dataset_converters/vimeo90k/README_zh-CN.md index 600973f52c..2967f27514 100644 --- a/tools/dataset_converters/vimeo90k/README_zh-CN.md +++ b/tools/dataset_converters/vimeo90k/README_zh-CN.md @@ -45,8 +45,8 @@ python tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py --data-r 文件目录结构应如下所示: ```text -mmediting -├── mmedit +mmagic +├── mmagic ├── tools ├── configs ├── data diff --git a/tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py b/tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py index 6e2577ce24..d0f4563675 100644 --- a/tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py +++ b/tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py @@ -14,8 +14,8 @@ from skimage import img_as_float from skimage.io import imread, imsave -from mmedit.datasets.transforms import MATLABLikeResize, blur_kernels -from mmedit.utils import modify_args +from mmagic.datasets.transforms import MATLABLikeResize, blur_kernels +from mmagic.utils import modify_args def make_lmdb(mode, diff --git a/tools/gui/README.md b/tools/gui/README.md index 483ad8e1da..b0ef0158f7 100644 --- a/tools/gui/README.md +++ b/tools/gui/README.md @@ -1,4 +1,4 @@ -# MMEditing Viewer +# MMagic Viewer - [Introduction](#introduction) - [Major features](#major-features) @@ -9,7 +9,7 @@ ## Introduction -**MMEditing Viewer** is a qualitative comparison tools to facilitate your research. +**MMagic Viewer** is a qualitative comparison tools to facilitate your research. ## Major features @@ -24,7 +24,7 @@ ## Prerequisites -MMEditing Viewer works on Linux, Windows and macOS. It requires: +MMagic Viewer works on Linux, Windows and macOS. It requires: - Python >= 3.6 - PyQt5 @@ -55,10 +55,10 @@ pip install opencv-python-headless ``` **Step 2.** -Install MMEditing. +Install MMagic. ```shell -git clone https://github.com/open-mmlab/mmediting.git +git clone https://github.com/open-mmlab/mmagic.git ``` **Step 3.** @@ -96,4 +96,4 @@ https://user-images.githubusercontent.com/49083766/199232634-eca70d28-8437-400a- ## Contributing -We appreciate all contributions to improve MMEditing Viewer. You can create your issue to report bugs or request new features. Welcome to give us suggestions or contribute your codes. +We appreciate all contributions to improve MMagic Viewer. You can create your issue to report bugs or request new features. Welcome to give us suggestions or contribute your codes. diff --git a/tools/gui/gui.py b/tools/gui/gui.py index e95e8cd827..4d8a5f9177 100644 --- a/tools/gui/gui.py +++ b/tools/gui/gui.py @@ -38,7 +38,7 @@ class MainWindow(QtWidgets.QMainWindow): def __init__(self): super(MainWindow, self).__init__() - self.setWindowTitle('MMEditing Viewer') + self.setWindowTitle('MMagic Viewer') # # MenuBar # menubar_Aaa = self.menuBar().addMenu('Aaa') # menubar_Bbb = self.menuBar().addMenu('Bbb') diff --git a/tools/model_converters/pytorch2onnx.py b/tools/model_converters/pytorch2onnx.py index f67ac5ebc9..bf3727fd71 100644 --- a/tools/model_converters/pytorch2onnx.py +++ b/tools/model_converters/pytorch2onnx.py @@ -14,8 +14,8 @@ from mmengine.registry import init_default_scope from mmengine.runner import load_checkpoint -from mmedit.apis import delete_cfg -from mmedit.registry import MODELS +from mmagic.apis import delete_cfg +from mmagic.registry import MODELS def pytorch2onnx(model, @@ -139,7 +139,7 @@ def pytorch2onnx(model, def parse_args(): - parser = argparse.ArgumentParser(description='Convert MMediting to ONNX') + parser = argparse.ArgumentParser(description='Convert MMagic to ONNX') parser.add_argument('config', help='test config file path') parser.add_argument('checkpoint', help='checkpoint file') parser.add_argument( @@ -180,7 +180,7 @@ def parse_args(): if model_type == 'mattor' and args.trimap_path is None: raise ValueError('Please set `--trimap-path` to convert mattor model.') - assert args.opset_version == 11, 'MMEditing only support opset 11 now' + assert args.opset_version == 11, 'MMagic only support opset 11 now' if args.device < 0 or not torch.cuda.is_available(): device = torch.device('cpu') @@ -190,7 +190,7 @@ def parse_args(): config = Config.fromfile(args.config) delete_cfg(config, key='init_cfg') - init_default_scope(config.get('default_scope', 'mmedit')) + init_default_scope(config.get('default_scope', 'mmagic')) # ONNX does not support spectral norm if model_type == 'mattor': diff --git a/tools/test.py b/tools/test.py index 1a167cafd7..c94a29d119 100644 --- a/tools/test.py +++ b/tools/test.py @@ -8,7 +8,7 @@ from mmengine.hooks import Hook from mmengine.runner import Runner -from mmedit.utils import print_colored_log +from mmagic.utils import print_colored_log # TODO: support fuse_conv_bn, visualization, and format_only diff --git a/tools/train.py b/tools/train.py index ed8dd4401e..ccf1f8c28d 100644 --- a/tools/train.py +++ b/tools/train.py @@ -7,7 +7,7 @@ from mmengine.config import Config, DictAction from mmengine.runner import Runner -from mmedit.utils import print_colored_log +from mmagic.utils import print_colored_log def parse_args(): From 6966c474f0550281ab24356d71b5d5d2dbd268a8 Mon Sep 17 00:00:00 2001 From: zhangjingdong <1396925302@qq.com> Date: Wed, 19 Apr 2023 16:31:01 +0800 Subject: [PATCH 17/42] rename to mmagic in configs --- configs/_base_/default_runtime.py | 2 +- configs/_base_/gen_default_runtime.py | 2 +- configs/_base_/inpaint_default_runtime.py | 2 +- configs/_base_/matting_default_runtime.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/configs/_base_/default_runtime.py b/configs/_base_/default_runtime.py index 195e1e6d2e..6fcb39779e 100644 --- a/configs/_base_/default_runtime.py +++ b/configs/_base_/default_runtime.py @@ -1,4 +1,4 @@ -default_scope = 'mmedit' +default_scope = 'mmagic' save_dir = './work_dirs' default_hooks = dict( diff --git a/configs/_base_/gen_default_runtime.py b/configs/_base_/gen_default_runtime.py index 7587164f5f..c4cd3ded17 100644 --- a/configs/_base_/gen_default_runtime.py +++ b/configs/_base_/gen_default_runtime.py @@ -1,4 +1,4 @@ -default_scope = 'mmedit' +default_scope = 'mmagic' randomness = dict(seed=2022, diff_rank_seed=True) # env settings diff --git a/configs/_base_/inpaint_default_runtime.py b/configs/_base_/inpaint_default_runtime.py index eae29e3b39..f3b876276a 100644 --- a/configs/_base_/inpaint_default_runtime.py +++ b/configs/_base_/inpaint_default_runtime.py @@ -1,4 +1,4 @@ -default_scope = 'mmedit' +default_scope = 'mmagic' save_dir = './work_dirs' default_hooks = dict( diff --git a/configs/_base_/matting_default_runtime.py b/configs/_base_/matting_default_runtime.py index e544dd8677..14c2146492 100644 --- a/configs/_base_/matting_default_runtime.py +++ b/configs/_base_/matting_default_runtime.py @@ -1,4 +1,4 @@ -default_scope = 'mmedit' +default_scope = 'mmagic' save_dir = './work_dirs' default_hooks = dict( From c47dd2b1152eba41df87e7383afc5527dc41becc Mon Sep 17 00:00:00 2001 From: zhangjingdong <1396925302@qq.com> Date: Wed, 19 Apr 2023 16:41:56 +0800 Subject: [PATCH 18/42] rename to mmagic in projects --- projects/README.md | 26 +++++++-------- projects/example_project/README.md | 32 +++++++++---------- .../configs/examplenet_8xb32_in1k.py | 2 +- .../example_project/models/example_net.py | 6 ++-- projects/glide/configs/README.md | 12 +++---- projects/glide/models/glide.py | 6 ++-- projects/glide/models/text2im_unet.py | 4 +-- 7 files changed, 44 insertions(+), 44 deletions(-) diff --git a/projects/README.md b/projects/README.md index f0da689ed8..9b67e35bd1 100644 --- a/projects/README.md +++ b/projects/README.md @@ -1,38 +1,38 @@ -# Welcome to Projects of MMEditing +# Welcome to Projects of MMagic -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. +Welcome to the MMagic community! +The MMagic 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 MMagic for image, video, 3D content generation, editing and processing. -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 are a few projects that are built upon MMagic. They are examples of how to use MMagic as a library, to make your projects more maintainable. +Please find more projects in [MMagic Ecosystem](https://openmmlab.com/ecosystem). ## Show your projects on OpenMMLab Ecosystem 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 +## Add example projects to MMagic -Here is an [example project](./example_project) about how to add your projects to MMEditing. +Here is an [example project](./example_project) about how to add your projects to MMagic. 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/latest/community/contributing.html) +- [Contribution Guide](https://mmagic.readthedocs.io/en/latest/community/contributing.html) - The guides for new contributors about how to add your projects to MMEditing. + The guides for new contributors about how to add your projects to MMagic. -- [New Model Guide](https://mmediting.readthedocs.io/en/latest/howto/models.html) +- [New Model Guide](https://mmagic.readthedocs.io/en/latest/howto/models.html) The documentation of adding new models. -- [Discussions](https://github.com/open-mmlab/mmediting/discussions) +- [Discussions](https://github.com/open-mmlab/mmagic/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. +- [PowerVQE](https://github.com/ryanxingql/powervqe): Open framework for quality enhancement of compressed videos based on PyTorch and MMagic. - [VR-Baseline](https://github.com/linjing7/VR-Baseline): Video Restoration Toolbox. diff --git a/projects/example_project/README.md b/projects/example_project/README.md index 06cd1e561d..3c2614e682 100644 --- a/projects/example_project/README.md +++ b/projects/example_project/README.md @@ -18,8 +18,8 @@ This is an implementation of \[XXX\]. ### Setup Environment \[required\] -Please refer to [Get Started](https://mmediting.readthedocs.io/en/latest/get_started/I.html) to install -MMEditing. +Please refer to [Get Started](https://mmagic.readthedocs.io/en/latest/get_started/I.html) to install +MMagic. At first, add the current folder to `PYTHONPATH`, so that Python can find your code. Run command in the current directory to add it. @@ -31,26 +31,26 @@ export PYTHONPATH=`pwd`:$PYTHONPATH ### Data Preparation \[optional\] -Prepare the ImageNet-2012 dataset according to the [instruction](https://mmediting.readthedocs.io/en/latest/user_guides/dataset_prepare.html#imagenet). +Prepare the ImageNet-2012 dataset according to the [instruction](https://mmagic.readthedocs.io/en/latest/user_guides/dataset_prepare.html#imagenet). ### Training commands \[optional\] **To train with single GPU:** ```bash -mim train mmedit configs/examplenet_8xb32_in1k.py +mim train mmagic configs/examplenet_8xb32_in1k.py ``` **To train with multiple GPUs:** ```bash -mim train mmedit configs/examplenet_8xb32_in1k.py --launcher pytorch --gpus 8 +mim train mmagic 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 \ +mim train mmagic configs/examplenet_8xb32_in1k.py --launcher slurm \ --gpus 16 --gpus-per-node 8 --partition $PARTITION ``` @@ -59,19 +59,19 @@ mim train mmedit configs/examplenet_8xb32_in1k.py --launcher slurm \ **To test with single GPU:** ```bash -mim test mmedit configs/examplenet_8xb32_in1k.py $CHECKPOINT +mim test mmagic 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 +mim test mmagic 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 \ +mim test mmagic configs/examplenet_8xb32_in1k.py $CHECKPOINT --launcher slurm \ --gpus 16 --gpus-per-node 8 --partition $PARTITION ``` @@ -93,9 +93,9 @@ You can also paste some visual results here if the model doesn't have quantitati ```bibtex @misc{mmediting2022, - title = {{MMEditing}: {OpenMMLab} Image and Video Editing Toolbox}, - author = {{MMEditing Contributors}}, - howpublished = {\url{https://github.com/open-mmlab/mmediting}}, + title = {{MMagic}: {OpenMMLab} Image and Video Editing Toolbox}, + author = {{MMagic Contributors}}, + howpublished = {\url{https://github.com/open-mmlab/mmagic}}, year = {2022} } ``` @@ -103,13 +103,13 @@ You can also paste some visual results here if the model doesn't have quantitati ## 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. +to MMagic projects. - [ ] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. - [ ] Finish the code - + - [ ] Basic docstrings & proper citation @@ -129,7 +129,7 @@ to MMediting projects. - [ ] Unit tests - + - [ ] Code style @@ -137,4 +137,4 @@ to MMediting projects. - [ ] `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 index 2a047ad943..c26f1dc7e4 100644 --- a/projects/example_project/configs/examplenet_8xb32_in1k.py +++ b/projects/example_project/configs/examplenet_8xb32_in1k.py @@ -1,5 +1,5 @@ # Directly inherit the entire recipe you want to use. -_base_ = 'mmediting::srcnn/srcnn_x4k915_1xb16-1000k_div2k.py' +_base_ = 'mmagic::srcnn/srcnn_x4k915_1xb16-1000k_div2k.py' # This line is to import your own modules. custom_imports = dict(imports='models') diff --git a/projects/example_project/models/example_net.py b/projects/example_project/models/example_net.py index 374b761800..a25961d0b8 100644 --- a/projects/example_project/models/example_net.py +++ b/projects/example_project/models/example_net.py @@ -1,5 +1,5 @@ -from mmedit.models import ResNet -from mmedit.registry import MODELS +from mmagic.models import ResNet +from mmagic.registry import MODELS # Register your model to the `MODELS`. @@ -12,7 +12,7 @@ class ExampleNet(ResNet): def __init__(self, **kwargs) -> None: print('#############################\n' - '# Hello MMEditing! #\n' + '# Hello MMagic! #\n' '#############################') super().__init__(**kwargs) diff --git a/projects/glide/configs/README.md b/projects/glide/configs/README.md index 321fec7b9f..91ba07ac40 100644 --- a/projects/glide/configs/README.md +++ b/projects/glide/configs/README.md @@ -34,9 +34,9 @@ Diffusion models have recently been shown to generate high-quality synthetic ima **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) | +| Method | Resolution | Config | Weights | +| ------ | ---------- | -------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| Glide | 64x64 | [config](projects/glide/configs/glide_ddim-classifier-free_laion-64x64.py) | [model](https://download.openmmlab.com/mmagic/glide/glide_laion-64x64-02afff47.pth) | ## Quick Start @@ -44,14 +44,14 @@ You can run glide as follows: ```python import torch -from mmedit.apis import init_model +from mmagic.apis import init_model from mmengine.registry import init_default_scope from projects.glide.models import * -init_default_scope('mmedit') +init_default_scope('mmagic') config = 'projects/glide/configs/glide_ddim-classifier-free_laion-64x64.py' -ckpt = 'https://download.openmmlab.com/mmediting/glide/glide_laion-64x64-02afff47.pth' +ckpt = 'https://download.openmmlab.com/mmagic/glide/glide_laion-64x64-02afff47.pth' model = init_model(config, ckpt).cuda().eval() prompt = "an oil painting of a corgi" diff --git a/projects/glide/models/glide.py b/projects/glide/models/glide.py index 609d7889ab..34a7694b07 100644 --- a/projects/glide/models/glide.py +++ b/projects/glide/models/glide.py @@ -12,9 +12,9 @@ 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 -from mmedit.utils.typing import ForwardInputs, SampleList +from mmagic.registry import DIFFUSION_SCHEDULERS, MODELS, MODULES +from mmagic.structures import EditDataSample +from mmagic.utils.typing import ForwardInputs, SampleList # from .guider import ImageTextGuider diff --git a/projects/glide/models/text2im_unet.py b/projects/glide/models/text2im_unet.py index c14d65d527..a312299d65 100644 --- a/projects/glide/models/text2im_unet.py +++ b/projects/glide/models/text2im_unet.py @@ -1,8 +1,8 @@ import torch import torch.nn as nn -from mmedit.models import DenoisingUnet -from mmedit.registry import MODELS +from mmagic.models import DenoisingUnet +from mmagic.registry import MODELS from .glide_modules import Transformer from .glide_tokenizer import get_encoder From 78f8c9c5ea40f8073f3b1fa50be67fc8ef48c3a8 Mon Sep 17 00:00:00 2001 From: zhangjingdong <1396925302@qq.com> Date: Wed, 19 Apr 2023 16:47:01 +0800 Subject: [PATCH 19/42] rename to mmagic in tests --- .../test_inferencers/test_base_mmedit_inferencer.py | 4 ++-- .../test_inferencers/test_colorization_inferencer.py | 4 ++-- .../test_inferencers/test_conditional_inferencer.py | 4 ++-- .../test_inferencers/test_eg3d_inferencer.py | 4 ++-- .../test_image_super_resolution_inferencer.py | 4 ++-- .../test_inferencers/test_inference_functions.py | 6 +++--- .../test_inferencers/test_inpainting_inferencer.py | 4 ++-- .../test_inferencers/test_matting_inferencer.py | 4 ++-- .../test_inferencers/test_mmedit_inferencer.py | 4 ++-- .../test_inferencers/test_text2image_inferencers.py | 8 ++++---- .../test_inferencers/test_translation_inferencer.py | 4 ++-- .../test_unconditional_inferencer.py | 4 ++-- .../test_video_interpolation_inferencer.py | 4 ++-- .../test_video_restoration_inferencer.py | 4 ++-- .../test_datasets/test_basic_conditional_dataset.py | 4 ++-- tests/test_datasets/test_basic_frames_dataset.py | 2 +- tests/test_datasets/test_basic_image_dataset.py | 4 ++-- tests/test_datasets/test_categories.py | 2 +- tests/test_datasets/test_cifar10_dataset.py | 6 +++--- tests/test_datasets/test_comp1k_dataset.py | 2 +- tests/test_datasets/test_controlnet_dataset.py | 2 +- tests/test_datasets/test_data_utils.py | 2 +- tests/test_datasets/test_dreambooth_dataset.py | 2 +- tests/test_datasets/test_grow_scale_image_dataset.py | 4 ++-- tests/test_datasets/test_imagenet_dataset.py | 2 +- tests/test_datasets/test_mscoco_dataset.py | 2 +- tests/test_datasets/test_paired_image_dataset.py | 4 ++-- tests/test_datasets/test_singan_dataset.py | 4 ++-- tests/test_datasets/test_transforms/test_alpha.py | 2 +- .../test_datasets/test_transforms/test_aug_frames.py | 2 +- .../test_datasets/test_transforms/test_aug_pixel.py | 2 +- .../test_datasets/test_transforms/test_aug_shape.py | 2 +- .../test_transforms/test_blur_kernels.py | 2 +- tests/test_datasets/test_transforms/test_crop.py | 2 +- tests/test_datasets/test_transforms/test_fgbg.py | 2 +- .../test_datasets/test_transforms/test_formatting.py | 4 ++-- .../test_transforms/test_generate_assistant.py | 2 +- .../test_transforms/test_generate_frame_indices.py | 2 +- .../test_transforms/test_get_masked_image.py | 2 +- tests/test_datasets/test_transforms/test_loading.py | 2 +- .../test_transforms/test_matlab_like_resize.py | 2 +- .../test_transforms/test_normalization.py | 2 +- .../test_transforms/test_random_degradations.py | 2 +- .../test_transforms/test_random_down_sampling.py | 2 +- tests/test_datasets/test_transforms/test_trimap.py | 2 +- tests/test_datasets/test_transforms/test_values.py | 2 +- tests/test_datasets/test_unpaired_image_dataset.py | 4 ++-- tests/test_edit.py | 4 ++-- tests/test_engine/test_hooks/test_ema.py | 2 +- tests/test_engine/test_hooks/test_iter_time_hook.py | 2 +- .../test_hooks/test_pggan_fetch_data_hook.py | 6 +++--- .../test_engine/test_hooks/test_pickle_data_hook.py | 2 +- .../test_hooks/test_reduce_lr_scheduler_hook.py | 2 +- .../test_hooks/test_visualization_hook.py | 12 ++++++------ .../test_multi_optimizer_constructor.py | 2 +- .../test_pggan_optimizer_constructor.py | 6 +++--- .../test_singan_optimizer_constructor.py | 6 +++--- tests/test_engine/test_runner/test_edit_loops.py | 4 ++-- tests/test_engine/test_runner/test_log_processor.py | 2 +- tests/test_engine/test_runner/test_loop_utils.py | 4 ++-- .../test_linear_lr_scheduler_with_interval.py | 2 +- .../test_schedulers/test_reduce_lr_scheduler.py | 2 +- tests/test_evaluation/test_evaluator.py | 12 ++++++------ .../test_functional/test_fid_inception.py | 2 +- .../test_functional/test_gaussian_funcs.py | 2 +- .../test_functional/test_inception_utils.py | 4 ++-- .../test_metrics/test_base_gen_metric.py | 6 +++--- .../test_metrics/test_base_sample_wise_metric.py | 4 ++-- .../test_metrics/test_connectivity_error.py | 4 ++-- .../test_metrics/test_equivariance.py | 12 ++++++------ tests/test_evaluation/test_metrics/test_fid.py | 10 +++++----- .../test_metrics/test_gradient_error.py | 4 ++-- .../test_metrics/test_inception_score.py | 10 +++++----- tests/test_evaluation/test_metrics/test_mae.py | 2 +- .../test_evaluation/test_metrics/test_matting_mse.py | 4 ++-- .../test_metrics/test_metrics_utils.py | 4 ++-- tests/test_evaluation/test_metrics/test_ms_ssim.py | 6 +++--- tests/test_evaluation/test_metrics/test_mse.py | 2 +- tests/test_evaluation/test_metrics/test_niqe.py | 2 +- tests/test_evaluation/test_metrics/test_ppl.py | 12 ++++++------ .../test_metrics/test_precision_and_recall.py | 12 ++++++------ tests/test_evaluation/test_metrics/test_psnr.py | 2 +- tests/test_evaluation/test_metrics/test_sad.py | 4 ++-- tests/test_evaluation/test_metrics/test_snr.py | 2 +- tests/test_evaluation/test_metrics/test_ssim.py | 2 +- tests/test_evaluation/test_metrics/test_swd.py | 6 +++--- tests/test_models/test_base_archs/test_aspp.py | 2 +- tests/test_models/test_base_archs/test_conv.py | 2 +- tests/test_models/test_base_archs/test_downsample.py | 2 +- tests/test_models/test_base_archs/test_ensemble.py | 2 +- .../test_base_archs/test_gated_conv_module.py | 2 +- .../test_base_archs/test_img_normalize.py | 2 +- .../test_base_archs/test_linear_module.py | 2 +- tests/test_models/test_base_archs/test_lora.py | 2 +- .../test_base_archs/test_multi_layer_disc.py | 2 +- tests/test_models/test_base_archs/test_patch_disc.py | 4 ++-- tests/test_models/test_base_archs/test_resnet.py | 2 +- .../test_base_archs/test_separable_conv_module.py | 2 +- .../test_base_archs/test_simple_encoder_decoder.py | 2 +- .../test_models/test_base_archs/test_smpatch_disc.py | 4 ++-- .../test_models/test_base_archs/test_sr_backbone.py | 4 ++-- tests/test_models/test_base_archs/test_upsample.py | 2 +- tests/test_models/test_base_archs/test_vgg.py | 2 +- tests/test_models/test_base_archs/test_wrapper.py | 6 +++--- .../test_base_models/test_average_model.py | 2 +- .../test_base_models/test_base_conditional_gan.py | 6 +++--- .../test_base_models/test_base_edit_model.py | 10 +++++----- tests/test_models/test_base_models/test_base_gan.py | 8 ++++---- .../test_models/test_base_models/test_base_mattor.py | 12 ++++++------ .../test_base_models/test_base_translation_model.py | 2 +- .../test_base_models/test_basic_interpolator.py | 6 +++--- tests/test_models/test_base_models/test_one_stage.py | 8 ++++---- tests/test_models/test_base_models/test_two_stage.py | 6 +++--- .../test_edit_data_preprocessor.py | 4 ++-- .../test_mattor_preprocessor.py | 4 ++-- .../test_diffusion_schedulers/test_ddim_scheduler.py | 2 +- .../test_diffusion_schedulers/test_init.py | 2 +- .../test_editors/test_aotgan/test_aot_decoder.py | 4 ++-- .../test_editors/test_aotgan/test_aot_encoder.py | 4 ++-- .../test_aotgan/test_aot_encoder_decoder.py | 4 ++-- .../test_editors/test_aotgan/test_aot_inpaintor.py | 8 ++++---- .../test_editors/test_aotgan/test_aot_neck.py | 2 +- .../test_arcface/test_arcface_modules.py | 2 +- .../test_editors/test_arcface/test_id_loss.py | 2 +- .../test_editors/test_arcface/test_model_irse.py | 2 +- .../test_editors/test_basicvsr/test_basicvsr.py | 6 +++--- .../test_editors/test_basicvsr/test_basicvsr_net.py | 2 +- .../test_basicvsr_plusplus_net.py | 2 +- .../test_editors/test_biggan/test_biggan.py | 6 +++--- .../test_biggan/test_biggan_deep_discriminator.py | 4 ++-- .../test_biggan/test_biggan_deep_generator.py | 4 ++-- .../test_biggan/test_biggan_discriminator.py | 4 ++-- .../test_biggan/test_biggan_generator.py | 4 ++-- .../test_editors/test_biggan/test_biggan_modules.py | 4 ++-- .../test_editors/test_biggan/test_biggan_snmodule.py | 2 +- .../test_models/test_editors/test_cain/test_cain.py | 10 +++++----- .../test_editors/test_cain/test_cain_net.py | 2 +- .../test_editors/test_controlnet/test_controlnet.py | 8 ++++---- .../test_controlnet/test_controlnet_utils.py | 2 +- .../test_editors/test_cyclegan/test_cyclegan.py | 8 ++++---- .../test_cyclegan/test_cyclegan_generator.py | 2 +- .../test_cyclegan/test_cyclegan_modules.py | 2 +- .../test_editors/test_dcgan/test_dcgan.py | 6 +++--- .../test_dcgan/test_dcgan_discriminator.py | 4 ++-- .../test_editors/test_dcgan/test_dcgan_generator.py | 4 ++-- .../test_editors/test_ddpm/test_attention.py | 2 +- .../test_editors/test_ddpm/test_ddpm_scheduler.py | 2 +- .../test_editors/test_ddpm/test_denoising_unet.py | 2 +- .../test_editors/test_ddpm/test_embeddings.py | 2 +- .../test_editors/test_ddpm/test_res_blocks.py | 2 +- .../test_editors/test_ddpm/test_unet_blocks.py | 2 +- .../test_deepfillv1/test_contextual_attention.py | 2 +- .../test_contextual_attention_neck.py | 4 ++-- .../test_deepfillv1/test_deepfill_decoder.py | 2 +- .../test_deepfillv1/test_deepfill_disc.py | 4 ++-- .../test_deepfillv1/test_deepfill_encoder.py | 4 ++-- .../test_deepfillv1/test_deepfill_refiner.py | 2 +- .../test_editors/test_deepfillv1/test_deepfillv1.py | 8 ++++---- .../test_two_stage_encoder_decoder.py | 6 +++--- tests/test_models/test_editors/test_dic/test_dic.py | 6 +++--- .../test_editors/test_dic/test_dic_net.py | 4 ++-- .../test_dic/test_feedback_hour_glass.py | 4 ++-- .../test_editors/test_dic/test_light_cnn.py | 4 ++-- tests/test_models/test_editors/test_dim/test_dim.py | 10 +++++----- .../test_disco_diffusion/test_disco_diffusion.py | 10 +++++----- .../test_disco_diffusion_clip_wrapper.py | 2 +- .../test_editors/test_dreambooth/test_dreambooth.py | 8 ++++---- tests/test_models/test_editors/test_duf/test_duf.py | 2 +- .../test_editors/test_edsr/test_edsr_net.py | 2 +- .../test_models/test_editors/test_edvr/test_edvr.py | 8 ++++---- .../test_editors/test_edvr/test_edvr_net.py | 2 +- .../test_editors/test_eg3d/test_camera.py | 4 ++-- .../test_eg3d/test_dual_discriminator.py | 2 +- .../test_models/test_editors/test_eg3d/test_eg3d.py | 6 +++--- .../test_editors/test_eg3d/test_eg3d_generator.py | 4 ++-- .../test_editors/test_eg3d/test_eg3d_modules.py | 2 +- .../test_editors/test_eg3d/test_eg3d_utils.py | 2 +- .../test_editors/test_eg3d/test_ray_sampler.py | 2 +- .../test_editors/test_eg3d/test_renderer.py | 6 +++--- .../test_editors/test_esrgan/test_esrgan.py | 6 +++--- .../test_editors/test_esrgan/test_rrdb_net.py | 2 +- .../test_editors/test_fba/test_fba_decoder.py | 2 +- .../test_editors/test_fba/test_fba_encoder.py | 2 +- .../test_editors/test_flavr/test_flavr.py | 2 +- .../test_editors/test_flavr/test_flavr_net.py | 4 ++-- tests/test_models/test_editors/test_gca/test_gca.py | 8 ++++---- .../test_editors/test_gca/test_gca_module.py | 2 +- .../test_editors/test_gca/test_resgca_dec.py | 2 +- .../test_editors/test_gca/test_resgca_enc.py | 2 +- .../test_models/test_editors/test_ggan/test_ggan.py | 6 +++--- .../test_editors/test_glean/test_glean_styleganv2.py | 8 ++++---- .../test_global_local/test_gl_decoder.py | 4 ++-- .../test_global_local/test_gl_dilation.py | 8 ++++---- .../test_editors/test_global_local/test_gl_disc.py | 2 +- .../test_global_local/test_gl_encoder.py | 4 ++-- .../test_global_local/test_gl_encoder_decoder.py | 4 ++-- .../test_global_local/test_gl_inpaintor.py | 6 +++--- .../test_editors/test_guided_diffusion/test_adm.py | 4 ++-- .../test_editors/test_iconvsr/test_iconvsr_net.py | 2 +- .../test_editors/test_indexnet/test_indexnet.py | 10 +++++----- .../test_indexnet/test_indexnet_decoder.py | 2 +- .../test_indexnet/test_indexnet_encoder.py | 2 +- .../test_inst_colorization/test_color_utils.py | 2 +- .../test_inst_colorization/test_colorization_net.py | 2 +- .../test_inst_colorization/test_fusion_net.py | 2 +- .../test_inst_colorization/test_inst_colorization.py | 6 +++--- .../test_inst_colorization/test_weight_layer.py | 2 +- .../test_models/test_editors/test_liif/test_liif.py | 4 ++-- .../test_editors/test_liif/test_liif_net.py | 2 +- .../test_editors/test_liif/test_mlp_refiner.py | 2 +- .../test_editors/test_lsgan/test_lsgan.py | 6 +++--- .../test_lsgan/test_lsgan_discriminator.py | 4 ++-- .../test_editors/test_lsgan/test_lsgan_generator.py | 4 ++-- .../test_editors/test_mspie/test_mspie_stylegan2.py | 6 +++--- .../test_mspie/test_mspie_stylegan2_discriminator.py | 2 +- .../test_mspie/test_mspie_stylegan2_generator.py | 6 +++--- .../test_mspie/test_mspie_stylegan2_modules.py | 2 +- .../test_editors/test_mspie/test_pe_singan.py | 6 +++--- .../test_mspie/test_pe_singan_generator.py | 2 +- .../test_mspie/test_positional_encoding.py | 4 ++-- .../test_editors/test_nafnet/test_naf_avgpool2d.py | 2 +- .../test_editors/test_nafnet/test_naf_layernorm2d.py | 2 +- .../test_editors/test_nafnet/test_nafbaseline.py | 2 +- .../test_editors/test_nafnet/test_nafnet.py | 2 +- .../test_editors/test_pconv/test_mask_conv_module.py | 4 ++-- .../test_editors/test_pconv/test_partial_conv.py | 2 +- .../test_editors/test_pconv/test_pconv_decoder.py | 4 ++-- .../test_editors/test_pconv/test_pconv_encoder.py | 2 +- .../test_pconv/test_pconv_encoder_decoder.py | 2 +- .../test_editors/test_pconv/test_pconv_inpaintor.py | 6 +++--- .../test_editors/test_pggan/test_pggan.py | 8 ++++---- .../test_pggan/test_pggan_discriminator.py | 2 +- .../test_editors/test_pggan/test_pggan_generator.py | 2 +- .../test_editors/test_pggan/test_pggan_modules.py | 4 ++-- .../test_editors/test_pix2pix/test_pix2pix.py | 8 ++++---- .../test_pix2pix/test_pix2pix_generator.py | 2 +- .../test_pix2pix/test_pix2pix_modules.py | 2 +- .../test_editors/test_plain/test_plain_decoder.py | 4 ++-- .../test_editors/test_plain/test_plain_refiner.py | 2 +- .../test_editors/test_rdn/test_rdn_net.py | 2 +- .../test_real_basicvsr/test_real_basicvsr.py | 8 ++++---- .../test_real_basicvsr/test_real_basicvsr_net.py | 2 +- .../test_real_esrgan/test_real_esrgan.py | 6 +++--- .../test_editors/test_real_esrgan/test_unet_disc.py | 2 +- .../test_restormer/test_restormer_net.py | 2 +- .../test_editors/test_sagan/test_sagan.py | 6 +++--- .../test_sagan/test_sagan_discriminator.py | 4 ++-- .../test_editors/test_sagan/test_sagan_generator.py | 4 ++-- .../test_editors/test_sagan/test_sagan_modules.py | 2 +- .../test_editors/test_singan/test_singan.py | 6 +++--- .../test_singan/test_singan_discriminator.py | 2 +- .../test_singan/test_singan_generator.py | 2 +- .../test_editors/test_singan/test_singan_modules.py | 2 +- .../test_editors/test_srcnn/test_srcnn_net.py | 2 +- .../test_editors/test_srgan/test_modified_vgg.py | 2 +- .../test_editors/test_srgan/test_sr_resnet.py | 2 +- .../test_editors/test_srgan/test_srgan.py | 6 +++--- .../test_stable_diffusion/test_clip_wrapper.py | 8 ++++---- .../test_stable_diffusion/test_stable_diffusion.py | 2 +- .../test_editors/test_stable_diffusion/test_vae.py | 2 +- .../test_editors/test_stylegan1/test_stylegan1.py | 8 ++++---- .../test_stylegan1/test_stylegan1_discriminator.py | 4 ++-- .../test_stylegan1/test_stylegan1_generator.py | 4 ++-- .../test_stylegan1/test_stylegan1_modules.py | 2 +- .../test_stylegan1/test_stylegan_utils.py | 4 ++-- .../test_stylegan2/test_ada/test_augment.py | 2 +- .../test_editors/test_stylegan2/test_stylegan2.py | 4 ++-- .../test_stylegan2/test_stylegan2_discriminator.py | 4 ++-- .../test_stylegan2/test_stylegan2_generator.py | 2 +- .../test_stylegan2/test_stylegan2_modules.py | 8 ++++---- .../test_editors/test_stylegan3/test_stylegan3.py | 6 +++--- .../test_stylegan3/test_stylegan3_generator.py | 2 +- .../test_stylegan3/test_stylegan3_modules.py | 2 +- .../test_stylegan3/test_stylegan3_utils.py | 2 +- .../test_editors/test_swinir/test_swinir_modules.py | 2 +- .../test_editors/test_swinir/test_swinir_net.py | 2 +- .../test_editors/test_swinir/test_swinir_rstb.py | 2 +- .../test_editors/test_swinir/test_swinir_utils.py | 2 +- .../test_models/test_editors/test_tdan/test_tdan.py | 8 ++++---- .../test_editors/test_tdan/test_tdan_net.py | 2 +- .../test_editors/test_tof/test_tof_vfi_net.py | 2 +- .../test_editors/test_tof/test_tof_vsr_net.py | 2 +- tests/test_models/test_editors/test_ttsr/test_lte.py | 2 +- .../test_ttsr/test_search_transformer.py | 2 +- .../test_models/test_editors/test_ttsr/test_ttsr.py | 8 ++++---- .../test_editors/test_ttsr/test_ttsr_disc.py | 2 +- .../test_editors/test_ttsr/test_ttsr_net.py | 4 ++-- .../test_wgan_gp/test_wgan_discriminator.py | 4 ++-- .../test_editors/test_wgan_gp/test_wgan_generator.py | 4 ++-- .../test_editors/test_wgan_gp/test_wgan_gp.py | 6 +++--- .../test_editors/test_wgan_gp/test_wgan_gp_module.py | 2 +- tests/test_models/test_losses/test_clip_loss.py | 4 ++-- .../test_models/test_losses/test_composition_loss.py | 2 +- tests/test_models/test_losses/test_face_id_loss.py | 2 +- tests/test_models/test_losses/test_feature_loss.py | 2 +- tests/test_models/test_losses/test_gan_loss.py | 2 +- tests/test_models/test_losses/test_gradient_loss.py | 2 +- .../test_loss_comps/test_clip_loss_comps.py | 4 ++-- .../test_disc_auxiliary_loss_comps.py | 8 ++++---- .../test_loss_comps/test_face_id_loss_comps.py | 4 ++-- .../test_loss_comps/test_gan_loss_comps.py | 2 +- .../test_loss_comps/test_gen_auxiliary_loss_comps.py | 4 ++-- tests/test_models/test_losses/test_loss_wrapper.py | 2 +- .../test_models/test_losses/test_perceptual_loss.py | 2 +- tests/test_models/test_losses/test_pixelwise_loss.py | 2 +- tests/test_models/test_utils/test_bbox_utils.py | 4 ++-- tests/test_models/test_utils/test_flow_warp.py | 2 +- tests/test_models/test_utils/test_model_utils.py | 4 ++-- tests/test_models/test_utils/test_sampling_utils.py | 2 +- tests/test_models/test_utils/test_tensor_utils.py | 2 +- tests/test_structures/test_edit_data_sample.py | 4 ++-- tests/test_utils/test_cli.py | 2 +- tests/test_utils/test_img_utils.py | 2 +- tests/test_utils/test_io_utils.py | 2 +- tests/test_utils/test_logger.py | 2 +- tests/test_utils/test_sampler.py | 2 +- tests/test_utils/test_setup_env.py | 2 +- tests/test_utils/test_trans_utils.py | 4 ++-- tests/test_visualization/test_concat_visualizer.py | 4 ++-- tests/test_visualization/test_gen_visualizer.py | 6 +++--- tests/test_visualization/test_vis_backend.py | 6 +++--- 321 files changed, 598 insertions(+), 598 deletions(-) diff --git a/tests/test_apis/test_inferencers/test_base_mmedit_inferencer.py b/tests/test_apis/test_inferencers/test_base_mmedit_inferencer.py index 54edff049e..5c256eac1e 100644 --- a/tests/test_apis/test_inferencers/test_base_mmedit_inferencer.py +++ b/tests/test_apis/test_inferencers/test_base_mmedit_inferencer.py @@ -3,8 +3,8 @@ import pytest -from mmedit.apis.inferencers.base_mmedit_inferencer import BaseMMEditInferencer -from mmedit.utils import register_all_modules +from mmagic.apis.inferencers.base_mmedit_inferencer import BaseMMEditInferencer +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_colorization_inferencer.py b/tests/test_apis/test_inferencers/test_colorization_inferencer.py index dae2f6498d..d42c260e35 100644 --- a/tests/test_apis/test_inferencers/test_colorization_inferencer.py +++ b/tests/test_apis/test_inferencers/test_colorization_inferencer.py @@ -4,9 +4,9 @@ import torch -from mmedit.apis.inferencers.colorization_inferencer import \ +from mmagic.apis.inferencers.colorization_inferencer import \ ColorizationInferencer -from mmedit.utils import register_all_modules +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_conditional_inferencer.py b/tests/test_apis/test_inferencers/test_conditional_inferencer.py index 6bf8d5e148..1764aaa00d 100644 --- a/tests/test_apis/test_inferencers/test_conditional_inferencer.py +++ b/tests/test_apis/test_inferencers/test_conditional_inferencer.py @@ -1,9 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp -from mmedit.apis.inferencers.conditional_inferencer import \ +from mmagic.apis.inferencers.conditional_inferencer import \ ConditionalInferencer -from mmedit.utils import register_all_modules +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_eg3d_inferencer.py b/tests/test_apis/test_inferencers/test_eg3d_inferencer.py index 9e75c9bad4..c36bc90cbd 100644 --- a/tests/test_apis/test_inferencers/test_eg3d_inferencer.py +++ b/tests/test_apis/test_inferencers/test_eg3d_inferencer.py @@ -7,8 +7,8 @@ import pytest from mmengine import Config -from mmedit.apis.inferencers.eg3d_inferencer import EG3DInferencer -from mmedit.utils import register_all_modules +from mmagic.apis.inferencers.eg3d_inferencer import EG3DInferencer +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_image_super_resolution_inferencer.py b/tests/test_apis/test_inferencers/test_image_super_resolution_inferencer.py index c49327b879..6a18ec8444 100644 --- a/tests/test_apis/test_inferencers/test_image_super_resolution_inferencer.py +++ b/tests/test_apis/test_inferencers/test_image_super_resolution_inferencer.py @@ -5,9 +5,9 @@ import pytest import torch -from mmedit.apis.inferencers.image_super_resolution_inferencer import \ +from mmagic.apis.inferencers.image_super_resolution_inferencer import \ ImageSuperResolutionInferencer -from mmedit.utils import register_all_modules +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_inference_functions.py b/tests/test_apis/test_inferencers/test_inference_functions.py index 9eed091a74..78d7b668b6 100644 --- a/tests/test_apis/test_inferencers/test_inference_functions.py +++ b/tests/test_apis/test_inferencers/test_inference_functions.py @@ -8,14 +8,14 @@ from mmengine import Config from mmengine.runner import load_checkpoint -from mmedit.apis import (calculate_grid_size, colorization_inference, +from mmagic.apis import (calculate_grid_size, colorization_inference, init_model, inpainting_inference, matting_inference, restoration_face_inference, restoration_inference, restoration_video_inference, sample_conditional_model, sample_img2img_model, sample_unconditional_model, set_random_seed, video_interpolation_inference) -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules, tensor2img +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules, tensor2img register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_inpainting_inferencer.py b/tests/test_apis/test_inferencers/test_inpainting_inferencer.py index df184caa02..a1714a0488 100644 --- a/tests/test_apis/test_inferencers/test_inpainting_inferencer.py +++ b/tests/test_apis/test_inferencers/test_inpainting_inferencer.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp -from mmedit.apis.inferencers.inpainting_inferencer import InpaintingInferencer -from mmedit.utils import register_all_modules +from mmagic.apis.inferencers.inpainting_inferencer import InpaintingInferencer +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_matting_inferencer.py b/tests/test_apis/test_inferencers/test_matting_inferencer.py index b78d4400c3..12ecfbe549 100644 --- a/tests/test_apis/test_inferencers/test_matting_inferencer.py +++ b/tests/test_apis/test_inferencers/test_matting_inferencer.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp -from mmedit.apis.inferencers.matting_inferencer import MattingInferencer -from mmedit.utils import register_all_modules +from mmagic.apis.inferencers.matting_inferencer import MattingInferencer +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_mmedit_inferencer.py b/tests/test_apis/test_inferencers/test_mmedit_inferencer.py index 9801fcafbd..efd2961d8e 100644 --- a/tests/test_apis/test_inferencers/test_mmedit_inferencer.py +++ b/tests/test_apis/test_inferencers/test_mmedit_inferencer.py @@ -3,8 +3,8 @@ import pytest -from mmedit.apis.inferencers import Inferencers -from mmedit.utils import register_all_modules +from mmagic.apis.inferencers import Inferencers +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_text2image_inferencers.py b/tests/test_apis/test_inferencers/test_text2image_inferencers.py index 3c530e2876..0699a1e5d8 100644 --- a/tests/test_apis/test_inferencers/test_text2image_inferencers.py +++ b/tests/test_apis/test_inferencers/test_text2image_inferencers.py @@ -9,10 +9,10 @@ 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 DenoisingUnet, DiscoDiffusion -from mmedit.models.diffusion_schedulers import EditDDIMScheduler -from mmedit.utils import register_all_modules +from mmagic.apis.inferencers.text2image_inferencer import Text2ImageInferencer +from mmagic.models import DenoisingUnet, DiscoDiffusion +from mmagic.models.diffusion_schedulers import EditDDIMScheduler +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_translation_inferencer.py b/tests/test_apis/test_inferencers/test_translation_inferencer.py index 56fc990030..e11cccb897 100644 --- a/tests/test_apis/test_inferencers/test_translation_inferencer.py +++ b/tests/test_apis/test_inferencers/test_translation_inferencer.py @@ -1,9 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp -from mmedit.apis.inferencers.translation_inferencer import \ +from mmagic.apis.inferencers.translation_inferencer import \ TranslationInferencer -from mmedit.utils import register_all_modules +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_unconditional_inferencer.py b/tests/test_apis/test_inferencers/test_unconditional_inferencer.py index 693890747d..4b18d0416f 100644 --- a/tests/test_apis/test_inferencers/test_unconditional_inferencer.py +++ b/tests/test_apis/test_inferencers/test_unconditional_inferencer.py @@ -1,9 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp -from mmedit.apis.inferencers.unconditional_inferencer import \ +from mmagic.apis.inferencers.unconditional_inferencer import \ UnconditionalInferencer -from mmedit.utils import register_all_modules +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_apis/test_inferencers/test_video_interpolation_inferencer.py b/tests/test_apis/test_inferencers/test_video_interpolation_inferencer.py index bdc7e523cd..3a421c23df 100644 --- a/tests/test_apis/test_inferencers/test_video_interpolation_inferencer.py +++ b/tests/test_apis/test_inferencers/test_video_interpolation_inferencer.py @@ -1,9 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp -from mmedit.apis.inferencers.video_interpolation_inferencer import \ +from mmagic.apis.inferencers.video_interpolation_inferencer import \ VideoInterpolationInferencer -from mmedit.utils import register_all_modules +from mmagic.utils import register_all_modules register_all_modules() 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 ba0b8ecad9..9afff1f1e0 100644 --- a/tests/test_apis/test_inferencers/test_video_restoration_inferencer.py +++ b/tests/test_apis/test_inferencers/test_video_restoration_inferencer.py @@ -1,9 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp -from mmedit.apis.inferencers.video_restoration_inferencer import \ +from mmagic.apis.inferencers.video_restoration_inferencer import \ VideoRestorationInferencer -from mmedit.utils import register_all_modules +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_datasets/test_basic_conditional_dataset.py b/tests/test_datasets/test_basic_conditional_dataset.py index 054065301b..d51485737b 100644 --- a/tests/test_datasets/test_basic_conditional_dataset.py +++ b/tests/test_datasets/test_basic_conditional_dataset.py @@ -5,8 +5,8 @@ import numpy as np -from mmedit.datasets import BasicConditionalDataset -from mmedit.utils import register_all_modules +from mmagic.datasets import BasicConditionalDataset +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_datasets/test_basic_frames_dataset.py b/tests/test_datasets/test_basic_frames_dataset.py index 0548140de0..d4ecfe0f00 100644 --- a/tests/test_datasets/test_basic_frames_dataset.py +++ b/tests/test_datasets/test_basic_frames_dataset.py @@ -2,7 +2,7 @@ import os from pathlib import Path -from mmedit.datasets import BasicFramesDataset +from mmagic.datasets import BasicFramesDataset class TestFramesDatasets: diff --git a/tests/test_datasets/test_basic_image_dataset.py b/tests/test_datasets/test_basic_image_dataset.py index 857f1cfa8c..db4724acd1 100644 --- a/tests/test_datasets/test_basic_image_dataset.py +++ b/tests/test_datasets/test_basic_image_dataset.py @@ -4,8 +4,8 @@ import mmcv -from mmedit.datasets import BasicImageDataset -from mmedit.datasets.transforms import LoadImageFromFile +from mmagic.datasets import BasicImageDataset +from mmagic.datasets.transforms import LoadImageFromFile class TestImageDatasets: diff --git a/tests/test_datasets/test_categories.py b/tests/test_datasets/test_categories.py index b8687096a6..3c65d409b8 100644 --- a/tests/test_datasets/test_categories.py +++ b/tests/test_datasets/test_categories.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.datasets.categories import CIFAR10_CATEGORIES, IMAGENET_CATEGORIES +from mmagic.datasets.categories import CIFAR10_CATEGORIES, IMAGENET_CATEGORIES def test_cifar10_categories(): diff --git a/tests/test_datasets/test_cifar10_dataset.py b/tests/test_datasets/test_cifar10_dataset.py index dcba2b25a2..d0e7793bd7 100644 --- a/tests/test_datasets/test_cifar10_dataset.py +++ b/tests/test_datasets/test_cifar10_dataset.py @@ -8,8 +8,8 @@ import numpy as np -from mmedit.registry import DATASETS -from mmedit.utils import register_all_modules +from mmagic.registry import DATASETS +from mmagic.utils import register_all_modules DATA_DIR = osp.abspath(osp.join(osp.dirname(__file__), '../data/dataset/')) @@ -128,7 +128,7 @@ def test_load_data_list(self): # Test automatically download with patch( - 'mmedit.datasets.cifar10_dataset.download_and_extract_archive' + 'mmagic.datasets.cifar10_dataset.download_and_extract_archive' ) as mock: cfg = {**self.DEFAULT_ARGS, 'lazy_init': True, 'test_mode': True} dataset = dataset_class(**cfg) diff --git a/tests/test_datasets/test_comp1k_dataset.py b/tests/test_datasets/test_comp1k_dataset.py index deaaeaaeeb..5f3c925b28 100644 --- a/tests/test_datasets/test_comp1k_dataset.py +++ b/tests/test_datasets/test_comp1k_dataset.py @@ -3,7 +3,7 @@ import os.path as osp from pathlib import Path -from mmedit.datasets import AdobeComp1kDataset +from mmagic.datasets import AdobeComp1kDataset class TestMattingDatasets: diff --git a/tests/test_datasets/test_controlnet_dataset.py b/tests/test_datasets/test_controlnet_dataset.py index 9a36ea9f70..2319c1134c 100644 --- a/tests/test_datasets/test_controlnet_dataset.py +++ b/tests/test_datasets/test_controlnet_dataset.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import os -from mmedit.datasets import ControlNetDataset +from mmagic.datasets import ControlNetDataset data_dir = os.path.join(__file__, '../', '../', 'data', 'controlnet') data_dir = os.path.abspath(data_dir) diff --git a/tests/test_datasets/test_data_utils.py b/tests/test_datasets/test_data_utils.py index 43eb6f2d46..e6a25c34a8 100644 --- a/tests/test_datasets/test_data_utils.py +++ b/tests/test_datasets/test_data_utils.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.datasets.data_utils import infer_io_backend +from mmagic.datasets.data_utils import infer_io_backend def test_infer_io_backend(): diff --git a/tests/test_datasets/test_dreambooth_dataset.py b/tests/test_datasets/test_dreambooth_dataset.py index e2ed1f0283..781f744800 100644 --- a/tests/test_datasets/test_dreambooth_dataset.py +++ b/tests/test_datasets/test_dreambooth_dataset.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import os -from mmedit.datasets import DreamBoothDataset +from mmagic.datasets import DreamBoothDataset # we use controlnet's dataset to test data_dir = os.path.join(__file__, '../', '../', 'data', 'controlnet') diff --git a/tests/test_datasets/test_grow_scale_image_dataset.py b/tests/test_datasets/test_grow_scale_image_dataset.py index 329565ef69..28636f8df2 100644 --- a/tests/test_datasets/test_grow_scale_image_dataset.py +++ b/tests/test_datasets/test_grow_scale_image_dataset.py @@ -3,8 +3,8 @@ import pytest -from mmedit.datasets import GrowScaleImgDataset -from mmedit.utils import register_all_modules +from mmagic.datasets import GrowScaleImgDataset +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_datasets/test_imagenet_dataset.py b/tests/test_datasets/test_imagenet_dataset.py index e653270a64..a9f0b28820 100644 --- a/tests/test_datasets/test_imagenet_dataset.py +++ b/tests/test_datasets/test_imagenet_dataset.py @@ -2,7 +2,7 @@ import os.path as osp from unittest import TestCase -from mmedit.datasets import ImageNet +from mmagic.datasets import ImageNet DATA_DIR = osp.abspath(osp.join(osp.dirname(__file__), '../data/dataset/')) diff --git a/tests/test_datasets/test_mscoco_dataset.py b/tests/test_datasets/test_mscoco_dataset.py index 5ebc1a7b01..2376725cfa 100644 --- a/tests/test_datasets/test_mscoco_dataset.py +++ b/tests/test_datasets/test_mscoco_dataset.py @@ -2,7 +2,7 @@ import os from pathlib import Path -from mmedit.datasets import MSCoCoDataset +from mmagic.datasets import MSCoCoDataset class TestMSCoCoDatasets: diff --git a/tests/test_datasets/test_paired_image_dataset.py b/tests/test_datasets/test_paired_image_dataset.py index 3f688d8a74..97ee66b6d3 100644 --- a/tests/test_datasets/test_paired_image_dataset.py +++ b/tests/test_datasets/test_paired_image_dataset.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp -from mmedit.datasets import PairedImageDataset -from mmedit.utils import register_all_modules +from mmagic.datasets import PairedImageDataset +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_datasets/test_singan_dataset.py b/tests/test_datasets/test_singan_dataset.py index 96b78b8ae8..e3f4452a90 100644 --- a/tests/test_datasets/test_singan_dataset.py +++ b/tests/test_datasets/test_singan_dataset.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp -from mmedit.datasets import SinGANDataset -from mmedit.utils import register_all_modules +from mmagic.datasets import SinGANDataset +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_datasets/test_transforms/test_alpha.py b/tests/test_datasets/test_transforms/test_alpha.py index 695f85c608..e1bfdcf46d 100644 --- a/tests/test_datasets/test_transforms/test_alpha.py +++ b/tests/test_datasets/test_transforms/test_alpha.py @@ -3,7 +3,7 @@ import numpy as np import pytest -from mmedit.datasets.transforms import GenerateSeg, GenerateSoftSeg +from mmagic.datasets.transforms import GenerateSeg, GenerateSoftSeg def assert_keys_contain(result_keys, target_keys): diff --git a/tests/test_datasets/test_transforms/test_aug_frames.py b/tests/test_datasets/test_transforms/test_aug_frames.py index 2e0af2330c..652bdd2c65 100644 --- a/tests/test_datasets/test_transforms/test_aug_frames.py +++ b/tests/test_datasets/test_transforms/test_aug_frames.py @@ -2,7 +2,7 @@ import numpy as np import pytest -from mmedit.datasets.transforms import MirrorSequence, TemporalReverse +from mmagic.datasets.transforms import MirrorSequence, TemporalReverse class TestAugmentations: diff --git a/tests/test_datasets/test_transforms/test_aug_pixel.py b/tests/test_datasets/test_transforms/test_aug_pixel.py index 8afb263281..a621d14dc7 100644 --- a/tests/test_datasets/test_transforms/test_aug_pixel.py +++ b/tests/test_datasets/test_transforms/test_aug_pixel.py @@ -4,7 +4,7 @@ import numpy as np import pytest -from mmedit.datasets.transforms import (BinarizeImage, Clip, ColorJitter, +from mmagic.datasets.transforms import (BinarizeImage, Clip, ColorJitter, RandomAffine, RandomMaskDilation, UnsharpMasking) diff --git a/tests/test_datasets/test_transforms/test_aug_shape.py b/tests/test_datasets/test_transforms/test_aug_shape.py index d4b3828c96..9b8cbf395f 100644 --- a/tests/test_datasets/test_transforms/test_aug_shape.py +++ b/tests/test_datasets/test_transforms/test_aug_shape.py @@ -4,7 +4,7 @@ import numpy as np import pytest -from mmedit.datasets.transforms import (CenterCropLongEdge, Flip, NumpyPad, +from mmagic.datasets.transforms import (CenterCropLongEdge, Flip, NumpyPad, RandomCropLongEdge, RandomRotation, RandomTransposeHW, Resize) diff --git a/tests/test_datasets/test_transforms/test_blur_kernels.py b/tests/test_datasets/test_transforms/test_blur_kernels.py index bb8fd0e82e..d9851d79ea 100644 --- a/tests/test_datasets/test_transforms/test_blur_kernels.py +++ b/tests/test_datasets/test_transforms/test_blur_kernels.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.datasets.transforms import blur_kernels +from mmagic.datasets.transforms import blur_kernels def test_blur_kernels(): diff --git a/tests/test_datasets/test_transforms/test_crop.py b/tests/test_datasets/test_transforms/test_crop.py index 703e7657c6..2f4b456c33 100644 --- a/tests/test_datasets/test_transforms/test_crop.py +++ b/tests/test_datasets/test_transforms/test_crop.py @@ -8,7 +8,7 @@ import pytest import torch -from mmedit.datasets.transforms import (Crop, CropLike, FixedCrop, +from mmagic.datasets.transforms import (Crop, CropLike, FixedCrop, InstanceCrop, ModCrop, PairedRandomCrop, RandomResizedCrop) diff --git a/tests/test_datasets/test_transforms/test_fgbg.py b/tests/test_datasets/test_transforms/test_fgbg.py index 942829666c..fc0107530d 100644 --- a/tests/test_datasets/test_transforms/test_fgbg.py +++ b/tests/test_datasets/test_transforms/test_fgbg.py @@ -5,7 +5,7 @@ import pytest from mmengine.fileio import load -from mmedit.datasets.transforms import (CompositeFg, MergeFgAndBg, PerturbBg, +from mmagic.datasets.transforms import (CompositeFg, MergeFgAndBg, PerturbBg, RandomJitter, RandomLoadResizeBg) test_root = Path(__file__).parent.parent.parent diff --git a/tests/test_datasets/test_transforms/test_formatting.py b/tests/test_datasets/test_transforms/test_formatting.py index b7121b5280..8b00bed1ce 100644 --- a/tests/test_datasets/test_transforms/test_formatting.py +++ b/tests/test_datasets/test_transforms/test_formatting.py @@ -3,8 +3,8 @@ import torch from mmcv.transforms import to_tensor -from mmedit.datasets.transforms import PackEditInputs -from mmedit.structures.edit_data_sample import EditDataSample +from mmagic.datasets.transforms import PackEditInputs +from mmagic.structures.edit_data_sample import EditDataSample def assert_tensor_equal(img, ref_img, ratio_thr=0.999): diff --git a/tests/test_datasets/test_transforms/test_generate_assistant.py b/tests/test_datasets/test_transforms/test_generate_assistant.py index 536b00b95e..c1f063ff16 100644 --- a/tests/test_datasets/test_transforms/test_generate_assistant.py +++ b/tests/test_datasets/test_transforms/test_generate_assistant.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.datasets.transforms import (GenerateCoordinateAndCell, +from mmagic.datasets.transforms import (GenerateCoordinateAndCell, GenerateFacialHeatmap, LoadImageFromFile) diff --git a/tests/test_datasets/test_transforms/test_generate_frame_indices.py b/tests/test_datasets/test_transforms/test_generate_frame_indices.py index 0cc4a6dc48..7c84b09b10 100644 --- a/tests/test_datasets/test_transforms/test_generate_frame_indices.py +++ b/tests/test_datasets/test_transforms/test_generate_frame_indices.py @@ -5,7 +5,7 @@ import numpy as np import pytest -from mmedit.datasets.transforms import (GenerateFrameIndices, +from mmagic.datasets.transforms import (GenerateFrameIndices, GenerateFrameIndiceswithPadding, GenerateSegmentIndices) diff --git a/tests/test_datasets/test_transforms/test_get_masked_image.py b/tests/test_datasets/test_transforms/test_get_masked_image.py index b3b4a98513..bcb0e87e53 100644 --- a/tests/test_datasets/test_transforms/test_get_masked_image.py +++ b/tests/test_datasets/test_transforms/test_get_masked_image.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import numpy as np -from mmedit.datasets.transforms import GetMaskedImage +from mmagic.datasets.transforms import GetMaskedImage def test_masked_img(): diff --git a/tests/test_datasets/test_transforms/test_loading.py b/tests/test_datasets/test_transforms/test_loading.py index 41ce292f33..68ea8f6290 100644 --- a/tests/test_datasets/test_transforms/test_loading.py +++ b/tests/test_datasets/test_transforms/test_loading.py @@ -6,7 +6,7 @@ import pytest from mmengine.fileio.backends import LocalBackend -from mmedit.datasets.transforms import (GetSpatialDiscountMask, +from mmagic.datasets.transforms import (GetSpatialDiscountMask, LoadImageFromFile, LoadMask) diff --git a/tests/test_datasets/test_transforms/test_matlab_like_resize.py b/tests/test_datasets/test_transforms/test_matlab_like_resize.py index c853048360..162ff2a1b3 100644 --- a/tests/test_datasets/test_transforms/test_matlab_like_resize.py +++ b/tests/test_datasets/test_transforms/test_matlab_like_resize.py @@ -2,7 +2,7 @@ import numpy as np import pytest -from mmedit.datasets.transforms import MATLABLikeResize +from mmagic.datasets.transforms import MATLABLikeResize def test_matlab_like_resize(): diff --git a/tests/test_datasets/test_transforms/test_normalization.py b/tests/test_datasets/test_transforms/test_normalization.py index 4767674395..7e0420c78e 100644 --- a/tests/test_datasets/test_transforms/test_normalization.py +++ b/tests/test_datasets/test_transforms/test_normalization.py @@ -2,7 +2,7 @@ import numpy as np import pytest -from mmedit.datasets.transforms import Normalize, RescaleToZeroOne +from mmagic.datasets.transforms import Normalize, RescaleToZeroOne class TestAugmentations: diff --git a/tests/test_datasets/test_transforms/test_random_degradations.py b/tests/test_datasets/test_transforms/test_random_degradations.py index db4ad9c733..ee45bdf9aa 100644 --- a/tests/test_datasets/test_transforms/test_random_degradations.py +++ b/tests/test_datasets/test_transforms/test_random_degradations.py @@ -2,7 +2,7 @@ import numpy as np import pytest -from mmedit.datasets.transforms import (DegradationsWithShuffle, RandomBlur, +from mmagic.datasets.transforms import (DegradationsWithShuffle, RandomBlur, RandomJPEGCompression, RandomNoise, RandomResize, RandomVideoCompression) diff --git a/tests/test_datasets/test_transforms/test_random_down_sampling.py b/tests/test_datasets/test_transforms/test_random_down_sampling.py index ee034f14ac..efc6f5b5fe 100644 --- a/tests/test_datasets/test_transforms/test_random_down_sampling.py +++ b/tests/test_datasets/test_transforms/test_random_down_sampling.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import numpy as np -from mmedit.datasets.transforms import RandomDownSampling +from mmagic.datasets.transforms import RandomDownSampling def test_random_down_sampling(): diff --git a/tests/test_datasets/test_transforms/test_trimap.py b/tests/test_datasets/test_transforms/test_trimap.py index 08a7ae63a1..a4848e24d3 100644 --- a/tests/test_datasets/test_transforms/test_trimap.py +++ b/tests/test_datasets/test_transforms/test_trimap.py @@ -4,7 +4,7 @@ import numpy as np import pytest -from mmedit.datasets.transforms import (FormatTrimap, GenerateTrimap, +from mmagic.datasets.transforms import (FormatTrimap, GenerateTrimap, GenerateTrimapWithDistTransform, TransformTrimap) diff --git a/tests/test_datasets/test_transforms/test_values.py b/tests/test_datasets/test_transforms/test_values.py index 6c18e6c968..cb350d4fb4 100644 --- a/tests/test_datasets/test_transforms/test_values.py +++ b/tests/test_datasets/test_transforms/test_values.py @@ -2,7 +2,7 @@ import numpy as np import pytest -from mmedit.datasets.transforms import CopyValues, SetValues +from mmagic.datasets.transforms import CopyValues, SetValues class TestAugmentations: diff --git a/tests/test_datasets/test_unpaired_image_dataset.py b/tests/test_datasets/test_unpaired_image_dataset.py index b9f43951ea..7c2013baec 100644 --- a/tests/test_datasets/test_unpaired_image_dataset.py +++ b/tests/test_datasets/test_unpaired_image_dataset.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp -from mmedit.datasets import UnpairedImageDataset -from mmedit.utils import register_all_modules +from mmagic.datasets import UnpairedImageDataset +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_edit.py b/tests/test_edit.py index f48e848144..5b56bd183a 100644 --- a/tests/test_edit.py +++ b/tests/test_edit.py @@ -3,8 +3,8 @@ import pytest -from mmedit.edit import MMEdit -from mmedit.utils import register_all_modules +from mmagic.edit import MMEdit +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_engine/test_hooks/test_ema.py b/tests/test_engine/test_hooks/test_ema.py index 51f63003ae..443f9b997e 100644 --- a/tests/test_engine/test_hooks/test_ema.py +++ b/tests/test_engine/test_hooks/test_ema.py @@ -8,7 +8,7 @@ from mmengine.model import MMDistributedDataParallel from packaging import version -from mmedit.engine import ExponentialMovingAverageHook +from mmagic.engine import ExponentialMovingAverageHook class SimpleModule(nn.Module): diff --git a/tests/test_engine/test_hooks/test_iter_time_hook.py b/tests/test_engine/test_hooks/test_iter_time_hook.py index f3cc0554cb..4d32ccabff 100644 --- a/tests/test_engine/test_hooks/test_iter_time_hook.py +++ b/tests/test_engine/test_hooks/test_iter_time_hook.py @@ -4,7 +4,7 @@ from mmengine.logging import MessageHub -from mmedit.engine import EditIterTimerHook +from mmagic.engine import EditIterTimerHook def time_patch(): diff --git a/tests/test_engine/test_hooks/test_pggan_fetch_data_hook.py b/tests/test_engine/test_hooks/test_pggan_fetch_data_hook.py index 943f134c79..0d7531ffc3 100644 --- a/tests/test_engine/test_hooks/test_pggan_fetch_data_hook.py +++ b/tests/test_engine/test_hooks/test_pggan_fetch_data_hook.py @@ -8,9 +8,9 @@ from mmengine.runner import IterBasedTrainLoop from torch.utils.data.dataloader import DataLoader -from mmedit.engine import PGGANFetchDataHook -from mmedit.registry import DATASETS, MODELS -from mmedit.utils import register_all_modules +from mmagic.engine import PGGANFetchDataHook +from mmagic.registry import DATASETS, MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_engine/test_hooks/test_pickle_data_hook.py b/tests/test_engine/test_hooks/test_pickle_data_hook.py index 08484f3b16..0ae46a0dc1 100644 --- a/tests/test_engine/test_hooks/test_pickle_data_hook.py +++ b/tests/test_engine/test_hooks/test_pickle_data_hook.py @@ -5,7 +5,7 @@ import torch import torch.nn as nn -from mmedit.engine.hooks import PickleDataHook +from mmagic.engine.hooks import PickleDataHook class ToyModel(nn.Module): diff --git a/tests/test_engine/test_hooks/test_reduce_lr_scheduler_hook.py b/tests/test_engine/test_hooks/test_reduce_lr_scheduler_hook.py index f9214f6e2a..84d1eba2e2 100644 --- a/tests/test_engine/test_hooks/test_reduce_lr_scheduler_hook.py +++ b/tests/test_engine/test_hooks/test_reduce_lr_scheduler_hook.py @@ -6,7 +6,7 @@ import torch.nn.functional as F from mmengine import MessageHub -from mmedit.engine.hooks import ReduceLRSchedulerHook +from mmagic.engine.hooks import ReduceLRSchedulerHook class ToyModel(torch.nn.Module): diff --git a/tests/test_engine/test_hooks/test_visualization_hook.py b/tests/test_engine/test_hooks/test_visualization_hook.py index 3a7d2fd608..61a918a8bf 100644 --- a/tests/test_engine/test_hooks/test_visualization_hook.py +++ b/tests/test_engine/test_hooks/test_visualization_hook.py @@ -11,13 +11,13 @@ from mmengine.visualization import Visualizer from torch.utils.data.dataset import Dataset -from mmedit.engine import GenVisualizationHook -from mmedit.engine.hooks import BasicVisualizationHook -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules -from mmedit.visualization import ConcatImageVisualizer +from mmagic.engine import GenVisualizationHook +from mmagic.engine.hooks import BasicVisualizationHook +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules +from mmagic.visualization import ConcatImageVisualizer -from mmedit.registry import MODELS # isort:skip # noqa +from mmagic.registry import MODELS # isort:skip # noqa register_all_modules() diff --git a/tests/test_engine/test_optimizers/test_multi_optimizer_constructor.py b/tests/test_engine/test_optimizers/test_multi_optimizer_constructor.py index 567fb4c3ca..38cac0ab72 100644 --- a/tests/test_engine/test_optimizers/test_multi_optimizer_constructor.py +++ b/tests/test_engine/test_optimizers/test_multi_optimizer_constructor.py @@ -4,7 +4,7 @@ from mmengine import MMLogger from mmengine.optim import OptimWrapper -from mmedit.engine.optimizers import MultiOptimWrapperConstructor +from mmagic.engine.optimizers import MultiOptimWrapperConstructor logger = MMLogger.get_instance('test_multi_optimizer_constructor') diff --git a/tests/test_engine/test_optimizers/test_pggan_optimizer_constructor.py b/tests/test_engine/test_optimizers/test_pggan_optimizer_constructor.py index 53dba79cb0..fd23ee3b8a 100644 --- a/tests/test_engine/test_optimizers/test_pggan_optimizer_constructor.py +++ b/tests/test_engine/test_optimizers/test_pggan_optimizer_constructor.py @@ -5,9 +5,9 @@ from mmengine.model import MMSeparateDistributedDataParallel -from mmedit.engine import PGGANOptimWrapperConstructor -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.engine import PGGANOptimWrapperConstructor +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_engine/test_optimizers/test_singan_optimizer_constructor.py b/tests/test_engine/test_optimizers/test_singan_optimizer_constructor.py index 997fc2bdf2..9fbf62fe48 100644 --- a/tests/test_engine/test_optimizers/test_singan_optimizer_constructor.py +++ b/tests/test_engine/test_optimizers/test_singan_optimizer_constructor.py @@ -2,9 +2,9 @@ from unittest import TestCase from unittest.mock import MagicMock -from mmedit.engine import SinGANOptimWrapperConstructor -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.engine import SinGANOptimWrapperConstructor +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_engine/test_runner/test_edit_loops.py b/tests/test_engine/test_runner/test_edit_loops.py index 0b4fbd9b2a..fa124eafac 100644 --- a/tests/test_engine/test_runner/test_edit_loops.py +++ b/tests/test_engine/test_runner/test_edit_loops.py @@ -4,8 +4,8 @@ from mmengine.evaluator import Evaluator -from mmedit.engine import EditTestLoop, EditValLoop -from mmedit.evaluation import EditEvaluator +from mmagic.engine import EditTestLoop, EditValLoop +from mmagic.evaluation import EditEvaluator def build_dataloader(loader, **kwargs): diff --git a/tests/test_engine/test_runner/test_log_processor.py b/tests/test_engine/test_runner/test_log_processor.py index 257258afaa..48dd736708 100644 --- a/tests/test_engine/test_runner/test_log_processor.py +++ b/tests/test_engine/test_runner/test_log_processor.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. from unittest.mock import MagicMock -from mmedit.engine import EditLogProcessor as LogProcessor +from mmagic.engine import EditLogProcessor as LogProcessor class TestLogProcessor: diff --git a/tests/test_engine/test_runner/test_loop_utils.py b/tests/test_engine/test_runner/test_loop_utils.py index 4ab067c327..299f1e2d12 100644 --- a/tests/test_engine/test_runner/test_loop_utils.py +++ b/tests/test_engine/test_runner/test_loop_utils.py @@ -4,9 +4,9 @@ import pytest from mmengine.evaluator import Evaluator -from mmedit.engine.runner.loop_utils import (is_evaluator, +from mmagic.engine.runner.loop_utils import (is_evaluator, update_and_check_evaluator) -from mmedit.evaluation import EditEvaluator +from mmagic.evaluation import EditEvaluator def test_is_evaluator(): diff --git a/tests/test_engine/test_schedulers/test_linear_lr_scheduler_with_interval.py b/tests/test_engine/test_schedulers/test_linear_lr_scheduler_with_interval.py index ba58e62994..a65489ebe4 100644 --- a/tests/test_engine/test_schedulers/test_linear_lr_scheduler_with_interval.py +++ b/tests/test_engine/test_schedulers/test_linear_lr_scheduler_with_interval.py @@ -7,7 +7,7 @@ import torch.optim as optim from mmengine import MessageHub -from mmedit.engine.schedulers import LinearLrInterval +from mmagic.engine.schedulers import LinearLrInterval class ToyModel(torch.nn.Module): diff --git a/tests/test_engine/test_schedulers/test_reduce_lr_scheduler.py b/tests/test_engine/test_schedulers/test_reduce_lr_scheduler.py index 49e52c4e93..33c969b2b8 100644 --- a/tests/test_engine/test_schedulers/test_reduce_lr_scheduler.py +++ b/tests/test_engine/test_schedulers/test_reduce_lr_scheduler.py @@ -7,7 +7,7 @@ import torch.optim as optim from mmengine import MessageHub -from mmedit.engine.schedulers import ReduceLR +from mmagic.engine.schedulers import ReduceLR class ToyModel(torch.nn.Module): diff --git a/tests/test_evaluation/test_evaluator.py b/tests/test_evaluation/test_evaluator.py index 799a6b54d5..137627cc41 100644 --- a/tests/test_evaluation/test_evaluator.py +++ b/tests/test_evaluation/test_evaluator.py @@ -3,15 +3,15 @@ from unittest import TestCase from unittest.mock import MagicMock, patch -from mmedit.evaluation import (EditEvaluator, FrechetInceptionDistance, +from mmagic.evaluation import (EditEvaluator, FrechetInceptionDistance, InceptionScore) -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() -fid_loading_str = 'mmedit.evaluation.metrics.fid.FrechetInceptionDistance._load_inception' # noqa -is_loading_str = 'mmedit.evaluation.metrics.inception_score.InceptionScore._load_inception' # noqa +fid_loading_str = 'mmagic.evaluation.metrics.fid.FrechetInceptionDistance._load_inception' # noqa +is_loading_str = 'mmagic.evaluation.metrics.inception_score.InceptionScore._load_inception' # noqa loading_mock = MagicMock(return_value=(MagicMock(), 'StyleGAN')) @@ -47,7 +47,7 @@ def test_prepare_metric(self): model = MagicMock() model.data_preprocessor.device = 'cpu' dataloader = MagicMock() - with patch('mmedit.evaluation.metrics.fid.prepare_inception_feat'): + with patch('mmagic.evaluation.metrics.fid.prepare_inception_feat'): evaluator.prepare_metrics(model, dataloader) self.assertTrue(evaluator.is_ready) diff --git a/tests/test_evaluation/test_functional/test_fid_inception.py b/tests/test_evaluation/test_functional/test_fid_inception.py index cb79deb285..ef55d96f59 100644 --- a/tests/test_evaluation/test_functional/test_fid_inception.py +++ b/tests/test_evaluation/test_functional/test_fid_inception.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.evaluation.functional.fid_inception import (InceptionV3, +from mmagic.evaluation.functional.fid_inception import (InceptionV3, fid_inception_v3) diff --git a/tests/test_evaluation/test_functional/test_gaussian_funcs.py b/tests/test_evaluation/test_functional/test_gaussian_funcs.py index edd2bdedb9..fa3d6e7654 100644 --- a/tests/test_evaluation/test_functional/test_gaussian_funcs.py +++ b/tests/test_evaluation/test_functional/test_gaussian_funcs.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import numpy as np -from mmedit.evaluation.functional import gauss_gradient +from mmagic.evaluation.functional import gauss_gradient def test_gauss_gradient(): diff --git a/tests/test_evaluation/test_functional/test_inception_utils.py b/tests/test_evaluation/test_functional/test_inception_utils.py index 4e0a5cda7e..2eeb26103b 100644 --- a/tests/test_evaluation/test_functional/test_inception_utils.py +++ b/tests/test_evaluation/test_functional/test_inception_utils.py @@ -3,8 +3,8 @@ from torch.utils.data import Dataset -from mmedit.datasets.transforms import LoadImageFromFile -from mmedit.evaluation.functional.inception_utils import ( +from mmagic.datasets.transforms import LoadImageFromFile +from mmagic.evaluation.functional.inception_utils import ( get_inception_feat_cache_name_and_args, get_vgg_feat_cache_name_and_args) 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 f90e7f8021..6937fec3b0 100644 --- a/tests/test_evaluation/test_metrics/test_base_gen_metric.py +++ b/tests/test_evaluation/test_metrics/test_base_gen_metric.py @@ -5,7 +5,7 @@ import torch from mmengine.model import MMDistributedDataParallel -from mmedit.evaluation.metrics.base_gen_metric import (GenerativeMetric, +from mmagic.evaluation.metrics.base_gen_metric import (GenerativeMetric, GenMetric) @@ -13,7 +13,7 @@ def mock_collect_fn(results, *args, **kwargs): return results[0] -@patch('mmedit.evaluation.metrics.base_gen_metric.collect_results', +@patch('mmagic.evaluation.metrics.base_gen_metric.collect_results', mock_collect_fn) class ToyMetric(GenMetric): @@ -24,7 +24,7 @@ def compute_metrics(self, results): return dict(score=1) -@patch('mmedit.evaluation.metrics.base_gen_metric.collect_results', +@patch('mmagic.evaluation.metrics.base_gen_metric.collect_results', mock_collect_fn) class ToyGenerativeMetric(GenerativeMetric): diff --git a/tests/test_evaluation/test_metrics/test_base_sample_wise_metric.py b/tests/test_evaluation/test_metrics/test_base_sample_wise_metric.py index a1d58413c0..41c4e8a9c1 100644 --- a/tests/test_evaluation/test_metrics/test_base_sample_wise_metric.py +++ b/tests/test_evaluation/test_metrics/test_base_sample_wise_metric.py @@ -6,8 +6,8 @@ import torch from torch.utils.data.dataloader import DataLoader -from mmedit.datasets import BasicImageDataset -from mmedit.evaluation.metrics.base_sample_wise_metric import \ +from mmagic.datasets import BasicImageDataset +from mmagic.evaluation.metrics.base_sample_wise_metric import \ BaseSampleWiseMetric diff --git a/tests/test_evaluation/test_metrics/test_connectivity_error.py b/tests/test_evaluation/test_metrics/test_connectivity_error.py index 5a7db39fe4..573a32977c 100644 --- a/tests/test_evaluation/test_metrics/test_connectivity_error.py +++ b/tests/test_evaluation/test_metrics/test_connectivity_error.py @@ -6,8 +6,8 @@ import pytest import torch -from mmedit.datasets.transforms import LoadImageFromFile -from mmedit.evaluation.metrics import ConnectivityError +from mmagic.datasets.transforms import LoadImageFromFile +from mmagic.evaluation.metrics import ConnectivityError class TestMattingMetrics: diff --git a/tests/test_evaluation/test_metrics/test_equivariance.py b/tests/test_evaluation/test_metrics/test_equivariance.py index 743c341ecd..0372be2d64 100644 --- a/tests/test_evaluation/test_metrics/test_equivariance.py +++ b/tests/test_evaluation/test_metrics/test_equivariance.py @@ -5,12 +5,12 @@ from mmengine.utils.dl_utils import TORCH_VERSION from mmengine.utils.version_utils import digit_version -from mmedit.datasets import BasicImageDataset -from mmedit.datasets.transforms import PackEditInputs -from mmedit.evaluation import Equivariance -from mmedit.models import EditDataPreprocessor, StyleGAN3 -from mmedit.models.editors.stylegan3 import StyleGAN3Generator -from mmedit.utils import register_all_modules +from mmagic.datasets import BasicImageDataset +from mmagic.datasets.transforms import PackEditInputs +from mmagic.evaluation import Equivariance +from mmagic.models import EditDataPreprocessor, StyleGAN3 +from mmagic.models.editors.stylegan3 import StyleGAN3Generator +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_evaluation/test_metrics/test_fid.py b/tests/test_evaluation/test_metrics/test_fid.py index 27fd2f152a..722f78eccb 100644 --- a/tests/test_evaluation/test_metrics/test_fid.py +++ b/tests/test_evaluation/test_metrics/test_fid.py @@ -11,11 +11,11 @@ import torch.nn as nn from mmengine.runner import Runner -from mmedit.datasets import PairedImageDataset -from mmedit.evaluation import FrechetInceptionDistance, TransFID -from mmedit.models import EditDataPreprocessor, Pix2Pix -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.datasets import PairedImageDataset +from mmagic.evaluation import FrechetInceptionDistance, TransFID +from mmagic.models import EditDataPreprocessor, Pix2Pix +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_evaluation/test_metrics/test_gradient_error.py b/tests/test_evaluation/test_metrics/test_gradient_error.py index 3b910f52b6..bcd75df578 100644 --- a/tests/test_evaluation/test_metrics/test_gradient_error.py +++ b/tests/test_evaluation/test_metrics/test_gradient_error.py @@ -6,8 +6,8 @@ import pytest import torch -from mmedit.datasets.transforms import LoadImageFromFile -from mmedit.evaluation.metrics import GradientError +from mmagic.datasets.transforms import LoadImageFromFile +from mmagic.evaluation.metrics import GradientError class TestMattingMetrics: diff --git a/tests/test_evaluation/test_metrics/test_inception_score.py b/tests/test_evaluation/test_metrics/test_inception_score.py index 985f890eb6..afae09a2b4 100644 --- a/tests/test_evaluation/test_metrics/test_inception_score.py +++ b/tests/test_evaluation/test_metrics/test_inception_score.py @@ -8,11 +8,11 @@ import torch.nn as nn from mmengine.runner import Runner -from mmedit.datasets import PairedImageDataset -from mmedit.evaluation import InceptionScore, TransIS -from mmedit.models import EditDataPreprocessor, Pix2Pix -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.datasets import PairedImageDataset +from mmagic.evaluation import InceptionScore, TransIS +from mmagic.models import EditDataPreprocessor, Pix2Pix +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_evaluation/test_metrics/test_mae.py b/tests/test_evaluation/test_metrics/test_mae.py index ef03773d1b..9bbe0816a4 100644 --- a/tests/test_evaluation/test_metrics/test_mae.py +++ b/tests/test_evaluation/test_metrics/test_mae.py @@ -4,7 +4,7 @@ import numpy as np import torch -from mmedit.evaluation.metrics import MAE +from mmagic.evaluation.metrics import MAE class TestPixelMetrics: diff --git a/tests/test_evaluation/test_metrics/test_matting_mse.py b/tests/test_evaluation/test_metrics/test_matting_mse.py index 264588102b..c17ec511db 100644 --- a/tests/test_evaluation/test_metrics/test_matting_mse.py +++ b/tests/test_evaluation/test_metrics/test_matting_mse.py @@ -6,8 +6,8 @@ import pytest import torch -from mmedit.datasets.transforms import LoadImageFromFile -from mmedit.evaluation.metrics import MattingMSE +from mmagic.datasets.transforms import LoadImageFromFile +from mmagic.evaluation.metrics import MattingMSE class TestMattingMetrics: diff --git a/tests/test_evaluation/test_metrics/test_metrics_utils.py b/tests/test_evaluation/test_metrics/test_metrics_utils.py index 290682a3b0..3bd3adf5c3 100644 --- a/tests/test_evaluation/test_metrics/test_metrics_utils.py +++ b/tests/test_evaluation/test_metrics/test_metrics_utils.py @@ -2,8 +2,8 @@ import numpy as np import pytest -from mmedit.evaluation.metrics import metrics_utils -from mmedit.evaluation.metrics.metrics_utils import reorder_image +from mmagic.evaluation.metrics import metrics_utils +from mmagic.evaluation.metrics.metrics_utils import reorder_image def test_average(): diff --git a/tests/test_evaluation/test_metrics/test_ms_ssim.py b/tests/test_evaluation/test_metrics/test_ms_ssim.py index 84a5c74240..4177dca191 100644 --- a/tests/test_evaluation/test_metrics/test_ms_ssim.py +++ b/tests/test_evaluation/test_metrics/test_ms_ssim.py @@ -3,9 +3,9 @@ import torch -from mmedit.evaluation import MultiScaleStructureSimilarity -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.evaluation import MultiScaleStructureSimilarity +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_evaluation/test_metrics/test_mse.py b/tests/test_evaluation/test_metrics/test_mse.py index 5b0fdfeeab..c0aabb8f78 100644 --- a/tests/test_evaluation/test_metrics/test_mse.py +++ b/tests/test_evaluation/test_metrics/test_mse.py @@ -4,7 +4,7 @@ import numpy as np import torch -from mmedit.evaluation.metrics import MSE +from mmagic.evaluation.metrics import MSE class TestPixelMetrics: diff --git a/tests/test_evaluation/test_metrics/test_niqe.py b/tests/test_evaluation/test_metrics/test_niqe.py index 8ccc2bd587..ac757172f2 100644 --- a/tests/test_evaluation/test_metrics/test_niqe.py +++ b/tests/test_evaluation/test_metrics/test_niqe.py @@ -6,7 +6,7 @@ import pytest import torch -from mmedit.evaluation.metrics import NIQE, niqe +from mmagic.evaluation.metrics import NIQE, niqe def test_niqe(): diff --git a/tests/test_evaluation/test_metrics/test_ppl.py b/tests/test_evaluation/test_metrics/test_ppl.py index 1bf86cfca4..f22c77f89a 100644 --- a/tests/test_evaluation/test_metrics/test_ppl.py +++ b/tests/test_evaluation/test_metrics/test_ppl.py @@ -6,12 +6,12 @@ import torch from mmengine.runner import Runner -from mmedit.datasets import BasicImageDataset -from mmedit.datasets.transforms import PackEditInputs -from mmedit.evaluation import PerceptualPathLength -from mmedit.models import LSGAN, EditDataPreprocessor -from mmedit.models.editors.stylegan2 import StyleGAN2Generator -from mmedit.utils import register_all_modules +from mmagic.datasets import BasicImageDataset +from mmagic.datasets.transforms import PackEditInputs +from mmagic.evaluation import PerceptualPathLength +from mmagic.models import LSGAN, EditDataPreprocessor +from mmagic.models.editors.stylegan2 import StyleGAN2Generator +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_evaluation/test_metrics/test_precision_and_recall.py b/tests/test_evaluation/test_metrics/test_precision_and_recall.py index db17a55622..338485c2f4 100644 --- a/tests/test_evaluation/test_metrics/test_precision_and_recall.py +++ b/tests/test_evaluation/test_metrics/test_precision_and_recall.py @@ -6,12 +6,12 @@ import torch.nn as nn from mmengine.runner import Runner -from mmedit.datasets import BasicImageDataset -from mmedit.datasets.transforms import PackEditInputs -from mmedit.evaluation import PrecisionAndRecall -from mmedit.models import LSGAN, EditDataPreprocessor -from mmedit.models.editors.dcgan import DCGANGenerator -from mmedit.utils import register_all_modules +from mmagic.datasets import BasicImageDataset +from mmagic.datasets.transforms import PackEditInputs +from mmagic.evaluation import PrecisionAndRecall +from mmagic.models import LSGAN, EditDataPreprocessor +from mmagic.models.editors.dcgan import DCGANGenerator +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_evaluation/test_metrics/test_psnr.py b/tests/test_evaluation/test_metrics/test_psnr.py index b220c651aa..069a6b870e 100644 --- a/tests/test_evaluation/test_metrics/test_psnr.py +++ b/tests/test_evaluation/test_metrics/test_psnr.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.evaluation.metrics import PSNR, psnr +from mmagic.evaluation.metrics import PSNR, psnr class TestPixelMetrics: diff --git a/tests/test_evaluation/test_metrics/test_sad.py b/tests/test_evaluation/test_metrics/test_sad.py index 82ecd162ff..cf61ba166a 100644 --- a/tests/test_evaluation/test_metrics/test_sad.py +++ b/tests/test_evaluation/test_metrics/test_sad.py @@ -6,8 +6,8 @@ import pytest import torch -from mmedit.datasets.transforms import LoadImageFromFile -from mmedit.evaluation.metrics import SAD +from mmagic.datasets.transforms import LoadImageFromFile +from mmagic.evaluation.metrics import SAD class TestMattingMetrics: diff --git a/tests/test_evaluation/test_metrics/test_snr.py b/tests/test_evaluation/test_metrics/test_snr.py index 4d87eda969..e1016869f1 100644 --- a/tests/test_evaluation/test_metrics/test_snr.py +++ b/tests/test_evaluation/test_metrics/test_snr.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.evaluation.metrics import SNR, snr +from mmagic.evaluation.metrics import SNR, snr class TestPixelMetrics: diff --git a/tests/test_evaluation/test_metrics/test_ssim.py b/tests/test_evaluation/test_metrics/test_ssim.py index 3e9a8c5f9f..faaf0f4bae 100644 --- a/tests/test_evaluation/test_metrics/test_ssim.py +++ b/tests/test_evaluation/test_metrics/test_ssim.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.evaluation.metrics import SSIM, ssim +from mmagic.evaluation.metrics import SSIM, ssim def test_ssim(): diff --git a/tests/test_evaluation/test_metrics/test_swd.py b/tests/test_evaluation/test_metrics/test_swd.py index 1d645ff413..f96d316ad1 100644 --- a/tests/test_evaluation/test_metrics/test_swd.py +++ b/tests/test_evaluation/test_metrics/test_swd.py @@ -5,9 +5,9 @@ import numpy as np import torch -from mmedit.evaluation import SlicedWassersteinDistance -from mmedit.models import EditDataPreprocessor -from mmedit.structures import EditDataSample +from mmagic.evaluation import SlicedWassersteinDistance +from mmagic.models import EditDataPreprocessor +from mmagic.structures import EditDataSample class TestSWD(TestCase): diff --git a/tests/test_models/test_base_archs/test_aspp.py b/tests/test_models/test_base_archs/test_aspp.py index 7b76484c9a..cf0bfde7b8 100644 --- a/tests/test_models/test_base_archs/test_aspp.py +++ b/tests/test_models/test_base_archs/test_aspp.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.base_archs import ASPP +from mmagic.models.base_archs import ASPP def test_aspp(): diff --git a/tests/test_models/test_base_archs/test_conv.py b/tests/test_models/test_base_archs/test_conv.py index 6cd8bace9f..bddb53dcb8 100644 --- a/tests/test_models/test_base_archs/test_conv.py +++ b/tests/test_models/test_base_archs/test_conv.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.models.base_archs import conv +from mmagic.models.base_archs import conv def test_conv(): diff --git a/tests/test_models/test_base_archs/test_downsample.py b/tests/test_models/test_base_archs/test_downsample.py index c5defab48f..22bdb2939e 100644 --- a/tests/test_models/test_base_archs/test_downsample.py +++ b/tests/test_models/test_base_archs/test_downsample.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.base_archs import pixel_unshuffle +from mmagic.models.base_archs import pixel_unshuffle def test_pixel_unshuffle(): diff --git a/tests/test_models/test_base_archs/test_ensemble.py b/tests/test_models/test_base_archs/test_ensemble.py index 043d32cc8f..bde99e09a6 100644 --- a/tests/test_models/test_base_archs/test_ensemble.py +++ b/tests/test_models/test_base_archs/test_ensemble.py @@ -4,7 +4,7 @@ import torch import torch.nn as nn -from mmedit.models.base_archs import SpatialTemporalEnsemble +from mmagic.models.base_archs import SpatialTemporalEnsemble def test_ensemble_cpu(): diff --git a/tests/test_models/test_base_archs/test_gated_conv_module.py b/tests/test_models/test_base_archs/test_gated_conv_module.py index 495c0876d7..a3b442c467 100644 --- a/tests/test_models/test_base_archs/test_gated_conv_module.py +++ b/tests/test_models/test_base_archs/test_gated_conv_module.py @@ -3,7 +3,7 @@ import torch import torch.nn as nn -from mmedit.models.base_archs import SimpleGatedConvModule +from mmagic.models.base_archs import SimpleGatedConvModule def test_gated_conv(): diff --git a/tests/test_models/test_base_archs/test_img_normalize.py b/tests/test_models/test_base_archs/test_img_normalize.py index 7584687888..86b663e2cb 100644 --- a/tests/test_models/test_base_archs/test_img_normalize.py +++ b/tests/test_models/test_base_archs/test_img_normalize.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.base_archs import ImgNormalize +from mmagic.models.base_archs import ImgNormalize def test_normalize_layer(): diff --git a/tests/test_models/test_base_archs/test_linear_module.py b/tests/test_models/test_base_archs/test_linear_module.py index 3f43cef343..e2cf84e9e3 100644 --- a/tests/test_models/test_base_archs/test_linear_module.py +++ b/tests/test_models/test_base_archs/test_linear_module.py @@ -2,7 +2,7 @@ import torch import torch.nn as nn -from mmedit.models.base_archs import LinearModule +from mmagic.models.base_archs import LinearModule def test_linear_module(): diff --git a/tests/test_models/test_base_archs/test_lora.py b/tests/test_models/test_base_archs/test_lora.py index 7eb2f64e7f..54a3e5d1c0 100644 --- a/tests/test_models/test_base_archs/test_lora.py +++ b/tests/test_models/test_base_archs/test_lora.py @@ -5,7 +5,7 @@ from mmengine.utils import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -from mmedit.models.base_archs import (LoRAWrapper, set_lora, set_lora_disable, +from mmagic.models.base_archs import (LoRAWrapper, set_lora, set_lora_disable, set_lora_enable, set_only_lora_trainable) diff --git a/tests/test_models/test_base_archs/test_multi_layer_disc.py b/tests/test_models/test_base_archs/test_multi_layer_disc.py index fb626127ba..b51288f335 100644 --- a/tests/test_models/test_base_archs/test_multi_layer_disc.py +++ b/tests/test_models/test_base_archs/test_multi_layer_disc.py @@ -3,7 +3,7 @@ import torch import torch.nn as nn -from mmedit.models.base_archs import MultiLayerDiscriminator +from mmagic.models.base_archs import MultiLayerDiscriminator def test_multi_layer_disc(): diff --git a/tests/test_models/test_base_archs/test_patch_disc.py b/tests/test_models/test_base_archs/test_patch_disc.py index a7adf8aa90..39fd32a28d 100644 --- a/tests/test_models/test_base_archs/test_patch_disc.py +++ b/tests/test_models/test_base_archs/test_patch_disc.py @@ -4,8 +4,8 @@ import pytest import torch -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_base_archs/test_resnet.py b/tests/test_models/test_base_archs/test_resnet.py index 7f572c914f..5a732ba100 100644 --- a/tests/test_models/test_base_archs/test_resnet.py +++ b/tests/test_models/test_base_archs/test_resnet.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.base_archs import ResNet +from mmagic.models.base_archs import ResNet def test_resnet(): diff --git a/tests/test_models/test_base_archs/test_separable_conv_module.py b/tests/test_models/test_base_archs/test_separable_conv_module.py index 731e55a013..a24cf9bfd1 100644 --- a/tests/test_models/test_base_archs/test_separable_conv_module.py +++ b/tests/test_models/test_base_archs/test_separable_conv_module.py @@ -3,7 +3,7 @@ import torch import torch.nn as nn -from mmedit.models.base_archs import DepthwiseSeparableConvModule +from mmagic.models.base_archs import DepthwiseSeparableConvModule def test_depthwise_separable_conv(): diff --git a/tests/test_models/test_base_archs/test_simple_encoder_decoder.py b/tests/test_models/test_base_archs/test_simple_encoder_decoder.py index 8a9b3cb608..8483ce6f63 100644 --- a/tests/test_models/test_base_archs/test_simple_encoder_decoder.py +++ b/tests/test_models/test_base_archs/test_simple_encoder_decoder.py @@ -2,7 +2,7 @@ import numpy as np import torch -from mmedit.models.base_archs import SimpleEncoderDecoder +from mmagic.models.base_archs import SimpleEncoderDecoder def assert_dict_keys_equal(dictionary, target_keys): diff --git a/tests/test_models/test_base_archs/test_smpatch_disc.py b/tests/test_models/test_base_archs/test_smpatch_disc.py index 4a78befe30..dd33fa9f03 100644 --- a/tests/test_models/test_base_archs/test_smpatch_disc.py +++ b/tests/test_models/test_base_archs/test_smpatch_disc.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_base_archs/test_sr_backbone.py b/tests/test_models/test_base_archs/test_sr_backbone.py index 81dabec2e1..488ab5a9d8 100644 --- a/tests/test_models/test_base_archs/test_sr_backbone.py +++ b/tests/test_models/test_base_archs/test_sr_backbone.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.base_archs import ResidualBlockNoBN -from mmedit.models.utils import make_layer +from mmagic.models.base_archs import ResidualBlockNoBN +from mmagic.models.utils import make_layer def test_sr_backbone_utils(): diff --git a/tests/test_models/test_base_archs/test_upsample.py b/tests/test_models/test_base_archs/test_upsample.py index 7ee24a8e28..94ad96f48b 100644 --- a/tests/test_models/test_base_archs/test_upsample.py +++ b/tests/test_models/test_base_archs/test_upsample.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.base_archs import PixelShufflePack +from mmagic.models.base_archs import PixelShufflePack def test_pixel_shuffle(): diff --git a/tests/test_models/test_base_archs/test_vgg.py b/tests/test_models/test_base_archs/test_vgg.py index b5d602499b..beb3c2ba43 100644 --- a/tests/test_models/test_base_archs/test_vgg.py +++ b/tests/test_models/test_base_archs/test_vgg.py @@ -6,7 +6,7 @@ import torch from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm -from mmedit.models.base_archs import VGG16 +from mmagic.models.base_archs import VGG16 def check_norm_state(modules, train_state): diff --git a/tests/test_models/test_base_archs/test_wrapper.py b/tests/test_models/test_base_archs/test_wrapper.py index 3764cca128..294cbfcf0f 100644 --- a/tests/test_models/test_base_archs/test_wrapper.py +++ b/tests/test_models/test_base_archs/test_wrapper.py @@ -9,8 +9,8 @@ from mmengine.utils import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules test_dir = osp.join(osp.dirname(__file__), '../../..', 'tests') config_path = osp.join(test_dir, 'configs', 'diffuser_wrapper_cfg') @@ -25,7 +25,7 @@ class TestWrapper(TestCase): def test_build(self): # mock SiLU if digit_version(TORCH_VERSION) <= digit_version('1.6.0'): - from mmedit.models.editors.ddpm.denoising_unet import SiLU + from mmagic.models.editors.ddpm.denoising_unet import SiLU torch.nn.SiLU = SiLU # 1. test from config diff --git a/tests/test_models/test_base_models/test_average_model.py b/tests/test_models/test_base_models/test_average_model.py index a4c04fc9dc..ec66d3039b 100644 --- a/tests/test_models/test_base_models/test_average_model.py +++ b/tests/test_models/test_base_models/test_average_model.py @@ -8,7 +8,7 @@ from mmengine.model import BaseModel from mmengine.testing import assert_allclose -from mmedit.models.base_models import ExponentialMovingAverage, RampUpEMA +from mmagic.models.base_models import ExponentialMovingAverage, RampUpEMA class ToyModule(nn.Module): diff --git a/tests/test_models/test_base_models/test_base_conditional_gan.py b/tests/test_models/test_base_models/test_base_conditional_gan.py index f393216730..50972856a0 100644 --- a/tests/test_models/test_base_models/test_base_conditional_gan.py +++ b/tests/test_models/test_base_models/test_base_conditional_gan.py @@ -9,11 +9,11 @@ from mmengine.testing import assert_allclose from torch.nn import ModuleList -from mmedit.models import BaseConditionalGAN, EditDataPreprocessor -from mmedit.models.losses import (DiscShiftLossComps, GANLossComps, +from mmagic.models import BaseConditionalGAN, EditDataPreprocessor +from mmagic.models.losses import (DiscShiftLossComps, GANLossComps, GeneratorPathRegularizerComps, GradientPenaltyLossComps) -from mmedit.structures import EditDataSample +from mmagic.structures import EditDataSample generator = dict( type='SAGANGenerator', diff --git a/tests/test_models/test_base_models/test_base_edit_model.py b/tests/test_models/test_base_models/test_base_edit_model.py index cacb15713d..1323a5000a 100644 --- a/tests/test_models/test_base_models/test_base_edit_model.py +++ b/tests/test_models/test_base_models/test_base_edit_model.py @@ -4,11 +4,11 @@ from torch import nn from torch.optim import Adam -from mmedit.models import BaseEditModel, EditDataPreprocessor -from mmedit.models.losses import L1Loss -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.models import BaseEditModel, EditDataPreprocessor +from mmagic.models.losses import L1Loss +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_base_models/test_base_gan.py b/tests/test_models/test_base_models/test_base_gan.py index 0a456850d2..0f506c0edd 100644 --- a/tests/test_models/test_base_models/test_base_gan.py +++ b/tests/test_models/test_base_models/test_base_gan.py @@ -10,12 +10,12 @@ from torch.nn import ModuleList from torch.optim import SGD -from mmedit.models import BaseGAN, EditDataPreprocessor -from mmedit.models.losses import (DiscShiftLossComps, GANLossComps, +from mmagic.models import BaseGAN, EditDataPreprocessor +from mmagic.models.losses import (DiscShiftLossComps, GANLossComps, GeneratorPathRegularizerComps, GradientPenaltyLossComps) -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample generator = dict(type='DCGANGenerator', output_scale=8, base_channels=8) discriminator = dict( diff --git a/tests/test_models/test_base_models/test_base_mattor.py b/tests/test_models/test_base_models/test_base_mattor.py index 78f853bde7..8034530cb8 100644 --- a/tests/test_models/test_base_models/test_base_mattor.py +++ b/tests/test_models/test_base_models/test_base_mattor.py @@ -7,12 +7,12 @@ import torch from mmengine.config import ConfigDict -from mmedit.datasets.transforms import PackEditInputs -from mmedit.models.base_models import BaseMattor -from mmedit.models.editors import DIM -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.datasets.transforms import PackEditInputs +from mmagic.models.base_models import BaseMattor +from mmagic.models.editors import DIM +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_base_models/test_base_translation_model.py b/tests/test_models/test_base_models/test_base_translation_model.py index 13da735ead..c5123369d2 100644 --- a/tests/test_models/test_base_models/test_base_translation_model.py +++ b/tests/test_models/test_base_models/test_base_translation_model.py @@ -5,7 +5,7 @@ import torch from mmengine.model import MMDistributedDataParallel -from mmedit.models import BaseTranslationModel +from mmagic.models import BaseTranslationModel class ToyTranslationModel(BaseTranslationModel): diff --git a/tests/test_models/test_base_models/test_basic_interpolator.py b/tests/test_models/test_base_models/test_basic_interpolator.py index ccf0600af0..8e963af53b 100644 --- a/tests/test_models/test_base_models/test_basic_interpolator.py +++ b/tests/test_models/test_base_models/test_basic_interpolator.py @@ -2,9 +2,9 @@ import torch from torch import nn -from mmedit.models import BasicInterpolator -from mmedit.models.losses import L1Loss -from mmedit.registry import MODELS +from mmagic.models import BasicInterpolator +from mmagic.models.losses import L1Loss +from mmagic.registry import MODELS @MODELS.register_module() diff --git a/tests/test_models/test_base_models/test_one_stage.py b/tests/test_models/test_base_models/test_one_stage.py index a981b36fb8..8a174454ea 100644 --- a/tests/test_models/test_base_models/test_one_stage.py +++ b/tests/test_models/test_base_models/test_one_stage.py @@ -7,10 +7,10 @@ import torch from mmengine import Config -from mmedit.models import GLEncoderDecoder -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.models import GLEncoderDecoder +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules def test_one_stage_inpaintor(): diff --git a/tests/test_models/test_base_models/test_two_stage.py b/tests/test_models/test_base_models/test_two_stage.py index a3e0f9c30c..271caacebb 100644 --- a/tests/test_models/test_base_models/test_two_stage.py +++ b/tests/test_models/test_base_models/test_two_stage.py @@ -9,9 +9,9 @@ from mmengine import Config from mmengine.optim import OptimWrapper -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules # TODO: this test is same as `test_two_stage_encoder_decoder.py` diff --git a/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py b/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py index 56a56191cf..360efe8c5a 100644 --- a/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py +++ b/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py @@ -5,8 +5,8 @@ import torch.nn.functional as F from mmengine.testing import assert_allclose -from mmedit.models.data_preprocessors import EditDataPreprocessor -from mmedit.structures import EditDataSample +from mmagic.models.data_preprocessors import EditDataPreprocessor +from mmagic.structures import EditDataSample class TestBaseDataPreprocessor(TestCase): diff --git a/tests/test_models/test_data_preprocessors/test_mattor_preprocessor.py b/tests/test_models/test_data_preprocessors/test_mattor_preprocessor.py index 43a17a4277..e52c7493f1 100644 --- a/tests/test_models/test_data_preprocessors/test_mattor_preprocessor.py +++ b/tests/test_models/test_data_preprocessors/test_mattor_preprocessor.py @@ -3,8 +3,8 @@ import torch from mmengine.testing import assert_allclose -from mmedit.models.data_preprocessors import MattorPreprocessor -from mmedit.structures import EditDataSample +from mmagic.models.data_preprocessors import MattorPreprocessor +from mmagic.structures import EditDataSample def test_mattor_preprocessor(): diff --git a/tests/test_models/test_diffusion_schedulers/test_ddim_scheduler.py b/tests/test_models/test_diffusion_schedulers/test_ddim_scheduler.py index f149e3ec24..a7cfc07817 100644 --- a/tests/test_models/test_diffusion_schedulers/test_ddim_scheduler.py +++ b/tests/test_models/test_diffusion_schedulers/test_ddim_scheduler.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.diffusion_schedulers.ddim_scheduler import EditDDIMScheduler +from mmagic.models.diffusion_schedulers.ddim_scheduler import EditDDIMScheduler def test_ddim(): diff --git a/tests/test_models/test_diffusion_schedulers/test_init.py b/tests/test_models/test_diffusion_schedulers/test_init.py index 5eb190835e..b8ab67e6c7 100644 --- a/tests/test_models/test_diffusion_schedulers/test_init.py +++ b/tests/test_models/test_diffusion_schedulers/test_init.py @@ -3,7 +3,7 @@ import shutil from unittest import TestCase -from mmedit.registry import DIFFUSION_SCHEDULERS +from mmagic.registry import DIFFUSION_SCHEDULERS test_dir = osp.join(osp.dirname(__file__), '../../..', 'tests') config_path = osp.join(test_dir, 'configs', 'scheduler_cfg') diff --git a/tests/test_models/test_editors/test_aotgan/test_aot_decoder.py b/tests/test_models/test_editors/test_aotgan/test_aot_decoder.py index 884bbd0347..014d7b1ad1 100644 --- a/tests/test_models/test_editors/test_aotgan/test_aot_decoder.py +++ b/tests/test_models/test_editors/test_aotgan/test_aot_decoder.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_aotgan/test_aot_encoder.py b/tests/test_models/test_editors/test_aotgan/test_aot_encoder.py index 770dd19fab..98566322ef 100644 --- a/tests/test_models/test_editors/test_aotgan/test_aot_encoder.py +++ b/tests/test_models/test_editors/test_aotgan/test_aot_encoder.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_aotgan/test_aot_encoder_decoder.py b/tests/test_models/test_editors/test_aotgan/test_aot_encoder_decoder.py index 5b5e9670ca..920c3d6665 100644 --- a/tests/test_models/test_editors/test_aotgan/test_aot_encoder_decoder.py +++ b/tests/test_models/test_editors/test_aotgan/test_aot_encoder_decoder.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_aotgan/test_aot_inpaintor.py b/tests/test_models/test_editors/test_aotgan/test_aot_inpaintor.py index 7d0ab2eddb..21976897bc 100644 --- a/tests/test_models/test_editors/test_aotgan/test_aot_inpaintor.py +++ b/tests/test_models/test_editors/test_aotgan/test_aot_inpaintor.py @@ -5,10 +5,10 @@ from mmengine import Config from mmengine.optim import OptimWrapper -from mmedit.models import AOTEncoderDecoder -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.models import AOTEncoderDecoder +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules def test_aot_inpaintor(): diff --git a/tests/test_models/test_editors/test_aotgan/test_aot_neck.py b/tests/test_models/test_editors/test_aotgan/test_aot_neck.py index 81852be2b1..3eadb50e50 100644 --- a/tests/test_models/test_editors/test_aotgan/test_aot_neck.py +++ b/tests/test_models/test_editors/test_aotgan/test_aot_neck.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import AOTBlockNeck +from mmagic.models.editors import AOTBlockNeck def test_aot_dilation_neck(): diff --git a/tests/test_models/test_editors/test_arcface/test_arcface_modules.py b/tests/test_models/test_editors/test_arcface/test_arcface_modules.py index 69fbf083c3..a26322752c 100644 --- a/tests/test_models/test_editors/test_arcface/test_arcface_modules.py +++ b/tests/test_models/test_editors/test_arcface/test_arcface_modules.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.models.editors.arcface.arcface_modules import get_blocks +from mmagic.models.editors.arcface.arcface_modules import get_blocks @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_arcface/test_id_loss.py b/tests/test_models/test_editors/test_arcface/test_id_loss.py index edaf83b5c4..c07130db65 100644 --- a/tests/test_models/test_editors/test_arcface/test_id_loss.py +++ b/tests/test_models/test_editors/test_arcface/test_id_loss.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models import IDLossModel +from mmagic.models import IDLossModel class TestArcFace: diff --git a/tests/test_models/test_editors/test_arcface/test_model_irse.py b/tests/test_models/test_editors/test_arcface/test_model_irse.py index 37831f6c76..b8f35067a2 100644 --- a/tests/test_models/test_editors/test_arcface/test_model_irse.py +++ b/tests/test_models/test_editors/test_arcface/test_model_irse.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.models.editors.arcface.model_irse import Backbone +from mmagic.models.editors.arcface.model_irse import Backbone class TestIRSEModel: diff --git a/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py b/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py index 87be72c0fc..ec22050a23 100644 --- a/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py +++ b/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py @@ -4,9 +4,9 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models import BasicVSR, BasicVSRNet, EditDataPreprocessor -from mmedit.models.losses import CharbonnierLoss -from mmedit.structures import EditDataSample +from mmagic.models import BasicVSR, BasicVSRNet, EditDataPreprocessor +from mmagic.models.losses import CharbonnierLoss +from mmagic.structures import EditDataSample def test_basicvsr(): diff --git a/tests/test_models/test_editors/test_basicvsr/test_basicvsr_net.py b/tests/test_models/test_editors/test_basicvsr/test_basicvsr_net.py index 89bf930a56..3f7939086e 100644 --- a/tests/test_models/test_editors/test_basicvsr/test_basicvsr_net.py +++ b/tests/test_models/test_editors/test_basicvsr/test_basicvsr_net.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import BasicVSRNet +from mmagic.models.editors import BasicVSRNet def test_basicvsr_net(): diff --git a/tests/test_models/test_editors/test_basicvsr_plusplus_net/test_basicvsr_plusplus_net.py b/tests/test_models/test_editors/test_basicvsr_plusplus_net/test_basicvsr_plusplus_net.py index 3d2d1f061f..b1f4bae575 100644 --- a/tests/test_models/test_editors/test_basicvsr_plusplus_net/test_basicvsr_plusplus_net.py +++ b/tests/test_models/test_editors/test_basicvsr_plusplus_net/test_basicvsr_plusplus_net.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors import BasicVSRPlusPlusNet +from mmagic.models.editors import BasicVSRPlusPlusNet @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_biggan/test_biggan.py b/tests/test_models/test_editors/test_biggan/test_biggan.py index d07c7a37fd..85482a306d 100644 --- a/tests/test_models/test_editors/test_biggan/test_biggan.py +++ b/tests/test_models/test_editors/test_biggan/test_biggan.py @@ -7,9 +7,9 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmedit.models import BigGAN, EditDataPreprocessor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models import BigGAN, EditDataPreprocessor +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample generator = dict( type='BigGANGenerator', diff --git a/tests/test_models/test_editors/test_biggan/test_biggan_deep_discriminator.py b/tests/test_models/test_editors/test_biggan/test_biggan_deep_discriminator.py index 48a96bba3b..4cb169eb23 100644 --- a/tests/test_models/test_editors/test_biggan/test_biggan_deep_discriminator.py +++ b/tests/test_models/test_editors/test_biggan/test_biggan_deep_discriminator.py @@ -4,8 +4,8 @@ import pytest import torch -from mmedit.models.editors.biggan import BigGANDeepDiscriminator -from mmedit.registry import MODELS +from mmagic.models.editors.biggan import BigGANDeepDiscriminator +from mmagic.registry import MODELS class TestBigGANDeepDiscriminator(object): diff --git a/tests/test_models/test_editors/test_biggan/test_biggan_deep_generator.py b/tests/test_models/test_editors/test_biggan/test_biggan_deep_generator.py index d379cf951e..d08304d68e 100644 --- a/tests/test_models/test_editors/test_biggan/test_biggan_deep_generator.py +++ b/tests/test_models/test_editors/test_biggan/test_biggan_deep_generator.py @@ -6,8 +6,8 @@ import torch # yapf:disable -from mmedit.models.editors.biggan import BigGANDeepGenerator -from mmedit.registry import MODELS +from mmagic.models.editors.biggan import BigGANDeepGenerator +from mmagic.registry import MODELS # yapf:enable diff --git a/tests/test_models/test_editors/test_biggan/test_biggan_discriminator.py b/tests/test_models/test_editors/test_biggan/test_biggan_discriminator.py index 33b26f8fc3..cd24556d6a 100644 --- a/tests/test_models/test_editors/test_biggan/test_biggan_discriminator.py +++ b/tests/test_models/test_editors/test_biggan/test_biggan_discriminator.py @@ -4,8 +4,8 @@ import pytest import torch -from mmedit.models.editors.biggan import BigGANDiscriminator -from mmedit.registry import MODELS +from mmagic.models.editors.biggan import BigGANDiscriminator +from mmagic.registry import MODELS class TestBigGANDiscriminator(object): diff --git a/tests/test_models/test_editors/test_biggan/test_biggan_generator.py b/tests/test_models/test_editors/test_biggan/test_biggan_generator.py index dc69561f54..9950166aec 100644 --- a/tests/test_models/test_editors/test_biggan/test_biggan_generator.py +++ b/tests/test_models/test_editors/test_biggan/test_biggan_generator.py @@ -6,8 +6,8 @@ import torch # yapf:disable -from mmedit.models.editors.biggan import BigGANGenerator -from mmedit.registry import MODELS +from mmagic.models.editors.biggan import BigGANGenerator +from mmagic.registry import MODELS # yapf:enable diff --git a/tests/test_models/test_editors/test_biggan/test_biggan_modules.py b/tests/test_models/test_editors/test_biggan/test_biggan_modules.py index b68a0a4f64..322a0b036c 100644 --- a/tests/test_models/test_editors/test_biggan/test_biggan_modules.py +++ b/tests/test_models/test_editors/test_biggan/test_biggan_modules.py @@ -5,13 +5,13 @@ import torch # yapf:disable -from mmedit.models.editors.biggan import (BigGANConditionBN, +from mmagic.models.editors.biggan import (BigGANConditionBN, BigGANDeepDiscResBlock, BigGANDeepGenResBlock, BigGANDiscResBlock, BigGANGenResBlock, SelfAttentionBlock) -from mmedit.registry import MODELS +from mmagic.registry import MODELS # yapf:enable diff --git a/tests/test_models/test_editors/test_biggan/test_biggan_snmodule.py b/tests/test_models/test_editors/test_biggan/test_biggan_snmodule.py index d1a980e5de..e6732a4205 100644 --- a/tests/test_models/test_editors/test_biggan/test_biggan_snmodule.py +++ b/tests/test_models/test_editors/test_biggan/test_biggan_snmodule.py @@ -2,7 +2,7 @@ import torch import torch.nn as nn -from mmedit.models.editors.biggan.biggan_snmodule import SpectralNorm +from mmagic.models.editors.biggan.biggan_snmodule import SpectralNorm class MyBlock(nn.Module): diff --git a/tests/test_models/test_editors/test_cain/test_cain.py b/tests/test_models/test_editors/test_cain/test_cain.py index 4f6f0e4e45..4645830a65 100644 --- a/tests/test_models/test_editors/test_cain/test_cain.py +++ b/tests/test_models/test_editors/test_cain/test_cain.py @@ -6,11 +6,11 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models import EditDataPreprocessor -from mmedit.models.editors import CAIN, CAINNet -from mmedit.models.losses import L1Loss -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models import EditDataPreprocessor +from mmagic.models.editors import CAIN, CAINNet +from mmagic.models.losses import L1Loss +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_cain/test_cain_net.py b/tests/test_models/test_editors/test_cain/test_cain_net.py index 773147bc87..50114cf90f 100644 --- a/tests/test_models/test_editors/test_cain/test_cain_net.py +++ b/tests/test_models/test_editors/test_cain/test_cain_net.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.registry import MODELS +from mmagic.registry import MODELS @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_controlnet/test_controlnet.py b/tests/test_models/test_editors/test_controlnet/test_controlnet.py index fb8b58fb2c..6e7eb7d972 100644 --- a/tests/test_models/test_editors/test_controlnet/test_controlnet.py +++ b/tests/test_models/test_editors/test_controlnet/test_controlnet.py @@ -11,9 +11,9 @@ from mmengine.utils import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules test_dir = osp.join(osp.dirname(__file__), '../../../..', 'tests') config_path = osp.join(test_dir, 'configs', 'diffuser_wrapper_cfg') @@ -66,7 +66,7 @@ class TestControlStableDiffusion(TestCase): def setUp(self): # mock SiLU if digit_version(TORCH_VERSION) <= digit_version('1.6.0'): - from mmedit.models.editors.ddpm.denoising_unet import SiLU + from mmagic.models.editors.ddpm.denoising_unet import SiLU torch.nn.SiLU = SiLU control_sd = MODELS.build(config) assert not any([p.requires_grad for p in control_sd.vae.parameters()]) diff --git a/tests/test_models/test_editors/test_controlnet/test_controlnet_utils.py b/tests/test_models/test_editors/test_controlnet/test_controlnet_utils.py index c76bd3904a..198203522d 100644 --- a/tests/test_models/test_editors/test_controlnet/test_controlnet_utils.py +++ b/tests/test_models/test_editors/test_controlnet/test_controlnet_utils.py @@ -6,7 +6,7 @@ import pytest import torch -from mmedit.models.editors.controlnet.controlnet_utils import change_base_model +from mmagic.models.editors.controlnet.controlnet_utils import change_base_model def make_state_dict(d): diff --git a/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py b/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py index d805d0d32f..0bbb29aa57 100644 --- a/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py +++ b/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py @@ -6,10 +6,10 @@ from mmengine import MessageHub from mmengine.optim import OptimWrapper, OptimWrapperDict -from mmedit.models import CycleGAN, EditDataPreprocessor -from mmedit.models.base_archs import PatchDiscriminator -from mmedit.models.editors.cyclegan import ResnetGenerator -from mmedit.structures import EditDataSample +from mmagic.models import CycleGAN, EditDataPreprocessor +from mmagic.models.base_archs import PatchDiscriminator +from mmagic.models.editors.cyclegan import ResnetGenerator +from mmagic.structures import EditDataSample def obj_from_dict(info: dict, parent=None, default_args=None): diff --git a/tests/test_models/test_editors/test_cyclegan/test_cyclegan_generator.py b/tests/test_models/test_editors/test_cyclegan/test_cyclegan_generator.py index 69a2883778..223e13bbd8 100644 --- a/tests/test_models/test_editors/test_cyclegan/test_cyclegan_generator.py +++ b/tests/test_models/test_editors/test_cyclegan/test_cyclegan_generator.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.models.editors.cyclegan import ResnetGenerator +from mmagic.models.editors.cyclegan import ResnetGenerator @pytest.mark.skipif( 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 d92515d7e6..56798452ab 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 @@ -2,7 +2,7 @@ import numpy as np import torch -from mmedit.models.editors.cyclegan.cyclegan_modules import ( +from mmagic.models.editors.cyclegan.cyclegan_modules import ( GANImageBuffer, ResidualBlockWithDropout) diff --git a/tests/test_models/test_editors/test_dcgan/test_dcgan.py b/tests/test_models/test_editors/test_dcgan/test_dcgan.py index eabcdff39e..f90d3cf4e5 100644 --- a/tests/test_models/test_editors/test_dcgan/test_dcgan.py +++ b/tests/test_models/test_editors/test_dcgan/test_dcgan.py @@ -7,9 +7,9 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmedit.models import DCGAN, EditDataPreprocessor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models import DCGAN, EditDataPreprocessor +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample generator = dict( type='DCGANGenerator', noise_size=10, output_scale=16, base_channels=16) diff --git a/tests/test_models/test_editors/test_dcgan/test_dcgan_discriminator.py b/tests/test_models/test_editors/test_dcgan/test_dcgan_discriminator.py index 8a2eafd416..a9fc124b97 100644 --- a/tests/test_models/test_editors/test_dcgan/test_dcgan_discriminator.py +++ b/tests/test_models/test_editors/test_dcgan/test_dcgan_discriminator.py @@ -2,8 +2,8 @@ import pytest import torch -from mmedit.models.editors.dcgan import DCGANDiscriminator -from mmedit.registry import MODELS +from mmagic.models.editors.dcgan import DCGANDiscriminator +from mmagic.registry import MODELS class TestDCGANDiscriminator(object): diff --git a/tests/test_models/test_editors/test_dcgan/test_dcgan_generator.py b/tests/test_models/test_editors/test_dcgan/test_dcgan_generator.py index c95fcf91d7..60cc2477c6 100644 --- a/tests/test_models/test_editors/test_dcgan/test_dcgan_generator.py +++ b/tests/test_models/test_editors/test_dcgan/test_dcgan_generator.py @@ -2,8 +2,8 @@ import pytest import torch -from mmedit.models.editors.dcgan import DCGANGenerator -from mmedit.registry import MODELS +from mmagic.models.editors.dcgan import DCGANGenerator +from mmagic.registry import MODELS class TestDCGANGenerator(object): 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 7aae5e85ec..f1368503ee 100644 --- a/tests/test_models/test_editors/test_ddpm/test_attention.py +++ b/tests/test_models/test_editors/test_ddpm/test_attention.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors.ddpm.attention import (ApproximateGELU, +from mmagic.models.editors.ddpm.attention import (ApproximateGELU, CrossAttention, FeedForward, Transformer2DModel) 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 9bda959c55..08bc7ed6e3 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 @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.diffusion_schedulers.ddpm_scheduler import EditDDPMScheduler +from mmagic.models.diffusion_schedulers.ddpm_scheduler import EditDDPMScheduler def test_ddpm(): 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 index 1f7f2ef832..c91254b913 100644 --- a/tests/test_models/test_editors/test_ddpm/test_denoising_unet.py +++ b/tests/test_models/test_editors/test_ddpm/test_denoising_unet.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.ddpm.denoising_unet import (DenoisingUnet, +from mmagic.models.editors.ddpm.denoising_unet import (DenoisingUnet, NormWithEmbedding) diff --git a/tests/test_models/test_editors/test_ddpm/test_embeddings.py b/tests/test_models/test_editors/test_ddpm/test_embeddings.py index 811ebb8962..a0f9822878 100644 --- a/tests/test_models/test_editors/test_ddpm/test_embeddings.py +++ b/tests/test_models/test_editors/test_ddpm/test_embeddings.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.ddpm.embeddings import TimestepEmbedding, Timesteps +from mmagic.models.editors.ddpm.embeddings import TimestepEmbedding, Timesteps def test_TimestepEmbedding(): 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 index 808af63b2c..db508a57d6 100644 --- a/tests/test_models/test_editors/test_ddpm/test_res_blocks.py +++ b/tests/test_models/test_editors/test_ddpm/test_res_blocks.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.ddpm.res_blocks import (Downsample2D, ResnetBlock2D, +from mmagic.models.editors.ddpm.res_blocks import (Downsample2D, ResnetBlock2D, Upsample2D) 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 index e7ea584e5f..17693e0e44 100644 --- a/tests/test_models/test_editors/test_ddpm/test_unet_blocks.py +++ b/tests/test_models/test_editors/test_ddpm/test_unet_blocks.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors.ddpm.unet_blocks import (CrossAttnDownBlock2D, +from mmagic.models.editors.ddpm.unet_blocks import (CrossAttnDownBlock2D, CrossAttnUpBlock2D, UNetMidBlock2DCrossAttn, get_down_block, diff --git a/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention.py b/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention.py index 841fd0b593..a3597ddfdd 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import ContextualAttentionModule +from mmagic.models.editors import ContextualAttentionModule def test_deepfill_contextual_attention_module(): diff --git a/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention_neck.py b/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention_neck.py index 5c2bf1076f..13f6e9fbc1 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention_neck.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention_neck.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.base_archs import SimpleGatedConvModule -from mmedit.models.editors import ContextualAttentionNeck +from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.editors import ContextualAttentionNeck def test_deepfill_contextual_attention_neck(): diff --git a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_decoder.py b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_decoder.py index 6e8f5647aa..f03f1f78a5 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_decoder.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_decoder.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import DeepFillDecoder +from mmagic.models.editors import DeepFillDecoder def test_deepfill_dec(): diff --git a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_disc.py b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_disc.py index eb68c36be0..9cf86c8a7a 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_disc.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_disc.py @@ -2,8 +2,8 @@ import pytest import torch -from mmedit.models.base_archs import MultiLayerDiscriminator -from mmedit.models.editors import DeepFillv1Discriminators +from mmagic.models.base_archs import MultiLayerDiscriminator +from mmagic.models.editors import DeepFillv1Discriminators def test_deepfillv1_disc(): diff --git a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_encoder.py b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_encoder.py index 73843601be..999b23a7ef 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_encoder.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_encoder.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.base_archs import SimpleGatedConvModule -from mmedit.models.editors import DeepFillEncoder +from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.editors import DeepFillEncoder def test_deepfill_enc(): diff --git a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_refiner.py b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_refiner.py index f9ea8d9f9c..4481530027 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_refiner.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_refiner.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import (ContextualAttentionNeck, DeepFillDecoder, +from mmagic.models.editors import (ContextualAttentionNeck, DeepFillDecoder, DeepFillEncoder, DeepFillRefiner, GLDilationNeck) diff --git a/tests/test_models/test_editors/test_deepfillv1/test_deepfillv1.py b/tests/test_models/test_editors/test_deepfillv1/test_deepfillv1.py index 3bfe7d34b3..b4b29c48a6 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_deepfillv1.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_deepfillv1.py @@ -5,11 +5,11 @@ from mmengine import Config from mmengine.optim import OptimWrapper -from mmedit.models.editors import (DeepFillEncoderDecoder, DeepFillRefiner, +from mmagic.models.editors import (DeepFillEncoderDecoder, DeepFillRefiner, GLEncoderDecoder) -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules def test_deepfill_encdec(): diff --git a/tests/test_models/test_editors/test_deepfillv2/test_two_stage_encoder_decoder.py b/tests/test_models/test_editors/test_deepfillv2/test_two_stage_encoder_decoder.py index d982ace524..045c5d6fda 100644 --- a/tests/test_models/test_editors/test_deepfillv2/test_two_stage_encoder_decoder.py +++ b/tests/test_models/test_editors/test_deepfillv2/test_two_stage_encoder_decoder.py @@ -8,9 +8,9 @@ from mmengine import Config from mmengine.optim import OptimWrapper -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_dic/test_dic.py b/tests/test_models/test_editors/test_dic/test_dic.py index 6f94a48812..ee764339b6 100644 --- a/tests/test_models/test_editors/test_dic/test_dic.py +++ b/tests/test_models/test_editors/test_dic/test_dic.py @@ -5,10 +5,10 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models import DIC, DICNet, EditDataPreprocessor, LightCNN -from mmedit.models.losses import (GANLoss, L1Loss, LightCNNFeatureLoss, +from mmagic.models import DIC, DICNet, EditDataPreprocessor, LightCNN +from mmagic.models.losses import (GANLoss, L1Loss, LightCNNFeatureLoss, PerceptualVGG) -from mmedit.structures import EditDataSample +from mmagic.structures import EditDataSample @patch.object(PerceptualVGG, 'init_weights') diff --git a/tests/test_models/test_editors/test_dic/test_dic_net.py b/tests/test_models/test_editors/test_dic/test_dic_net.py index 29a27abb27..db14f35036 100644 --- a/tests/test_models/test_editors/test_dic/test_dic_net.py +++ b/tests/test_models/test_editors/test_dic/test_dic_net.py @@ -5,9 +5,9 @@ import torch import torch.nn as nn -from mmedit.models.editors import (FeedbackBlock, FeedbackBlockCustom, +from mmagic.models.editors import (FeedbackBlock, FeedbackBlockCustom, FeedbackBlockHeatmapAttention) -from mmedit.registry import MODELS +from mmagic.registry import MODELS def test_feedback_block(): diff --git a/tests/test_models/test_editors/test_dic/test_feedback_hour_glass.py b/tests/test_models/test_editors/test_dic/test_feedback_hour_glass.py index 936b1e4f2c..d39f8afcbe 100644 --- a/tests/test_models/test_editors/test_dic/test_feedback_hour_glass.py +++ b/tests/test_models/test_editors/test_dic/test_feedback_hour_glass.py @@ -2,9 +2,9 @@ import pytest import torch -from mmedit.models.editors.dic.feedback_hour_glass import ( +from mmagic.models.editors.dic.feedback_hour_glass import ( Hourglass, ResBlock, reduce_to_five_heatmaps) -from mmedit.registry import MODELS +from mmagic.registry import MODELS def test_res_block(): diff --git a/tests/test_models/test_editors/test_dic/test_light_cnn.py b/tests/test_models/test_editors/test_dic/test_light_cnn.py index e7a7062cff..dd20dd2b3c 100644 --- a/tests/test_models/test_editors/test_dic/test_light_cnn.py +++ b/tests/test_models/test_editors/test_dic/test_light_cnn.py @@ -4,8 +4,8 @@ import pytest import torch -from mmedit.models.editors import MaxFeature -from mmedit.registry import MODELS +from mmagic.models.editors import MaxFeature +from mmagic.registry import MODELS @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_dim/test_dim.py b/tests/test_models/test_editors/test_dim/test_dim.py index 772b7c2b4b..e253174099 100644 --- a/tests/test_models/test_editors/test_dim/test_dim.py +++ b/tests/test_models/test_editors/test_dim/test_dim.py @@ -6,11 +6,11 @@ import torch from mmengine.config import ConfigDict -from mmedit.datasets.transforms import PackEditInputs -from mmedit.models.editors import DIM -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.datasets.transforms import PackEditInputs +from mmagic.models.editors import DIM +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() 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 fa9c194d07..cd82d9d6cc 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 @@ -9,9 +9,9 @@ from mmengine.utils import digit_version from torchvision.version import __version__ as TV_VERSION -from mmedit.models import DenoisingUnet, DiscoDiffusion -from mmedit.models.diffusion_schedulers import EditDDIMScheduler -from mmedit.utils import register_all_modules +from mmagic.models import DenoisingUnet, DiscoDiffusion +from mmagic.models.diffusion_schedulers import EditDDIMScheduler +from mmagic.utils import register_all_modules register_all_modules() @@ -226,9 +226,9 @@ def __init__(self, *args, **kwargs): def forward(self, x): return x - mock_path = ('mmedit.models.editors.disco_diffusion.guider.' + mock_path = ('mmagic.models.editors.disco_diffusion.guider.' 'TORCHVISION_VERSION') - affine_mock_path = ('mmedit.models.editors.disco_diffusion.guider.T.' + affine_mock_path = ('mmagic.models.editors.disco_diffusion.guider.T.' 'RandomAffine') with patch(affine_mock_path, new=affineMock): with patch(mock_path, '0.8.1'): diff --git a/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion_clip_wrapper.py b/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion_clip_wrapper.py index b9723d90a1..91e641a88e 100644 --- a/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion_clip_wrapper.py +++ b/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion_clip_wrapper.py @@ -2,7 +2,7 @@ from unittest import TestCase from unittest.mock import MagicMock, patch -from mmedit.models.editors import ClipWrapper +from mmagic.models.editors import ClipWrapper class TestClipWrapper(TestCase): diff --git a/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py b/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py index 98dc6e4f70..9adea52883 100644 --- a/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py +++ b/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py @@ -10,9 +10,9 @@ from mmengine.utils import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules test_dir = osp.join(osp.dirname(__file__), '../../../..', 'tests') config_path = osp.join(test_dir, 'configs', 'diffuser_wrapper_cfg') @@ -63,7 +63,7 @@ class TestControlStableDiffusion(TestCase): def setUp(self): # mock SiLU if digit_version(TORCH_VERSION) <= digit_version('1.6.0'): - from mmedit.models.editors.ddpm.denoising_unet import SiLU + from mmagic.models.editors.ddpm.denoising_unet import SiLU torch.nn.SiLU = SiLU dreambooth = MODELS.build(config) assert not any([p.requires_grad for p in dreambooth.vae.parameters()]) diff --git a/tests/test_models/test_editors/test_duf/test_duf.py b/tests/test_models/test_editors/test_duf/test_duf.py index 3792c8e4c7..ffc1755daa 100644 --- a/tests/test_models/test_editors/test_duf/test_duf.py +++ b/tests/test_models/test_editors/test_duf/test_duf.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors.duf import DynamicUpsamplingFilter +from mmagic.models.editors.duf import DynamicUpsamplingFilter def test_dynamic_upsampling_filter(): diff --git a/tests/test_models/test_editors/test_edsr/test_edsr_net.py b/tests/test_models/test_editors/test_edsr/test_edsr_net.py index aa539758db..2741ee363f 100644 --- a/tests/test_models/test_editors/test_edsr/test_edsr_net.py +++ b/tests/test_models/test_editors/test_edsr/test_edsr_net.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors import EDSRNet +from mmagic.models.editors import EDSRNet def test_edsr_cpu(): diff --git a/tests/test_models/test_editors/test_edvr/test_edvr.py b/tests/test_models/test_editors/test_edvr/test_edvr.py index d5f02ba16b..8dea415d34 100644 --- a/tests/test_models/test_editors/test_edvr/test_edvr.py +++ b/tests/test_models/test_editors/test_edvr/test_edvr.py @@ -4,10 +4,10 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models import EDVR, EDVRNet -from mmedit.models.losses import CharbonnierLoss -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.models import EDVR, EDVRNet +from mmagic.models.losses import CharbonnierLoss +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_edvr/test_edvr_net.py b/tests/test_models/test_editors/test_edvr/test_edvr_net.py index 7cc30ad9a2..584a36f71e 100644 --- a/tests/test_models/test_editors/test_edvr/test_edvr_net.py +++ b/tests/test_models/test_editors/test_edvr/test_edvr_net.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors.edvr.edvr_net import (EDVRNet, PCDAlignment, +from mmagic.models.editors.edvr.edvr_net import (EDVRNet, PCDAlignment, TSAFusion) diff --git a/tests/test_models/test_editors/test_eg3d/test_camera.py b/tests/test_models/test_editors/test_eg3d/test_camera.py index 04180958ee..5c114db65b 100644 --- a/tests/test_models/test_editors/test_eg3d/test_camera.py +++ b/tests/test_models/test_editors/test_eg3d/test_camera.py @@ -7,7 +7,7 @@ import torch from mmengine.testing import assert_allclose -from mmedit.models.editors.eg3d.camera import (BaseCamera, GaussianCamera, +from mmagic.models.editors.eg3d.camera import (BaseCamera, GaussianCamera, UniformCamera) @@ -112,7 +112,7 @@ def test_sample_camera2world(self): cam2world = camera.sample_camera2world() self.assertEqual(cam2world.shape, (1, 4, 4)) - mock_path = 'mmedit.models.editors.eg3d.camera.TORCH_VERSION' + mock_path = 'mmagic.models.editors.eg3d.camera.TORCH_VERSION' with patch(mock_path, '1.6.0'): print(torch.__version__) cfg_ = deepcopy(self.default_cfg) diff --git a/tests/test_models/test_editors/test_eg3d/test_dual_discriminator.py b/tests/test_models/test_editors/test_eg3d/test_dual_discriminator.py index 05d0d742b2..07d9c0a728 100644 --- a/tests/test_models/test_editors/test_eg3d/test_dual_discriminator.py +++ b/tests/test_models/test_editors/test_eg3d/test_dual_discriminator.py @@ -6,7 +6,7 @@ import pytest import torch -from mmedit.models.editors.eg3d.dual_discriminator import DualDiscriminator +from mmagic.models.editors.eg3d.dual_discriminator import DualDiscriminator class TestEG3DDiscriminator(TestCase): diff --git a/tests/test_models/test_editors/test_eg3d/test_eg3d.py b/tests/test_models/test_editors/test_eg3d/test_eg3d.py index 77946760bc..e05d464ca9 100644 --- a/tests/test_models/test_editors/test_eg3d/test_eg3d.py +++ b/tests/test_models/test_editors/test_eg3d/test_eg3d.py @@ -6,9 +6,9 @@ import torch import torch.nn as nn -from mmedit.models.editors.eg3d.eg3d import EG3D -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.models.editors.eg3d.eg3d import EG3D +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_eg3d/test_eg3d_generator.py b/tests/test_models/test_editors/test_eg3d/test_eg3d_generator.py index 8703bf4c74..da64b58d1a 100644 --- a/tests/test_models/test_editors/test_eg3d/test_eg3d_generator.py +++ b/tests/test_models/test_editors/test_eg3d/test_eg3d_generator.py @@ -5,7 +5,7 @@ import torch -from mmedit.models.editors.eg3d.eg3d_generator import TriplaneGenerator +from mmagic.models.editors.eg3d.eg3d_generator import TriplaneGenerator class TestEG3DGenerator(TestCase): @@ -68,7 +68,7 @@ def test_forward(self): render_kwargs = dict(a=1, b='b') render_mock = Mock( return_value=(torch.randn(2, 25, 8), torch.randn(2, 25, 1), None)) - patch_func = 'mmedit.models.editors.eg3d.renderer.EG3DRenderer.forward' + patch_func = 'mmagic.models.editors.eg3d.renderer.EG3DRenderer.forward' with patch(patch_func, new=render_mock): gen = TriplaneGenerator(**cfg_) gen(noise, cond, render_kwargs=render_kwargs) diff --git a/tests/test_models/test_editors/test_eg3d/test_eg3d_modules.py b/tests/test_models/test_editors/test_eg3d/test_eg3d_modules.py index 1e8be6d464..5325af321a 100644 --- a/tests/test_models/test_editors/test_eg3d/test_eg3d_modules.py +++ b/tests/test_models/test_editors/test_eg3d/test_eg3d_modules.py @@ -4,7 +4,7 @@ import torch -from mmedit.models.editors.eg3d.eg3d_modules import (SuperResolutionModule, +from mmagic.models.editors.eg3d.eg3d_modules import (SuperResolutionModule, TriPlaneBackbone) diff --git a/tests/test_models/test_editors/test_eg3d/test_eg3d_utils.py b/tests/test_models/test_editors/test_eg3d/test_eg3d_utils.py index 1a0eb1109b..201fd99a7f 100644 --- a/tests/test_models/test_editors/test_eg3d/test_eg3d_utils.py +++ b/tests/test_models/test_editors/test_eg3d/test_eg3d_utils.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.eg3d.eg3d_utils import (get_ray_limits_box, +from mmagic.models.editors.eg3d.eg3d_utils import (get_ray_limits_box, inverse_transform_sampling, linspace_batch) diff --git a/tests/test_models/test_editors/test_eg3d/test_ray_sampler.py b/tests/test_models/test_editors/test_eg3d/test_ray_sampler.py index 5051f2f550..0e38b7958d 100644 --- a/tests/test_models/test_editors/test_eg3d/test_ray_sampler.py +++ b/tests/test_models/test_editors/test_eg3d/test_ray_sampler.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.eg3d.ray_sampler import sample_rays +from mmagic.models.editors.eg3d.ray_sampler import sample_rays def test_sample_rays(): diff --git a/tests/test_models/test_editors/test_eg3d/test_renderer.py b/tests/test_models/test_editors/test_eg3d/test_renderer.py index 3ceb95e14b..8ddbf7d94f 100644 --- a/tests/test_models/test_editors/test_eg3d/test_renderer.py +++ b/tests/test_models/test_editors/test_eg3d/test_renderer.py @@ -5,7 +5,7 @@ import torch -from mmedit.models.editors.eg3d.renderer import EG3DDecoder, EG3DRenderer +from mmagic.models.editors.eg3d.renderer import EG3DDecoder, EG3DRenderer class TestEG3DRenderer(TestCase): @@ -87,7 +87,7 @@ def test_forward(self): # test without hierarchical sampling + test render_kwargs render_kwargs = dict(depth_resolution_importance=0) mock_func = Mock(return_value=(rgb, depth, weights[..., None])) - mock_path = ('mmedit.models.editors.eg3d.renderer.EG3DRenderer.' + mock_path = ('mmagic.models.editors.eg3d.renderer.EG3DRenderer.' 'volume_rendering') with patch(mock_path, new=mock_func): renderer = EG3DRenderer(**cfg_) @@ -99,7 +99,7 @@ def test_forward(self): mock_func.assert_called_once() # cover TORCH_VERSION < 1.8.0 - mock_path = 'mmedit.models.editors.eg3d.renderer.TORCH_VERSION' + mock_path = 'mmagic.models.editors.eg3d.renderer.TORCH_VERSION' with patch(mock_path, '1.6.0'): cfg_ = deepcopy(self.renderer_cfg) renderer = EG3DRenderer(**cfg_) diff --git a/tests/test_models/test_editors/test_esrgan/test_esrgan.py b/tests/test_models/test_editors/test_esrgan/test_esrgan.py index 046732923a..e6a7434313 100644 --- a/tests/test_models/test_editors/test_esrgan/test_esrgan.py +++ b/tests/test_models/test_editors/test_esrgan/test_esrgan.py @@ -5,9 +5,9 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models import ESRGAN, EditDataPreprocessor, ModifiedVGG, RRDBNet -from mmedit.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG -from mmedit.structures import EditDataSample +from mmagic.models import ESRGAN, EditDataPreprocessor, ModifiedVGG, RRDBNet +from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG +from mmagic.structures import EditDataSample @patch.object(PerceptualVGG, 'init_weights') diff --git a/tests/test_models/test_editors/test_esrgan/test_rrdb_net.py b/tests/test_models/test_editors/test_esrgan/test_rrdb_net.py index 211d4b0850..d388ef3871 100644 --- a/tests/test_models/test_editors/test_esrgan/test_rrdb_net.py +++ b/tests/test_models/test_editors/test_esrgan/test_rrdb_net.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.models import RRDBNet +from mmagic.models import RRDBNet def test_rrdbnet_backbone(): diff --git a/tests/test_models/test_editors/test_fba/test_fba_decoder.py b/tests/test_models/test_editors/test_fba/test_fba_decoder.py index f712c8f156..c25e306e4d 100644 --- a/tests/test_models/test_editors/test_fba/test_fba_decoder.py +++ b/tests/test_models/test_editors/test_fba/test_fba_decoder.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.models.editors import FBADecoder +from mmagic.models.editors import FBADecoder def assert_tensor_with_shape(tensor, shape): diff --git a/tests/test_models/test_editors/test_fba/test_fba_encoder.py b/tests/test_models/test_editors/test_fba/test_fba_encoder.py index ea621645db..329bea1fd1 100644 --- a/tests/test_models/test_editors/test_fba/test_fba_encoder.py +++ b/tests/test_models/test_editors/test_fba/test_fba_encoder.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.models.editors import FBAResnetDilated +from mmagic.models.editors import FBAResnetDilated def _demo_inputs(input_shape=(1, 4, 64, 64)): diff --git a/tests/test_models/test_editors/test_flavr/test_flavr.py b/tests/test_models/test_editors/test_flavr/test_flavr.py index 3b29e482ca..5ea3a5af9c 100644 --- a/tests/test_models/test_editors/test_flavr/test_flavr.py +++ b/tests/test_models/test_editors/test_flavr/test_flavr.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import FLAVR, FLAVRNet +from mmagic.models.editors import FLAVR, FLAVRNet def test_flavr(): diff --git a/tests/test_models/test_editors/test_flavr/test_flavr_net.py b/tests/test_models/test_editors/test_flavr/test_flavr_net.py index b213d09e21..9472ea4215 100644 --- a/tests/test_models/test_editors/test_flavr/test_flavr_net.py +++ b/tests/test_models/test_editors/test_flavr/test_flavr_net.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.flavr.flavr_net import UpConv3d -from mmedit.registry import MODELS +from mmagic.models.editors.flavr.flavr_net import UpConv3d +from mmagic.registry import MODELS def test_flavr_net(): diff --git a/tests/test_models/test_editors/test_gca/test_gca.py b/tests/test_models/test_editors/test_gca/test_gca.py index 7307be62a0..34e099b533 100644 --- a/tests/test_models/test_editors/test_gca/test_gca.py +++ b/tests/test_models/test_editors/test_gca/test_gca.py @@ -4,10 +4,10 @@ import torch from mmengine.config import ConfigDict -from mmedit.datasets.transforms import PackEditInputs -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.datasets.transforms import PackEditInputs +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_gca/test_gca_module.py b/tests/test_models/test_editors/test_gca/test_gca_module.py index 43ea16ace5..244b1b7fae 100644 --- a/tests/test_models/test_editors/test_gca/test_gca_module.py +++ b/tests/test_models/test_editors/test_gca/test_gca_module.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.models.editors.gca import GCAModule, ResGCAEncoder +from mmagic.models.editors.gca import GCAModule, ResGCAEncoder def _demo_inputs(input_shape=(1, 4, 64, 64)): diff --git a/tests/test_models/test_editors/test_gca/test_resgca_dec.py b/tests/test_models/test_editors/test_gca/test_resgca_dec.py index 8af81ef5e5..1094b67485 100644 --- a/tests/test_models/test_editors/test_gca/test_resgca_dec.py +++ b/tests/test_models/test_editors/test_gca/test_resgca_dec.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.models.editors.gca import (ResGCADecoder, ResGCAEncoder, ResNetDec, +from mmagic.models.editors.gca import (ResGCADecoder, ResGCAEncoder, ResNetDec, ResNetEnc, ResShortcutDec, ResShortcutEnc) diff --git a/tests/test_models/test_editors/test_gca/test_resgca_enc.py b/tests/test_models/test_editors/test_gca/test_resgca_enc.py index 376501aada..94c0f3892b 100644 --- a/tests/test_models/test_editors/test_gca/test_resgca_enc.py +++ b/tests/test_models/test_editors/test_gca/test_resgca_enc.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.models.editors.gca import ResNetEnc, ResShortcutEnc +from mmagic.models.editors.gca import ResNetEnc, ResShortcutEnc def _demo_inputs(input_shape=(1, 4, 64, 64)): diff --git a/tests/test_models/test_editors/test_ggan/test_ggan.py b/tests/test_models/test_editors/test_ggan/test_ggan.py index f786ebc03b..89ed6f2c91 100644 --- a/tests/test_models/test_editors/test_ggan/test_ggan.py +++ b/tests/test_models/test_editors/test_ggan/test_ggan.py @@ -7,9 +7,9 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmedit.models import GGAN, EditDataPreprocessor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models import GGAN, EditDataPreprocessor +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample generator = dict( type='DCGANGenerator', noise_size=10, output_scale=16, base_channels=16) diff --git a/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py b/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py index 41b47e6020..905b703a51 100644 --- a/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py +++ b/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py @@ -7,11 +7,11 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models import SRGAN, EditDataPreprocessor, GLEANStyleGANv2 -from mmedit.models.editors.stylegan2 import StyleGAN2Discriminator -from mmedit.models.losses import (GANLoss, MSELoss, PerceptualLoss, +from mmagic.models import SRGAN, EditDataPreprocessor, GLEANStyleGANv2 +from mmagic.models.editors.stylegan2 import StyleGAN2Discriminator +from mmagic.models.losses import (GANLoss, MSELoss, PerceptualLoss, PerceptualVGG) -from mmedit.structures import EditDataSample +from mmagic.structures import EditDataSample @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_global_local/test_gl_decoder.py b/tests/test_models/test_editors/test_global_local/test_gl_decoder.py index 6bc4d5ed18..a48ea8c4b3 100644 --- a/tests/test_models/test_editors/test_global_local/test_gl_decoder.py +++ b/tests/test_models/test_editors/test_global_local/test_gl_decoder.py @@ -2,8 +2,8 @@ import pytest import torch -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules def test_gl_decoder(): diff --git a/tests/test_models/test_editors/test_global_local/test_gl_dilation.py b/tests/test_models/test_editors/test_global_local/test_gl_dilation.py index adf3508544..6a0ad5d7c9 100644 --- a/tests/test_models/test_editors/test_global_local/test_gl_dilation.py +++ b/tests/test_models/test_editors/test_global_local/test_gl_dilation.py @@ -1,10 +1,10 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.base_archs import SimpleGatedConvModule -from mmedit.models.editors.global_local import GLDilationNeck -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.editors.global_local import GLDilationNeck +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_global_local/test_gl_disc.py b/tests/test_models/test_editors/test_global_local/test_gl_disc.py index 6e2922a2df..d44ce7434c 100644 --- a/tests/test_models/test_editors/test_global_local/test_gl_disc.py +++ b/tests/test_models/test_editors/test_global_local/test_gl_disc.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.registry import MODELS +from mmagic.registry import MODELS def test_gl_discs(): diff --git a/tests/test_models/test_editors/test_global_local/test_gl_encoder.py b/tests/test_models/test_editors/test_global_local/test_gl_encoder.py index 26a57c5d39..95691e7539 100644 --- a/tests/test_models/test_editors/test_global_local/test_gl_encoder.py +++ b/tests/test_models/test_editors/test_global_local/test_gl_encoder.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules def test_gl_encoder(): diff --git a/tests/test_models/test_editors/test_global_local/test_gl_encoder_decoder.py b/tests/test_models/test_editors/test_global_local/test_gl_encoder_decoder.py index b001f048c6..98c0f2eb88 100644 --- a/tests/test_models/test_editors/test_global_local/test_gl_encoder_decoder.py +++ b/tests/test_models/test_editors/test_global_local/test_gl_encoder_decoder.py @@ -2,8 +2,8 @@ import pytest import torch -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules def test_gl_encdec(): diff --git a/tests/test_models/test_editors/test_global_local/test_gl_inpaintor.py b/tests/test_models/test_editors/test_global_local/test_gl_inpaintor.py index f26a05478d..3b546cf91a 100644 --- a/tests/test_models/test_editors/test_global_local/test_gl_inpaintor.py +++ b/tests/test_models/test_editors/test_global_local/test_gl_inpaintor.py @@ -5,9 +5,9 @@ from mmengine import Config from mmengine.optim import OptimWrapper -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules def test_gl_inpaintor(): diff --git a/tests/test_models/test_editors/test_guided_diffusion/test_adm.py b/tests/test_models/test_editors/test_guided_diffusion/test_adm.py index 31f6cf4bee..f00aa38a08 100644 --- a/tests/test_models/test_editors/test_guided_diffusion/test_adm.py +++ b/tests/test_models/test_editors/test_guided_diffusion/test_adm.py @@ -4,8 +4,8 @@ import pytest import torch -from mmedit.models import AblatedDiffusionModel -from mmedit.utils import register_all_modules +from mmagic.models import AblatedDiffusionModel +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_iconvsr/test_iconvsr_net.py b/tests/test_models/test_editors/test_iconvsr/test_iconvsr_net.py index 9410577d59..ea87881836 100644 --- a/tests/test_models/test_editors/test_iconvsr/test_iconvsr_net.py +++ b/tests/test_models/test_editors/test_iconvsr/test_iconvsr_net.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors import IconVSRNet +from mmagic.models.editors import IconVSRNet def test_iconvsr(): diff --git a/tests/test_models/test_editors/test_indexnet/test_indexnet.py b/tests/test_models/test_editors/test_indexnet/test_indexnet.py index 32df3d8a15..91da073134 100644 --- a/tests/test_models/test_editors/test_indexnet/test_indexnet.py +++ b/tests/test_models/test_editors/test_indexnet/test_indexnet.py @@ -3,11 +3,11 @@ import torch from mmengine.config import ConfigDict -from mmedit.datasets.transforms import PackEditInputs -from mmedit.models.editors import IndexedUpsample -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.datasets.transforms import PackEditInputs +from mmagic.models.editors import IndexedUpsample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules def _demo_input_train(img_shape, batch_size=1, cuda=False, meta={}): diff --git a/tests/test_models/test_editors/test_indexnet/test_indexnet_decoder.py b/tests/test_models/test_editors/test_indexnet/test_indexnet_decoder.py index 4f017d8012..d6195db926 100644 --- a/tests/test_models/test_editors/test_indexnet/test_indexnet_decoder.py +++ b/tests/test_models/test_editors/test_indexnet/test_indexnet_decoder.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors import IndexNetDecoder, IndexNetEncoder +from mmagic.models.editors import IndexNetDecoder, IndexNetEncoder def test_indexnet_decoder(): diff --git a/tests/test_models/test_editors/test_indexnet/test_indexnet_encoder.py b/tests/test_models/test_editors/test_indexnet/test_indexnet_encoder.py index 7ecd41e0f5..87787682ec 100644 --- a/tests/test_models/test_editors/test_indexnet/test_indexnet_encoder.py +++ b/tests/test_models/test_editors/test_indexnet/test_indexnet_encoder.py @@ -6,7 +6,7 @@ import pytest import torch -from mmedit.models import (DepthwiseIndexBlock, HolisticIndexBlock, +from mmagic.models import (DepthwiseIndexBlock, HolisticIndexBlock, IndexNetEncoder) diff --git a/tests/test_models/test_editors/test_inst_colorization/test_color_utils.py b/tests/test_models/test_editors/test_inst_colorization/test_color_utils.py index ff113d0917..b24141e46c 100644 --- a/tests/test_models/test_editors/test_inst_colorization/test_color_utils.py +++ b/tests/test_models/test_editors/test_inst_colorization/test_color_utils.py @@ -2,7 +2,7 @@ import torch -from mmedit.models.editors.inst_colorization import color_utils +from mmagic.models.editors.inst_colorization import color_utils class TestColorUtils: diff --git a/tests/test_models/test_editors/test_inst_colorization/test_colorization_net.py b/tests/test_models/test_editors/test_inst_colorization/test_colorization_net.py index 2c97f6f957..e9da280267 100644 --- a/tests/test_models/test_editors/test_inst_colorization/test_colorization_net.py +++ b/tests/test_models/test_editors/test_inst_colorization/test_colorization_net.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.registry import MODELS +from mmagic.registry import MODELS def test_colorization_net(): diff --git a/tests/test_models/test_editors/test_inst_colorization/test_fusion_net.py b/tests/test_models/test_editors/test_inst_colorization/test_fusion_net.py index 8b2d7cd4c8..e46e99a01f 100644 --- a/tests/test_models/test_editors/test_inst_colorization/test_fusion_net.py +++ b/tests/test_models/test_editors/test_inst_colorization/test_fusion_net.py @@ -2,7 +2,7 @@ import torch -from mmedit.registry import MODELS +from mmagic.registry import MODELS def test_fusion_net(): diff --git a/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py b/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py index 0eb1e2186a..cabca5a074 100644 --- a/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py +++ b/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py @@ -5,9 +5,9 @@ import pytest import torch -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_inst_colorization/test_weight_layer.py b/tests/test_models/test_editors/test_inst_colorization/test_weight_layer.py index 8293eb116e..69d7600785 100644 --- a/tests/test_models/test_editors/test_inst_colorization/test_weight_layer.py +++ b/tests/test_models/test_editors/test_inst_colorization/test_weight_layer.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors.inst_colorization.weight_layer import WeightLayer +from mmagic.models.editors.inst_colorization.weight_layer import WeightLayer @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_liif/test_liif.py b/tests/test_models/test_editors/test_liif/test_liif.py index 2739d6516e..8e7c8a652d 100644 --- a/tests/test_models/test_editors/test_liif/test_liif.py +++ b/tests/test_models/test_editors/test_liif/test_liif.py @@ -5,8 +5,8 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models import LIIF, EditDataPreprocessor -from mmedit.structures import EditDataSample +from mmagic.models import LIIF, EditDataPreprocessor +from mmagic.structures import EditDataSample def test_liif(): diff --git a/tests/test_models/test_editors/test_liif/test_liif_net.py b/tests/test_models/test_editors/test_liif/test_liif_net.py index 3ae764f060..6c7d649a05 100644 --- a/tests/test_models/test_editors/test_liif/test_liif_net.py +++ b/tests/test_models/test_editors/test_liif/test_liif_net.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.registry import MODELS +from mmagic.registry import MODELS @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_liif/test_mlp_refiner.py b/tests/test_models/test_editors/test_liif/test_mlp_refiner.py index af8b022324..a13e743a8d 100644 --- a/tests/test_models/test_editors/test_liif/test_mlp_refiner.py +++ b/tests/test_models/test_editors/test_liif/test_mlp_refiner.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import MLPRefiner +from mmagic.models.editors import MLPRefiner def test_MLPRefiner(): diff --git a/tests/test_models/test_editors/test_lsgan/test_lsgan.py b/tests/test_models/test_editors/test_lsgan/test_lsgan.py index c6a91b2944..3e22c84f06 100644 --- a/tests/test_models/test_editors/test_lsgan/test_lsgan.py +++ b/tests/test_models/test_editors/test_lsgan/test_lsgan.py @@ -7,9 +7,9 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmedit.models import LSGAN, EditDataPreprocessor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models import LSGAN, EditDataPreprocessor +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample generator = dict( type='DCGANGenerator', noise_size=10, output_scale=16, base_channels=16) diff --git a/tests/test_models/test_editors/test_lsgan/test_lsgan_discriminator.py b/tests/test_models/test_editors/test_lsgan/test_lsgan_discriminator.py index bfa831bb09..6481ec48ea 100644 --- a/tests/test_models/test_editors/test_lsgan/test_lsgan_discriminator.py +++ b/tests/test_models/test_editors/test_lsgan/test_lsgan_discriminator.py @@ -2,8 +2,8 @@ import pytest import torch -from mmedit.models.editors.lsgan import LSGANDiscriminator -from mmedit.registry import MODELS +from mmagic.models.editors.lsgan import LSGANDiscriminator +from mmagic.registry import MODELS class TestLSGANDiscriminator(object): diff --git a/tests/test_models/test_editors/test_lsgan/test_lsgan_generator.py b/tests/test_models/test_editors/test_lsgan/test_lsgan_generator.py index dcf9af8525..4843a6f074 100644 --- a/tests/test_models/test_editors/test_lsgan/test_lsgan_generator.py +++ b/tests/test_models/test_editors/test_lsgan/test_lsgan_generator.py @@ -2,8 +2,8 @@ import pytest import torch -from mmedit.models.editors.lsgan import LSGANGenerator -from mmedit.registry import MODELS +from mmagic.models.editors.lsgan import LSGANGenerator +from mmagic.registry import MODELS class TestLSGANGenerator(object): diff --git a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py index 9f998bec3c..4057012580 100644 --- a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py +++ b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py @@ -7,9 +7,9 @@ from mmengine import MessageHub from mmengine.optim import OptimWrapper, OptimWrapperDict -from mmedit.models import EditDataPreprocessor, MSPIEStyleGAN2 -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.models import EditDataPreprocessor, MSPIEStyleGAN2 +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_discriminator.py b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_discriminator.py index d7f54f9ac7..5290d8ee10 100644 --- a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_discriminator.py +++ b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_discriminator.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors.mspie import MSStyleGAN2Discriminator +from mmagic.models.editors.mspie import MSStyleGAN2Discriminator class TestMSStyleGANv2Disc: diff --git a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_generator.py b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_generator.py index 5fc70ad695..1d8ff866a1 100644 --- a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_generator.py +++ b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_generator.py @@ -6,9 +6,9 @@ import torch import torch.nn as nn -from mmedit.models.editors.mspie import MSStyleGANv2Generator -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.models.editors.mspie import MSStyleGANv2Generator +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_modules.py b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_modules.py index 02782ec5db..03d61773eb 100644 --- a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_modules.py +++ b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2_modules.py @@ -6,7 +6,7 @@ import pytest import torch -from mmedit.models.editors.mspie.mspie_stylegan2_modules import ( +from mmagic.models.editors.mspie.mspie_stylegan2_modules import ( ModulatedPEConv2d, ModulatedPEStyleConv) diff --git a/tests/test_models/test_editors/test_mspie/test_pe_singan.py b/tests/test_models/test_editors/test_mspie/test_pe_singan.py index 3a9db0c627..628537b715 100644 --- a/tests/test_models/test_editors/test_mspie/test_pe_singan.py +++ b/tests/test_models/test_editors/test_mspie/test_pe_singan.py @@ -2,9 +2,9 @@ import torch from mmengine import MessageHub -from mmedit.engine import SinGANOptimWrapperConstructor -from mmedit.models import PESinGAN -from mmedit.utils import register_all_modules +from mmagic.engine import SinGANOptimWrapperConstructor +from mmagic.models import PESinGAN +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_mspie/test_pe_singan_generator.py b/tests/test_models/test_editors/test_mspie/test_pe_singan_generator.py index 144baaf8fe..fe479b9580 100644 --- a/tests/test_models/test_editors/test_mspie/test_pe_singan_generator.py +++ b/tests/test_models/test_editors/test_mspie/test_pe_singan_generator.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors.mspie import SinGANMSGeneratorPE +from mmagic.models.editors.mspie import SinGANMSGeneratorPE class TestSinGANPEGen: diff --git a/tests/test_models/test_editors/test_mspie/test_positional_encoding.py b/tests/test_models/test_editors/test_mspie/test_positional_encoding.py index 3ed1fb4fd7..b069a2a1ea 100644 --- a/tests/test_models/test_editors/test_mspie/test_positional_encoding.py +++ b/tests/test_models/test_editors/test_mspie/test_positional_encoding.py @@ -2,8 +2,8 @@ import pytest import torch -from mmedit.models.editors.mspie import CatersianGrid as CSG -from mmedit.models.editors.mspie import SinusoidalPositionalEmbedding as SPE +from mmagic.models.editors.mspie import CatersianGrid as CSG +from mmagic.models.editors.mspie import SinusoidalPositionalEmbedding as SPE class TestSPE: diff --git a/tests/test_models/test_editors/test_nafnet/test_naf_avgpool2d.py b/tests/test_models/test_editors/test_nafnet/test_naf_avgpool2d.py index b5f9916e75..b2a9d40ca6 100644 --- a/tests/test_models/test_editors/test_nafnet/test_naf_avgpool2d.py +++ b/tests/test_models/test_editors/test_nafnet/test_naf_avgpool2d.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.nafnet.naf_avgpool2d import NAFAvgPool2d +from mmagic.models.editors.nafnet.naf_avgpool2d import NAFAvgPool2d def test_avgpool2d(): diff --git a/tests/test_models/test_editors/test_nafnet/test_naf_layernorm2d.py b/tests/test_models/test_editors/test_nafnet/test_naf_layernorm2d.py index c908707c47..eefd626115 100644 --- a/tests/test_models/test_editors/test_nafnet/test_naf_layernorm2d.py +++ b/tests/test_models/test_editors/test_nafnet/test_naf_layernorm2d.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.nafnet.naf_layerNorm2d import LayerNorm2d +from mmagic.models.editors.nafnet.naf_layerNorm2d import LayerNorm2d def test_layer_norm(): diff --git a/tests/test_models/test_editors/test_nafnet/test_nafbaseline.py b/tests/test_models/test_editors/test_nafnet/test_nafbaseline.py index 84392ee11b..7bdb6fcf5e 100644 --- a/tests/test_models/test_editors/test_nafnet/test_nafbaseline.py +++ b/tests/test_models/test_editors/test_nafnet/test_nafbaseline.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models import NAFBaseline, NAFBaselineLocal +from mmagic.models import NAFBaseline, NAFBaselineLocal def test_nafnet(): diff --git a/tests/test_models/test_editors/test_nafnet/test_nafnet.py b/tests/test_models/test_editors/test_nafnet/test_nafnet.py index 2d9c699392..56ed5bbf7a 100644 --- a/tests/test_models/test_editors/test_nafnet/test_nafnet.py +++ b/tests/test_models/test_editors/test_nafnet/test_nafnet.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models import NAFNet, NAFNetLocal +from mmagic.models import NAFNet, NAFNetLocal def test_nafnet(): diff --git a/tests/test_models/test_editors/test_pconv/test_mask_conv_module.py b/tests/test_models/test_editors/test_pconv/test_mask_conv_module.py index a20fcd3cd8..4de08490d5 100644 --- a/tests/test_models/test_editors/test_pconv/test_mask_conv_module.py +++ b/tests/test_models/test_editors/test_pconv/test_mask_conv_module.py @@ -3,8 +3,8 @@ import torch import torch.nn as nn -from mmedit.models.editors import MaskConvModule -from mmedit.utils import register_all_modules +from mmagic.models.editors import MaskConvModule +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_pconv/test_partial_conv.py b/tests/test_models/test_editors/test_pconv/test_partial_conv.py index 955db9319e..0b20395190 100644 --- a/tests/test_models/test_editors/test_pconv/test_partial_conv.py +++ b/tests/test_models/test_editors/test_pconv/test_partial_conv.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors import PartialConv2d +from mmagic.models.editors import PartialConv2d def test_pconv2d(): diff --git a/tests/test_models/test_editors/test_pconv/test_pconv_decoder.py b/tests/test_models/test_editors/test_pconv/test_pconv_decoder.py index 78fa4ddffd..5f78de358e 100644 --- a/tests/test_models/test_editors/test_pconv/test_pconv_decoder.py +++ b/tests/test_models/test_editors/test_pconv/test_pconv_decoder.py @@ -1,8 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import PConvDecoder, PConvEncoder -from mmedit.utils import register_all_modules +from mmagic.models.editors import PConvDecoder, PConvEncoder +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_pconv/test_pconv_encoder.py b/tests/test_models/test_editors/test_pconv/test_pconv_encoder.py index 1ca04a5905..90201220f1 100644 --- a/tests/test_models/test_editors/test_pconv/test_pconv_encoder.py +++ b/tests/test_models/test_editors/test_pconv/test_pconv_encoder.py @@ -2,7 +2,7 @@ import torch from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm -from mmedit.models.editors import PConvEncoder +from mmagic.models.editors import PConvEncoder def test_pconv_enc(): diff --git a/tests/test_models/test_editors/test_pconv/test_pconv_encoder_decoder.py b/tests/test_models/test_editors/test_pconv/test_pconv_encoder_decoder.py index b458acd4e5..305c936130 100644 --- a/tests/test_models/test_editors/test_pconv/test_pconv_encoder_decoder.py +++ b/tests/test_models/test_editors/test_pconv/test_pconv_encoder_decoder.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors import PConvEncoderDecoder +from mmagic.models.editors import PConvEncoderDecoder def test_pconv_encdec(): diff --git a/tests/test_models/test_editors/test_pconv/test_pconv_inpaintor.py b/tests/test_models/test_editors/test_pconv/test_pconv_inpaintor.py index e9159a5fcf..c76c1995af 100644 --- a/tests/test_models/test_editors/test_pconv/test_pconv_inpaintor.py +++ b/tests/test_models/test_editors/test_pconv/test_pconv_inpaintor.py @@ -7,9 +7,9 @@ from mmengine import Config from mmengine.optim import OptimWrapper -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_pggan/test_pggan.py b/tests/test_models/test_editors/test_pggan/test_pggan.py index 76607de6b7..fad4d0f633 100644 --- a/tests/test_models/test_editors/test_pggan/test_pggan.py +++ b/tests/test_models/test_editors/test_pggan/test_pggan.py @@ -6,10 +6,10 @@ import torch from mmengine import MessageHub -from mmedit.engine import PGGANOptimWrapperConstructor -from mmedit.models import ProgressiveGrowingGAN -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.engine import PGGANOptimWrapperConstructor +from mmagic.models import ProgressiveGrowingGAN +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_pggan/test_pggan_discriminator.py b/tests/test_models/test_editors/test_pggan/test_pggan_discriminator.py index 59f660d78d..dddb7119cf 100644 --- a/tests/test_models/test_editors/test_pggan/test_pggan_discriminator.py +++ b/tests/test_models/test_editors/test_pggan/test_pggan_discriminator.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors.pggan import PGGANDiscriminator +from mmagic.models.editors.pggan import PGGANDiscriminator class TestPGGANDiscriminator: diff --git a/tests/test_models/test_editors/test_pggan/test_pggan_generator.py b/tests/test_models/test_editors/test_pggan/test_pggan_generator.py index 79762d1500..33fec9f094 100644 --- a/tests/test_models/test_editors/test_pggan/test_pggan_generator.py +++ b/tests/test_models/test_editors/test_pggan/test_pggan_generator.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors.pggan import PGGANGenerator +from mmagic.models.editors.pggan import PGGANGenerator class TestPGGANGenerator: diff --git a/tests/test_models/test_editors/test_pggan/test_pggan_modules.py b/tests/test_models/test_editors/test_pggan/test_pggan_modules.py index bbabcbc480..e8fcc563f6 100644 --- a/tests/test_models/test_editors/test_pggan/test_pggan_modules.py +++ b/tests/test_models/test_editors/test_pggan/test_pggan_modules.py @@ -5,7 +5,7 @@ import torch import torch.nn as nn -from mmedit.models.editors.pggan import (EqualizedLR, +from mmagic.models.editors.pggan import (EqualizedLR, EqualizedLRConvDownModule, EqualizedLRConvModule, EqualizedLRConvUpModule, @@ -13,7 +13,7 @@ MiniBatchStddevLayer, PGGANNoiseTo2DFeat, PixelNorm, equalized_lr) -from mmedit.utils import register_all_modules +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py b/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py index 8827c930a7..9cb76a9e25 100644 --- a/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py +++ b/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py @@ -8,10 +8,10 @@ from mmengine.logging import MessageHub from mmengine.optim import OptimWrapper, OptimWrapperDict -from mmedit.models import EditDataPreprocessor, Pix2Pix -from mmedit.models.base_archs import PatchDiscriminator -from mmedit.models.editors.pix2pix import UnetGenerator -from mmedit.utils import register_all_modules +from mmagic.models import EditDataPreprocessor, Pix2Pix +from mmagic.models.base_archs import PatchDiscriminator +from mmagic.models.editors.pix2pix import UnetGenerator +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_pix2pix/test_pix2pix_generator.py b/tests/test_models/test_editors/test_pix2pix/test_pix2pix_generator.py index a688434696..d7a182d7f1 100644 --- a/tests/test_models/test_editors/test_pix2pix/test_pix2pix_generator.py +++ b/tests/test_models/test_editors/test_pix2pix/test_pix2pix_generator.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.models.editors.pix2pix import UnetGenerator +from mmagic.models.editors.pix2pix import UnetGenerator class TestUnetGenerator: diff --git a/tests/test_models/test_editors/test_pix2pix/test_pix2pix_modules.py b/tests/test_models/test_editors/test_pix2pix/test_pix2pix_modules.py index a17306a434..506731d384 100644 --- a/tests/test_models/test_editors/test_pix2pix/test_pix2pix_modules.py +++ b/tests/test_models/test_editors/test_pix2pix/test_pix2pix_modules.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.pix2pix.pix2pix_modules import \ +from mmagic.models.editors.pix2pix.pix2pix_modules import \ UnetSkipConnectionBlock diff --git a/tests/test_models/test_editors/test_plain/test_plain_decoder.py b/tests/test_models/test_editors/test_plain/test_plain_decoder.py index 00e3361612..f3b5c113ad 100644 --- a/tests/test_models/test_editors/test_plain/test_plain_decoder.py +++ b/tests/test_models/test_editors/test_plain/test_plain_decoder.py @@ -5,8 +5,8 @@ import pytest import torch -from mmedit.models.base_archs import VGG16 -from mmedit.models.editors import PlainDecoder +from mmagic.models.base_archs import VGG16 +from mmagic.models.editors import PlainDecoder def assert_tensor_with_shape(tensor, shape): diff --git a/tests/test_models/test_editors/test_plain/test_plain_refiner.py b/tests/test_models/test_editors/test_plain/test_plain_refiner.py index 8200cb8b55..8d7e68aa47 100644 --- a/tests/test_models/test_editors/test_plain/test_plain_refiner.py +++ b/tests/test_models/test_editors/test_plain/test_plain_refiner.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors import PlainRefiner +from mmagic.models.editors import PlainRefiner @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_rdn/test_rdn_net.py b/tests/test_models/test_editors/test_rdn/test_rdn_net.py index 9e3b939be8..c6ea290976 100644 --- a/tests/test_models/test_editors/test_rdn/test_rdn_net.py +++ b/tests/test_models/test_editors/test_rdn/test_rdn_net.py @@ -5,7 +5,7 @@ import torch import torch.nn as nn -from mmedit.models import RDNNet +from mmagic.models import RDNNet @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py b/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py index d020cbc670..263dfa6693 100644 --- a/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py +++ b/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py @@ -7,11 +7,11 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models.data_preprocessors import EditDataPreprocessor -from mmedit.models.editors import (RealBasicVSR, RealBasicVSRNet, +from mmagic.models.data_preprocessors import EditDataPreprocessor +from mmagic.models.editors import (RealBasicVSR, RealBasicVSRNet, UNetDiscriminatorWithSpectralNorm) -from mmedit.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG -from mmedit.structures import EditDataSample +from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG +from mmagic.structures import EditDataSample @patch.object(PerceptualVGG, 'init_weights') diff --git a/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr_net.py b/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr_net.py index d1f5625295..ae261a705d 100644 --- a/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr_net.py +++ b/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr_net.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors import RealBasicVSRNet +from mmagic.models.editors import RealBasicVSRNet @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py b/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py index 48ba7007c8..c625796a9e 100644 --- a/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py +++ b/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py @@ -5,10 +5,10 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models import (EditDataPreprocessor, RealESRGAN, RRDBNet, +from mmagic.models import (EditDataPreprocessor, RealESRGAN, RRDBNet, UNetDiscriminatorWithSpectralNorm) -from mmedit.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG -from mmedit.structures import EditDataSample +from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG +from mmagic.structures import EditDataSample @patch.object(PerceptualVGG, 'init_weights') diff --git a/tests/test_models/test_editors/test_real_esrgan/test_unet_disc.py b/tests/test_models/test_editors/test_real_esrgan/test_unet_disc.py index 702df6e6da..e268136e47 100644 --- a/tests/test_models/test_editors/test_real_esrgan/test_unet_disc.py +++ b/tests/test_models/test_editors/test_real_esrgan/test_unet_disc.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models import UNetDiscriminatorWithSpectralNorm +from mmagic.models import UNetDiscriminatorWithSpectralNorm @pytest.mark.skipif( 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 64624d825f..d48969f899 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 @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors import Restormer +from mmagic.models.editors import Restormer @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_sagan/test_sagan.py b/tests/test_models/test_editors/test_sagan/test_sagan.py index 810fcb357a..be84667e2b 100644 --- a/tests/test_models/test_editors/test_sagan/test_sagan.py +++ b/tests/test_models/test_editors/test_sagan/test_sagan.py @@ -7,9 +7,9 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmedit.models import SAGAN, EditDataPreprocessor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models import SAGAN, EditDataPreprocessor +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample generator = dict( type='SAGANGenerator', diff --git a/tests/test_models/test_editors/test_sagan/test_sagan_discriminator.py b/tests/test_models/test_editors/test_sagan/test_sagan_discriminator.py index 87e269a0e7..80969ece02 100644 --- a/tests/test_models/test_editors/test_sagan/test_sagan_discriminator.py +++ b/tests/test_models/test_editors/test_sagan/test_sagan_discriminator.py @@ -5,8 +5,8 @@ import pytest import torch -from mmedit.models.editors.sagan import ProjDiscriminator -from mmedit.registry import MODELS +from mmagic.models.editors.sagan import ProjDiscriminator +from mmagic.registry import MODELS class TestSNGANPROJDiscriminator(object): diff --git a/tests/test_models/test_editors/test_sagan/test_sagan_generator.py b/tests/test_models/test_editors/test_sagan/test_sagan_generator.py index 64599d6c13..58d4ea018a 100644 --- a/tests/test_models/test_editors/test_sagan/test_sagan_generator.py +++ b/tests/test_models/test_editors/test_sagan/test_sagan_generator.py @@ -5,8 +5,8 @@ import pytest import torch -from mmedit.models.editors.sagan import SNGANGenerator -from mmedit.registry import MODELS +from mmagic.models.editors.sagan import SNGANGenerator +from mmagic.registry import MODELS class TestSNGANPROJGenerator(object): diff --git a/tests/test_models/test_editors/test_sagan/test_sagan_modules.py b/tests/test_models/test_editors/test_sagan/test_sagan_modules.py index 2aaa11abf2..5746b267ff 100644 --- a/tests/test_models/test_editors/test_sagan/test_sagan_modules.py +++ b/tests/test_models/test_editors/test_sagan/test_sagan_modules.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.registry import MODELS +from mmagic.registry import MODELS class TestSNGANGenResBlock(object): diff --git a/tests/test_models/test_editors/test_singan/test_singan.py b/tests/test_models/test_editors/test_singan/test_singan.py index e7da490d9a..82491431ac 100644 --- a/tests/test_models/test_editors/test_singan/test_singan.py +++ b/tests/test_models/test_editors/test_singan/test_singan.py @@ -2,9 +2,9 @@ import torch from mmengine import MessageHub -from mmedit.engine import SinGANOptimWrapperConstructor -from mmedit.models import SinGAN -from mmedit.utils import register_all_modules +from mmagic.engine import SinGANOptimWrapperConstructor +from mmagic.models import SinGAN +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_singan/test_singan_discriminator.py b/tests/test_models/test_editors/test_singan/test_singan_discriminator.py index d3b6814b20..1c4d952dc5 100644 --- a/tests/test_models/test_editors/test_singan/test_singan_discriminator.py +++ b/tests/test_models/test_editors/test_singan/test_singan_discriminator.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.singan import SinGANMultiScaleDiscriminator +from mmagic.models.editors.singan import SinGANMultiScaleDiscriminator class TestSinGANDisc: diff --git a/tests/test_models/test_editors/test_singan/test_singan_generator.py b/tests/test_models/test_editors/test_singan/test_singan_generator.py index c6e1b3a2fe..8b3b73d129 100644 --- a/tests/test_models/test_editors/test_singan/test_singan_generator.py +++ b/tests/test_models/test_editors/test_singan/test_singan_generator.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.singan import SinGANMultiScaleGenerator +from mmagic.models.editors.singan import SinGANMultiScaleGenerator class TestSinGANGen: diff --git a/tests/test_models/test_editors/test_singan/test_singan_modules.py b/tests/test_models/test_editors/test_singan/test_singan_modules.py index d4be3ab43b..503d551e5c 100644 --- a/tests/test_models/test_editors/test_singan/test_singan_modules.py +++ b/tests/test_models/test_editors/test_singan/test_singan_modules.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.singan.singan_modules import (DiscriminatorBlock, +from mmagic.models.editors.singan.singan_modules import (DiscriminatorBlock, GeneratorBlock) diff --git a/tests/test_models/test_editors/test_srcnn/test_srcnn_net.py b/tests/test_models/test_editors/test_srcnn/test_srcnn_net.py index 501d85aa22..385d58375e 100644 --- a/tests/test_models/test_editors/test_srcnn/test_srcnn_net.py +++ b/tests/test_models/test_editors/test_srcnn/test_srcnn_net.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models import SRCNNNet +from mmagic.models import SRCNNNet def test_srcnn(): diff --git a/tests/test_models/test_editors/test_srgan/test_modified_vgg.py b/tests/test_models/test_editors/test_srgan/test_modified_vgg.py index dc901c9e16..6eae214149 100644 --- a/tests/test_models/test_editors/test_srgan/test_modified_vgg.py +++ b/tests/test_models/test_editors/test_srgan/test_modified_vgg.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import ModifiedVGG +from mmagic.models.editors import ModifiedVGG def test_modifiedVGG(): diff --git a/tests/test_models/test_editors/test_srgan/test_sr_resnet.py b/tests/test_models/test_editors/test_srgan/test_sr_resnet.py index bcd24b523d..2ec837ae03 100644 --- a/tests/test_models/test_editors/test_srgan/test_sr_resnet.py +++ b/tests/test_models/test_editors/test_srgan/test_sr_resnet.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models import ModifiedVGG, MSRResNet +from mmagic.models import ModifiedVGG, MSRResNet def test_srresnet_backbone(): diff --git a/tests/test_models/test_editors/test_srgan/test_srgan.py b/tests/test_models/test_editors/test_srgan/test_srgan.py index 11aec3e558..539ba51c2f 100644 --- a/tests/test_models/test_editors/test_srgan/test_srgan.py +++ b/tests/test_models/test_editors/test_srgan/test_srgan.py @@ -5,9 +5,9 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models import SRGAN, EditDataPreprocessor, ModifiedVGG, MSRResNet -from mmedit.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG -from mmedit.structures import EditDataSample +from mmagic.models import SRGAN, EditDataPreprocessor, ModifiedVGG, MSRResNet +from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG +from mmagic.structures import EditDataSample @patch.object(PerceptualVGG, 'init_weights') 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 index 35076616dd..9026aa0be1 100644 --- 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 @@ -9,7 +9,7 @@ def test_clip_wrapper(): from transformers import CLIPConfig - from mmedit.models.editors.stable_diffusion.clip_wrapper import \ + from mmagic.models.editors.stable_diffusion.clip_wrapper import \ StableDiffusionSafetyChecker clipconfig = CLIPConfig() safety_checker = StableDiffusionSafetyChecker(clipconfig) @@ -22,7 +22,7 @@ def test_clip_wrapper(): def test_load_clip_submodels(): - from mmedit.models.editors.stable_diffusion.clip_wrapper import \ + from mmagic.models.editors.stable_diffusion.clip_wrapper import \ load_clip_submodels init_cfg = dict( type='Pretrained', @@ -38,8 +38,8 @@ 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 \ + sys.modules['mmagic.models.editors.stable_diffusion.clip_wrapper']) + from mmagic.models.editors.stable_diffusion.clip_wrapper import \ load_clip_submodels init_cfg = dict( 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 6349188373..4838a9c9f8 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 @@ -7,7 +7,7 @@ from addict import Dict from mmengine import MODELS, Config -from mmedit.utils import register_all_modules +from mmagic.utils import register_all_modules register_all_modules() 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 index 0c8898a1e6..54d169b125 100644 --- a/tests/test_models/test_editors/test_stable_diffusion/test_vae.py +++ b/tests/test_models/test_editors/test_stable_diffusion/test_vae.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.stable_diffusion.vae import ( +from mmagic.models.editors.stable_diffusion.vae import ( AttentionBlock, AutoencoderKL, DiagonalGaussianDistribution, Downsample2D, ResnetBlock2D, Upsample2D) 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 989b1494e5..5131c0bd16 100644 --- a/tests/test_models/test_editors/test_stylegan1/test_stylegan1.py +++ b/tests/test_models/test_editors/test_stylegan1/test_stylegan1.py @@ -7,10 +7,10 @@ import torch from mmengine import MessageHub -from mmedit.engine import PGGANOptimWrapperConstructor -from mmedit.models import StyleGAN1 -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.engine import PGGANOptimWrapperConstructor +from mmagic.models import StyleGAN1 +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_stylegan1/test_stylegan1_discriminator.py b/tests/test_models/test_editors/test_stylegan1/test_stylegan1_discriminator.py index f201c1c202..d119dd1ac9 100644 --- a/tests/test_models/test_editors/test_stylegan1/test_stylegan1_discriminator.py +++ b/tests/test_models/test_editors/test_stylegan1/test_stylegan1_discriminator.py @@ -4,8 +4,8 @@ import pytest import torch -from mmedit.models.editors.stylegan1 import StyleGAN1Discriminator -from mmedit.utils import register_all_modules +from mmagic.models.editors.stylegan1 import StyleGAN1Discriminator +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_stylegan1/test_stylegan1_generator.py b/tests/test_models/test_editors/test_stylegan1/test_stylegan1_generator.py index 13a867373e..78033c3d01 100644 --- a/tests/test_models/test_editors/test_stylegan1/test_stylegan1_generator.py +++ b/tests/test_models/test_editors/test_stylegan1/test_stylegan1_generator.py @@ -5,8 +5,8 @@ import pytest import torch -from mmedit.models.editors.stylegan1 import StyleGAN1Generator -from mmedit.utils import register_all_modules +from mmagic.models.editors.stylegan1 import StyleGAN1Generator +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_stylegan1/test_stylegan1_modules.py b/tests/test_models/test_editors/test_stylegan1/test_stylegan1_modules.py index b0018217f3..70dd5a2e26 100644 --- a/tests/test_models/test_editors/test_stylegan1/test_stylegan1_modules.py +++ b/tests/test_models/test_editors/test_stylegan1/test_stylegan1_modules.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.editors.stylegan1.stylegan1_modules import ( +from mmagic.models.editors.stylegan1.stylegan1_modules import ( AdaptiveInstanceNorm, StyleConv) diff --git a/tests/test_models/test_editors/test_stylegan1/test_stylegan_utils.py b/tests/test_models/test_editors/test_stylegan1/test_stylegan_utils.py index 5c6437020e..be22e6c455 100644 --- a/tests/test_models/test_editors/test_stylegan1/test_stylegan_utils.py +++ b/tests/test_models/test_editors/test_stylegan1/test_stylegan_utils.py @@ -3,9 +3,9 @@ import torch -from mmedit.models.editors.stylegan1 import get_mean_latent, style_mixing +from mmagic.models.editors.stylegan1 import get_mean_latent, style_mixing -get_module_device_str = 'mmedit.models.editors.stylegan1.stylegan_utils.get_module_device' # noqa +get_module_device_str = 'mmagic.models.editors.stylegan1.stylegan_utils.get_module_device' # noqa @patch(get_module_device_str, MagicMock(return_value='cpu')) diff --git a/tests/test_models/test_editors/test_stylegan2/test_ada/test_augment.py b/tests/test_models/test_editors/test_stylegan2/test_ada/test_augment.py index 2b34692c68..273a219f88 100644 --- a/tests/test_models/test_editors/test_stylegan2/test_ada/test_augment.py +++ b/tests/test_models/test_editors/test_stylegan2/test_ada/test_augment.py @@ -7,7 +7,7 @@ from mmengine import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -from mmedit.models.editors.stylegan2.ada.augment import AugmentPipe +from mmagic.models.editors.stylegan2.ada.augment import AugmentPipe class TestAuementPipe(TestCase): 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 f6a230840c..541c500ddf 100644 --- a/tests/test_models/test_editors/test_stylegan2/test_stylegan2.py +++ b/tests/test_models/test_editors/test_stylegan2/test_stylegan2.py @@ -7,8 +7,8 @@ from mmengine import MessageHub from mmengine.optim import OptimWrapper, OptimWrapperDict -from mmedit.models import EditDataPreprocessor, StyleGAN2 -from mmedit.structures import EditDataSample +from mmagic.models import EditDataPreprocessor, StyleGAN2 +from mmagic.structures import EditDataSample class TestStyleGAN2(TestCase): diff --git a/tests/test_models/test_editors/test_stylegan2/test_stylegan2_discriminator.py b/tests/test_models/test_editors/test_stylegan2/test_stylegan2_discriminator.py index 0d9b2a2edd..f81380c597 100644 --- a/tests/test_models/test_editors/test_stylegan2/test_stylegan2_discriminator.py +++ b/tests/test_models/test_editors/test_stylegan2/test_stylegan2_discriminator.py @@ -8,9 +8,9 @@ from mmengine import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -from mmedit.models.editors.stylegan2 import (ADAAug, ADAStyleGAN2Discriminator, +from mmagic.models.editors.stylegan2 import (ADAAug, ADAStyleGAN2Discriminator, StyleGAN2Discriminator) -from mmedit.models.utils import get_module_device +from mmagic.models.utils import get_module_device @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_stylegan2/test_stylegan2_generator.py b/tests/test_models/test_editors/test_stylegan2/test_stylegan2_generator.py index 4a333aee1d..b9b22f0ca3 100644 --- a/tests/test_models/test_editors/test_stylegan2/test_stylegan2_generator.py +++ b/tests/test_models/test_editors/test_stylegan2/test_stylegan2_generator.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.models.editors.stylegan2 import StyleGAN2Generator +from mmagic.models.editors.stylegan2 import StyleGAN2Generator class TestStyleGAN2Generator: diff --git a/tests/test_models/test_editors/test_stylegan2/test_stylegan2_modules.py b/tests/test_models/test_editors/test_stylegan2/test_stylegan2_modules.py index bdd792a98f..23326eb78a 100644 --- a/tests/test_models/test_editors/test_stylegan2/test_stylegan2_modules.py +++ b/tests/test_models/test_editors/test_stylegan2/test_stylegan2_modules.py @@ -5,12 +5,12 @@ import pytest import torch -from mmedit.models.editors.stylegan1 import get_mean_latent, style_mixing -from mmedit.models.editors.stylegan2 import StyleGAN2Generator -from mmedit.models.editors.stylegan2.stylegan2_modules import ( +from mmagic.models.editors.stylegan1 import get_mean_latent, style_mixing +from mmagic.models.editors.stylegan2 import StyleGAN2Generator +from mmagic.models.editors.stylegan2.stylegan2_modules import ( Blur, DownsampleUpFIRDn, ModulatedConv2d, ModulatedStyleConv, ModulatedToRGB) -from mmedit.models.utils import get_module_device +from mmagic.models.utils import get_module_device @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py b/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py index fc0b808761..4de049e73e 100644 --- a/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py +++ b/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py @@ -8,9 +8,9 @@ from mmengine import MessageHub from mmengine.optim import OptimWrapper, OptimWrapperDict -from mmedit.models import StyleGAN3 -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules +from mmagic.models import StyleGAN3 +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules register_all_modules() diff --git a/tests/test_models/test_editors/test_stylegan3/test_stylegan3_generator.py b/tests/test_models/test_editors/test_stylegan3/test_stylegan3_generator.py index 061556441c..df55822863 100644 --- a/tests/test_models/test_editors/test_stylegan3/test_stylegan3_generator.py +++ b/tests/test_models/test_editors/test_stylegan3/test_stylegan3_generator.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.models.editors.stylegan3 import StyleGAN3Generator +from mmagic.models.editors.stylegan3 import StyleGAN3Generator class TestStyleGAN3Generator: diff --git a/tests/test_models/test_editors/test_stylegan3/test_stylegan3_modules.py b/tests/test_models/test_editors/test_stylegan3/test_stylegan3_modules.py index 63192ab195..794f96295f 100644 --- a/tests/test_models/test_editors/test_stylegan3/test_stylegan3_modules.py +++ b/tests/test_models/test_editors/test_stylegan3/test_stylegan3_modules.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors.stylegan3.stylegan3_modules import MappingNetwork +from mmagic.models.editors.stylegan3.stylegan3_modules import MappingNetwork @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_stylegan3/test_stylegan3_utils.py b/tests/test_models/test_editors/test_stylegan3/test_stylegan3_utils.py index 4248c7ba45..bbffe81c91 100644 --- a/tests/test_models/test_editors/test_stylegan3/test_stylegan3_utils.py +++ b/tests/test_models/test_editors/test_stylegan3/test_stylegan3_utils.py @@ -6,7 +6,7 @@ from mmengine.utils.dl_utils import TORCH_VERSION from mmengine.utils.version_utils import digit_version -from mmedit.models.editors.stylegan3.stylegan3_utils import ( +from mmagic.models.editors.stylegan3.stylegan3_utils import ( apply_fractional_pseudo_rotation, apply_fractional_rotation, apply_fractional_translation, apply_integer_translation) 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 index 3f02556236..7af6525863 100644 --- a/tests/test_models/test_editors/test_swinir/test_swinir_modules.py +++ b/tests/test_models/test_editors/test_swinir/test_swinir_modules.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors.swinir.swinir_modules import (PatchEmbed, +from mmagic.models.editors.swinir.swinir_modules import (PatchEmbed, PatchUnEmbed, Upsample, UpsampleOneStep) 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 index b2944baa89..9f82495322 100644 --- a/tests/test_models/test_editors/test_swinir/test_swinir_net.py +++ b/tests/test_models/test_editors/test_swinir/test_swinir_net.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors import SwinIRNet +from mmagic.models.editors import SwinIRNet def test_swinir_cpu(): 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 index b5f9c1db1d..7723bd720d 100644 --- a/tests/test_models/test_editors/test_swinir/test_swinir_rstb.py +++ b/tests/test_models/test_editors/test_swinir/test_swinir_rstb.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.editors.swinir.swinir_rstb import RSTB +from mmagic.models.editors.swinir.swinir_rstb import RSTB @pytest.mark.skipif( 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 index 0971960401..2e489caf61 100644 --- a/tests/test_models/test_editors/test_swinir/test_swinir_utils.py +++ b/tests/test_models/test_editors/test_swinir/test_swinir_utils.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.swinir.swinir_utils import (drop_path, to_2tuple, +from mmagic.models.editors.swinir.swinir_utils import (drop_path, to_2tuple, window_partition, window_reverse) diff --git a/tests/test_models/test_editors/test_tdan/test_tdan.py b/tests/test_models/test_editors/test_tdan/test_tdan.py index 46fd9940ab..c3da040c96 100644 --- a/tests/test_models/test_editors/test_tdan/test_tdan.py +++ b/tests/test_models/test_editors/test_tdan/test_tdan.py @@ -3,10 +3,10 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models.data_preprocessors import EditDataPreprocessor -from mmedit.models.editors import TDAN, TDANNet -from mmedit.models.losses import MSELoss -from mmedit.structures import EditDataSample +from mmagic.models.data_preprocessors import EditDataPreprocessor +from mmagic.models.editors import TDAN, TDANNet +from mmagic.models.losses import MSELoss +from mmagic.structures import EditDataSample def test_tdan(): diff --git a/tests/test_models/test_editors/test_tdan/test_tdan_net.py b/tests/test_models/test_editors/test_tdan/test_tdan_net.py index c6eaf973c7..397377644f 100644 --- a/tests/test_models/test_editors/test_tdan/test_tdan_net.py +++ b/tests/test_models/test_editors/test_tdan/test_tdan_net.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import TDANNet +from mmagic.models.editors import TDANNet def test_tdan_net(): diff --git a/tests/test_models/test_editors/test_tof/test_tof_vfi_net.py b/tests/test_models/test_editors/test_tof/test_tof_vfi_net.py index f940504963..5af54e7e1f 100644 --- a/tests/test_models/test_editors/test_tof/test_tof_vfi_net.py +++ b/tests/test_models/test_editors/test_tof/test_tof_vfi_net.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import TOFlowVFINet +from mmagic.models.editors import TOFlowVFINet def test_tof_vfi_net(): diff --git a/tests/test_models/test_editors/test_tof/test_tof_vsr_net.py b/tests/test_models/test_editors/test_tof/test_tof_vsr_net.py index e92ed68512..6fc30bc9c4 100644 --- a/tests/test_models/test_editors/test_tof/test_tof_vsr_net.py +++ b/tests/test_models/test_editors/test_tof/test_tof_vsr_net.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors import TOFlowVSRNet +from mmagic.models.editors import TOFlowVSRNet def test_toflow_vsr_net(): diff --git a/tests/test_models/test_editors/test_ttsr/test_lte.py b/tests/test_models/test_editors/test_ttsr/test_lte.py index 34787eb9bd..10a5878c89 100644 --- a/tests/test_models/test_editors/test_ttsr/test_lte.py +++ b/tests/test_models/test_editors/test_ttsr/test_lte.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.registry import MODELS +from mmagic.registry import MODELS def test_lte(): diff --git a/tests/test_models/test_editors/test_ttsr/test_search_transformer.py b/tests/test_models/test_editors/test_ttsr/test_search_transformer.py index ae697754b2..5d8cab36ff 100644 --- a/tests/test_models/test_editors/test_ttsr/test_search_transformer.py +++ b/tests/test_models/test_editors/test_ttsr/test_search_transformer.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.registry import MODELS +from mmagic.registry import MODELS def test_search_transformer(): diff --git a/tests/test_models/test_editors/test_ttsr/test_ttsr.py b/tests/test_models/test_editors/test_ttsr/test_ttsr.py index 533618853f..193e786312 100644 --- a/tests/test_models/test_editors/test_ttsr/test_ttsr.py +++ b/tests/test_models/test_editors/test_ttsr/test_ttsr.py @@ -7,12 +7,12 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmedit.models import (LTE, TTSR, EditDataPreprocessor, SearchTransformer, +from mmagic.models import (LTE, TTSR, EditDataPreprocessor, SearchTransformer, TTSRDiscriminator, TTSRNet) -from mmedit.models.losses import (GANLoss, L1Loss, PerceptualVGG, +from mmagic.models.losses import (GANLoss, L1Loss, PerceptualVGG, TransferalPerceptualLoss) -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_ttsr/test_ttsr_disc.py b/tests/test_models/test_editors/test_ttsr/test_ttsr_disc.py index e1aea9cfc7..9e8321754a 100644 --- a/tests/test_models/test_editors/test_ttsr/test_ttsr_disc.py +++ b/tests/test_models/test_editors/test_ttsr/test_ttsr_disc.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.models import TTSRDiscriminator +from mmagic.models import TTSRDiscriminator @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_ttsr/test_ttsr_net.py b/tests/test_models/test_editors/test_ttsr/test_ttsr_net.py index 2487c6a400..b2fb267046 100644 --- a/tests/test_models/test_editors/test_ttsr/test_ttsr_net.py +++ b/tests/test_models/test_editors/test_ttsr/test_ttsr_net.py @@ -4,9 +4,9 @@ import pytest import torch -from mmedit.models.editors.ttsr.ttsr_net import (CSFI2, CSFI3, SFE, +from mmagic.models.editors.ttsr.ttsr_net import (CSFI2, CSFI3, SFE, MergeFeatures) -from mmedit.registry import MODELS +from mmagic.registry import MODELS @pytest.mark.skipif( diff --git a/tests/test_models/test_editors/test_wgan_gp/test_wgan_discriminator.py b/tests/test_models/test_editors/test_wgan_gp/test_wgan_discriminator.py index d5eb879f69..44b283caa8 100644 --- a/tests/test_models/test_editors/test_wgan_gp/test_wgan_discriminator.py +++ b/tests/test_models/test_editors/test_wgan_gp/test_wgan_discriminator.py @@ -2,8 +2,8 @@ import pytest import torch -from mmedit.models.editors.wgan_gp import WGANGPDiscriminator -from mmedit.registry import MODELS +from mmagic.models.editors.wgan_gp import WGANGPDiscriminator +from mmagic.registry import MODELS class TestWGANGPDiscriminator(object): diff --git a/tests/test_models/test_editors/test_wgan_gp/test_wgan_generator.py b/tests/test_models/test_editors/test_wgan_gp/test_wgan_generator.py index 2f0b1d49ba..84b93cb390 100644 --- a/tests/test_models/test_editors/test_wgan_gp/test_wgan_generator.py +++ b/tests/test_models/test_editors/test_wgan_gp/test_wgan_generator.py @@ -2,8 +2,8 @@ import pytest import torch -from mmedit.models.editors.wgan_gp import WGANGPGenerator -from mmedit.registry import MODELS +from mmagic.models.editors.wgan_gp import WGANGPGenerator +from mmagic.registry import MODELS class TestWGANGPGenerator(object): 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 c0ac68a252..ce44d79310 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 @@ -9,9 +9,9 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmedit.models import WGANGP, EditDataPreprocessor -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.models import WGANGP, EditDataPreprocessor +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample generator = dict( type='DCGANGenerator', noise_size=10, output_scale=16, base_channels=16) diff --git a/tests/test_models/test_editors/test_wgan_gp/test_wgan_gp_module.py b/tests/test_models/test_editors/test_wgan_gp/test_wgan_gp_module.py index 05d656bed7..db28fc0de7 100644 --- a/tests/test_models/test_editors/test_wgan_gp/test_wgan_gp_module.py +++ b/tests/test_models/test_editors/test_wgan_gp/test_wgan_gp_module.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.editors.wgan_gp.wgan_gp_module import (ConvLNModule, +from mmagic.models.editors.wgan_gp.wgan_gp_module import (ConvLNModule, WGANDecisionHead, WGANNoiseTo2DFeat) diff --git a/tests/test_models/test_losses/test_clip_loss.py b/tests/test_models/test_losses/test_clip_loss.py index 7ead030d28..015c96c78d 100644 --- a/tests/test_models/test_losses/test_clip_loss.py +++ b/tests/test_models/test_losses/test_clip_loss.py @@ -1,13 +1,13 @@ # Copyright (c) OpenMMLab. All rights reserved. import platform -import clip import pytest import torch from mmengine.utils import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -from mmedit.models.losses import CLIPLoss +import clip +from mmagic.models.losses import CLIPLoss @pytest.mark.skipif( diff --git a/tests/test_models/test_losses/test_composition_loss.py b/tests/test_models/test_losses/test_composition_loss.py index 1cc6557ef3..acbe098f69 100644 --- a/tests/test_models/test_losses/test_composition_loss.py +++ b/tests/test_models/test_losses/test_composition_loss.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.models import (CharbonnierCompLoss, L1CompositionLoss, +from mmagic.models import (CharbonnierCompLoss, L1CompositionLoss, MSECompositionLoss) diff --git a/tests/test_models/test_losses/test_face_id_loss.py b/tests/test_models/test_losses/test_face_id_loss.py index 26952750b9..d3a0c68d04 100644 --- a/tests/test_models/test_losses/test_face_id_loss.py +++ b/tests/test_models/test_losses/test_face_id_loss.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.losses import FaceIdLoss +from mmagic.models.losses import FaceIdLoss @pytest.mark.skipif( diff --git a/tests/test_models/test_losses/test_feature_loss.py b/tests/test_models/test_losses/test_feature_loss.py index 1b71a99627..c80236a27d 100644 --- a/tests/test_models/test_losses/test_feature_loss.py +++ b/tests/test_models/test_losses/test_feature_loss.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models.losses import LightCNNFeatureLoss +from mmagic.models.losses import LightCNNFeatureLoss @pytest.mark.skipif( diff --git a/tests/test_models/test_losses/test_gan_loss.py b/tests/test_models/test_losses/test_gan_loss.py index d7590f6cf8..c053fc908a 100644 --- a/tests/test_models/test_losses/test_gan_loss.py +++ b/tests/test_models/test_losses/test_gan_loss.py @@ -4,7 +4,7 @@ import pytest import torch -from mmedit.models import GANLoss, GaussianBlur +from mmagic.models import GANLoss, GaussianBlur def test_gan_losses(): diff --git a/tests/test_models/test_losses/test_gradient_loss.py b/tests/test_models/test_losses/test_gradient_loss.py index c0260196a9..b5c431c784 100644 --- a/tests/test_models/test_losses/test_gradient_loss.py +++ b/tests/test_models/test_losses/test_gradient_loss.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.models import DiscShiftLoss, GradientLoss, GradientPenaltyLoss +from mmagic.models import DiscShiftLoss, GradientLoss, GradientPenaltyLoss def test_gradient_loss(): diff --git a/tests/test_models/test_losses/test_loss_comps/test_clip_loss_comps.py b/tests/test_models/test_losses/test_loss_comps/test_clip_loss_comps.py index 8931e01f5b..f8531b0bdc 100644 --- a/tests/test_models/test_losses/test_loss_comps/test_clip_loss_comps.py +++ b/tests/test_models/test_losses/test_loss_comps/test_clip_loss_comps.py @@ -1,13 +1,13 @@ # Copyright (c) OpenMMLab. All rights reserved. import platform -import clip import pytest import torch from mmengine.utils import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -from mmedit.models.losses import CLIPLossComps +import clip +from mmagic.models.losses import CLIPLossComps @pytest.mark.skipif( diff --git a/tests/test_models/test_losses/test_loss_comps/test_disc_auxiliary_loss_comps.py b/tests/test_models/test_losses/test_loss_comps/test_disc_auxiliary_loss_comps.py index 29570f6837..d25a57d0f6 100644 --- a/tests/test_models/test_losses/test_loss_comps/test_disc_auxiliary_loss_comps.py +++ b/tests/test_models/test_losses/test_loss_comps/test_disc_auxiliary_loss_comps.py @@ -4,11 +4,11 @@ import pytest import torch -from mmedit.models.editors.dcgan import DCGANDiscriminator -from mmedit.models.editors.pggan import PGGANDiscriminator -from mmedit.models.losses import (DiscShiftLossComps, GradientPenaltyLossComps, +from mmagic.models.editors.dcgan import DCGANDiscriminator +from mmagic.models.editors.pggan import PGGANDiscriminator +from mmagic.models.losses import (DiscShiftLossComps, GradientPenaltyLossComps, R1GradientPenaltyComps) -from mmedit.models.losses.gan_loss import (gradient_penalty_loss, +from mmagic.models.losses.gan_loss import (gradient_penalty_loss, r1_gradient_penalty_loss) diff --git a/tests/test_models/test_losses/test_loss_comps/test_face_id_loss_comps.py b/tests/test_models/test_losses/test_loss_comps/test_face_id_loss_comps.py index 496a21b871..c734f0bbfd 100644 --- a/tests/test_models/test_losses/test_loss_comps/test_face_id_loss_comps.py +++ b/tests/test_models/test_losses/test_loss_comps/test_face_id_loss_comps.py @@ -4,8 +4,8 @@ import pytest import torch -from mmedit.models import IDLossModel -from mmedit.models.losses import FaceIdLossComps +from mmagic.models import IDLossModel +from mmagic.models.losses import FaceIdLossComps @pytest.mark.skipif( diff --git a/tests/test_models/test_losses/test_loss_comps/test_gan_loss_comps.py b/tests/test_models/test_losses/test_loss_comps/test_gan_loss_comps.py index fcd80bf00c..dbd59b3652 100644 --- a/tests/test_models/test_losses/test_loss_comps/test_gan_loss_comps.py +++ b/tests/test_models/test_losses/test_loss_comps/test_gan_loss_comps.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.models.losses import GANLossComps +from mmagic.models.losses import GANLossComps def test_gan_losses(): 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 160170d609..09b6fca615 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 @@ -6,8 +6,8 @@ from mmengine.utils.dl_utils import TORCH_VERSION from mmengine.utils.version_utils import digit_version -from mmedit.models.editors.stylegan2 import StyleGAN2Generator -from mmedit.models.losses import GeneratorPathRegularizerComps +from mmagic.models.editors.stylegan2 import StyleGAN2Generator +from mmagic.models.losses import GeneratorPathRegularizerComps @pytest.mark.skipif( diff --git a/tests/test_models/test_losses/test_loss_wrapper.py b/tests/test_models/test_losses/test_loss_wrapper.py index 263368c001..02550579c5 100644 --- a/tests/test_models/test_losses/test_loss_wrapper.py +++ b/tests/test_models/test_losses/test_loss_wrapper.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.models import mask_reduce_loss, reduce_loss +from mmagic.models import mask_reduce_loss, reduce_loss def test_utils(): diff --git a/tests/test_models/test_losses/test_perceptual_loss.py b/tests/test_models/test_losses/test_perceptual_loss.py index d928600049..146c144a68 100644 --- a/tests/test_models/test_losses/test_perceptual_loss.py +++ b/tests/test_models/test_losses/test_perceptual_loss.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.models import (PerceptualLoss, PerceptualVGG, +from mmagic.models import (PerceptualLoss, PerceptualVGG, TransferalPerceptualLoss) diff --git a/tests/test_models/test_losses/test_pixelwise_loss.py b/tests/test_models/test_losses/test_pixelwise_loss.py index bd305c7330..b05d368565 100644 --- a/tests/test_models/test_losses/test_pixelwise_loss.py +++ b/tests/test_models/test_losses/test_pixelwise_loss.py @@ -5,7 +5,7 @@ import pytest import torch -from mmedit.models import (CharbonnierLoss, L1Loss, MaskedTVLoss, MSELoss, +from mmagic.models import (CharbonnierLoss, L1Loss, MaskedTVLoss, MSELoss, PSNRLoss) diff --git a/tests/test_models/test_utils/test_bbox_utils.py b/tests/test_models/test_utils/test_bbox_utils.py index 6eed5a5661..5cc66af038 100644 --- a/tests/test_models/test_utils/test_bbox_utils.py +++ b/tests/test_models/test_utils/test_bbox_utils.py @@ -3,8 +3,8 @@ import pytest import torch -from mmedit.models.editors import PlainRefiner -from mmedit.models.utils import extract_around_bbox, extract_bbox_patch +from mmagic.models.editors import PlainRefiner +from mmagic.models.utils import extract_around_bbox, extract_bbox_patch def test_extract_bbox_patch(): diff --git a/tests/test_models/test_utils/test_flow_warp.py b/tests/test_models/test_utils/test_flow_warp.py index 1ad421e98b..098cd4f600 100644 --- a/tests/test_models/test_utils/test_flow_warp.py +++ b/tests/test_models/test_utils/test_flow_warp.py @@ -2,7 +2,7 @@ import pytest import torch -from mmedit.models.utils import flow_warp +from mmagic.models.utils import flow_warp def tensor_shift(x, shift=(1, 1), fill_val=0): diff --git a/tests/test_models/test_utils/test_model_utils.py b/tests/test_models/test_utils/test_model_utils.py index 3348d7ae01..893f32f4a0 100644 --- a/tests/test_models/test_utils/test_model_utils.py +++ b/tests/test_models/test_utils/test_model_utils.py @@ -5,10 +5,10 @@ import torch import torch.nn as nn -from mmedit.models.utils import (build_module, generation_init_weights, +from mmagic.models.utils import (build_module, generation_init_weights, get_module_device, get_valid_num_batches, set_requires_grad) -from mmedit.registry import MODELS +from mmagic.registry import MODELS def test_generation_init_weights(): diff --git a/tests/test_models/test_utils/test_sampling_utils.py b/tests/test_models/test_utils/test_sampling_utils.py index 212fef7ad4..4da730ffff 100644 --- a/tests/test_models/test_utils/test_sampling_utils.py +++ b/tests/test_models/test_utils/test_sampling_utils.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.models.utils.sampling_utils import label_sample_fn, noise_sample_fn +from mmagic.models.utils.sampling_utils import label_sample_fn, noise_sample_fn def test_noise_sample_fn(): diff --git a/tests/test_models/test_utils/test_tensor_utils.py b/tests/test_models/test_utils/test_tensor_utils.py index 731aee9744..22c2e540e6 100644 --- a/tests/test_models/test_utils/test_tensor_utils.py +++ b/tests/test_models/test_utils/test_tensor_utils.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmedit.models.utils.tensor_utils import get_unknown_tensor, normalize_vecs +from mmagic.models.utils.tensor_utils import get_unknown_tensor, normalize_vecs def test_tensor_utils(): diff --git a/tests/test_structures/test_edit_data_sample.py b/tests/test_structures/test_edit_data_sample.py index cd83f9980e..fda74b4fe5 100644 --- a/tests/test_structures/test_edit_data_sample.py +++ b/tests/test_structures/test_edit_data_sample.py @@ -6,8 +6,8 @@ from mmengine.structures import LabelData from mmengine.testing import assert_allclose -from mmedit.structures import EditDataSample -from mmedit.structures.edit_data_sample import is_splitable_var +from mmagic.structures import EditDataSample +from mmagic.structures.edit_data_sample import is_splitable_var def test_is_stacked_var(): diff --git a/tests/test_utils/test_cli.py b/tests/test_utils/test_cli.py index ffb4eae954..2ed0c53b64 100644 --- a/tests/test_utils/test_cli.py +++ b/tests/test_utils/test_cli.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import sys -from mmedit.utils import modify_args +from mmagic.utils import modify_args def test_modify_args(): diff --git a/tests/test_utils/test_img_utils.py b/tests/test_utils/test_img_utils.py index 5ad011daac..56159cf8b2 100644 --- a/tests/test_utils/test_img_utils.py +++ b/tests/test_utils/test_img_utils.py @@ -3,7 +3,7 @@ import pytest import torch -from mmedit.utils import (all_to_tensor, can_convert_to_image, tensor2img, +from mmagic.utils import (all_to_tensor, can_convert_to_image, tensor2img, to_numpy) diff --git a/tests/test_utils/test_io_utils.py b/tests/test_utils/test_io_utils.py index ebd8ab18b4..a3e8a1b8a3 100644 --- a/tests/test_utils/test_io_utils.py +++ b/tests/test_utils/test_io_utils.py @@ -1,6 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.utils.io_utils import download_from_url +from mmagic.utils.io_utils import download_from_url def test_download_from_url(): diff --git a/tests/test_utils/test_logger.py b/tests/test_utils/test_logger.py index 792a48cc04..9cca892caa 100644 --- a/tests/test_utils/test_logger.py +++ b/tests/test_utils/test_logger.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.utils import print_colored_log +from mmagic.utils import print_colored_log def test_print_colored_log(): diff --git a/tests/test_utils/test_sampler.py b/tests/test_utils/test_sampler.py index de923a0728..5bbbddf643 100644 --- a/tests/test_utils/test_sampler.py +++ b/tests/test_utils/test_sampler.py @@ -3,7 +3,7 @@ from torch.utils.data import DataLoader -from mmedit.utils.sampler import ArgumentsSampler, ValDataSampler +from mmagic.utils.sampler import ArgumentsSampler, ValDataSampler def test_argument_sampler(): diff --git a/tests/test_utils/test_setup_env.py b/tests/test_utils/test_setup_env.py index 6f8d91ec03..4a599f0437 100644 --- a/tests/test_utils/test_setup_env.py +++ b/tests/test_utils/test_setup_env.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmedit.utils import register_all_modules, try_import +from mmagic.utils import register_all_modules, try_import def test_register_all_modules(): diff --git a/tests/test_utils/test_trans_utils.py b/tests/test_utils/test_trans_utils.py index e20b040dc1..a7f51b84e3 100644 --- a/tests/test_utils/test_trans_utils.py +++ b/tests/test_utils/test_trans_utils.py @@ -4,9 +4,9 @@ import numpy as np import pytest -from mmedit.datasets.transforms import (CropAroundCenter, CropAroundFg, +from mmagic.datasets.transforms import (CropAroundCenter, CropAroundFg, CropAroundUnknown, LoadImageFromFile) -from mmedit.utils import (adjust_gamma, bbox2mask, brush_stroke_mask, +from mmagic.utils import (adjust_gamma, bbox2mask, brush_stroke_mask, get_irregular_mask, random_bbox) dtype_range = { diff --git a/tests/test_visualization/test_concat_visualizer.py b/tests/test_visualization/test_concat_visualizer.py index d4e1437adc..20b852138f 100644 --- a/tests/test_visualization/test_concat_visualizer.py +++ b/tests/test_visualization/test_concat_visualizer.py @@ -3,8 +3,8 @@ import numpy as np import torch -from mmedit.structures import EditDataSample -from mmedit.visualization import ConcatImageVisualizer +from mmagic.structures import EditDataSample +from mmagic.visualization import ConcatImageVisualizer def test_concatimagevisualizer(): diff --git a/tests/test_visualization/test_gen_visualizer.py b/tests/test_visualization/test_gen_visualizer.py index 33bf473ec4..58f62246be 100644 --- a/tests/test_visualization/test_gen_visualizer.py +++ b/tests/test_visualization/test_gen_visualizer.py @@ -5,9 +5,9 @@ import torch -from mmedit.structures import EditDataSample -from mmedit.utils import register_all_modules -from mmedit.visualization import GenVisualizer +from mmagic.structures import EditDataSample +from mmagic.utils import register_all_modules +from mmagic.visualization import GenVisualizer register_all_modules() diff --git a/tests/test_visualization/test_vis_backend.py b/tests/test_visualization/test_vis_backend.py index 3a43135657..6b6bf9002d 100644 --- a/tests/test_visualization/test_vis_backend.py +++ b/tests/test_visualization/test_vis_backend.py @@ -10,7 +10,7 @@ import torch from mmengine import Config, MessageHub -from mmedit.visualization import (GenVisBackend, PaviGenVisBackend, +from mmagic.visualization import (GenVisBackend, PaviGenVisBackend, TensorboardGenVisBackend, WandbGenVisBackend) @@ -18,7 +18,7 @@ class TestGenVisBackend(TestCase): def test_vis_backend(self): message_hub = MessageHub.get_instance('test-visbackend') - config = Config(dict(work_dir='./mmedit/test/vis_backend_test/')) + config = Config(dict(work_dir='./mmagic/test/vis_backend_test/')) message_hub.update_info('cfg', config.pretty_text) data_root = 'tmp_dir' @@ -28,7 +28,7 @@ def test_vis_backend(self): self.assertEqual(vis_backend.experiment, vis_backend) # test path mapping src_path = osp.abspath( - './mmedit/test/vis_backend_test/test_vis_data/test.png') + './mmagic/test/vis_backend_test/test_vis_data/test.png') tar_path = 's3://xxx/vis_backend_test/test_vis_data/test.png' file_client = vis_backend._file_client mapped_path = file_client._map_path(src_path) From cb541086a1e47f91e3a659c3dd7fc58539360969 Mon Sep 17 00:00:00 2001 From: zhangjingdong <1396925302@qq.com> Date: Wed, 19 Apr 2023 17:59:42 +0800 Subject: [PATCH 20/42] [Rename] rename to mmagic in demo --- demo/colorization_demo.py | 4 +- demo/conditional_demo.py | 2 +- demo/gradio_controlnet_animation.py | 2 +- demo/gradio_inpainting.py | 10 ++--- demo/inpainting_demo.py | 4 +- demo/matting_demo.py | 2 +- demo/matting_tutorial.ipynb | 24 +++++------ demo/mmediting_inference_demo.py | 2 +- demo/mmediting_inference_tutorial.ipynb | 54 ++++++++++++------------ demo/restoration_demo.py | 4 +- demo/restoration_face_demo.py | 4 +- demo/restoration_video_demo.py | 4 +- demo/restorer_basic_tutorial.ipynb | 2 +- demo/restorer_basic_tutorial_zh-CN.ipynb | 2 +- demo/singan_demo.py | 12 +++--- demo/translation_demo.py | 2 +- demo/unconditional_demo.py | 2 +- demo/video_interpolation_demo.py | 4 +- 18 files changed, 70 insertions(+), 70 deletions(-) diff --git a/demo/colorization_demo.py b/demo/colorization_demo.py index 926515f637..0c30c6047f 100644 --- a/demo/colorization_demo.py +++ b/demo/colorization_demo.py @@ -4,8 +4,8 @@ import mmcv import torch -from mmedit.apis import colorization_inference, init_model -from mmedit.utils import modify_args, tensor2img +from mmagic.apis import colorization_inference, init_model +from mmagic.utils import modify_args, tensor2img def parse_args(): diff --git a/demo/conditional_demo.py b/demo/conditional_demo.py index 4eb6ab5eb0..e8798c297a 100644 --- a/demo/conditional_demo.py +++ b/demo/conditional_demo.py @@ -10,7 +10,7 @@ # yapf: disable sys.path.append(os.path.abspath(os.path.join(__file__, '../..'))) # isort:skip # noqa -from mmedit.apis import init_model, sample_conditional_model # isort:skip # noqa +from mmagic.apis import init_model, sample_conditional_model # isort:skip # noqa # yapf: enable diff --git a/demo/gradio_controlnet_animation.py b/demo/gradio_controlnet_animation.py index a7c23937b3..58b99998ff 100644 --- a/demo/gradio_controlnet_animation.py +++ b/demo/gradio_controlnet_animation.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import gradio as gr -from mmedit.edit import MMEdit +from mmagic.edit import MMEdit editor = MMEdit(model_name='controlnet_animation') diff --git a/demo/gradio_inpainting.py b/demo/gradio_inpainting.py index fd52d0465b..7b9952b6e5 100644 --- a/demo/gradio_inpainting.py +++ b/demo/gradio_inpainting.py @@ -14,7 +14,7 @@ import yaml from mmengine.registry import init_default_scope -from mmedit.apis.inferencers.inpainting_inferencer import InpaintingInferencer +from mmagic.apis.inferencers.inpainting_inferencer import InpaintingInferencer class InpaintingGradio: @@ -43,7 +43,7 @@ def __init__(self, extra_parameters: Dict = None, seed: int = 2022, **kwargs) -> None: - init_default_scope('mmedit') + init_default_scope('mmagic') InpaintingGradio.init_inference_supported_models_cfg() self.model_name = model_name self.model_setting = model_setting @@ -119,14 +119,14 @@ def change_text2dict(input_text: str) -> Union[Dict, None]: @staticmethod def get_package_path() -> str: p = subprocess.Popen( - 'pip show mmedit', shell=True, stdout=subprocess.PIPE) + 'pip show mmagic', shell=True, stdout=subprocess.PIPE) out, err = p.communicate() out = out.decode() if 'Location' not in out: - InpaintingGradio.send_notification('module mmedit not found', + InpaintingGradio.send_notification('module mmagic not found', InpaintingGradio.error_color, 'error') - raise Exception('module mmedit not found') + raise Exception('module mmagic not found') package_path = out[out.find('Location') + len('Location: '):].split('\r\n')[0] + os.sep return package_path diff --git a/demo/inpainting_demo.py b/demo/inpainting_demo.py index f896c21cf6..ada598e397 100644 --- a/demo/inpainting_demo.py +++ b/demo/inpainting_demo.py @@ -4,8 +4,8 @@ import mmcv import torch -from mmedit.apis import init_model, inpainting_inference -from mmedit.utils import tensor2img +from mmagic.apis import init_model, inpainting_inference +from mmagic.utils import tensor2img def parse_args(): diff --git a/demo/matting_demo.py b/demo/matting_demo.py index b5e15a0ce3..a139b89d0d 100644 --- a/demo/matting_demo.py +++ b/demo/matting_demo.py @@ -4,7 +4,7 @@ import mmcv import torch -from mmedit.apis import init_model, matting_inference +from mmagic.apis import init_model, matting_inference def parse_args(): diff --git a/demo/matting_tutorial.ipynb b/demo/matting_tutorial.ipynb index 336868193b..e9aa953171 100644 --- a/demo/matting_tutorial.ipynb +++ b/demo/matting_tutorial.ipynb @@ -143,12 +143,12 @@ "Resolving deltas: 100% (6710/6710), done.\n", "/content/mmediting\n", "Obtaining file:///content/mmediting\n", - "Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmedit==0.13.0) (0.99)\n", - "Requirement already satisfied: mmcv-full>=1.3.1 in /usr/local/lib/python3.7/dist-packages (from mmedit==0.13.0) (1.4.6)\n", - "Requirement already satisfied: opencv-python<=4.5.4.60 in /usr/local/lib/python3.7/dist-packages (from mmedit==0.13.0) (4.1.2.30)\n", - "Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmedit==0.13.0) (0.18.3)\n", - "Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmedit==0.13.0) (2.8.0)\n", - "Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmedit==0.13.0) (0.32.0)\n", + "Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.99)\n", + "Requirement already satisfied: mmcv-full>=1.3.1 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (1.4.6)\n", + "Requirement already satisfied: opencv-python<=4.5.4.60 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (4.1.2.30)\n", + "Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.18.3)\n", + "Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (2.8.0)\n", + "Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.32.0)\n", "Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (7.1.2)\n", "Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (2.4.0)\n", "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (3.13)\n", @@ -313,7 +313,7 @@ } ], "source": [ - "from mmedit.apis import matting_inference, init_model\n", + "from mmagic.apis import matting_inference, init_model\n", "\n", "# Choose to use a config and initialize the mattor\n", "config = 'configs/indexnet/indexnet_mobv2_1x16_78k_comp1k.py'\n", @@ -1368,9 +1368,9 @@ "source": [ "import os.path as osp\n", "\n", - "from mmedit.datasets import build_dataset\n", - "from mmedit.models import build_model\n", - "from mmedit.apis import train_model\n", + "from mmagic.datasets import build_dataset\n", + "from mmagic.models import build_model\n", + "from mmagic.apis import train_model\n", "\n", "import mmcv\n", "\n", @@ -1433,8 +1433,8 @@ } ], "source": [ - "from mmedit.apis import single_gpu_test\n", - "from mmedit.datasets import build_dataloader\n", + "from mmagic.apis import single_gpu_test\n", + "from mmagic.datasets import build_dataloader\n", "from mmcv.parallel import MMDataParallel\n", "\n", "# Build a test dataloader and model\n", diff --git a/demo/mmediting_inference_demo.py b/demo/mmediting_inference_demo.py index 56649f35f8..f3a14784ad 100644 --- a/demo/mmediting_inference_demo.py +++ b/demo/mmediting_inference_demo.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. # isort: off from argparse import ArgumentParser -from mmedit.edit import MMEdit +from mmagic.edit import MMEdit from mmengine import DictAction diff --git a/demo/mmediting_inference_tutorial.ipynb b/demo/mmediting_inference_tutorial.ipynb index 31220d7b06..85901c202c 100644 --- a/demo/mmediting_inference_tutorial.ipynb +++ b/demo/mmediting_inference_tutorial.ipynb @@ -162,19 +162,19 @@ "/mnt/petrelfs/liuwenran/develop/mmediting\n", "Obtaining file:///mnt/petrelfs/liuwenran/develop/mmediting\n", " Preparing metadata (setup.py) ... \u001b[?25ldone\n", - "\u001b[?25hRequirement already satisfied: av in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (10.0.0)\n", - "Requirement already satisfied: face-alignment in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (1.3.5)\n", - "Requirement already satisfied: facexlib in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (0.2.5)\n", - "Requirement already satisfied: lmdb in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (1.3.0)\n", - "Requirement already satisfied: lpips in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (0.1.4)\n", - "Requirement already satisfied: mmcv>=2.0.0rc1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (2.0.0rc2)\n", - "Requirement already satisfied: mmengine in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (0.2.0)\n", - "Requirement already satisfied: numpy in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (1.23.4)\n", - "Requirement already satisfied: opencv-python!=4.5.5.62,!=4.5.5.64 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (4.6.0.66)\n", - "Requirement already satisfied: Pillow in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (9.2.0)\n", - "Requirement already satisfied: tensorboard in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (2.10.1)\n", - "Requirement already satisfied: torch in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (1.9.0+cu111)\n", - "Requirement already satisfied: torchvision in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmedit==1.0.0rc3) (0.10.0+cu111)\n", + "\u001b[?25hRequirement already satisfied: av in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (10.0.0)\n", + "Requirement already satisfied: face-alignment in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.3.5)\n", + "Requirement already satisfied: facexlib in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.2.5)\n", + "Requirement already satisfied: lmdb in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.3.0)\n", + "Requirement already satisfied: lpips in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.1.4)\n", + "Requirement already satisfied: mmcv>=2.0.0rc1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (2.0.0rc2)\n", + "Requirement already satisfied: mmengine in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.2.0)\n", + "Requirement already satisfied: numpy in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.23.4)\n", + "Requirement already satisfied: opencv-python!=4.5.5.62,!=4.5.5.64 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (4.6.0.66)\n", + "Requirement already satisfied: Pillow in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (9.2.0)\n", + "Requirement already satisfied: tensorboard in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (2.10.1)\n", + "Requirement already satisfied: torch in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.9.0+cu111)\n", + "Requirement already satisfied: torchvision in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.10.0+cu111)\n", "Requirement already satisfied: addict in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1->mmedit==1.0.0rc3) (2.4.0)\n", "Requirement already satisfied: packaging in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1->mmedit==1.0.0rc3) (21.3)\n", "Requirement already satisfied: yapf in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1->mmedit==1.0.0rc3) (0.32.0)\n", @@ -292,7 +292,7 @@ } ], "source": [ - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# print all supported models for inference.\n", "inference_supported_models = MMEdit.get_inference_supported_models()\n", @@ -485,7 +485,7 @@ } ], "source": [ - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# Create a MMEdit instance\n", "editor = MMEdit('pix2pix')\n", @@ -564,7 +564,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "result_out_dir = '../resources/output/conditional/tutorial_conditinal_biggan_res_setting1.jpg'\n", "# configure setting to 1\n", @@ -614,7 +614,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "result_out_dir = '../resources/output/conditional/tutorial_conditinal_biggan_res_sample6.jpg'\n", "# use a dict to pass the parameters, num_batches means images output num for one inference\n", @@ -651,7 +651,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "editor = MMEdit('biggan', model_setting=1) \n", "editor.print_extra_parameters()\n", @@ -716,7 +716,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# Create a MMEdit instance and infer\n", "result_out_dir = '../resources/output/conditional/tutorial_conditinal_biggan_res.jpg'\n", @@ -784,7 +784,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "img = '../resources/input/inpainting/celeba_test.png'\n", "mask = '../resources/input/inpainting/bbox_mask.png'\n", @@ -867,7 +867,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "img = '../resources/input/matting/GT05.jpg'\n", "trimap = '../resources/input/matting/GT05_trimap.jpg'\n", @@ -926,7 +926,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# Create a MMEdit instance and infer\n", "img = '../resources/input/restoration/0901x2.png'\n", @@ -985,7 +985,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "img = '../resources/input/translation/gt_mask_0.png'\n", "\n", @@ -1042,7 +1042,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# Create a MMEdit instance and infer\n", "result_out_dir = '../resources/output/unconditional/tutorial_unconditional_styleganv1_res.png'\n", @@ -1082,7 +1082,7 @@ ], "source": [ "import os\n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "from mmengine import mkdir_or_exist\n", "\n", "# Create a MMEdit instance and infer\n", @@ -1126,7 +1126,7 @@ ], "source": [ "import os\n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "from mmengine import mkdir_or_exist\n", "\n", "# Create a MMEdit instance and infer\n", @@ -1194,7 +1194,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmedit.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# Create a MMEdit instance and infer\n", "editor = MMEdit(model_name='disco_diffusion')\n", diff --git a/demo/restoration_demo.py b/demo/restoration_demo.py index 3ae5895a40..fefbab89fb 100644 --- a/demo/restoration_demo.py +++ b/demo/restoration_demo.py @@ -5,8 +5,8 @@ import mmcv import torch -from mmedit.apis import init_model, restoration_inference -from mmedit.utils import modify_args, tensor2img +from mmagic.apis import init_model, restoration_inference +from mmagic.utils import modify_args, tensor2img def parse_args(): diff --git a/demo/restoration_face_demo.py b/demo/restoration_face_demo.py index cfe62c610f..8ee6a93b8b 100644 --- a/demo/restoration_face_demo.py +++ b/demo/restoration_face_demo.py @@ -5,8 +5,8 @@ import mmcv import torch -from mmedit.apis import init_model, restoration_face_inference -from mmedit.utils import modify_args +from mmagic.apis import init_model, restoration_face_inference +from mmagic.utils import modify_args def parse_args(): diff --git a/demo/restoration_video_demo.py b/demo/restoration_video_demo.py index 0d058b552f..ebe7122725 100644 --- a/demo/restoration_video_demo.py +++ b/demo/restoration_video_demo.py @@ -7,8 +7,8 @@ import numpy as np import torch -from mmedit.apis import init_model, restoration_video_inference -from mmedit.utils import modify_args, tensor2img +from mmagic.apis import init_model, restoration_video_inference +from mmagic.utils import modify_args, tensor2img VIDEO_EXTENSIONS = ('.mp4', '.mov') diff --git a/demo/restorer_basic_tutorial.ipynb b/demo/restorer_basic_tutorial.ipynb index 120fe6e7b4..d87666c3eb 100644 --- a/demo/restorer_basic_tutorial.ipynb +++ b/demo/restorer_basic_tutorial.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","metadata":{"id":"T2WWQiheMF7q"},"source":["# MMEditing Basic Tutorial\n","\n","Welcome to MMEditing! This is the official Colab tutorial for MMEditing. In this tutorial you will learn how to train and test a restorer using the APIs provided in MMEditing. \n","\n","This is a quick guide for you to train and test existing models. If you want to develop you own models based on MMEditing and know more about the code structures, please refer to our comprehensive tutorial [here]().\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmedit/blob/main/demo/restorer_basic_tutorial.ipynb)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"-kYw3WQ0MQry"},"source":["## Install MMEditing\n","\n","MMEditing can be installed in three steps:\n","\n","1. Install a compatible PyTorch version (You need to check you CUDA version by using `nvcc -V`).\n","2. Install pre-compiled MMCV\n","3. Clone and install MMEditing\n","\n","The steps are shown below:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":279948,"status":"ok","timestamp":1625140820804,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"GIeIZEzZMfc0","outputId":"fe2e5ded-988d-4563-eb18-374344c316ef"},"outputs":[{"name":"stdout","output_type":"stream","text":["Looking in links: https://download.pytorch.org/whl/torch_stable.html\n","Collecting torch==1.7.0+cu110\n","\u001b[?25l Downloading https://download.pytorch.org/whl/cu110/torch-1.7.0%2Bcu110-cp37-cp37m-linux_x86_64.whl (1137.1MB)\n","\u001b[K |███████████████████████▌ | 834.1MB 1.3MB/s eta 0:03:50tcmalloc: large alloc 1147494400 bytes == 0x56458d07a000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |█████████████████████████████▊ | 1055.7MB 1.2MB/s eta 0:01:07tcmalloc: large alloc 1434370048 bytes == 0x5645d16d0000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |████████████████████████████████| 1137.1MB 1.1MB/s eta 0:00:01tcmalloc: large alloc 1421369344 bytes == 0x564626ebc000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645535c430a 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c4a81\n","\u001b[K |████████████████████████████████| 1137.1MB 16kB/s \n","\u001b[?25hCollecting torchvision==0.8.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/1d/3f/4f45249458a0dee85bff7acf4a2ac6177708253f1f318fcf6ee230fb864f/torchvision-0.8.0-cp37-cp37m-manylinux1_x86_64.whl (11.8MB)\n","\u001b[K |████████████████████████████████| 11.8MB 254kB/s \n","\u001b[?25hRequirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (3.7.4.3)\n","Collecting dataclasses\n"," Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n","Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (1.19.5)\n","Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (0.16.0)\n","Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.0) (7.1.2)\n","\u001b[31mERROR: torchtext 0.10.0 has requirement torch==1.9.0, but you'll have torch 1.7.0+cu110 which is incompatible.\u001b[0m\n","Installing collected packages: dataclasses, torch, torchvision\n"," Found existing installation: torch 1.9.0+cu102\n"," Uninstalling torch-1.9.0+cu102:\n"," Successfully uninstalled torch-1.9.0+cu102\n"," Found existing installation: torchvision 0.10.0+cu102\n"," Uninstalling torchvision-0.10.0+cu102:\n"," Successfully uninstalled torchvision-0.10.0+cu102\n","Successfully installed dataclasses-0.6 torch-1.7.0+cu110 torchvision-0.8.0\n","Looking in links: https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n","Collecting mmcv-full==1.3.5\n","\u001b[?25l Downloading https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/mmcv_full-1.3.5-cp37-cp37m-manylinux1_x86_64.whl (31.1MB)\n","\u001b[K |████████████████████████████████| 31.1MB 107kB/s \n","\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (1.19.5)\n","Collecting addict\n"," Downloading https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl\n","Collecting yapf\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/5f/0d/8814e79eb865eab42d95023b58b650d01dec6f8ea87fc9260978b1bf2167/yapf-0.31.0-py2.py3-none-any.whl (185kB)\n","\u001b[K |████████████████████████████████| 194kB 33.0MB/s \n","\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (7.1.2)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (4.1.2.30)\n","Installing collected packages: addict, yapf, mmcv-full\n","Successfully installed addict-2.4.0 mmcv-full-1.3.5 yapf-0.31.0\n","Cloning into 'mmediting'...\n","remote: Enumerating objects: 7162, done.\u001b[K\n","remote: Counting objects: 100% (1367/1367), done.\u001b[K\n","remote: Compressing objects: 100% (793/793), done.\u001b[K\n","remote: Total 7162 (delta 827), reused 928 (delta 554), pack-reused 5795\u001b[K\n","Receiving objects: 100% (7162/7162), 5.02 MiB | 32.14 MiB/s, done.\n","Resolving deltas: 100% (4826/4826), done.\n","/content/mmediting\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 1)) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 2)) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 3)) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 4)) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 5)) (0.31.0)\n","Collecting codecov\n"," Downloading https://files.pythonhosted.org/packages/93/9f/bbea5b6231308458963cb5c067bc5643da9949689702fa5a382714b59699/codecov-2.1.11-py2.py3-none-any.whl\n","Collecting flake8\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/fc/80/35a0716e5d5101e643404dabd20f07f5528a21f3ef4032d31a49c913237b/flake8-3.9.2-py2.py3-none-any.whl (73kB)\n","\u001b[K |████████████████████████████████| 81kB 9.7MB/s \n","\u001b[?25hCollecting interrogate\n"," Downloading https://files.pythonhosted.org/packages/cd/6d/ce3ac440b13c1b36b323a0eab191499a902adade3cc11b18078c07af3e6e/interrogate-1.4.0-py3-none-any.whl\n","Collecting isort==4.3.21\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n","\u001b[K |████████████████████████████████| 51kB 7.5MB/s \n","\u001b[?25hCollecting onnxruntime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/f9/76/3d0f8bb2776961c7335693df06eccf8d099e48fa6fb552c7546867192603/onnxruntime-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5MB)\n","\u001b[K |████████████████████████████████| 4.5MB 37.4MB/s \n","\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.7/dist-packages (from -r requirements/tests.txt (line 6)) (3.6.4)\n","Collecting pytest-runner\n"," Downloading https://files.pythonhosted.org/packages/f4/f5/6605d73bf3f4c198915872111b10c4b3c2dccd8485f47b7290ceef037190/pytest_runner-5.3.1-py3-none-any.whl\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (1.19.5)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (2.4.0)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (4.1.2.30)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (3.13)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.5.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.4.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.4.1)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.1.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (3.2.2)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.36.2)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.34.1)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.6.1)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.8.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (2.23.0)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.4.4)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (57.0.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.12.0)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.12.4)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.3.4)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.31.0)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.0.1)\n","Requirement already satisfied: coverage in /usr/local/lib/python3.7/dist-packages (from codecov->-r requirements/tests.txt (line 1)) (3.7.1)\n","Collecting pyflakes<2.4.0,>=2.3.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/11/2a745612f1d3cbbd9c69ba14b1b43a35a2f5c3c81cd0124508c52c64307f/pyflakes-2.3.1-py2.py3-none-any.whl (68kB)\n","\u001b[K |████████████████████████████████| 71kB 9.8MB/s \n","\u001b[?25hCollecting pycodestyle<2.8.0,>=2.7.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/cc/227251b1471f129bc35e966bb0fceb005969023926d744139642d847b7ae/pycodestyle-2.7.0-py2.py3-none-any.whl (41kB)\n","\u001b[K |████████████████████████████████| 51kB 8.7MB/s \n","\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n"," Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from flake8->-r requirements/tests.txt (line 2)) (4.5.0)\n","Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.8.9)\n","Collecting colorama\n"," Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n","Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (7.1.2)\n","Requirement already satisfied: toml in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.10.2)\n","Requirement already satisfied: py in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (1.10.0)\n","Requirement already satisfied: attrs in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (21.2.0)\n","Requirement already satisfied: flatbuffers in /usr/local/lib/python3.7/dist-packages (from onnxruntime->-r requirements/tests.txt (line 5)) (1.12)\n","Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (8.8.0)\n","Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (0.7.1)\n","Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.15.0)\n","Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.4.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->-r requirements/runtime.txt (line 3)) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (1.3.1)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (3.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2021.5.30)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (1.24.3)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2.10)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (1.3.0)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.7.2)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.2.2)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (3.1.1)\n","Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.7/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3.6\"->google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.4.8)\n","Installing collected packages: codecov, pyflakes, pycodestyle, mccabe, flake8, colorama, interrogate, isort, onnxruntime, pytest-runner\n","Successfully installed codecov-2.1.11 colorama-0.4.4 flake8-3.9.2 interrogate-1.4.0 isort-4.3.21 mccabe-0.6.1 onnxruntime-1.8.0 pycodestyle-2.7.0 pyflakes-2.3.1 pytest-runner-5.3.1\n","Created temporary directory: /tmp/pip-ephem-wheel-cache-hu6xvjxh\n","Created temporary directory: /tmp/pip-req-tracker-zk5q0q3z\n","Created requirements tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Created temporary directory: /tmp/pip-install-vr_vpseo\n","Obtaining file:///content/mmediting\n"," Added file:///content/mmediting to build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"," Running setup.py (path:/content/mmediting/setup.py) egg_info for package from file:///content/mmediting\n"," Running command python setup.py egg_info\n"," running egg_info\n"," creating mmedit.egg-info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," Source in /content/mmediting has version 0.8.0, which satisfies requirement mmedit==0.8.0 from file:///content/mmediting\n"," Removed mmedit==0.8.0 from file:///content/mmediting from build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmedit==0.8.0) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from mmedit==0.8.0) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmedit==0.8.0) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmedit==0.8.0) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmedit==0.8.0) (0.31.0)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (4.1.2.30)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (2.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (1.19.5)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.5.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.4.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.4.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (3.2.2)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.1.1)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.34.1)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.12.4)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.0.1)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.36.2)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.31.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.12.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (2.23.0)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.8.0)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.3.4)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.4.4)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.6.1)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (57.0.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->mmedit==0.8.0) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (1.3.1)\n","Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from grpcio>=1.24.3->tensorboard->mmedit==0.8.0) (1.15.0)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.2.2)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.7.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (1.24.3)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2.10)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2021.5.30)\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.8.0) (4.5.0)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (1.3.0)\n","Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.4.8)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (3.1.1)\n","Installing collected packages: mmedit\n"," Running setup.py develop for mmedit\n"," Running command /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/content/mmediting/setup.py'\"'\"'; __file__='\"'\"'/content/mmediting/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' develop --no-deps\n"," running develop\n"," running egg_info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," running build_ext\n"," Creating /usr/local/lib/python3.7/dist-packages/mmedit.egg-link (link to .)\n"," Adding mmedit 0.8.0 to easy-install.pth file\n","\n"," Installed /content/mmediting\n","Successfully installed mmedit\n","Cleaning up...\n","Removed build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"]}],"source":["# Install openmim for the installation of mmcv-full\n","!pip install openmim\n","\n","# Install mmcv-full thus we could use CUDA operators\n","!mim install mmcv-full\n","\n","# Clone MMEditing\n","!rm -rf mmediting\n","!git clone https://github.com/open-mmlab/mmediting.git\n","%cd mmediting\n","\n","# Install MMEditing\n","!pip install -v -e ."]},{"cell_type":"markdown","metadata":{"id":"QgX96Sc_3PcV"},"source":["## Download necessary material for this demo\n","We will need some data and configuration files in this demo. We will download it and put it in `./demo_files/`"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4723,"status":"ok","timestamp":1625140825508,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"-K0zFSJ-3V42","outputId":"528a87f7-f78e-4219-84f3-dec19b88e88a"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2021-07-01 11:59:48-- https://download.openmmlab.com/mmediting/demo_files.zip\n","Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.35\n","Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.35|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 19215781 (18M) [application/zip]\n","Saving to: ‘demo_files.zip’\n","\n","demo_files.zip 100%[===================>] 18.33M 6.00MB/s in 3.1s \n","\n","2021-07-01 11:59:52 (6.00 MB/s) - ‘demo_files.zip’ saved [19215781/19215781]\n","\n","Archive: demo_files.zip\n"," creating: demo_files/\n"," inflating: demo_files/demo_config_EDVR.py \n"," inflating: demo_files/demo_config_BasicVSR.py \n"," creating: demo_files/lq_sequences/\n"," creating: demo_files/lq_sequences/calendar/\n"," inflating: demo_files/lq_sequences/calendar/00000006.png \n"," inflating: demo_files/lq_sequences/calendar/00000007.png \n"," inflating: demo_files/lq_sequences/calendar/00000010.png \n"," inflating: demo_files/lq_sequences/calendar/00000004.png \n"," inflating: demo_files/lq_sequences/calendar/00000003.png \n"," inflating: demo_files/lq_sequences/calendar/00000001.png \n"," inflating: demo_files/lq_sequences/calendar/00000000.png \n"," inflating: demo_files/lq_sequences/calendar/00000009.png \n"," inflating: demo_files/lq_sequences/calendar/00000008.png \n"," inflating: demo_files/lq_sequences/calendar/00000002.png \n"," inflating: demo_files/lq_sequences/calendar/00000005.png \n"," creating: demo_files/lq_sequences/city/\n"," inflating: demo_files/lq_sequences/city/00000006.png \n"," inflating: demo_files/lq_sequences/city/00000007.png \n"," inflating: demo_files/lq_sequences/city/00000010.png \n"," inflating: demo_files/lq_sequences/city/00000004.png \n"," inflating: demo_files/lq_sequences/city/00000003.png \n"," inflating: demo_files/lq_sequences/city/00000001.png \n"," inflating: demo_files/lq_sequences/city/00000000.png \n"," inflating: demo_files/lq_sequences/city/00000009.png \n"," inflating: demo_files/lq_sequences/city/00000008.png \n"," inflating: demo_files/lq_sequences/city/00000002.png \n"," inflating: demo_files/lq_sequences/city/00000005.png \n"," creating: demo_files/lq_sequences/.ipynb_checkpoints/\n"," creating: demo_files/gt_images/\n"," inflating: demo_files/gt_images/bird.png \n"," inflating: demo_files/gt_images/woman.png \n"," inflating: demo_files/gt_images/head.png \n"," inflating: demo_files/gt_images/baby.png \n"," inflating: demo_files/gt_images/butterfly.png \n"," inflating: demo_files/demo_config_SRCNN.py \n"," creating: demo_files/lq_images/\n"," extracting: demo_files/lq_images/bird.png \n"," extracting: demo_files/lq_images/woman.png \n"," extracting: demo_files/lq_images/head.png \n"," extracting: demo_files/lq_images/baby.png \n"," extracting: demo_files/lq_images/butterfly.png \n"," creating: demo_files/gt_sequences/\n"," creating: demo_files/gt_sequences/calendar/\n"," inflating: demo_files/gt_sequences/calendar/00000006.png \n"," inflating: demo_files/gt_sequences/calendar/00000007.png \n"," inflating: demo_files/gt_sequences/calendar/00000010.png \n"," inflating: demo_files/gt_sequences/calendar/00000004.png \n"," inflating: demo_files/gt_sequences/calendar/00000003.png \n"," inflating: demo_files/gt_sequences/calendar/00000001.png \n"," inflating: demo_files/gt_sequences/calendar/00000000.png \n"," inflating: demo_files/gt_sequences/calendar/00000009.png \n"," inflating: demo_files/gt_sequences/calendar/00000008.png \n"," inflating: demo_files/gt_sequences/calendar/00000002.png \n"," inflating: demo_files/gt_sequences/calendar/00000005.png \n"," creating: demo_files/gt_sequences/city/\n"," inflating: demo_files/gt_sequences/city/00000006.png \n"," inflating: demo_files/gt_sequences/city/00000007.png \n"," inflating: demo_files/gt_sequences/city/00000010.png \n"," inflating: demo_files/gt_sequences/city/00000004.png \n"," inflating: demo_files/gt_sequences/city/00000003.png \n"," inflating: demo_files/gt_sequences/city/00000001.png \n"," inflating: demo_files/gt_sequences/city/00000000.png \n"," inflating: demo_files/gt_sequences/city/00000009.png \n"," inflating: demo_files/gt_sequences/city/00000008.png \n"," inflating: demo_files/gt_sequences/city/00000002.png \n"," inflating: demo_files/gt_sequences/city/00000005.png \n"," creating: demo_files/gt_sequences/.ipynb_checkpoints/\n"," creating: demo_files/.ipynb_checkpoints/\n"]}],"source":["!wget https://download.openmmlab.com/mmediting/demo_files.zip # download files\n","!unzip demo_files # unzip\n","\n","# copy the data to data/Set5 for later use\n","!mkdir data\n","!mkdir data/val_set5\n","!cp -r demo_files/lq_images data/val_set5/Set5_bicLRx4\n","!cp -r demo_files/gt_images data/val_set5/Set5"]},{"cell_type":"markdown","metadata":{"id":"zXGurqGKOeNE"},"source":["## Inference with a pre-trained image restorer\n","You can easily perform inference on a single image with a pre-trained restorer by using `restoration_demo.py`. What you need are \n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer you want to use. It specifies the model you want to use. \n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model. \n","3. `IMAGE_FILE`: The path to the input image.\n","4. `SAVE_FILE`: The location where you want to store the output image.\n","5. `imshow`: Whether to show the image. (Optional)\n","6. `GPU_ID`: Which GPU you want to use. (Optional)\n","\n","Once you have all these details, you can directly use the following command:\n","\n","```\n","python demo/restoration_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${IMAGE_FILE} ${SAVE_FILE} [--imshow] [--device ${GPU_ID}]\n","```\n","\n","**Notes:** \n","1. Configuration files are located in `./configs`. \n","2. We support loading checkpoints from url. You can go to the corresponding page (e.g. [here](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan)) to obtain the url of the pretrained model.\n","\n","---\n","\n","We will now use `SRCNN` and `ESRGAN` as examples.\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58677,"status":"ok","timestamp":1625140884175,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"KiPvtvlqM1zb","outputId":"be7375a7-4632-4770-8383-2a8ce654b069"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\" to /root/.cache/torch/hub/checkpoints/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\n","100% 83.9k/83.9k [00:00<00:00, 1.59MB/s]\n","2021-07-01 12:00:10,779 - mmedit - INFO - Use load_from_torchvision loader\n","Downloading: \"https://download.pytorch.org/models/vgg19-dcbb9e9d.pth\" to /root/.cache/torch/hub/checkpoints/vgg19-dcbb9e9d.pth\n","100% 548M/548M [00:07<00:00, 76.0MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\" to /root/.cache/torch/hub/checkpoints/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\n","100% 196M/196M [00:26<00:00, 7.61MB/s]\n","bird_ESRGAN.png bird_SRCNN.png\n"]}],"source":["# SRCNN\n","!python demo/restoration_demo.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth ./demo_files/lq_images/bird.png ./outputs/bird_SRCNN.png\n","\n","# ESRGAN\n","!python demo/restoration_demo.py ./configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth ./demo_files/lq_images/bird.png ./outputs/bird_ESRGAN.png\n","\n","# Check whether images are saved\n","!ls ./outputs"]},{"cell_type":"markdown","metadata":{"id":"W1DfGHu3Xcfd"},"source":["## Inference with a pre-trained video restorer\n","\n","MMEditing also supports video super-resolution methods, and the procedure is similar. You can use `restoration_video_demo.py` with the following arguments:\n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer you want to use\n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model. \n","3. `INPUT_DIR`: The directory containing the video frames.\n","4. `OUTPUT_DIR`: The location where you want to store the output frames.\n","5. `WINDOW_SIZE`: The window size if you are using sliding-window method (Optional).\n","6. `GPU_ID`: Which GPU you want to use (Optional).\n","```\n","python demo/restoration_video_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${INPUT_DIR} ${OUTPUT_DIR} [--window_size=$WINDOW_SIZE] [--device ${GPU_ID}]\n","```\n","**Note:** There are two different frameworks in video super-resolution: ***sliding-window*** and ***recurrent*** frameworks. When you use the methods of the sliding-window framework, such as EDVR, you need to specify `window_size`. This value is dependent on the model you use.\n","\n","---\n","\n","We will now use `EDVR` and `BasicVSR` as examples.\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29263,"status":"ok","timestamp":1625140913405,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"iaoE7UF5Xb2i","outputId":"a022e0bd-c47a-450e-f4e4-1bf9f92e4813"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\" to /root/.cache/torch/hub/checkpoints/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\n","100% 11.5M/11.5M [00:01<00:00, 8.55MB/s]\n","2021-07-01 12:01:09,689 - mmedit - INFO - Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth\" to /root/.cache/torch/hub/checkpoints/spynet_20210409-c6c1bd09.pth\n","100% 5.50M/5.50M [00:00<00:00, 8.88MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth\" to /root/.cache/torch/hub/checkpoints/basicvsr_reds4_20120409-0e599677.pth\n","100% 24.1M/24.1M [00:02<00:00, 8.97MB/s]\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# EDVR (Sliding-window framework)\n","!python demo/restoration_video_demo.py ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_EDVR --window_size=5\n","\n","# BasicVSR (Recurrent framework)\n","!python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_BasicVSR\n","\n","# Check whether video frames are saved\n","!ls ./outputs/calendar_BasicVSR"]},{"cell_type":"markdown","metadata":{"id":"Rf3LW57qMHXb"},"source":["## Test on a pre-defined dataset using the configuration file\n","\n","The above demos provide an easy way to perform inference on a single image or video sequence. If you want to perform inference on a set of images or sequences, you can make use of the configuration files located in `./configs`.\n"," \n","Existing configuration files allow you to perform inference on common datasets, such as `Set5` in image super-resolution and `REDS4` in video super-resolution. You can use the following command:\n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer and dataset you want to use\n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model.\n","3. `GPU_NUM`: Number of GPUs used for test. \n","4. `RESULT_FILE`: The path to the output result pickle file. (Optional)\n","5. `IMAGE_SAVE_PATH`: The location where you want to store the output image. (Optional)\n","\n","```\n","# single-gpu testing\n","python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","\n","# multi-gpu testing\n","./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","```\n","What you need to do is to modify the `lq_folder` and `gt_folder` in the configuration file:\n","```\n","test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/val_set5/Set5_bicLRx4',\n"," gt_folder='data/val_set5/Set5',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","```\n","\n","**Note**: Some dataset type (e.g. `SRREDSDataset`) requires an annotation file specifying the details of the dataset. Please refer to the corresponding file\n","in `./mmedit/dataset/` for more details. \n","\n","---\n","\n","The following is the command for SRCNN. For other models, you can simply change the paths to the configuration file and pretrained model. \n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14095,"status":"ok","timestamp":1625140927462,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"tClgIYgcbbVg","outputId":"c37ec2de-e1c9-42ae-ed9b-31009d48ae64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"tools/test.py\", line 136, in \n"," main()\n"," File \"tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/test.py\", line 136, in \n"," main()\n"," File \"./tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/test.py', '--local_rank=0', './configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py', 'https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth', '--launcher', 'pytorch', '--save-path', './outputs/']' returned non-zero exit status 1.\n"]}],"source":["# single-gpu\n","!python tools/test.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/\n","\n","# multi-gpu testing\n","!./tools/dist_test.sh ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth 1 --save-path ./outputs/"]},{"cell_type":"markdown","metadata":{"id":"KWKVyeEQelh3"},"source":["## Test on your own datasets\n","\n","When you want to test on your own datasets, you need to modify `test_dataset_type` in addition to the dataset paths. \n","\n","- For image super-resolution, you need to use `SRFolderDataset`\n","- For sliding-window framework in video super-resolution (e.g. EDVR, TDAN), you need to use `SRFolderVideoDataset`.\n","- For recurrent framework in video super-resolution (e.g. BasicVSR, IconVSR), you need to use `SRFolderMultipleGTDataset`.\n","\n","These dataset types assume that all images/sequences in the specified directory are used for test. The folder structures should be\n","```\n","| lq_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," | ...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","| gt_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," |...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","```\n","We will use **SRCNN**, **EDVR**, **BasicVSR** as examples. Please pay attention to the settings of `test_dataset_type` and `data['test']`. "]},{"cell_type":"markdown","metadata":{"id":"0p2rP8jV_dL1"},"source":["**SRCNN**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8729,"status":"ok","timestamp":1625140936180,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"4kEev4wVIq_L","outputId":"8026ed73-f781-4eb2-bb80-d3446bd131df"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 5/5, 8.6 task/s, elapsed: 1s, ETA: 0s\n","Eval-PSNR: 28.433974369836108\n","Eval-SSIM: 0.8099053586583066\n","baby.png bird.png butterfly.png head.png woman.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_SRCNN.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/testset_SRCNN\n","\n","# Check the output folder\n","!ls ./outputs/testset_SRCNN"]},{"cell_type":"markdown","metadata":{"id":"RONzjTTU_gem"},"source":["**EDVR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":19671,"status":"ok","timestamp":1625140955813,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"vL8WOWXY0fNJ","outputId":"dc2a8f81-9bef-4ad4-c5b2-c6f124e6b113"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 22/22, 2.0 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 23.89569862011228\n","Eval-SSIM: 0.7667098470108678\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_EDVR.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth --save-path ./outputs/testset_EDVR\n","\n","# # Check the output folder\n","!ls ./outputs/testset_EDVR\n","!ls ./outputs/testset_EDVR/city"]},{"cell_type":"markdown","metadata":{"id":"5Tc7F-l5_i1e"},"source":["**BasicVSR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":20220,"status":"ok","timestamp":1625140976026,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"jpW5GWC74Yvu","outputId":"7ba02a32-d4ec-40b2-8108-ef0729b62147"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:07,780 - mmedit - INFO - Use load_from_http loader\n","Use load_from_http loader\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","[>>] 2/2, 0.2 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 24.195768601433734\n","Eval-SSIM: 0.7828541339512978\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_BasicVSR.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth --save-path ./outputs/testset_BasicVSR\n","\n","# # Check the output folder\n","!ls ./outputs/testset_BasicVSR\n","!ls ./outputs/testset_BasicVSR/calendar"]},{"cell_type":"markdown","metadata":{"id":"4DQxNL8BhI0y"},"source":["## Train a restorer on a pre-defined dataset\n","\n","MMEditing uses distributed training. The following command can be used for training. If you want to train on the pre-defined datasets specified in our configuration file, you can simply run the following command.\n","\n","```\n","./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]\n","```\n","\n","For more details about the optional arguments, please refer to `tools/train.py`.\n","\n","---\n","\n","Here is an example using EDVR.\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9337,"status":"ok","timestamp":1625140985357,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"s-hOnSF6ItQM","outputId":"e40e960a-29e1-43e8-b922-5e08c4e98afe"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:31,961 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:31,961 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:31,961 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:31,961 - mmedit - INFO - Config:\n","/content/mmediting/configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py\n","exp_name = 'edvrm_wotsa_x4_g8_600k_reds'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRREDSDataset'\n","val_dataset_type = 'SRREDSDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 600000\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50000, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=100,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 54, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 63, in load_annotations\n"," with open(self.ann_file, 'r') as fin:\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/train.py\", line 145, in \n"," main()\n"," File \"./tools/train.py\", line 111, in main\n"," datasets = [build_dataset(cfg.data.train)]\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 76, in build_dataset\n"," build_dataset(cfg['dataset'], default_args), cfg['times'])\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRREDSDataset: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/train.py', '--local_rank=0', './configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py', '--launcher', 'pytorch']' returned non-zero exit status 1.\n"]}],"source":["!./tools/dist_train.sh ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py 1"]},{"cell_type":"markdown","metadata":{"id":"b0VfQkQQjg8N"},"source":["## Train a restorer on your own datasets\n","\n","Similar to the case when you want to test on your own datasets, you need to modify `train_dataset_type`. The dataset type you need is identical:\n","\n","- For image super-resolution, you need to use `SRFolderDataset`\n","- For sliding-window framework in video super-resolution (e.g. EDVR, TDAN), you need to use `SRFolderVideoDataset`.\n","- For recurrent framework in video super-resolution (e.g. BasicVSR, IconVSR), you need to use `SRFolderMultipleGTDataset`.\n","\n","After you modified the dataset type and the data path. You are all set to go."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":128384,"status":"ok","timestamp":1625141113733,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"liGEKJpbIoXZ","outputId":"84e1502e-e2cb-458f-c7c5-e4b401e570b7"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:41,185 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:41,185 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:41,185 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:41,185 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_SRCNN.py\n","exp_name = 'srcnn_demo'\n","\n","scale = 4\n","# model settings\n","model = dict(\n"," type='BasicRestorer',\n"," generator=dict(\n"," type='SRCNN',\n"," channels=(3, 64, 32, 3),\n"," kernel_sizes=(9, 1, 5),\n"," upscale_factor=scale),\n"," pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=scale)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderDataset'\n","val_dataset_type = 'SRFolderDataset'\n","train_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=128),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","test_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'lq_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=8,\n"," train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=train_pipeline,\n"," scale=scale)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[250000, 250000, 250000, 250000],\n"," restart_weights=[1, 1, 1, 1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","evaluation = dict(interval=50, save_image=True, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./experiments/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:02:41,192 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/experiments/srcnn_demo\n","2021-07-01 12:02:41,192 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:02:41.529307: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:03:18,631 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.000e-04, eta: 0:57:01, time: 34.560, data_time: 34.446, memory: 586, loss_pix: 0.3999, loss: 0.3999\n","2021-07-01 12:03:18,712 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","INFO:mmedit:Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","2021-07-01 12:03:18,764 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","INFO:mmedit:Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","2021-07-01 12:03:18,840 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","INFO:mmedit:Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","2021-07-01 12:03:18,916 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","INFO:mmedit:Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","2021-07-01 12:03:18,956 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","INFO:mmedit:Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","2021-07-01 12:03:19,012 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","INFO:mmedit:Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","2021-07-01 12:03:19,070 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","INFO:mmedit:Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","2021-07-01 12:03:19,142 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","INFO:mmedit:Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","2021-07-01 12:03:19,212 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","INFO:mmedit:Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","2021-07-01 12:03:19,261 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","INFO:mmedit:Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","2021-07-01 12:03:19,302 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","INFO:mmedit:Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","2021-07-01 12:03:19,357 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","INFO:mmedit:Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","2021-07-01 12:03:19,419 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","INFO:mmedit:Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","2021-07-01 12:03:19,473 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","INFO:mmedit:Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","2021-07-01 12:03:19,538 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","INFO:mmedit:Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","2021-07-01 12:03:19,603 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","INFO:mmedit:Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","2021-07-01 12:03:19,657 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","INFO:mmedit:Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","2021-07-01 12:03:19,716 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","INFO:mmedit:Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","2021-07-01 12:03:19,772 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","INFO:mmedit:Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","2021-07-01 12:03:19,834 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","INFO:mmedit:Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","2021-07-01 12:03:19,877 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","INFO:mmedit:Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","2021-07-01 12:03:19,947 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","INFO:mmedit:Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","2021-07-01 12:03:20,014 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","INFO:mmedit:Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","2021-07-01 12:03:20,068 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","INFO:mmedit:Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","2021-07-01 12:03:20,124 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","INFO:mmedit:Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","2021-07-01 12:03:20,181 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","INFO:mmedit:Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","2021-07-01 12:03:20,244 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","INFO:mmedit:Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","2021-07-01 12:03:20,310 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","INFO:mmedit:Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","2021-07-01 12:03:20,356 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","INFO:mmedit:Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","2021-07-01 12:03:20,410 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","INFO:mmedit:Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","2021-07-01 12:03:20,480 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","INFO:mmedit:Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","2021-07-01 12:03:20,536 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","INFO:mmedit:Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","2021-07-01 12:03:20,595 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","INFO:mmedit:Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","2021-07-01 12:03:20,656 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","INFO:mmedit:Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","2021-07-01 12:03:20,710 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","INFO:mmedit:Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","2021-07-01 12:03:20,779 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:20,846 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","INFO:mmedit:Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","2021-07-01 12:03:20,907 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:20,958 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","INFO:mmedit:Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","2021-07-01 12:03:21,028 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","INFO:mmedit:Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","2021-07-01 12:03:21,122 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","INFO:mmedit:Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","2021-07-01 12:03:21,181 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:21,418 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","INFO:mmedit:Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","2021-07-01 12:03:21,480 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:21,551 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","INFO:mmedit:Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","2021-07-01 12:03:21,618 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","INFO:mmedit:Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","2021-07-01 12:03:21,667 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","INFO:mmedit:Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","2021-07-01 12:03:21,743 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","INFO:mmedit:Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","[>>] 5/5, 0.1 task/s, elapsed: 37s, ETA: 0s\n","\n","2021-07-01 12:03:59,996 - mmedit - INFO - Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","INFO:mmedit:Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","2021-07-01 12:04:00,047 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","INFO:mmedit:Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","2021-07-01 12:04:00,114 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","INFO:mmedit:Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","2021-07-01 12:04:00,181 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","INFO:mmedit:Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","2021-07-01 12:04:00,251 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","INFO:mmedit:Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","2021-07-01 12:04:00,315 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","INFO:mmedit:Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","2021-07-01 12:04:00,373 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","INFO:mmedit:Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","2021-07-01 12:04:00,418 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","INFO:mmedit:Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","2021-07-01 12:04:00,478 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","INFO:mmedit:Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","2021-07-01 12:04:00,538 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","INFO:mmedit:Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","2021-07-01 12:04:00,606 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","INFO:mmedit:Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","2021-07-01 12:04:00,647 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","INFO:mmedit:Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","2021-07-01 12:04:00,711 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","INFO:mmedit:Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","2021-07-01 12:04:00,757 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","INFO:mmedit:Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","2021-07-01 12:04:00,799 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","INFO:mmedit:Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","2021-07-01 12:04:00,871 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:00,938 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:00,995 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","INFO:mmedit:Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","2021-07-01 12:04:01,051 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","INFO:mmedit:Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","2021-07-01 12:04:01,115 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:01,196 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","INFO:mmedit:Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","2021-07-01 12:04:01,256 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","INFO:mmedit:Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","2021-07-01 12:04:01,325 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","INFO:mmedit:Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","2021-07-01 12:04:01,381 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","INFO:mmedit:Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:04:01,429 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","INFO:mmedit:Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","2021-07-01 12:04:01,497 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","INFO:mmedit:Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","2021-07-01 12:04:01,545 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","INFO:mmedit:Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","2021-07-01 12:04:01,597 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","INFO:mmedit:Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","2021-07-01 12:04:01,671 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","INFO:mmedit:Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:04:01,724 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:01,777 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","INFO:mmedit:Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","2021-07-01 12:04:01,847 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","INFO:mmedit:Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","2021-07-01 12:04:01,905 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","INFO:mmedit:Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","2021-07-01 12:04:01,953 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","INFO:mmedit:Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","2021-07-01 12:04:02,025 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","INFO:mmedit:Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","2021-07-01 12:04:02,079 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","INFO:mmedit:Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","2021-07-01 12:04:02,137 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","INFO:mmedit:Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","2021-07-01 12:04:02,193 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:02,255 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","INFO:mmedit:Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:04:02,341 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","INFO:mmedit:Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","2021-07-01 12:04:02,394 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","INFO:mmedit:Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","2021-07-01 12:04:02,496 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","INFO:mmedit:Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","2021-07-01 12:04:02,552 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:02,629 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","INFO:mmedit:Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","2021-07-01 12:04:02,682 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","INFO:mmedit:Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","2021-07-01 12:04:02,791 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","INFO:mmedit:Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","2021-07-01 12:04:02,834 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","INFO:mmedit:Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","2021-07-01 12:04:02,900 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","INFO:mmedit:Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","2021-07-01 12:04:03,053 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","INFO:mmedit:Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:04:03,108 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","INFO:mmedit:Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","[>>] 5/5, 0.2 task/s, elapsed: 33s, ETA: 0s\n","\n","2021-07-01 12:04:37,412 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:04:37,422 - mmedit - INFO - Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n","INFO:mmedit:Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n"]}],"source":["# SRCNN (Single Image Super-Resolution)\n","!./tools/dist_train.sh ./demo_files/demo_config_SRCNN.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":117937,"status":"ok","timestamp":1625141554036,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"26uZ4Ak7qbC9","outputId":"2fb26527-eb9e-4b48-e03c-ba9a91c60db8"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:10:12,619 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:10:12,619 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:10:12,619 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:10:12,619 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_EDVR.py\n","exp_name = 'edvrm_demo'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderVideoDataset'\n","val_dataset_type = 'SRFolderVideoDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:10:12,701 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/edvrm_demo\n","2021-07-01 12:10:12,702 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:10:12.951771: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:10:30,703 - mmedit - INFO - Iter [1/100]\tlr_generator: 4.000e-04, eta: 0:26:53, time: 16.295, data_time: 15.833, memory: 1341, loss_pix: 63917.2734, loss: 63917.2734\n","2021-07-01 12:10:31,046 - mmedit - INFO - Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","INFO:mmedit:Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","2021-07-01 12:10:31,386 - mmedit - INFO - Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","INFO:mmedit:Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","2021-07-01 12:10:31,731 - mmedit - INFO - Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","INFO:mmedit:Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","2021-07-01 12:10:32,071 - mmedit - INFO - Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","INFO:mmedit:Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","2021-07-01 12:10:32,414 - mmedit - INFO - Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","INFO:mmedit:Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","2021-07-01 12:10:32,760 - mmedit - INFO - Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","INFO:mmedit:Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","2021-07-01 12:10:33,102 - mmedit - INFO - Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","INFO:mmedit:Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","2021-07-01 12:10:33,447 - mmedit - INFO - Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","INFO:mmedit:Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","2021-07-01 12:10:33,792 - mmedit - INFO - Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","INFO:mmedit:Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","2021-07-01 12:10:34,138 - mmedit - INFO - Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","INFO:mmedit:Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","2021-07-01 12:10:34,484 - mmedit - INFO - Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","INFO:mmedit:Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","2021-07-01 12:10:34,829 - mmedit - INFO - Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","INFO:mmedit:Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","2021-07-01 12:10:35,175 - mmedit - INFO - Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","INFO:mmedit:Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","2021-07-01 12:10:35,522 - mmedit - INFO - Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","INFO:mmedit:Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","2021-07-01 12:10:35,866 - mmedit - INFO - Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","INFO:mmedit:Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","2021-07-01 12:10:36,212 - mmedit - INFO - Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","INFO:mmedit:Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","2021-07-01 12:10:36,560 - mmedit - INFO - Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","INFO:mmedit:Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","2021-07-01 12:10:36,904 - mmedit - INFO - Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","INFO:mmedit:Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","2021-07-01 12:10:37,249 - mmedit - INFO - Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","INFO:mmedit:Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","2021-07-01 12:10:37,595 - mmedit - INFO - Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","INFO:mmedit:Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","2021-07-01 12:10:37,939 - mmedit - INFO - Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","INFO:mmedit:Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","2021-07-01 12:10:38,283 - mmedit - INFO - Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","INFO:mmedit:Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","2021-07-01 12:10:38,628 - mmedit - INFO - Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","INFO:mmedit:Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","2021-07-01 12:10:38,974 - mmedit - INFO - Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","INFO:mmedit:Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","2021-07-01 12:10:39,318 - mmedit - INFO - Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","INFO:mmedit:Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","2021-07-01 12:10:39,665 - mmedit - INFO - Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","INFO:mmedit:Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","2021-07-01 12:10:40,011 - mmedit - INFO - Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","INFO:mmedit:Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","2021-07-01 12:10:40,356 - mmedit - INFO - Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","INFO:mmedit:Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","2021-07-01 12:10:40,703 - mmedit - INFO - Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","INFO:mmedit:Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","2021-07-01 12:10:41,049 - mmedit - INFO - Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","INFO:mmedit:Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","2021-07-01 12:10:41,396 - mmedit - INFO - Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","INFO:mmedit:Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","2021-07-01 12:10:41,745 - mmedit - INFO - Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","INFO:mmedit:Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","2021-07-01 12:10:42,097 - mmedit - INFO - Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","INFO:mmedit:Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","2021-07-01 12:10:42,444 - mmedit - INFO - Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","INFO:mmedit:Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","2021-07-01 12:10:42,790 - mmedit - INFO - Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","INFO:mmedit:Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","2021-07-01 12:10:43,140 - mmedit - INFO - Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","INFO:mmedit:Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","2021-07-01 12:10:43,490 - mmedit - INFO - Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","INFO:mmedit:Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","2021-07-01 12:10:43,841 - mmedit - INFO - Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","INFO:mmedit:Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","2021-07-01 12:10:44,193 - mmedit - INFO - Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","INFO:mmedit:Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","2021-07-01 12:10:44,541 - mmedit - INFO - Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","INFO:mmedit:Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","2021-07-01 12:10:44,895 - mmedit - INFO - Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","INFO:mmedit:Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","2021-07-01 12:10:45,248 - mmedit - INFO - Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","INFO:mmedit:Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","2021-07-01 12:10:45,595 - mmedit - INFO - Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","INFO:mmedit:Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","2021-07-01 12:10:45,950 - mmedit - INFO - Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","INFO:mmedit:Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","2021-07-01 12:10:46,301 - mmedit - INFO - Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","INFO:mmedit:Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","2021-07-01 12:10:46,649 - mmedit - INFO - Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","INFO:mmedit:Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","2021-07-01 12:10:47,003 - mmedit - INFO - Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","INFO:mmedit:Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","2021-07-01 12:10:47,356 - mmedit - INFO - Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","INFO:mmedit:Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:14,231 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","INFO:mmedit:Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","2021-07-01 12:11:14,578 - mmedit - INFO - Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","INFO:mmedit:Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","2021-07-01 12:11:14,930 - mmedit - INFO - Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","INFO:mmedit:Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","2021-07-01 12:11:15,289 - mmedit - INFO - Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","INFO:mmedit:Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","2021-07-01 12:11:15,642 - mmedit - INFO - Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","INFO:mmedit:Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","2021-07-01 12:11:15,993 - mmedit - INFO - Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","INFO:mmedit:Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","2021-07-01 12:11:16,354 - mmedit - INFO - Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","INFO:mmedit:Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","2021-07-01 12:11:16,712 - mmedit - INFO - Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","INFO:mmedit:Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","2021-07-01 12:11:17,065 - mmedit - INFO - Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","INFO:mmedit:Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","2021-07-01 12:11:17,425 - mmedit - INFO - Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","INFO:mmedit:Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","2021-07-01 12:11:17,780 - mmedit - INFO - Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","INFO:mmedit:Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","2021-07-01 12:11:18,135 - mmedit - INFO - Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","INFO:mmedit:Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","2021-07-01 12:11:18,495 - mmedit - INFO - Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","INFO:mmedit:Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","2021-07-01 12:11:18,851 - mmedit - INFO - Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","INFO:mmedit:Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","2021-07-01 12:11:19,210 - mmedit - INFO - Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","INFO:mmedit:Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","2021-07-01 12:11:19,567 - mmedit - INFO - Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","INFO:mmedit:Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","2021-07-01 12:11:19,923 - mmedit - INFO - Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","INFO:mmedit:Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","2021-07-01 12:11:20,286 - mmedit - INFO - Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","INFO:mmedit:Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","2021-07-01 12:11:20,644 - mmedit - INFO - Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","INFO:mmedit:Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","2021-07-01 12:11:21,000 - mmedit - INFO - Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","INFO:mmedit:Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","2021-07-01 12:11:21,359 - mmedit - INFO - Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","INFO:mmedit:Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","2021-07-01 12:11:21,719 - mmedit - INFO - Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","INFO:mmedit:Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","2021-07-01 12:11:22,072 - mmedit - INFO - Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","INFO:mmedit:Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","2021-07-01 12:11:22,434 - mmedit - INFO - Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","INFO:mmedit:Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","2021-07-01 12:11:22,798 - mmedit - INFO - Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","INFO:mmedit:Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","2021-07-01 12:11:23,158 - mmedit - INFO - Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","INFO:mmedit:Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","2021-07-01 12:11:23,513 - mmedit - INFO - Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","INFO:mmedit:Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","2021-07-01 12:11:23,875 - mmedit - INFO - Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","INFO:mmedit:Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","2021-07-01 12:11:24,236 - mmedit - INFO - Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","INFO:mmedit:Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","2021-07-01 12:11:24,597 - mmedit - INFO - Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","INFO:mmedit:Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","2021-07-01 12:11:24,951 - mmedit - INFO - Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","INFO:mmedit:Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","2021-07-01 12:11:25,313 - mmedit - INFO - Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","INFO:mmedit:Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","2021-07-01 12:11:25,677 - mmedit - INFO - Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","INFO:mmedit:Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","2021-07-01 12:11:26,038 - mmedit - INFO - Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","INFO:mmedit:Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","2021-07-01 12:11:26,393 - mmedit - INFO - Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","INFO:mmedit:Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","2021-07-01 12:11:26,753 - mmedit - INFO - Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","INFO:mmedit:Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","2021-07-01 12:11:27,115 - mmedit - INFO - Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","INFO:mmedit:Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","2021-07-01 12:11:27,472 - mmedit - INFO - Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","INFO:mmedit:Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","2021-07-01 12:11:27,830 - mmedit - INFO - Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","INFO:mmedit:Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","2021-07-01 12:11:28,189 - mmedit - INFO - Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","INFO:mmedit:Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","2021-07-01 12:11:28,553 - mmedit - INFO - Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","INFO:mmedit:Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","2021-07-01 12:11:28,910 - mmedit - INFO - Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","INFO:mmedit:Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","2021-07-01 12:11:29,266 - mmedit - INFO - Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","INFO:mmedit:Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","2021-07-01 12:11:29,628 - mmedit - INFO - Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","INFO:mmedit:Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","2021-07-01 12:11:29,989 - mmedit - INFO - Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","INFO:mmedit:Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","2021-07-01 12:11:30,345 - mmedit - INFO - Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","INFO:mmedit:Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","2021-07-01 12:11:30,704 - mmedit - INFO - Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","INFO:mmedit:Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","2021-07-01 12:11:31,067 - mmedit - INFO - Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","INFO:mmedit:Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","2021-07-01 12:11:31,425 - mmedit - INFO - Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","INFO:mmedit:Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","2021-07-01 12:11:31,782 - mmedit - INFO - Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","INFO:mmedit:Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:58,494 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:11:58,598 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n","INFO:mmedit:Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n"]}],"source":["# EDVR (Video Super-Resolution - Sliding Window)\n","!./tools/dist_train.sh ./demo_files/demo_config_EDVR.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":197033,"status":"ok","timestamp":1625141428032,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"_RdqmlT6qgt2","outputId":"b951b426-e06c-4f31-db01-449333eab333"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:06:47,253 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:06:47,253 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:06:47,254 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:06:47,254 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_BasicVSR.py\n","exp_name = 'basicvsr_demo'\n","\n","# model settings\n","model = dict(\n"," type='BasicVSR',\n"," generator=dict(\n"," type='BasicVSRNet',\n"," mid_channels=64,\n"," num_blocks=30,\n"," spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'\n"," 'basicvsr/spynet_20210409-c6c1bd09.pth'),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = dict(fix_iter=5000)\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderMultipleGTDataset'\n","val_dataset_type = 'SRFolderMultipleGTDataset'\n","\n","train_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=6,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True), # 2 gpus\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1, workers_per_gpu=1),\n","\n"," # train\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," # val\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," # test\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(\n"," generator=dict(\n"," type='Adam',\n"," lr=2e-4,\n"," betas=(0.9, 0.99),\n"," paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)})))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[300000],\n"," restart_weights=[1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," # dict(type='TensorboardLoggerHook'),\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","find_unused_parameters = True\n","\n","2021-07-01 12:06:47,291 - mmedit - INFO - Use load_from_http loader\n","2021-07-01 12:06:47,569 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/basicvsr_demo\n","2021-07-01 12:06:47,569 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:07:14,210 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.500e-05, eta: 0:42:52, time: 25.981, data_time: 24.045, memory: 3464, loss_pix: 0.0634, loss: 0.0634\n","2021-07-01 12:07:15,171 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.500e-05, eta: 0:22:00, time: 0.961, data_time: 0.011, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","2021-07-01 12:07:16,052 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.500e-05, eta: 0:14:59, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0476, loss: 0.0476\n","2021-07-01 12:07:16,940 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.500e-05, eta: 0:11:29, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:17,829 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.500e-05, eta: 0:09:22, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0796, loss: 0.0796\n","2021-07-01 12:07:18,712 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.500e-05, eta: 0:07:57, time: 0.884, data_time: 0.004, memory: 3518, loss_pix: 0.0680, loss: 0.0680\n","2021-07-01 12:07:19,594 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.500e-05, eta: 0:06:56, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0607, loss: 0.0607\n","2021-07-01 12:07:20,481 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.500e-05, eta: 0:06:10, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0598, loss: 0.0598\n","2021-07-01 12:07:21,361 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.500e-05, eta: 0:05:35, time: 0.880, data_time: 0.003, memory: 3518, loss_pix: 0.0664, loss: 0.0664\n","2021-07-01 12:07:22,274 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.500e-05, eta: 0:05:06, time: 0.913, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:07:23,161 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.500e-05, eta: 0:04:42, time: 0.887, data_time: 0.005, memory: 3518, loss_pix: 0.0771, loss: 0.0771\n","2021-07-01 12:07:24,058 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.500e-05, eta: 0:04:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0521, loss: 0.0521\n","2021-07-01 12:07:24,944 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.500e-05, eta: 0:04:05, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:07:25,835 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.500e-05, eta: 0:03:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0515, loss: 0.0515\n","2021-07-01 12:07:26,723 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.500e-05, eta: 0:03:38, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0674, loss: 0.0674\n","2021-07-01 12:07:27,609 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.500e-05, eta: 0:03:26, time: 0.886, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:28,498 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.500e-05, eta: 0:03:16, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0670, loss: 0.0670\n","2021-07-01 12:07:29,388 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.500e-05, eta: 0:03:07, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0663, loss: 0.0663\n","2021-07-01 12:07:30,284 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.500e-05, eta: 0:02:59, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0633, loss: 0.0633\n","2021-07-01 12:07:31,176 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.500e-05, eta: 0:02:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0482, loss: 0.0482\n","2021-07-01 12:07:32,073 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.500e-05, eta: 0:02:44, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0743, loss: 0.0743\n","2021-07-01 12:07:32,966 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.500e-05, eta: 0:02:38, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0690, loss: 0.0690\n","2021-07-01 12:07:33,858 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.500e-05, eta: 0:02:32, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0437, loss: 0.0437\n","2021-07-01 12:07:34,750 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.500e-05, eta: 0:02:27, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:35,642 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.500e-05, eta: 0:02:22, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0781, loss: 0.0781\n","2021-07-01 12:07:36,533 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.500e-05, eta: 0:02:17, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:07:37,427 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.500e-05, eta: 0:02:13, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:07:38,321 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.500e-05, eta: 0:02:08, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0567, loss: 0.0567\n","2021-07-01 12:07:39,212 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.500e-05, eta: 0:02:04, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0846, loss: 0.0846\n","2021-07-01 12:07:40,104 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.500e-05, eta: 0:02:01, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0658, loss: 0.0658\n","2021-07-01 12:07:40,993 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.500e-05, eta: 0:01:57, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0502, loss: 0.0502\n","2021-07-01 12:07:41,885 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.500e-05, eta: 0:01:54, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0622, loss: 0.0622\n","2021-07-01 12:07:42,787 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.500e-05, eta: 0:01:50, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0657, loss: 0.0657\n","2021-07-01 12:07:43,674 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.500e-05, eta: 0:01:47, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0643, loss: 0.0643\n","2021-07-01 12:07:44,567 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.500e-05, eta: 0:01:44, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0898, loss: 0.0898\n","2021-07-01 12:07:45,458 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.500e-05, eta: 0:01:41, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0865, loss: 0.0865\n","2021-07-01 12:07:46,341 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.500e-05, eta: 0:01:38, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0511, loss: 0.0511\n","2021-07-01 12:07:47,225 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.500e-05, eta: 0:01:36, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:48,109 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.500e-05, eta: 0:01:33, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0653, loss: 0.0653\n","2021-07-01 12:07:48,990 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:07:49,874 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.885, data_time: 0.003, memory: 3518, loss_pix: 0.0788, loss: 0.0788\n","2021-07-01 12:07:50,755 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.500e-05, eta: 0:01:26, time: 0.881, data_time: 0.005, memory: 3518, loss_pix: 0.0605, loss: 0.0605\n","2021-07-01 12:07:51,638 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.500e-05, eta: 0:01:24, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0539, loss: 0.0539\n","2021-07-01 12:07:52,518 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.500e-05, eta: 0:01:21, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0503, loss: 0.0503\n","2021-07-01 12:07:53,395 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.500e-05, eta: 0:01:19, time: 0.877, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:07:54,273 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0555, loss: 0.0555\n","2021-07-01 12:07:55,159 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.500e-05, eta: 0:01:15, time: 0.886, data_time: 0.007, memory: 3518, loss_pix: 0.0806, loss: 0.0806\n","2021-07-01 12:07:56,040 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.500e-05, eta: 0:01:13, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0576, loss: 0.0576\n","2021-07-01 12:07:56,919 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.500e-05, eta: 0:01:11, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0871, loss: 0.0871\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:08:32,618 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9899, SSIM: 0.5295\n","2021-07-01 12:08:33,591 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.500e-05, eta: 0:01:40, time: 35.792, data_time: 34.822, memory: 3518, loss_pix: 0.0773, loss: 0.0773\n","2021-07-01 12:08:34,462 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.500e-05, eta: 0:01:37, time: 0.871, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:08:35,326 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.500e-05, eta: 0:01:34, time: 0.864, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:36,192 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0575, loss: 0.0575\n","2021-07-01 12:08:37,069 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.876, data_time: 0.003, memory: 3518, loss_pix: 0.0842, loss: 0.0842\n","2021-07-01 12:08:37,942 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.500e-05, eta: 0:01:25, time: 0.873, data_time: 0.003, memory: 3518, loss_pix: 0.0836, loss: 0.0836\n","2021-07-01 12:08:38,808 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.500e-05, eta: 0:01:22, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0580, loss: 0.0580\n","2021-07-01 12:08:39,679 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.500e-05, eta: 0:01:20, time: 0.870, data_time: 0.003, memory: 3518, loss_pix: 0.0449, loss: 0.0449\n","2021-07-01 12:08:40,557 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0702, loss: 0.0702\n","2021-07-01 12:08:41,430 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.500e-05, eta: 0:01:14, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:42,308 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.500e-05, eta: 0:01:12, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:08:43,182 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.500e-05, eta: 0:01:09, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0489, loss: 0.0489\n","2021-07-01 12:08:44,056 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.500e-05, eta: 0:01:07, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0566, loss: 0.0566\n","2021-07-01 12:08:44,932 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.500e-05, eta: 0:01:05, time: 0.875, data_time: 0.003, memory: 3518, loss_pix: 0.0597, loss: 0.0597\n","2021-07-01 12:08:45,819 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.500e-05, eta: 0:01:02, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0640, loss: 0.0640\n","2021-07-01 12:08:46,698 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.500e-05, eta: 0:01:00, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:47,580 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.500e-05, eta: 0:00:58, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:08:48,464 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.500e-05, eta: 0:00:56, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:08:49,347 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.500e-05, eta: 0:00:54, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0603, loss: 0.0603\n","2021-07-01 12:08:50,229 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.500e-05, eta: 0:00:51, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0478, loss: 0.0478\n","2021-07-01 12:08:51,113 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.500e-05, eta: 0:00:49, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:08:52,000 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.500e-05, eta: 0:00:47, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0861, loss: 0.0861\n","2021-07-01 12:08:52,890 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.500e-05, eta: 0:00:45, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:08:53,792 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.500e-05, eta: 0:00:43, time: 0.903, data_time: 0.003, memory: 3518, loss_pix: 0.0787, loss: 0.0787\n","2021-07-01 12:08:54,688 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.500e-05, eta: 0:00:41, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0744, loss: 0.0744\n","2021-07-01 12:08:55,582 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.500e-05, eta: 0:00:39, time: 0.895, data_time: 0.003, memory: 3518, loss_pix: 0.0792, loss: 0.0792\n","2021-07-01 12:08:56,476 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.500e-05, eta: 0:00:38, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0645, loss: 0.0645\n","2021-07-01 12:08:57,368 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.500e-05, eta: 0:00:36, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:08:58,261 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.500e-05, eta: 0:00:34, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:59,159 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.500e-05, eta: 0:00:32, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0626, loss: 0.0626\n","2021-07-01 12:09:00,055 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.500e-05, eta: 0:00:30, time: 0.896, data_time: 0.004, memory: 3518, loss_pix: 0.0681, loss: 0.0681\n","2021-07-01 12:09:00,954 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.500e-05, eta: 0:00:28, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0671, loss: 0.0671\n","2021-07-01 12:09:01,860 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.500e-05, eta: 0:00:27, time: 0.906, data_time: 0.003, memory: 3518, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:09:02,760 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.500e-05, eta: 0:00:25, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0594, loss: 0.0594\n","2021-07-01 12:09:03,658 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.500e-05, eta: 0:00:23, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0446, loss: 0.0446\n","2021-07-01 12:09:04,555 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.500e-05, eta: 0:00:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0491, loss: 0.0491\n","2021-07-01 12:09:05,452 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.500e-05, eta: 0:00:20, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0450, loss: 0.0450\n","2021-07-01 12:09:06,351 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.500e-05, eta: 0:00:18, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0795, loss: 0.0795\n","2021-07-01 12:09:07,257 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.500e-05, eta: 0:00:17, time: 0.905, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:08,161 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.500e-05, eta: 0:00:15, time: 0.904, data_time: 0.003, memory: 3518, loss_pix: 0.0588, loss: 0.0588\n","2021-07-01 12:09:09,063 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.500e-05, eta: 0:00:13, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:09:09,955 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.500e-05, eta: 0:00:12, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0599, loss: 0.0599\n","2021-07-01 12:09:10,849 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.500e-05, eta: 0:00:10, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:11,749 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.500e-05, eta: 0:00:09, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0667, loss: 0.0667\n","2021-07-01 12:09:12,638 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.500e-05, eta: 0:00:07, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0558, loss: 0.0558\n","2021-07-01 12:09:13,576 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.500e-05, eta: 0:00:06, time: 0.938, data_time: 0.052, memory: 3518, loss_pix: 0.0577, loss: 0.0577\n","2021-07-01 12:09:14,463 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.500e-05, eta: 0:00:04, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:09:15,351 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.500e-05, eta: 0:00:02, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0578, loss: 0.0578\n","2021-07-01 12:09:16,240 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.500e-05, eta: 0:00:01, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:09:52,294 - mmedit - INFO - Saving checkpoint at 100 iterations\n","2021-07-01 12:09:52,433 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.4372, SSIM: 0.5687\n"]}],"source":["# BasicVSR (Video Super-Resolution - Recurrent)\n","!./tools/dist_train.sh ./demo_files/demo_config_BasicVSR.py 1 "]},{"cell_type":"markdown","metadata":{"id":"QT0zwBFt7J13"},"source":["**This is the end of this tutorial. For more advanced usage, please see our comprehensive tutorial [here](). Enjoy coding with MMEditing!**"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"restorer_basic_tutorial.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3.7.7 64-bit ('pre-commit': conda)","name":"python377jvsc74a57bd04974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"},"language_info":{"name":"python","version":""},"metadata":{"interpreter":{"hash":"4974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"}}},"nbformat":4,"nbformat_minor":2} +{"cells":[{"cell_type":"markdown","metadata":{"id":"T2WWQiheMF7q"},"source":["# MMEditing Basic Tutorial\n","\n","Welcome to MMEditing! This is the official Colab tutorial for MMEditing. In this tutorial you will learn how to train and test a restorer using the APIs provided in MMEditing. \n","\n","This is a quick guide for you to train and test existing models. If you want to develop you own models based on MMEditing and know more about the code structures, please refer to our comprehensive tutorial [here]().\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmedit/blob/main/demo/restorer_basic_tutorial.ipynb)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"-kYw3WQ0MQry"},"source":["## Install MMEditing\n","\n","MMEditing can be installed in three steps:\n","\n","1. Install a compatible PyTorch version (You need to check you CUDA version by using `nvcc -V`).\n","2. Install pre-compiled MMCV\n","3. Clone and install MMEditing\n","\n","The steps are shown below:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":279948,"status":"ok","timestamp":1625140820804,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"GIeIZEzZMfc0","outputId":"fe2e5ded-988d-4563-eb18-374344c316ef"},"outputs":[{"name":"stdout","output_type":"stream","text":["Looking in links: https://download.pytorch.org/whl/torch_stable.html\n","Collecting torch==1.7.0+cu110\n","\u001b[?25l Downloading https://download.pytorch.org/whl/cu110/torch-1.7.0%2Bcu110-cp37-cp37m-linux_x86_64.whl (1137.1MB)\n","\u001b[K |███████████████████████▌ | 834.1MB 1.3MB/s eta 0:03:50tcmalloc: large alloc 1147494400 bytes == 0x56458d07a000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |█████████████████████████████▊ | 1055.7MB 1.2MB/s eta 0:01:07tcmalloc: large alloc 1434370048 bytes == 0x5645d16d0000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |████████████████████████████████| 1137.1MB 1.1MB/s eta 0:00:01tcmalloc: large alloc 1421369344 bytes == 0x564626ebc000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645535c430a 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c4a81\n","\u001b[K |████████████████████████████████| 1137.1MB 16kB/s \n","\u001b[?25hCollecting torchvision==0.8.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/1d/3f/4f45249458a0dee85bff7acf4a2ac6177708253f1f318fcf6ee230fb864f/torchvision-0.8.0-cp37-cp37m-manylinux1_x86_64.whl (11.8MB)\n","\u001b[K |████████████████████████████████| 11.8MB 254kB/s \n","\u001b[?25hRequirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (3.7.4.3)\n","Collecting dataclasses\n"," Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n","Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (1.19.5)\n","Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (0.16.0)\n","Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.0) (7.1.2)\n","\u001b[31mERROR: torchtext 0.10.0 has requirement torch==1.9.0, but you'll have torch 1.7.0+cu110 which is incompatible.\u001b[0m\n","Installing collected packages: dataclasses, torch, torchvision\n"," Found existing installation: torch 1.9.0+cu102\n"," Uninstalling torch-1.9.0+cu102:\n"," Successfully uninstalled torch-1.9.0+cu102\n"," Found existing installation: torchvision 0.10.0+cu102\n"," Uninstalling torchvision-0.10.0+cu102:\n"," Successfully uninstalled torchvision-0.10.0+cu102\n","Successfully installed dataclasses-0.6 torch-1.7.0+cu110 torchvision-0.8.0\n","Looking in links: https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n","Collecting mmcv-full==1.3.5\n","\u001b[?25l Downloading https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/mmcv_full-1.3.5-cp37-cp37m-manylinux1_x86_64.whl (31.1MB)\n","\u001b[K |████████████████████████████████| 31.1MB 107kB/s \n","\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (1.19.5)\n","Collecting addict\n"," Downloading https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl\n","Collecting yapf\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/5f/0d/8814e79eb865eab42d95023b58b650d01dec6f8ea87fc9260978b1bf2167/yapf-0.31.0-py2.py3-none-any.whl (185kB)\n","\u001b[K |████████████████████████████████| 194kB 33.0MB/s \n","\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (7.1.2)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (4.1.2.30)\n","Installing collected packages: addict, yapf, mmcv-full\n","Successfully installed addict-2.4.0 mmcv-full-1.3.5 yapf-0.31.0\n","Cloning into 'mmediting'...\n","remote: Enumerating objects: 7162, done.\u001b[K\n","remote: Counting objects: 100% (1367/1367), done.\u001b[K\n","remote: Compressing objects: 100% (793/793), done.\u001b[K\n","remote: Total 7162 (delta 827), reused 928 (delta 554), pack-reused 5795\u001b[K\n","Receiving objects: 100% (7162/7162), 5.02 MiB | 32.14 MiB/s, done.\n","Resolving deltas: 100% (4826/4826), done.\n","/content/mmediting\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 1)) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 2)) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 3)) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 4)) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 5)) (0.31.0)\n","Collecting codecov\n"," Downloading https://files.pythonhosted.org/packages/93/9f/bbea5b6231308458963cb5c067bc5643da9949689702fa5a382714b59699/codecov-2.1.11-py2.py3-none-any.whl\n","Collecting flake8\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/fc/80/35a0716e5d5101e643404dabd20f07f5528a21f3ef4032d31a49c913237b/flake8-3.9.2-py2.py3-none-any.whl (73kB)\n","\u001b[K |████████████████████████████████| 81kB 9.7MB/s \n","\u001b[?25hCollecting interrogate\n"," Downloading https://files.pythonhosted.org/packages/cd/6d/ce3ac440b13c1b36b323a0eab191499a902adade3cc11b18078c07af3e6e/interrogate-1.4.0-py3-none-any.whl\n","Collecting isort==4.3.21\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n","\u001b[K |████████████████████████████████| 51kB 7.5MB/s \n","\u001b[?25hCollecting onnxruntime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/f9/76/3d0f8bb2776961c7335693df06eccf8d099e48fa6fb552c7546867192603/onnxruntime-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5MB)\n","\u001b[K |████████████████████████████████| 4.5MB 37.4MB/s \n","\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.7/dist-packages (from -r requirements/tests.txt (line 6)) (3.6.4)\n","Collecting pytest-runner\n"," Downloading https://files.pythonhosted.org/packages/f4/f5/6605d73bf3f4c198915872111b10c4b3c2dccd8485f47b7290ceef037190/pytest_runner-5.3.1-py3-none-any.whl\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (1.19.5)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (2.4.0)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (4.1.2.30)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (3.13)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.5.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.4.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.4.1)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.1.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (3.2.2)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.36.2)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.34.1)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.6.1)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.8.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (2.23.0)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.4.4)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (57.0.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.12.0)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.12.4)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.3.4)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.31.0)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.0.1)\n","Requirement already satisfied: coverage in /usr/local/lib/python3.7/dist-packages (from codecov->-r requirements/tests.txt (line 1)) (3.7.1)\n","Collecting pyflakes<2.4.0,>=2.3.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/11/2a745612f1d3cbbd9c69ba14b1b43a35a2f5c3c81cd0124508c52c64307f/pyflakes-2.3.1-py2.py3-none-any.whl (68kB)\n","\u001b[K |████████████████████████████████| 71kB 9.8MB/s \n","\u001b[?25hCollecting pycodestyle<2.8.0,>=2.7.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/cc/227251b1471f129bc35e966bb0fceb005969023926d744139642d847b7ae/pycodestyle-2.7.0-py2.py3-none-any.whl (41kB)\n","\u001b[K |████████████████████████████████| 51kB 8.7MB/s \n","\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n"," Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from flake8->-r requirements/tests.txt (line 2)) (4.5.0)\n","Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.8.9)\n","Collecting colorama\n"," Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n","Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (7.1.2)\n","Requirement already satisfied: toml in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.10.2)\n","Requirement already satisfied: py in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (1.10.0)\n","Requirement already satisfied: attrs in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (21.2.0)\n","Requirement already satisfied: flatbuffers in /usr/local/lib/python3.7/dist-packages (from onnxruntime->-r requirements/tests.txt (line 5)) (1.12)\n","Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (8.8.0)\n","Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (0.7.1)\n","Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.15.0)\n","Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.4.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->-r requirements/runtime.txt (line 3)) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (1.3.1)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (3.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2021.5.30)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (1.24.3)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2.10)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (1.3.0)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.7.2)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.2.2)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (3.1.1)\n","Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.7/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3.6\"->google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.4.8)\n","Installing collected packages: codecov, pyflakes, pycodestyle, mccabe, flake8, colorama, interrogate, isort, onnxruntime, pytest-runner\n","Successfully installed codecov-2.1.11 colorama-0.4.4 flake8-3.9.2 interrogate-1.4.0 isort-4.3.21 mccabe-0.6.1 onnxruntime-1.8.0 pycodestyle-2.7.0 pyflakes-2.3.1 pytest-runner-5.3.1\n","Created temporary directory: /tmp/pip-ephem-wheel-cache-hu6xvjxh\n","Created temporary directory: /tmp/pip-req-tracker-zk5q0q3z\n","Created requirements tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Created temporary directory: /tmp/pip-install-vr_vpseo\n","Obtaining file:///content/mmediting\n"," Added file:///content/mmediting to build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"," Running setup.py (path:/content/mmediting/setup.py) egg_info for package from file:///content/mmediting\n"," Running command python setup.py egg_info\n"," running egg_info\n"," creating mmedit.egg-info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," Source in /content/mmediting has version 0.8.0, which satisfies requirement mmedit==0.8.0 from file:///content/mmediting\n"," Removed mmedit==0.8.0 from file:///content/mmediting from build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.31.0)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (4.1.2.30)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (2.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (1.19.5)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.5.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.4.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.4.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (3.2.2)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.1.1)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.34.1)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.12.4)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.0.1)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.36.2)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.31.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.12.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (2.23.0)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.8.0)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.3.4)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.4.4)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.6.1)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (57.0.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->mmedit==0.8.0) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (1.3.1)\n","Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from grpcio>=1.24.3->tensorboard->mmedit==0.8.0) (1.15.0)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.2.2)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.7.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (1.24.3)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2.10)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2021.5.30)\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.8.0) (4.5.0)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (1.3.0)\n","Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.4.8)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (3.1.1)\n","Installing collected packages: mmedit\n"," Running setup.py develop for mmedit\n"," Running command /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/content/mmediting/setup.py'\"'\"'; __file__='\"'\"'/content/mmediting/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' develop --no-deps\n"," running develop\n"," running egg_info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," running build_ext\n"," Creating /usr/local/lib/python3.7/dist-packages/mmedit.egg-link (link to .)\n"," Adding mmedit 0.8.0 to easy-install.pth file\n","\n"," Installed /content/mmediting\n","Successfully installed mmedit\n","Cleaning up...\n","Removed build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"]}],"source":["# Install openmim for the installation of mmcv-full\n","!pip install openmim\n","\n","# Install mmcv-full thus we could use CUDA operators\n","!mim install mmcv-full\n","\n","# Clone MMEditing\n","!rm -rf mmediting\n","!git clone https://github.com/open-mmlab/mmediting.git\n","%cd mmediting\n","\n","# Install MMEditing\n","!pip install -v -e ."]},{"cell_type":"markdown","metadata":{"id":"QgX96Sc_3PcV"},"source":["## Download necessary material for this demo\n","We will need some data and configuration files in this demo. We will download it and put it in `./demo_files/`"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4723,"status":"ok","timestamp":1625140825508,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"-K0zFSJ-3V42","outputId":"528a87f7-f78e-4219-84f3-dec19b88e88a"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2021-07-01 11:59:48-- https://download.openmmlab.com/mmediting/demo_files.zip\n","Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.35\n","Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.35|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 19215781 (18M) [application/zip]\n","Saving to: ‘demo_files.zip’\n","\n","demo_files.zip 100%[===================>] 18.33M 6.00MB/s in 3.1s \n","\n","2021-07-01 11:59:52 (6.00 MB/s) - ‘demo_files.zip’ saved [19215781/19215781]\n","\n","Archive: demo_files.zip\n"," creating: demo_files/\n"," inflating: demo_files/demo_config_EDVR.py \n"," inflating: demo_files/demo_config_BasicVSR.py \n"," creating: demo_files/lq_sequences/\n"," creating: demo_files/lq_sequences/calendar/\n"," inflating: demo_files/lq_sequences/calendar/00000006.png \n"," inflating: demo_files/lq_sequences/calendar/00000007.png \n"," inflating: demo_files/lq_sequences/calendar/00000010.png \n"," inflating: demo_files/lq_sequences/calendar/00000004.png \n"," inflating: demo_files/lq_sequences/calendar/00000003.png \n"," inflating: demo_files/lq_sequences/calendar/00000001.png \n"," inflating: demo_files/lq_sequences/calendar/00000000.png \n"," inflating: demo_files/lq_sequences/calendar/00000009.png \n"," inflating: demo_files/lq_sequences/calendar/00000008.png \n"," inflating: demo_files/lq_sequences/calendar/00000002.png \n"," inflating: demo_files/lq_sequences/calendar/00000005.png \n"," creating: demo_files/lq_sequences/city/\n"," inflating: demo_files/lq_sequences/city/00000006.png \n"," inflating: demo_files/lq_sequences/city/00000007.png \n"," inflating: demo_files/lq_sequences/city/00000010.png \n"," inflating: demo_files/lq_sequences/city/00000004.png \n"," inflating: demo_files/lq_sequences/city/00000003.png \n"," inflating: demo_files/lq_sequences/city/00000001.png \n"," inflating: demo_files/lq_sequences/city/00000000.png \n"," inflating: demo_files/lq_sequences/city/00000009.png \n"," inflating: demo_files/lq_sequences/city/00000008.png \n"," inflating: demo_files/lq_sequences/city/00000002.png \n"," inflating: demo_files/lq_sequences/city/00000005.png \n"," creating: demo_files/lq_sequences/.ipynb_checkpoints/\n"," creating: demo_files/gt_images/\n"," inflating: demo_files/gt_images/bird.png \n"," inflating: demo_files/gt_images/woman.png \n"," inflating: demo_files/gt_images/head.png \n"," inflating: demo_files/gt_images/baby.png \n"," inflating: demo_files/gt_images/butterfly.png \n"," inflating: demo_files/demo_config_SRCNN.py \n"," creating: demo_files/lq_images/\n"," extracting: demo_files/lq_images/bird.png \n"," extracting: demo_files/lq_images/woman.png \n"," extracting: demo_files/lq_images/head.png \n"," extracting: demo_files/lq_images/baby.png \n"," extracting: demo_files/lq_images/butterfly.png \n"," creating: demo_files/gt_sequences/\n"," creating: demo_files/gt_sequences/calendar/\n"," inflating: demo_files/gt_sequences/calendar/00000006.png \n"," inflating: demo_files/gt_sequences/calendar/00000007.png \n"," inflating: demo_files/gt_sequences/calendar/00000010.png \n"," inflating: demo_files/gt_sequences/calendar/00000004.png \n"," inflating: demo_files/gt_sequences/calendar/00000003.png \n"," inflating: demo_files/gt_sequences/calendar/00000001.png \n"," inflating: demo_files/gt_sequences/calendar/00000000.png \n"," inflating: demo_files/gt_sequences/calendar/00000009.png \n"," inflating: demo_files/gt_sequences/calendar/00000008.png \n"," inflating: demo_files/gt_sequences/calendar/00000002.png \n"," inflating: demo_files/gt_sequences/calendar/00000005.png \n"," creating: demo_files/gt_sequences/city/\n"," inflating: demo_files/gt_sequences/city/00000006.png \n"," inflating: demo_files/gt_sequences/city/00000007.png \n"," inflating: demo_files/gt_sequences/city/00000010.png \n"," inflating: demo_files/gt_sequences/city/00000004.png \n"," inflating: demo_files/gt_sequences/city/00000003.png \n"," inflating: demo_files/gt_sequences/city/00000001.png \n"," inflating: demo_files/gt_sequences/city/00000000.png \n"," inflating: demo_files/gt_sequences/city/00000009.png \n"," inflating: demo_files/gt_sequences/city/00000008.png \n"," inflating: demo_files/gt_sequences/city/00000002.png \n"," inflating: demo_files/gt_sequences/city/00000005.png \n"," creating: demo_files/gt_sequences/.ipynb_checkpoints/\n"," creating: demo_files/.ipynb_checkpoints/\n"]}],"source":["!wget https://download.openmmlab.com/mmediting/demo_files.zip # download files\n","!unzip demo_files # unzip\n","\n","# copy the data to data/Set5 for later use\n","!mkdir data\n","!mkdir data/val_set5\n","!cp -r demo_files/lq_images data/val_set5/Set5_bicLRx4\n","!cp -r demo_files/gt_images data/val_set5/Set5"]},{"cell_type":"markdown","metadata":{"id":"zXGurqGKOeNE"},"source":["## Inference with a pre-trained image restorer\n","You can easily perform inference on a single image with a pre-trained restorer by using `restoration_demo.py`. What you need are \n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer you want to use. It specifies the model you want to use. \n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model. \n","3. `IMAGE_FILE`: The path to the input image.\n","4. `SAVE_FILE`: The location where you want to store the output image.\n","5. `imshow`: Whether to show the image. (Optional)\n","6. `GPU_ID`: Which GPU you want to use. (Optional)\n","\n","Once you have all these details, you can directly use the following command:\n","\n","```\n","python demo/restoration_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${IMAGE_FILE} ${SAVE_FILE} [--imshow] [--device ${GPU_ID}]\n","```\n","\n","**Notes:** \n","1. Configuration files are located in `./configs`. \n","2. We support loading checkpoints from url. You can go to the corresponding page (e.g. [here](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan)) to obtain the url of the pretrained model.\n","\n","---\n","\n","We will now use `SRCNN` and `ESRGAN` as examples.\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58677,"status":"ok","timestamp":1625140884175,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"KiPvtvlqM1zb","outputId":"be7375a7-4632-4770-8383-2a8ce654b069"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\" to /root/.cache/torch/hub/checkpoints/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\n","100% 83.9k/83.9k [00:00<00:00, 1.59MB/s]\n","2021-07-01 12:00:10,779 - mmedit - INFO - Use load_from_torchvision loader\n","Downloading: \"https://download.pytorch.org/models/vgg19-dcbb9e9d.pth\" to /root/.cache/torch/hub/checkpoints/vgg19-dcbb9e9d.pth\n","100% 548M/548M [00:07<00:00, 76.0MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\" to /root/.cache/torch/hub/checkpoints/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\n","100% 196M/196M [00:26<00:00, 7.61MB/s]\n","bird_ESRGAN.png bird_SRCNN.png\n"]}],"source":["# SRCNN\n","!python demo/restoration_demo.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth ./demo_files/lq_images/bird.png ./outputs/bird_SRCNN.png\n","\n","# ESRGAN\n","!python demo/restoration_demo.py ./configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth ./demo_files/lq_images/bird.png ./outputs/bird_ESRGAN.png\n","\n","# Check whether images are saved\n","!ls ./outputs"]},{"cell_type":"markdown","metadata":{"id":"W1DfGHu3Xcfd"},"source":["## Inference with a pre-trained video restorer\n","\n","MMEditing also supports video super-resolution methods, and the procedure is similar. You can use `restoration_video_demo.py` with the following arguments:\n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer you want to use\n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model. \n","3. `INPUT_DIR`: The directory containing the video frames.\n","4. `OUTPUT_DIR`: The location where you want to store the output frames.\n","5. `WINDOW_SIZE`: The window size if you are using sliding-window method (Optional).\n","6. `GPU_ID`: Which GPU you want to use (Optional).\n","```\n","python demo/restoration_video_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${INPUT_DIR} ${OUTPUT_DIR} [--window_size=$WINDOW_SIZE] [--device ${GPU_ID}]\n","```\n","**Note:** There are two different frameworks in video super-resolution: ***sliding-window*** and ***recurrent*** frameworks. When you use the methods of the sliding-window framework, such as EDVR, you need to specify `window_size`. This value is dependent on the model you use.\n","\n","---\n","\n","We will now use `EDVR` and `BasicVSR` as examples.\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29263,"status":"ok","timestamp":1625140913405,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"iaoE7UF5Xb2i","outputId":"a022e0bd-c47a-450e-f4e4-1bf9f92e4813"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\" to /root/.cache/torch/hub/checkpoints/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\n","100% 11.5M/11.5M [00:01<00:00, 8.55MB/s]\n","2021-07-01 12:01:09,689 - mmedit - INFO - Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth\" to /root/.cache/torch/hub/checkpoints/spynet_20210409-c6c1bd09.pth\n","100% 5.50M/5.50M [00:00<00:00, 8.88MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth\" to /root/.cache/torch/hub/checkpoints/basicvsr_reds4_20120409-0e599677.pth\n","100% 24.1M/24.1M [00:02<00:00, 8.97MB/s]\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# EDVR (Sliding-window framework)\n","!python demo/restoration_video_demo.py ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_EDVR --window_size=5\n","\n","# BasicVSR (Recurrent framework)\n","!python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_BasicVSR\n","\n","# Check whether video frames are saved\n","!ls ./outputs/calendar_BasicVSR"]},{"cell_type":"markdown","metadata":{"id":"Rf3LW57qMHXb"},"source":["## Test on a pre-defined dataset using the configuration file\n","\n","The above demos provide an easy way to perform inference on a single image or video sequence. If you want to perform inference on a set of images or sequences, you can make use of the configuration files located in `./configs`.\n"," \n","Existing configuration files allow you to perform inference on common datasets, such as `Set5` in image super-resolution and `REDS4` in video super-resolution. You can use the following command:\n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer and dataset you want to use\n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model.\n","3. `GPU_NUM`: Number of GPUs used for test. \n","4. `RESULT_FILE`: The path to the output result pickle file. (Optional)\n","5. `IMAGE_SAVE_PATH`: The location where you want to store the output image. (Optional)\n","\n","```\n","# single-gpu testing\n","python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","\n","# multi-gpu testing\n","./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","```\n","What you need to do is to modify the `lq_folder` and `gt_folder` in the configuration file:\n","```\n","test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/val_set5/Set5_bicLRx4',\n"," gt_folder='data/val_set5/Set5',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","```\n","\n","**Note**: Some dataset type (e.g. `SRREDSDataset`) requires an annotation file specifying the details of the dataset. Please refer to the corresponding file\n","in `./mmedit/dataset/` for more details. \n","\n","---\n","\n","The following is the command for SRCNN. For other models, you can simply change the paths to the configuration file and pretrained model. \n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14095,"status":"ok","timestamp":1625140927462,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"tClgIYgcbbVg","outputId":"c37ec2de-e1c9-42ae-ed9b-31009d48ae64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"tools/test.py\", line 136, in \n"," main()\n"," File \"tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/test.py\", line 136, in \n"," main()\n"," File \"./tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/test.py', '--local_rank=0', './configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py', 'https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth', '--launcher', 'pytorch', '--save-path', './outputs/']' returned non-zero exit status 1.\n"]}],"source":["# single-gpu\n","!python tools/test.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/\n","\n","# multi-gpu testing\n","!./tools/dist_test.sh ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth 1 --save-path ./outputs/"]},{"cell_type":"markdown","metadata":{"id":"KWKVyeEQelh3"},"source":["## Test on your own datasets\n","\n","When you want to test on your own datasets, you need to modify `test_dataset_type` in addition to the dataset paths. \n","\n","- For image super-resolution, you need to use `SRFolderDataset`\n","- For sliding-window framework in video super-resolution (e.g. EDVR, TDAN), you need to use `SRFolderVideoDataset`.\n","- For recurrent framework in video super-resolution (e.g. BasicVSR, IconVSR), you need to use `SRFolderMultipleGTDataset`.\n","\n","These dataset types assume that all images/sequences in the specified directory are used for test. The folder structures should be\n","```\n","| lq_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," | ...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","| gt_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," |...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","```\n","We will use **SRCNN**, **EDVR**, **BasicVSR** as examples. Please pay attention to the settings of `test_dataset_type` and `data['test']`. "]},{"cell_type":"markdown","metadata":{"id":"0p2rP8jV_dL1"},"source":["**SRCNN**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8729,"status":"ok","timestamp":1625140936180,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"4kEev4wVIq_L","outputId":"8026ed73-f781-4eb2-bb80-d3446bd131df"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 5/5, 8.6 task/s, elapsed: 1s, ETA: 0s\n","Eval-PSNR: 28.433974369836108\n","Eval-SSIM: 0.8099053586583066\n","baby.png bird.png butterfly.png head.png woman.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_SRCNN.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/testset_SRCNN\n","\n","# Check the output folder\n","!ls ./outputs/testset_SRCNN"]},{"cell_type":"markdown","metadata":{"id":"RONzjTTU_gem"},"source":["**EDVR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":19671,"status":"ok","timestamp":1625140955813,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"vL8WOWXY0fNJ","outputId":"dc2a8f81-9bef-4ad4-c5b2-c6f124e6b113"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 22/22, 2.0 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 23.89569862011228\n","Eval-SSIM: 0.7667098470108678\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_EDVR.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth --save-path ./outputs/testset_EDVR\n","\n","# # Check the output folder\n","!ls ./outputs/testset_EDVR\n","!ls ./outputs/testset_EDVR/city"]},{"cell_type":"markdown","metadata":{"id":"5Tc7F-l5_i1e"},"source":["**BasicVSR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":20220,"status":"ok","timestamp":1625140976026,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"jpW5GWC74Yvu","outputId":"7ba02a32-d4ec-40b2-8108-ef0729b62147"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:07,780 - mmedit - INFO - Use load_from_http loader\n","Use load_from_http loader\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","[>>] 2/2, 0.2 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 24.195768601433734\n","Eval-SSIM: 0.7828541339512978\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_BasicVSR.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth --save-path ./outputs/testset_BasicVSR\n","\n","# # Check the output folder\n","!ls ./outputs/testset_BasicVSR\n","!ls ./outputs/testset_BasicVSR/calendar"]},{"cell_type":"markdown","metadata":{"id":"4DQxNL8BhI0y"},"source":["## Train a restorer on a pre-defined dataset\n","\n","MMEditing uses distributed training. The following command can be used for training. If you want to train on the pre-defined datasets specified in our configuration file, you can simply run the following command.\n","\n","```\n","./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]\n","```\n","\n","For more details about the optional arguments, please refer to `tools/train.py`.\n","\n","---\n","\n","Here is an example using EDVR.\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9337,"status":"ok","timestamp":1625140985357,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"s-hOnSF6ItQM","outputId":"e40e960a-29e1-43e8-b922-5e08c4e98afe"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:31,961 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:31,961 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:31,961 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:31,961 - mmedit - INFO - Config:\n","/content/mmediting/configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py\n","exp_name = 'edvrm_wotsa_x4_g8_600k_reds'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRREDSDataset'\n","val_dataset_type = 'SRREDSDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 600000\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50000, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=100,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 54, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 63, in load_annotations\n"," with open(self.ann_file, 'r') as fin:\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/train.py\", line 145, in \n"," main()\n"," File \"./tools/train.py\", line 111, in main\n"," datasets = [build_dataset(cfg.data.train)]\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 76, in build_dataset\n"," build_dataset(cfg['dataset'], default_args), cfg['times'])\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRREDSDataset: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/train.py', '--local_rank=0', './configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py', '--launcher', 'pytorch']' returned non-zero exit status 1.\n"]}],"source":["!./tools/dist_train.sh ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py 1"]},{"cell_type":"markdown","metadata":{"id":"b0VfQkQQjg8N"},"source":["## Train a restorer on your own datasets\n","\n","Similar to the case when you want to test on your own datasets, you need to modify `train_dataset_type`. The dataset type you need is identical:\n","\n","- For image super-resolution, you need to use `SRFolderDataset`\n","- For sliding-window framework in video super-resolution (e.g. EDVR, TDAN), you need to use `SRFolderVideoDataset`.\n","- For recurrent framework in video super-resolution (e.g. BasicVSR, IconVSR), you need to use `SRFolderMultipleGTDataset`.\n","\n","After you modified the dataset type and the data path. You are all set to go."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":128384,"status":"ok","timestamp":1625141113733,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"liGEKJpbIoXZ","outputId":"84e1502e-e2cb-458f-c7c5-e4b401e570b7"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:41,185 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:41,185 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:41,185 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:41,185 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_SRCNN.py\n","exp_name = 'srcnn_demo'\n","\n","scale = 4\n","# model settings\n","model = dict(\n"," type='BasicRestorer',\n"," generator=dict(\n"," type='SRCNN',\n"," channels=(3, 64, 32, 3),\n"," kernel_sizes=(9, 1, 5),\n"," upscale_factor=scale),\n"," pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=scale)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderDataset'\n","val_dataset_type = 'SRFolderDataset'\n","train_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=128),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","test_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'lq_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=8,\n"," train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=train_pipeline,\n"," scale=scale)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[250000, 250000, 250000, 250000],\n"," restart_weights=[1, 1, 1, 1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","evaluation = dict(interval=50, save_image=True, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./experiments/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:02:41,192 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/experiments/srcnn_demo\n","2021-07-01 12:02:41,192 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:02:41.529307: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:03:18,631 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.000e-04, eta: 0:57:01, time: 34.560, data_time: 34.446, memory: 586, loss_pix: 0.3999, loss: 0.3999\n","2021-07-01 12:03:18,712 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","INFO:mmedit:Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","2021-07-01 12:03:18,764 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","INFO:mmedit:Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","2021-07-01 12:03:18,840 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","INFO:mmedit:Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","2021-07-01 12:03:18,916 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","INFO:mmedit:Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","2021-07-01 12:03:18,956 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","INFO:mmedit:Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","2021-07-01 12:03:19,012 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","INFO:mmedit:Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","2021-07-01 12:03:19,070 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","INFO:mmedit:Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","2021-07-01 12:03:19,142 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","INFO:mmedit:Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","2021-07-01 12:03:19,212 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","INFO:mmedit:Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","2021-07-01 12:03:19,261 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","INFO:mmedit:Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","2021-07-01 12:03:19,302 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","INFO:mmedit:Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","2021-07-01 12:03:19,357 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","INFO:mmedit:Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","2021-07-01 12:03:19,419 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","INFO:mmedit:Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","2021-07-01 12:03:19,473 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","INFO:mmedit:Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","2021-07-01 12:03:19,538 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","INFO:mmedit:Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","2021-07-01 12:03:19,603 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","INFO:mmedit:Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","2021-07-01 12:03:19,657 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","INFO:mmedit:Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","2021-07-01 12:03:19,716 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","INFO:mmedit:Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","2021-07-01 12:03:19,772 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","INFO:mmedit:Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","2021-07-01 12:03:19,834 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","INFO:mmedit:Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","2021-07-01 12:03:19,877 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","INFO:mmedit:Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","2021-07-01 12:03:19,947 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","INFO:mmedit:Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","2021-07-01 12:03:20,014 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","INFO:mmedit:Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","2021-07-01 12:03:20,068 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","INFO:mmedit:Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","2021-07-01 12:03:20,124 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","INFO:mmedit:Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","2021-07-01 12:03:20,181 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","INFO:mmedit:Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","2021-07-01 12:03:20,244 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","INFO:mmedit:Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","2021-07-01 12:03:20,310 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","INFO:mmedit:Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","2021-07-01 12:03:20,356 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","INFO:mmedit:Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","2021-07-01 12:03:20,410 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","INFO:mmedit:Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","2021-07-01 12:03:20,480 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","INFO:mmedit:Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","2021-07-01 12:03:20,536 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","INFO:mmedit:Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","2021-07-01 12:03:20,595 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","INFO:mmedit:Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","2021-07-01 12:03:20,656 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","INFO:mmedit:Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","2021-07-01 12:03:20,710 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","INFO:mmedit:Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","2021-07-01 12:03:20,779 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:20,846 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","INFO:mmedit:Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","2021-07-01 12:03:20,907 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:20,958 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","INFO:mmedit:Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","2021-07-01 12:03:21,028 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","INFO:mmedit:Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","2021-07-01 12:03:21,122 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","INFO:mmedit:Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","2021-07-01 12:03:21,181 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:21,418 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","INFO:mmedit:Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","2021-07-01 12:03:21,480 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:21,551 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","INFO:mmedit:Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","2021-07-01 12:03:21,618 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","INFO:mmedit:Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","2021-07-01 12:03:21,667 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","INFO:mmedit:Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","2021-07-01 12:03:21,743 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","INFO:mmedit:Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","[>>] 5/5, 0.1 task/s, elapsed: 37s, ETA: 0s\n","\n","2021-07-01 12:03:59,996 - mmedit - INFO - Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","INFO:mmedit:Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","2021-07-01 12:04:00,047 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","INFO:mmedit:Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","2021-07-01 12:04:00,114 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","INFO:mmedit:Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","2021-07-01 12:04:00,181 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","INFO:mmedit:Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","2021-07-01 12:04:00,251 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","INFO:mmedit:Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","2021-07-01 12:04:00,315 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","INFO:mmedit:Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","2021-07-01 12:04:00,373 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","INFO:mmedit:Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","2021-07-01 12:04:00,418 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","INFO:mmedit:Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","2021-07-01 12:04:00,478 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","INFO:mmedit:Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","2021-07-01 12:04:00,538 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","INFO:mmedit:Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","2021-07-01 12:04:00,606 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","INFO:mmedit:Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","2021-07-01 12:04:00,647 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","INFO:mmedit:Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","2021-07-01 12:04:00,711 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","INFO:mmedit:Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","2021-07-01 12:04:00,757 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","INFO:mmedit:Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","2021-07-01 12:04:00,799 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","INFO:mmedit:Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","2021-07-01 12:04:00,871 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:00,938 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:00,995 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","INFO:mmedit:Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","2021-07-01 12:04:01,051 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","INFO:mmedit:Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","2021-07-01 12:04:01,115 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:01,196 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","INFO:mmedit:Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","2021-07-01 12:04:01,256 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","INFO:mmedit:Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","2021-07-01 12:04:01,325 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","INFO:mmedit:Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","2021-07-01 12:04:01,381 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","INFO:mmedit:Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:04:01,429 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","INFO:mmedit:Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","2021-07-01 12:04:01,497 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","INFO:mmedit:Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","2021-07-01 12:04:01,545 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","INFO:mmedit:Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","2021-07-01 12:04:01,597 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","INFO:mmedit:Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","2021-07-01 12:04:01,671 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","INFO:mmedit:Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:04:01,724 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:01,777 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","INFO:mmedit:Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","2021-07-01 12:04:01,847 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","INFO:mmedit:Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","2021-07-01 12:04:01,905 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","INFO:mmedit:Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","2021-07-01 12:04:01,953 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","INFO:mmedit:Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","2021-07-01 12:04:02,025 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","INFO:mmedit:Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","2021-07-01 12:04:02,079 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","INFO:mmedit:Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","2021-07-01 12:04:02,137 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","INFO:mmedit:Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","2021-07-01 12:04:02,193 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:02,255 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","INFO:mmedit:Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:04:02,341 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","INFO:mmedit:Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","2021-07-01 12:04:02,394 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","INFO:mmedit:Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","2021-07-01 12:04:02,496 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","INFO:mmedit:Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","2021-07-01 12:04:02,552 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:02,629 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","INFO:mmedit:Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","2021-07-01 12:04:02,682 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","INFO:mmedit:Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","2021-07-01 12:04:02,791 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","INFO:mmedit:Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","2021-07-01 12:04:02,834 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","INFO:mmedit:Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","2021-07-01 12:04:02,900 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","INFO:mmedit:Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","2021-07-01 12:04:03,053 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","INFO:mmedit:Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:04:03,108 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","INFO:mmedit:Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","[>>] 5/5, 0.2 task/s, elapsed: 33s, ETA: 0s\n","\n","2021-07-01 12:04:37,412 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:04:37,422 - mmedit - INFO - Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n","INFO:mmedit:Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n"]}],"source":["# SRCNN (Single Image Super-Resolution)\n","!./tools/dist_train.sh ./demo_files/demo_config_SRCNN.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":117937,"status":"ok","timestamp":1625141554036,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"26uZ4Ak7qbC9","outputId":"2fb26527-eb9e-4b48-e03c-ba9a91c60db8"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:10:12,619 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:10:12,619 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:10:12,619 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:10:12,619 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_EDVR.py\n","exp_name = 'edvrm_demo'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderVideoDataset'\n","val_dataset_type = 'SRFolderVideoDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:10:12,701 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/edvrm_demo\n","2021-07-01 12:10:12,702 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:10:12.951771: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:10:30,703 - mmedit - INFO - Iter [1/100]\tlr_generator: 4.000e-04, eta: 0:26:53, time: 16.295, data_time: 15.833, memory: 1341, loss_pix: 63917.2734, loss: 63917.2734\n","2021-07-01 12:10:31,046 - mmedit - INFO - Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","INFO:mmedit:Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","2021-07-01 12:10:31,386 - mmedit - INFO - Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","INFO:mmedit:Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","2021-07-01 12:10:31,731 - mmedit - INFO - Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","INFO:mmedit:Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","2021-07-01 12:10:32,071 - mmedit - INFO - Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","INFO:mmedit:Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","2021-07-01 12:10:32,414 - mmedit - INFO - Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","INFO:mmedit:Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","2021-07-01 12:10:32,760 - mmedit - INFO - Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","INFO:mmedit:Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","2021-07-01 12:10:33,102 - mmedit - INFO - Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","INFO:mmedit:Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","2021-07-01 12:10:33,447 - mmedit - INFO - Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","INFO:mmedit:Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","2021-07-01 12:10:33,792 - mmedit - INFO - Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","INFO:mmedit:Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","2021-07-01 12:10:34,138 - mmedit - INFO - Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","INFO:mmedit:Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","2021-07-01 12:10:34,484 - mmedit - INFO - Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","INFO:mmedit:Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","2021-07-01 12:10:34,829 - mmedit - INFO - Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","INFO:mmedit:Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","2021-07-01 12:10:35,175 - mmedit - INFO - Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","INFO:mmedit:Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","2021-07-01 12:10:35,522 - mmedit - INFO - Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","INFO:mmedit:Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","2021-07-01 12:10:35,866 - mmedit - INFO - Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","INFO:mmedit:Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","2021-07-01 12:10:36,212 - mmedit - INFO - Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","INFO:mmedit:Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","2021-07-01 12:10:36,560 - mmedit - INFO - Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","INFO:mmedit:Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","2021-07-01 12:10:36,904 - mmedit - INFO - Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","INFO:mmedit:Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","2021-07-01 12:10:37,249 - mmedit - INFO - Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","INFO:mmedit:Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","2021-07-01 12:10:37,595 - mmedit - INFO - Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","INFO:mmedit:Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","2021-07-01 12:10:37,939 - mmedit - INFO - Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","INFO:mmedit:Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","2021-07-01 12:10:38,283 - mmedit - INFO - Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","INFO:mmedit:Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","2021-07-01 12:10:38,628 - mmedit - INFO - Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","INFO:mmedit:Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","2021-07-01 12:10:38,974 - mmedit - INFO - Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","INFO:mmedit:Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","2021-07-01 12:10:39,318 - mmedit - INFO - Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","INFO:mmedit:Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","2021-07-01 12:10:39,665 - mmedit - INFO - Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","INFO:mmedit:Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","2021-07-01 12:10:40,011 - mmedit - INFO - Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","INFO:mmedit:Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","2021-07-01 12:10:40,356 - mmedit - INFO - Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","INFO:mmedit:Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","2021-07-01 12:10:40,703 - mmedit - INFO - Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","INFO:mmedit:Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","2021-07-01 12:10:41,049 - mmedit - INFO - Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","INFO:mmedit:Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","2021-07-01 12:10:41,396 - mmedit - INFO - Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","INFO:mmedit:Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","2021-07-01 12:10:41,745 - mmedit - INFO - Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","INFO:mmedit:Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","2021-07-01 12:10:42,097 - mmedit - INFO - Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","INFO:mmedit:Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","2021-07-01 12:10:42,444 - mmedit - INFO - Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","INFO:mmedit:Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","2021-07-01 12:10:42,790 - mmedit - INFO - Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","INFO:mmedit:Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","2021-07-01 12:10:43,140 - mmedit - INFO - Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","INFO:mmedit:Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","2021-07-01 12:10:43,490 - mmedit - INFO - Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","INFO:mmedit:Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","2021-07-01 12:10:43,841 - mmedit - INFO - Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","INFO:mmedit:Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","2021-07-01 12:10:44,193 - mmedit - INFO - Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","INFO:mmedit:Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","2021-07-01 12:10:44,541 - mmedit - INFO - Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","INFO:mmedit:Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","2021-07-01 12:10:44,895 - mmedit - INFO - Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","INFO:mmedit:Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","2021-07-01 12:10:45,248 - mmedit - INFO - Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","INFO:mmedit:Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","2021-07-01 12:10:45,595 - mmedit - INFO - Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","INFO:mmedit:Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","2021-07-01 12:10:45,950 - mmedit - INFO - Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","INFO:mmedit:Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","2021-07-01 12:10:46,301 - mmedit - INFO - Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","INFO:mmedit:Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","2021-07-01 12:10:46,649 - mmedit - INFO - Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","INFO:mmedit:Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","2021-07-01 12:10:47,003 - mmedit - INFO - Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","INFO:mmedit:Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","2021-07-01 12:10:47,356 - mmedit - INFO - Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","INFO:mmedit:Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:14,231 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","INFO:mmedit:Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","2021-07-01 12:11:14,578 - mmedit - INFO - Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","INFO:mmedit:Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","2021-07-01 12:11:14,930 - mmedit - INFO - Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","INFO:mmedit:Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","2021-07-01 12:11:15,289 - mmedit - INFO - Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","INFO:mmedit:Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","2021-07-01 12:11:15,642 - mmedit - INFO - Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","INFO:mmedit:Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","2021-07-01 12:11:15,993 - mmedit - INFO - Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","INFO:mmedit:Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","2021-07-01 12:11:16,354 - mmedit - INFO - Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","INFO:mmedit:Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","2021-07-01 12:11:16,712 - mmedit - INFO - Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","INFO:mmedit:Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","2021-07-01 12:11:17,065 - mmedit - INFO - Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","INFO:mmedit:Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","2021-07-01 12:11:17,425 - mmedit - INFO - Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","INFO:mmedit:Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","2021-07-01 12:11:17,780 - mmedit - INFO - Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","INFO:mmedit:Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","2021-07-01 12:11:18,135 - mmedit - INFO - Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","INFO:mmedit:Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","2021-07-01 12:11:18,495 - mmedit - INFO - Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","INFO:mmedit:Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","2021-07-01 12:11:18,851 - mmedit - INFO - Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","INFO:mmedit:Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","2021-07-01 12:11:19,210 - mmedit - INFO - Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","INFO:mmedit:Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","2021-07-01 12:11:19,567 - mmedit - INFO - Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","INFO:mmedit:Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","2021-07-01 12:11:19,923 - mmedit - INFO - Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","INFO:mmedit:Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","2021-07-01 12:11:20,286 - mmedit - INFO - Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","INFO:mmedit:Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","2021-07-01 12:11:20,644 - mmedit - INFO - Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","INFO:mmedit:Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","2021-07-01 12:11:21,000 - mmedit - INFO - Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","INFO:mmedit:Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","2021-07-01 12:11:21,359 - mmedit - INFO - Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","INFO:mmedit:Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","2021-07-01 12:11:21,719 - mmedit - INFO - Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","INFO:mmedit:Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","2021-07-01 12:11:22,072 - mmedit - INFO - Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","INFO:mmedit:Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","2021-07-01 12:11:22,434 - mmedit - INFO - Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","INFO:mmedit:Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","2021-07-01 12:11:22,798 - mmedit - INFO - Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","INFO:mmedit:Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","2021-07-01 12:11:23,158 - mmedit - INFO - Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","INFO:mmedit:Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","2021-07-01 12:11:23,513 - mmedit - INFO - Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","INFO:mmedit:Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","2021-07-01 12:11:23,875 - mmedit - INFO - Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","INFO:mmedit:Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","2021-07-01 12:11:24,236 - mmedit - INFO - Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","INFO:mmedit:Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","2021-07-01 12:11:24,597 - mmedit - INFO - Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","INFO:mmedit:Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","2021-07-01 12:11:24,951 - mmedit - INFO - Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","INFO:mmedit:Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","2021-07-01 12:11:25,313 - mmedit - INFO - Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","INFO:mmedit:Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","2021-07-01 12:11:25,677 - mmedit - INFO - Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","INFO:mmedit:Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","2021-07-01 12:11:26,038 - mmedit - INFO - Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","INFO:mmedit:Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","2021-07-01 12:11:26,393 - mmedit - INFO - Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","INFO:mmedit:Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","2021-07-01 12:11:26,753 - mmedit - INFO - Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","INFO:mmedit:Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","2021-07-01 12:11:27,115 - mmedit - INFO - Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","INFO:mmedit:Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","2021-07-01 12:11:27,472 - mmedit - INFO - Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","INFO:mmedit:Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","2021-07-01 12:11:27,830 - mmedit - INFO - Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","INFO:mmedit:Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","2021-07-01 12:11:28,189 - mmedit - INFO - Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","INFO:mmedit:Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","2021-07-01 12:11:28,553 - mmedit - INFO - Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","INFO:mmedit:Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","2021-07-01 12:11:28,910 - mmedit - INFO - Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","INFO:mmedit:Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","2021-07-01 12:11:29,266 - mmedit - INFO - Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","INFO:mmedit:Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","2021-07-01 12:11:29,628 - mmedit - INFO - Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","INFO:mmedit:Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","2021-07-01 12:11:29,989 - mmedit - INFO - Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","INFO:mmedit:Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","2021-07-01 12:11:30,345 - mmedit - INFO - Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","INFO:mmedit:Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","2021-07-01 12:11:30,704 - mmedit - INFO - Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","INFO:mmedit:Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","2021-07-01 12:11:31,067 - mmedit - INFO - Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","INFO:mmedit:Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","2021-07-01 12:11:31,425 - mmedit - INFO - Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","INFO:mmedit:Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","2021-07-01 12:11:31,782 - mmedit - INFO - Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","INFO:mmedit:Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:58,494 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:11:58,598 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n","INFO:mmedit:Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n"]}],"source":["# EDVR (Video Super-Resolution - Sliding Window)\n","!./tools/dist_train.sh ./demo_files/demo_config_EDVR.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":197033,"status":"ok","timestamp":1625141428032,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"_RdqmlT6qgt2","outputId":"b951b426-e06c-4f31-db01-449333eab333"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:06:47,253 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:06:47,253 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:06:47,254 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:06:47,254 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_BasicVSR.py\n","exp_name = 'basicvsr_demo'\n","\n","# model settings\n","model = dict(\n"," type='BasicVSR',\n"," generator=dict(\n"," type='BasicVSRNet',\n"," mid_channels=64,\n"," num_blocks=30,\n"," spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'\n"," 'basicvsr/spynet_20210409-c6c1bd09.pth'),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = dict(fix_iter=5000)\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderMultipleGTDataset'\n","val_dataset_type = 'SRFolderMultipleGTDataset'\n","\n","train_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=6,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True), # 2 gpus\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1, workers_per_gpu=1),\n","\n"," # train\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," # val\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," # test\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(\n"," generator=dict(\n"," type='Adam',\n"," lr=2e-4,\n"," betas=(0.9, 0.99),\n"," paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)})))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[300000],\n"," restart_weights=[1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," # dict(type='TensorboardLoggerHook'),\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","find_unused_parameters = True\n","\n","2021-07-01 12:06:47,291 - mmedit - INFO - Use load_from_http loader\n","2021-07-01 12:06:47,569 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/basicvsr_demo\n","2021-07-01 12:06:47,569 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:07:14,210 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.500e-05, eta: 0:42:52, time: 25.981, data_time: 24.045, memory: 3464, loss_pix: 0.0634, loss: 0.0634\n","2021-07-01 12:07:15,171 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.500e-05, eta: 0:22:00, time: 0.961, data_time: 0.011, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","2021-07-01 12:07:16,052 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.500e-05, eta: 0:14:59, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0476, loss: 0.0476\n","2021-07-01 12:07:16,940 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.500e-05, eta: 0:11:29, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:17,829 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.500e-05, eta: 0:09:22, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0796, loss: 0.0796\n","2021-07-01 12:07:18,712 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.500e-05, eta: 0:07:57, time: 0.884, data_time: 0.004, memory: 3518, loss_pix: 0.0680, loss: 0.0680\n","2021-07-01 12:07:19,594 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.500e-05, eta: 0:06:56, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0607, loss: 0.0607\n","2021-07-01 12:07:20,481 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.500e-05, eta: 0:06:10, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0598, loss: 0.0598\n","2021-07-01 12:07:21,361 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.500e-05, eta: 0:05:35, time: 0.880, data_time: 0.003, memory: 3518, loss_pix: 0.0664, loss: 0.0664\n","2021-07-01 12:07:22,274 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.500e-05, eta: 0:05:06, time: 0.913, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:07:23,161 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.500e-05, eta: 0:04:42, time: 0.887, data_time: 0.005, memory: 3518, loss_pix: 0.0771, loss: 0.0771\n","2021-07-01 12:07:24,058 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.500e-05, eta: 0:04:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0521, loss: 0.0521\n","2021-07-01 12:07:24,944 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.500e-05, eta: 0:04:05, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:07:25,835 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.500e-05, eta: 0:03:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0515, loss: 0.0515\n","2021-07-01 12:07:26,723 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.500e-05, eta: 0:03:38, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0674, loss: 0.0674\n","2021-07-01 12:07:27,609 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.500e-05, eta: 0:03:26, time: 0.886, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:28,498 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.500e-05, eta: 0:03:16, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0670, loss: 0.0670\n","2021-07-01 12:07:29,388 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.500e-05, eta: 0:03:07, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0663, loss: 0.0663\n","2021-07-01 12:07:30,284 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.500e-05, eta: 0:02:59, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0633, loss: 0.0633\n","2021-07-01 12:07:31,176 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.500e-05, eta: 0:02:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0482, loss: 0.0482\n","2021-07-01 12:07:32,073 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.500e-05, eta: 0:02:44, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0743, loss: 0.0743\n","2021-07-01 12:07:32,966 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.500e-05, eta: 0:02:38, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0690, loss: 0.0690\n","2021-07-01 12:07:33,858 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.500e-05, eta: 0:02:32, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0437, loss: 0.0437\n","2021-07-01 12:07:34,750 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.500e-05, eta: 0:02:27, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:35,642 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.500e-05, eta: 0:02:22, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0781, loss: 0.0781\n","2021-07-01 12:07:36,533 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.500e-05, eta: 0:02:17, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:07:37,427 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.500e-05, eta: 0:02:13, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:07:38,321 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.500e-05, eta: 0:02:08, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0567, loss: 0.0567\n","2021-07-01 12:07:39,212 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.500e-05, eta: 0:02:04, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0846, loss: 0.0846\n","2021-07-01 12:07:40,104 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.500e-05, eta: 0:02:01, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0658, loss: 0.0658\n","2021-07-01 12:07:40,993 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.500e-05, eta: 0:01:57, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0502, loss: 0.0502\n","2021-07-01 12:07:41,885 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.500e-05, eta: 0:01:54, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0622, loss: 0.0622\n","2021-07-01 12:07:42,787 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.500e-05, eta: 0:01:50, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0657, loss: 0.0657\n","2021-07-01 12:07:43,674 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.500e-05, eta: 0:01:47, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0643, loss: 0.0643\n","2021-07-01 12:07:44,567 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.500e-05, eta: 0:01:44, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0898, loss: 0.0898\n","2021-07-01 12:07:45,458 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.500e-05, eta: 0:01:41, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0865, loss: 0.0865\n","2021-07-01 12:07:46,341 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.500e-05, eta: 0:01:38, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0511, loss: 0.0511\n","2021-07-01 12:07:47,225 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.500e-05, eta: 0:01:36, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:48,109 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.500e-05, eta: 0:01:33, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0653, loss: 0.0653\n","2021-07-01 12:07:48,990 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:07:49,874 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.885, data_time: 0.003, memory: 3518, loss_pix: 0.0788, loss: 0.0788\n","2021-07-01 12:07:50,755 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.500e-05, eta: 0:01:26, time: 0.881, data_time: 0.005, memory: 3518, loss_pix: 0.0605, loss: 0.0605\n","2021-07-01 12:07:51,638 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.500e-05, eta: 0:01:24, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0539, loss: 0.0539\n","2021-07-01 12:07:52,518 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.500e-05, eta: 0:01:21, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0503, loss: 0.0503\n","2021-07-01 12:07:53,395 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.500e-05, eta: 0:01:19, time: 0.877, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:07:54,273 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0555, loss: 0.0555\n","2021-07-01 12:07:55,159 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.500e-05, eta: 0:01:15, time: 0.886, data_time: 0.007, memory: 3518, loss_pix: 0.0806, loss: 0.0806\n","2021-07-01 12:07:56,040 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.500e-05, eta: 0:01:13, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0576, loss: 0.0576\n","2021-07-01 12:07:56,919 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.500e-05, eta: 0:01:11, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0871, loss: 0.0871\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:08:32,618 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9899, SSIM: 0.5295\n","2021-07-01 12:08:33,591 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.500e-05, eta: 0:01:40, time: 35.792, data_time: 34.822, memory: 3518, loss_pix: 0.0773, loss: 0.0773\n","2021-07-01 12:08:34,462 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.500e-05, eta: 0:01:37, time: 0.871, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:08:35,326 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.500e-05, eta: 0:01:34, time: 0.864, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:36,192 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0575, loss: 0.0575\n","2021-07-01 12:08:37,069 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.876, data_time: 0.003, memory: 3518, loss_pix: 0.0842, loss: 0.0842\n","2021-07-01 12:08:37,942 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.500e-05, eta: 0:01:25, time: 0.873, data_time: 0.003, memory: 3518, loss_pix: 0.0836, loss: 0.0836\n","2021-07-01 12:08:38,808 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.500e-05, eta: 0:01:22, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0580, loss: 0.0580\n","2021-07-01 12:08:39,679 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.500e-05, eta: 0:01:20, time: 0.870, data_time: 0.003, memory: 3518, loss_pix: 0.0449, loss: 0.0449\n","2021-07-01 12:08:40,557 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0702, loss: 0.0702\n","2021-07-01 12:08:41,430 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.500e-05, eta: 0:01:14, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:42,308 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.500e-05, eta: 0:01:12, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:08:43,182 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.500e-05, eta: 0:01:09, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0489, loss: 0.0489\n","2021-07-01 12:08:44,056 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.500e-05, eta: 0:01:07, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0566, loss: 0.0566\n","2021-07-01 12:08:44,932 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.500e-05, eta: 0:01:05, time: 0.875, data_time: 0.003, memory: 3518, loss_pix: 0.0597, loss: 0.0597\n","2021-07-01 12:08:45,819 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.500e-05, eta: 0:01:02, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0640, loss: 0.0640\n","2021-07-01 12:08:46,698 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.500e-05, eta: 0:01:00, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:47,580 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.500e-05, eta: 0:00:58, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:08:48,464 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.500e-05, eta: 0:00:56, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:08:49,347 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.500e-05, eta: 0:00:54, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0603, loss: 0.0603\n","2021-07-01 12:08:50,229 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.500e-05, eta: 0:00:51, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0478, loss: 0.0478\n","2021-07-01 12:08:51,113 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.500e-05, eta: 0:00:49, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:08:52,000 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.500e-05, eta: 0:00:47, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0861, loss: 0.0861\n","2021-07-01 12:08:52,890 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.500e-05, eta: 0:00:45, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:08:53,792 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.500e-05, eta: 0:00:43, time: 0.903, data_time: 0.003, memory: 3518, loss_pix: 0.0787, loss: 0.0787\n","2021-07-01 12:08:54,688 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.500e-05, eta: 0:00:41, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0744, loss: 0.0744\n","2021-07-01 12:08:55,582 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.500e-05, eta: 0:00:39, time: 0.895, data_time: 0.003, memory: 3518, loss_pix: 0.0792, loss: 0.0792\n","2021-07-01 12:08:56,476 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.500e-05, eta: 0:00:38, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0645, loss: 0.0645\n","2021-07-01 12:08:57,368 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.500e-05, eta: 0:00:36, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:08:58,261 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.500e-05, eta: 0:00:34, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:59,159 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.500e-05, eta: 0:00:32, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0626, loss: 0.0626\n","2021-07-01 12:09:00,055 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.500e-05, eta: 0:00:30, time: 0.896, data_time: 0.004, memory: 3518, loss_pix: 0.0681, loss: 0.0681\n","2021-07-01 12:09:00,954 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.500e-05, eta: 0:00:28, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0671, loss: 0.0671\n","2021-07-01 12:09:01,860 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.500e-05, eta: 0:00:27, time: 0.906, data_time: 0.003, memory: 3518, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:09:02,760 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.500e-05, eta: 0:00:25, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0594, loss: 0.0594\n","2021-07-01 12:09:03,658 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.500e-05, eta: 0:00:23, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0446, loss: 0.0446\n","2021-07-01 12:09:04,555 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.500e-05, eta: 0:00:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0491, loss: 0.0491\n","2021-07-01 12:09:05,452 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.500e-05, eta: 0:00:20, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0450, loss: 0.0450\n","2021-07-01 12:09:06,351 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.500e-05, eta: 0:00:18, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0795, loss: 0.0795\n","2021-07-01 12:09:07,257 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.500e-05, eta: 0:00:17, time: 0.905, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:08,161 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.500e-05, eta: 0:00:15, time: 0.904, data_time: 0.003, memory: 3518, loss_pix: 0.0588, loss: 0.0588\n","2021-07-01 12:09:09,063 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.500e-05, eta: 0:00:13, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:09:09,955 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.500e-05, eta: 0:00:12, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0599, loss: 0.0599\n","2021-07-01 12:09:10,849 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.500e-05, eta: 0:00:10, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:11,749 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.500e-05, eta: 0:00:09, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0667, loss: 0.0667\n","2021-07-01 12:09:12,638 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.500e-05, eta: 0:00:07, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0558, loss: 0.0558\n","2021-07-01 12:09:13,576 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.500e-05, eta: 0:00:06, time: 0.938, data_time: 0.052, memory: 3518, loss_pix: 0.0577, loss: 0.0577\n","2021-07-01 12:09:14,463 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.500e-05, eta: 0:00:04, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:09:15,351 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.500e-05, eta: 0:00:02, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0578, loss: 0.0578\n","2021-07-01 12:09:16,240 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.500e-05, eta: 0:00:01, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:09:52,294 - mmedit - INFO - Saving checkpoint at 100 iterations\n","2021-07-01 12:09:52,433 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.4372, SSIM: 0.5687\n"]}],"source":["# BasicVSR (Video Super-Resolution - Recurrent)\n","!./tools/dist_train.sh ./demo_files/demo_config_BasicVSR.py 1 "]},{"cell_type":"markdown","metadata":{"id":"QT0zwBFt7J13"},"source":["**This is the end of this tutorial. For more advanced usage, please see our comprehensive tutorial [here](). Enjoy coding with MMEditing!**"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"restorer_basic_tutorial.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3.7.7 64-bit ('pre-commit': conda)","name":"python377jvsc74a57bd04974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"},"language_info":{"name":"python","version":""},"metadata":{"interpreter":{"hash":"4974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"}}},"nbformat":4,"nbformat_minor":2} diff --git a/demo/restorer_basic_tutorial_zh-CN.ipynb b/demo/restorer_basic_tutorial_zh-CN.ipynb index 6312718202..90796a7d00 100644 --- a/demo/restorer_basic_tutorial_zh-CN.ipynb +++ b/demo/restorer_basic_tutorial_zh-CN.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","metadata":{"id":"T2WWQiheMF7q"},"source":["# MMEditing 基础教程\n","\n","欢迎来到MMEditing! 这是 MMEditing 的官方 Colab 教程。在本教程中,您将学习如何使用 MMEditing 中提供的 API 训练和测试恢复器。\n","\n","这是训练和测试现有模型的快速指南。如果您想基于 MMEditing 开发自己的模型并了解有关代码结构的更多信息,请参阅我们的[综合教程]()。\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmedit/blob/main/demo/restorer_basic_tutorial.ipynb)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"-kYw3WQ0MQry"},"source":["## 安装MMEditing\n","\n","MMEditing 可以分三步安装:\n","\n","1. 安装兼容的 PyTorch 版本(你需要使用 `nvcc -V` 检查你的 CUDA 版本)。\n","2. 安装预编译的MMCV\n","3. 克隆并安装MMEditing\n","\n","步骤如下所示:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":321,"status":"ok","timestamp":1625140540858,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"uha_13idyl1b","outputId":"87056561-5930-45b3-e1a8-f9e103d10b23"},"outputs":[{"name":"stdout","output_type":"stream","text":["nvcc: NVIDIA (R) Cuda compiler driver\n","Copyright (c) 2005-2020 NVIDIA Corporation\n","Built on Wed_Jul_22_19:09:09_PDT_2020\n","Cuda compilation tools, release 11.0, V11.0.221\n","Build cuda_11.0_bu.TC445_37.28845127_0\n","gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","Copyright (C) 2017 Free Software Foundation, Inc.\n","This is free software; see the source for copying conditions. There is NO\n","warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n","\n"]}],"source":["# Check nvcc version\n","!nvcc -V\n","# Check GCC version (MMEditing needs gcc >= 5.0)\n","!gcc --version"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":279948,"status":"ok","timestamp":1625140820804,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"GIeIZEzZMfc0","outputId":"fe2e5ded-988d-4563-eb18-374344c316ef"},"outputs":[{"name":"stdout","output_type":"stream","text":["Looking in links: https://download.pytorch.org/whl/torch_stable.html\n","Collecting torch==1.7.0+cu110\n","\u001b[?25l Downloading https://download.pytorch.org/whl/cu110/torch-1.7.0%2Bcu110-cp37-cp37m-linux_x86_64.whl (1137.1MB)\n","\u001b[K |███████████████████████▌ | 834.1MB 1.3MB/s eta 0:03:50tcmalloc: large alloc 1147494400 bytes == 0x56458d07a000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |█████████████████████████████▊ | 1055.7MB 1.2MB/s eta 0:01:07tcmalloc: large alloc 1434370048 bytes == 0x5645d16d0000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |████████████████████████████████| 1137.1MB 1.1MB/s eta 0:00:01tcmalloc: large alloc 1421369344 bytes == 0x564626ebc000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645535c430a 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c4a81\n","\u001b[K |████████████████████████████████| 1137.1MB 16kB/s \n","\u001b[?25hCollecting torchvision==0.8.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/1d/3f/4f45249458a0dee85bff7acf4a2ac6177708253f1f318fcf6ee230fb864f/torchvision-0.8.0-cp37-cp37m-manylinux1_x86_64.whl (11.8MB)\n","\u001b[K |████████████████████████████████| 11.8MB 254kB/s \n","\u001b[?25hRequirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (3.7.4.3)\n","Collecting dataclasses\n"," Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n","Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (1.19.5)\n","Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (0.16.0)\n","Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.0) (7.1.2)\n","\u001b[31mERROR: torchtext 0.10.0 has requirement torch==1.9.0, but you'll have torch 1.7.0+cu110 which is incompatible.\u001b[0m\n","Installing collected packages: dataclasses, torch, torchvision\n"," Found existing installation: torch 1.9.0+cu102\n"," Uninstalling torch-1.9.0+cu102:\n"," Successfully uninstalled torch-1.9.0+cu102\n"," Found existing installation: torchvision 0.10.0+cu102\n"," Uninstalling torchvision-0.10.0+cu102:\n"," Successfully uninstalled torchvision-0.10.0+cu102\n","Successfully installed dataclasses-0.6 torch-1.7.0+cu110 torchvision-0.8.0\n","Looking in links: https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n","Collecting mmcv-full==1.3.5\n","\u001b[?25l Downloading https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/mmcv_full-1.3.5-cp37-cp37m-manylinux1_x86_64.whl (31.1MB)\n","\u001b[K |████████████████████████████████| 31.1MB 107kB/s \n","\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (1.19.5)\n","Collecting addict\n"," Downloading https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl\n","Collecting yapf\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/5f/0d/8814e79eb865eab42d95023b58b650d01dec6f8ea87fc9260978b1bf2167/yapf-0.31.0-py2.py3-none-any.whl (185kB)\n","\u001b[K |████████████████████████████████| 194kB 33.0MB/s \n","\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (7.1.2)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (4.1.2.30)\n","Installing collected packages: addict, yapf, mmcv-full\n","Successfully installed addict-2.4.0 mmcv-full-1.3.5 yapf-0.31.0\n","Cloning into 'mmediting'...\n","remote: Enumerating objects: 7162, done.\u001b[K\n","remote: Counting objects: 100% (1367/1367), done.\u001b[K\n","remote: Compressing objects: 100% (793/793), done.\u001b[K\n","remote: Total 7162 (delta 827), reused 928 (delta 554), pack-reused 5795\u001b[K\n","Receiving objects: 100% (7162/7162), 5.02 MiB | 32.14 MiB/s, done.\n","Resolving deltas: 100% (4826/4826), done.\n","/content/mmediting\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 1)) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 2)) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 3)) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 4)) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 5)) (0.31.0)\n","Collecting codecov\n"," Downloading https://files.pythonhosted.org/packages/93/9f/bbea5b6231308458963cb5c067bc5643da9949689702fa5a382714b59699/codecov-2.1.11-py2.py3-none-any.whl\n","Collecting flake8\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/fc/80/35a0716e5d5101e643404dabd20f07f5528a21f3ef4032d31a49c913237b/flake8-3.9.2-py2.py3-none-any.whl (73kB)\n","\u001b[K |████████████████████████████████| 81kB 9.7MB/s \n","\u001b[?25hCollecting interrogate\n"," Downloading https://files.pythonhosted.org/packages/cd/6d/ce3ac440b13c1b36b323a0eab191499a902adade3cc11b18078c07af3e6e/interrogate-1.4.0-py3-none-any.whl\n","Collecting isort==4.3.21\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n","\u001b[K |████████████████████████████████| 51kB 7.5MB/s \n","\u001b[?25hCollecting onnxruntime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/f9/76/3d0f8bb2776961c7335693df06eccf8d099e48fa6fb552c7546867192603/onnxruntime-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5MB)\n","\u001b[K |████████████████████████████████| 4.5MB 37.4MB/s \n","\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.7/dist-packages (from -r requirements/tests.txt (line 6)) (3.6.4)\n","Collecting pytest-runner\n"," Downloading https://files.pythonhosted.org/packages/f4/f5/6605d73bf3f4c198915872111b10c4b3c2dccd8485f47b7290ceef037190/pytest_runner-5.3.1-py3-none-any.whl\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (1.19.5)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (2.4.0)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (4.1.2.30)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (3.13)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.5.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.4.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.4.1)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.1.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (3.2.2)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.36.2)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.34.1)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.6.1)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.8.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (2.23.0)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.4.4)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (57.0.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.12.0)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.12.4)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.3.4)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.31.0)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.0.1)\n","Requirement already satisfied: coverage in /usr/local/lib/python3.7/dist-packages (from codecov->-r requirements/tests.txt (line 1)) (3.7.1)\n","Collecting pyflakes<2.4.0,>=2.3.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/11/2a745612f1d3cbbd9c69ba14b1b43a35a2f5c3c81cd0124508c52c64307f/pyflakes-2.3.1-py2.py3-none-any.whl (68kB)\n","\u001b[K |████████████████████████████████| 71kB 9.8MB/s \n","\u001b[?25hCollecting pycodestyle<2.8.0,>=2.7.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/cc/227251b1471f129bc35e966bb0fceb005969023926d744139642d847b7ae/pycodestyle-2.7.0-py2.py3-none-any.whl (41kB)\n","\u001b[K |████████████████████████████████| 51kB 8.7MB/s \n","\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n"," Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from flake8->-r requirements/tests.txt (line 2)) (4.5.0)\n","Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.8.9)\n","Collecting colorama\n"," Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n","Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (7.1.2)\n","Requirement already satisfied: toml in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.10.2)\n","Requirement already satisfied: py in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (1.10.0)\n","Requirement already satisfied: attrs in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (21.2.0)\n","Requirement already satisfied: flatbuffers in /usr/local/lib/python3.7/dist-packages (from onnxruntime->-r requirements/tests.txt (line 5)) (1.12)\n","Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (8.8.0)\n","Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (0.7.1)\n","Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.15.0)\n","Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.4.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->-r requirements/runtime.txt (line 3)) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (1.3.1)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (3.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2021.5.30)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (1.24.3)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2.10)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (1.3.0)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.7.2)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.2.2)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (3.1.1)\n","Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.7/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3.6\"->google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.4.8)\n","Installing collected packages: codecov, pyflakes, pycodestyle, mccabe, flake8, colorama, interrogate, isort, onnxruntime, pytest-runner\n","Successfully installed codecov-2.1.11 colorama-0.4.4 flake8-3.9.2 interrogate-1.4.0 isort-4.3.21 mccabe-0.6.1 onnxruntime-1.8.0 pycodestyle-2.7.0 pyflakes-2.3.1 pytest-runner-5.3.1\n","Created temporary directory: /tmp/pip-ephem-wheel-cache-hu6xvjxh\n","Created temporary directory: /tmp/pip-req-tracker-zk5q0q3z\n","Created requirements tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Created temporary directory: /tmp/pip-install-vr_vpseo\n","Obtaining file:///content/mmediting\n"," Added file:///content/mmediting to build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"," Running setup.py (path:/content/mmediting/setup.py) egg_info for package from file:///content/mmediting\n"," Running command python setup.py egg_info\n"," running egg_info\n"," creating mmedit.egg-info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," Source in /content/mmediting has version 0.8.0, which satisfies requirement mmedit==0.8.0 from file:///content/mmediting\n"," Removed mmedit==0.8.0 from file:///content/mmediting from build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmedit==0.8.0) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from mmedit==0.8.0) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmedit==0.8.0) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmedit==0.8.0) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmedit==0.8.0) (0.31.0)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (4.1.2.30)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (2.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (1.19.5)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.5.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.4.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.4.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (3.2.2)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.1.1)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.34.1)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.12.4)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.0.1)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.36.2)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.31.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.12.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (2.23.0)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.8.0)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.3.4)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.4.4)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.6.1)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (57.0.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->mmedit==0.8.0) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (1.3.1)\n","Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from grpcio>=1.24.3->tensorboard->mmedit==0.8.0) (1.15.0)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.2.2)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.7.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (1.24.3)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2.10)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2021.5.30)\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.8.0) (4.5.0)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (1.3.0)\n","Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.4.8)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (3.1.1)\n","Installing collected packages: mmedit\n"," Running setup.py develop for mmedit\n"," Running command /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/content/mmediting/setup.py'\"'\"'; __file__='\"'\"'/content/mmediting/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' develop --no-deps\n"," running develop\n"," running egg_info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," running build_ext\n"," Creating /usr/local/lib/python3.7/dist-packages/mmedit.egg-link (link to .)\n"," Adding mmedit 0.8.0 to easy-install.pth file\n","\n"," Installed /content/mmediting\n","Successfully installed mmedit\n","Cleaning up...\n","Removed build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"]}],"source":["# 安装 openmim 用于安装 mmcv-full\n","!pip install openmim\n","\n","# 安装 mmcv-full 使用 CUDA 算子\n","!mim install mmcv-full\n","\n","# 克隆 MMEditing\n","!rm -rf mmediting\n","!git clone https://github.com/open-mmlab/mmediting.git\n","%cd mmediting\n","\n","# 安装 MMEditing\n","!pip install -v -e ."]},{"cell_type":"markdown","metadata":{"id":"QgX96Sc_3PcV"},"source":["## 下载此演示所需的材料\n","在这个演示中,我们将需要一些数据和配置文件。我们将下载并放入 `./demo_files/`"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4723,"status":"ok","timestamp":1625140825508,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"-K0zFSJ-3V42","outputId":"528a87f7-f78e-4219-84f3-dec19b88e88a"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2021-07-01 11:59:48-- https://download.openmmlab.com/mmediting/demo_files.zip\n","Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.35\n","Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.35|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 19215781 (18M) [application/zip]\n","Saving to: ‘demo_files.zip’\n","\n","demo_files.zip 100%[===================>] 18.33M 6.00MB/s in 3.1s \n","\n","2021-07-01 11:59:52 (6.00 MB/s) - ‘demo_files.zip’ saved [19215781/19215781]\n","\n","Archive: demo_files.zip\n"," creating: demo_files/\n"," inflating: demo_files/demo_config_EDVR.py \n"," inflating: demo_files/demo_config_BasicVSR.py \n"," creating: demo_files/lq_sequences/\n"," creating: demo_files/lq_sequences/calendar/\n"," inflating: demo_files/lq_sequences/calendar/00000006.png \n"," inflating: demo_files/lq_sequences/calendar/00000007.png \n"," inflating: demo_files/lq_sequences/calendar/00000010.png \n"," inflating: demo_files/lq_sequences/calendar/00000004.png \n"," inflating: demo_files/lq_sequences/calendar/00000003.png \n"," inflating: demo_files/lq_sequences/calendar/00000001.png \n"," inflating: demo_files/lq_sequences/calendar/00000000.png \n"," inflating: demo_files/lq_sequences/calendar/00000009.png \n"," inflating: demo_files/lq_sequences/calendar/00000008.png \n"," inflating: demo_files/lq_sequences/calendar/00000002.png \n"," inflating: demo_files/lq_sequences/calendar/00000005.png \n"," creating: demo_files/lq_sequences/city/\n"," inflating: demo_files/lq_sequences/city/00000006.png \n"," inflating: demo_files/lq_sequences/city/00000007.png \n"," inflating: demo_files/lq_sequences/city/00000010.png \n"," inflating: demo_files/lq_sequences/city/00000004.png \n"," inflating: demo_files/lq_sequences/city/00000003.png \n"," inflating: demo_files/lq_sequences/city/00000001.png \n"," inflating: demo_files/lq_sequences/city/00000000.png \n"," inflating: demo_files/lq_sequences/city/00000009.png \n"," inflating: demo_files/lq_sequences/city/00000008.png \n"," inflating: demo_files/lq_sequences/city/00000002.png \n"," inflating: demo_files/lq_sequences/city/00000005.png \n"," creating: demo_files/lq_sequences/.ipynb_checkpoints/\n"," creating: demo_files/gt_images/\n"," inflating: demo_files/gt_images/bird.png \n"," inflating: demo_files/gt_images/woman.png \n"," inflating: demo_files/gt_images/head.png \n"," inflating: demo_files/gt_images/baby.png \n"," inflating: demo_files/gt_images/butterfly.png \n"," inflating: demo_files/demo_config_SRCNN.py \n"," creating: demo_files/lq_images/\n"," extracting: demo_files/lq_images/bird.png \n"," extracting: demo_files/lq_images/woman.png \n"," extracting: demo_files/lq_images/head.png \n"," extracting: demo_files/lq_images/baby.png \n"," extracting: demo_files/lq_images/butterfly.png \n"," creating: demo_files/gt_sequences/\n"," creating: demo_files/gt_sequences/calendar/\n"," inflating: demo_files/gt_sequences/calendar/00000006.png \n"," inflating: demo_files/gt_sequences/calendar/00000007.png \n"," inflating: demo_files/gt_sequences/calendar/00000010.png \n"," inflating: demo_files/gt_sequences/calendar/00000004.png \n"," inflating: demo_files/gt_sequences/calendar/00000003.png \n"," inflating: demo_files/gt_sequences/calendar/00000001.png \n"," inflating: demo_files/gt_sequences/calendar/00000000.png \n"," inflating: demo_files/gt_sequences/calendar/00000009.png \n"," inflating: demo_files/gt_sequences/calendar/00000008.png \n"," inflating: demo_files/gt_sequences/calendar/00000002.png \n"," inflating: demo_files/gt_sequences/calendar/00000005.png \n"," creating: demo_files/gt_sequences/city/\n"," inflating: demo_files/gt_sequences/city/00000006.png \n"," inflating: demo_files/gt_sequences/city/00000007.png \n"," inflating: demo_files/gt_sequences/city/00000010.png \n"," inflating: demo_files/gt_sequences/city/00000004.png \n"," inflating: demo_files/gt_sequences/city/00000003.png \n"," inflating: demo_files/gt_sequences/city/00000001.png \n"," inflating: demo_files/gt_sequences/city/00000000.png \n"," inflating: demo_files/gt_sequences/city/00000009.png \n"," inflating: demo_files/gt_sequences/city/00000008.png \n"," inflating: demo_files/gt_sequences/city/00000002.png \n"," inflating: demo_files/gt_sequences/city/00000005.png \n"," creating: demo_files/gt_sequences/.ipynb_checkpoints/\n"," creating: demo_files/.ipynb_checkpoints/\n"]}],"source":["!wget https://download.openmmlab.com/mmediting/demo_files.zip # 下载文件\n","!unzip demo_files # 解压\n","\n","# 将数据复制到 data/Set5 以备后用\n","!mkdir data\n","!mkdir data/val_set5\n","!cp -r demo_files/lq_images data/val_set5/Set5_bicLRx4\n","!cp -r demo_files/gt_images data/val_set5/Set5"]},{"cell_type":"markdown","metadata":{"id":"zXGurqGKOeNE"},"source":["## 使用预训练的图像恢复器进行推理\n","您可以使用 “restoration_demo.py” 轻松地使用预训练的恢复器对单个图像进行推理。您需要的是\n","\n","1. `CONFIG_FILE`:你要使用的 restorer 对应的配置文件。它指定您要使用的模型。\n","2. `CHECKPOINT_FILE`:预训练模型权重文件的路径。\n","3. `IMAGE_FILE`:输入图像的路径。\n","4. `SAVE_FILE`:您要存储输出图像的位置。\n","5. `imshow`:是否显示图片。(可选的)\n","6. `GPU_ID`:您想使用哪个 GPU。(可选的)\n","\n","获得所有这些详细信息后,您可以直接使用以下命令:\n","\n","```\n","python demo/restoration_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${IMAGE_FILE} ${SAVE_FILE} [--imshow] [--device ${GPU_ID}]\n","```\n","\n","**注:** \n","1. 配置文件位于 `./configs`。\n","2. 我们支持从 url 加载权重文件。您可以到相应页面(例如[这里](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan))获取预训练模型的url。\n","\n","---\n","\n","我们现在将使用 `SRCNN` 和 `ESRGAN` 作为示例。\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58677,"status":"ok","timestamp":1625140884175,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"KiPvtvlqM1zb","outputId":"be7375a7-4632-4770-8383-2a8ce654b069"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\" to /root/.cache/torch/hub/checkpoints/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\n","100% 83.9k/83.9k [00:00<00:00, 1.59MB/s]\n","2021-07-01 12:00:10,779 - mmedit - INFO - Use load_from_torchvision loader\n","Downloading: \"https://download.pytorch.org/models/vgg19-dcbb9e9d.pth\" to /root/.cache/torch/hub/checkpoints/vgg19-dcbb9e9d.pth\n","100% 548M/548M [00:07<00:00, 76.0MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\" to /root/.cache/torch/hub/checkpoints/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\n","100% 196M/196M [00:26<00:00, 7.61MB/s]\n","bird_ESRGAN.png bird_SRCNN.png\n"]}],"source":["# SRCNN\n","!python demo/restoration_demo.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth ./demo_files/lq_images/bird.png ./outputs/bird_SRCNN.png\n","\n","# ESRGAN\n","!python demo/restoration_demo.py ./configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth ./demo_files/lq_images/bird.png ./outputs/bird_ESRGAN.png\n","\n","# 检查图像是否已保存\n","!ls ./outputs"]},{"cell_type":"markdown","metadata":{"id":"W1DfGHu3Xcfd"},"source":["## 使用预训练的视频复原器进行推理\n","\n","MMEditing 也支持视频超分辨率方法,过程类似。您可以使用带有以下参数的 `restoration_video_demo.py`:\n","\n","1. `CONFIG_FILE`:你要使用的 restorer 对应的配置文件。它指定您要使用的模型。\n","2. `CHECKPOINT_FILE`:预训练模型权重文件的路径。\n","3. `INPUT_DIR`: 包含视频帧的目录。\n","4. `OUTPUT_DIR`: 要存储输出帧的位置。\n","5. `WINDOW_SIZE`: 使用滑动窗口方法时的窗口大小(可选)。\n","6. `GPU_ID`: 您想使用哪个 GPU(可选)。\n","\n","```\n","python demo/restoration_video_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${INPUT_DIR} ${OUTPUT_DIR} [--window_size=$WINDOW_SIZE] [--device ${GPU_ID}]\n","```\n","**注:** 视频超分辨率有两种不同的框架:***滑动窗口***和***循环***框架。使用 EDVR 等滑动窗口框架的方法时,需要指定 `window_size`。此值取决于您使用的模型。\n","\n","---\n","\n","我们现在将使用 `EDVR` 和 `BasicVSR` 作为示例。\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29263,"status":"ok","timestamp":1625140913405,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"iaoE7UF5Xb2i","outputId":"a022e0bd-c47a-450e-f4e4-1bf9f92e4813"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\" to /root/.cache/torch/hub/checkpoints/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\n","100% 11.5M/11.5M [00:01<00:00, 8.55MB/s]\n","2021-07-01 12:01:09,689 - mmedit - INFO - Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth\" to /root/.cache/torch/hub/checkpoints/spynet_20210409-c6c1bd09.pth\n","100% 5.50M/5.50M [00:00<00:00, 8.88MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth\" to /root/.cache/torch/hub/checkpoints/basicvsr_reds4_20120409-0e599677.pth\n","100% 24.1M/24.1M [00:02<00:00, 8.97MB/s]\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# EDVR(滑动窗口框架)\n","!python demo/restoration_video_demo.py ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_EDVR --window_size=5\n","\n","# BasicVSR(循环框架)\n","!python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_BasicVSR\n","\n","# 检查是否保存了视频帧\n","!ls ./outputs/calendar_BasicVSR"]},{"cell_type":"markdown","metadata":{"id":"Rf3LW57qMHXb"},"source":["## 使用配置文件在预定义的数据集上进行测试\n","\n","上述演示提供了一种对单个图像或视频序列进行推理的简单方法。如果要对一组图像或序列进行推理,可以使用位于 `./configs` 中的配置文件。\n"," \n","现有的配置文件允许您对常见数据集进行推理,例如图像超分辨率中的 `Set5` 和视频超分辨率中的 `REDS4`。您可以使用以下命令:\n","\n","1. `CONFIG_FILE`: 你要使用的复原器和数据集对应的配置文件\n","2. `CHECKPOINT_FILE`: 预训练模型权重文件的路径。\n","3. `GPU_NUM`: 用于测试的 GPU 数量。\n","4. `RESULT_FILE`: 输出结果 pickle 文件的路径。(可选)\n","5. `IMAGE_SAVE_PATH`: 要存储输出图像的位置。(可选)\n","\n","```\n","# 单 GPU 测试\n","python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","\n","# 多 GPU 测试\n","./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","```\n","您需要做的是修改配置文件中的 `lq_folder` 和 `gt_folder`:\n","```\n","test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/val_set5/Set5_bicLRx4',\n"," gt_folder='data/val_set5/Set5',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","```\n","\n","**注**: 某些数据集类型(例如 `SRREDSDataset`)需要一个注释文件来指定数据集的详细信息。更多细节请参考 `./mmedit/dataset/` 中的相应文件。\n","\n","---\n","\n","以下是 SRCNN 的命令。对于其他模型,您可以简单地更改配置文件和预训练模型的路径。\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14095,"status":"ok","timestamp":1625140927462,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"tClgIYgcbbVg","outputId":"c37ec2de-e1c9-42ae-ed9b-31009d48ae64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"tools/test.py\", line 136, in \n"," main()\n"," File \"tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/test.py\", line 136, in \n"," main()\n"," File \"./tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/test.py', '--local_rank=0', './configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py', 'https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth', '--launcher', 'pytorch', '--save-path', './outputs/']' returned non-zero exit status 1.\n"]}],"source":["# 单 GPU\n","!python tools/test.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/\n","\n","# 多 GPU\n","!./tools/dist_test.sh ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth 1 --save-path ./outputs/"]},{"cell_type":"markdown","metadata":{"id":"KWKVyeEQelh3"},"source":["## 在自定义数据集上进行测试\n","\n","当您想在自定义数据集上进行测试时,除了数据集路径之外,您还需要修改 `test_dataset_type`。 \n","\n","- 对于图像超分辨率,需要使用 `SRFolderDataset`\n","- 对于视频超分辨率的滑动窗口框架(例如 EDVR、TDAN),需要使用 `SRFolderVideoDataset`。\n","- 对于视频超分辨率的循环框架(例如 BasicVSR、IconVSR),需要使用 `SRFolderMultipleGTDataset`。\n","\n","这些数据集类型假定指定目录中的所有图像/序列都用于测试。文件夹结构应该是\n","```\n","| lq_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," | ...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","| gt_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," |...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","```\n","我们将使用 **SRCNN**、**EDVR**、**BasicVSR** 作为示例。请注意 `test_dataset_type` 和 `data['test']` 的设置。"]},{"cell_type":"markdown","metadata":{"id":"0p2rP8jV_dL1"},"source":["**SRCNN**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8729,"status":"ok","timestamp":1625140936180,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"4kEev4wVIq_L","outputId":"8026ed73-f781-4eb2-bb80-d3446bd131df"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 5/5, 8.6 task/s, elapsed: 1s, ETA: 0s\n","Eval-PSNR: 28.433974369836108\n","Eval-SSIM: 0.8099053586583066\n","baby.png bird.png butterfly.png head.png woman.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_SRCNN.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/testset_SRCNN\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_SRCNN"]},{"cell_type":"markdown","metadata":{"id":"RONzjTTU_gem"},"source":["**EDVR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":19671,"status":"ok","timestamp":1625140955813,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"vL8WOWXY0fNJ","outputId":"dc2a8f81-9bef-4ad4-c5b2-c6f124e6b113"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 22/22, 2.0 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 23.89569862011228\n","Eval-SSIM: 0.7667098470108678\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_EDVR.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth --save-path ./outputs/testset_EDVR\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_EDVR\n","!ls ./outputs/testset_EDVR/city"]},{"cell_type":"markdown","metadata":{"id":"5Tc7F-l5_i1e"},"source":["**BasicVSR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":20220,"status":"ok","timestamp":1625140976026,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"jpW5GWC74Yvu","outputId":"7ba02a32-d4ec-40b2-8108-ef0729b62147"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:07,780 - mmedit - INFO - Use load_from_http loader\n","Use load_from_http loader\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","[>>] 2/2, 0.2 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 24.195768601433734\n","Eval-SSIM: 0.7828541339512978\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_BasicVSR.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth --save-path ./outputs/testset_BasicVSR\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_BasicVSR\n","!ls ./outputs/testset_BasicVSR/calendar"]},{"cell_type":"markdown","metadata":{"id":"4DQxNL8BhI0y"},"source":["## 在预定义的数据集上训练恢复器\n","\n","MMEditing 使用分布式训练。以下命令可用于训练。如果要在我们的配置文件中指定的预定义数据集上进行训练,只需运行以下命令即可。\n","\n","```\n","./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]\n","```\n","\n","有关可选参数的更多详细信息,请参阅 `tools/train.py`。\n","\n","---\n","\n","这是一个使用 EDVR 的示例。\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9337,"status":"ok","timestamp":1625140985357,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"s-hOnSF6ItQM","outputId":"e40e960a-29e1-43e8-b922-5e08c4e98afe"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:31,961 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:31,961 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:31,961 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:31,961 - mmedit - INFO - Config:\n","/content/mmediting/configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py\n","exp_name = 'edvrm_wotsa_x4_g8_600k_reds'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRREDSDataset'\n","val_dataset_type = 'SRREDSDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 600000\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50000, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=100,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 54, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 63, in load_annotations\n"," with open(self.ann_file, 'r') as fin:\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/train.py\", line 145, in \n"," main()\n"," File \"./tools/train.py\", line 111, in main\n"," datasets = [build_dataset(cfg.data.train)]\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 76, in build_dataset\n"," build_dataset(cfg['dataset'], default_args), cfg['times'])\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRREDSDataset: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/train.py', '--local_rank=0', './configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py', '--launcher', 'pytorch']' returned non-zero exit status 1.\n"]}],"source":["!./tools/dist_train.sh ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py 1"]},{"cell_type":"markdown","metadata":{"id":"b0VfQkQQjg8N"},"source":["## 在自定义数据集上训练复原器\n","\n","与您要在自己的数据集上进行测试的情况类似,您需要修改 `train_dataset_type`。您需要的数据集类型是相同的:\n","\n","- 对于图像超分辨率,需要使用 `SRFolderDataset`\n","- 对于视频超分辨率的滑动窗口框架(例如 EDVR、TDAN),需要使用 `SRFolderVideoDataset`。\n","- 对于视频超分辨率的循环框架(例如 BasicVSR、IconVSR),需要使用 `SRFolderMultipleGTDataset`。\n","\n","修改数据集类型和数据路径后。一切都准备好了。"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":128384,"status":"ok","timestamp":1625141113733,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"liGEKJpbIoXZ","outputId":"84e1502e-e2cb-458f-c7c5-e4b401e570b7"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:41,185 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:41,185 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:41,185 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:41,185 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_SRCNN.py\n","exp_name = 'srcnn_demo'\n","\n","scale = 4\n","# model settings\n","model = dict(\n"," type='BasicRestorer',\n"," generator=dict(\n"," type='SRCNN',\n"," channels=(3, 64, 32, 3),\n"," kernel_sizes=(9, 1, 5),\n"," upscale_factor=scale),\n"," pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=scale)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderDataset'\n","val_dataset_type = 'SRFolderDataset'\n","train_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=128),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","test_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'lq_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=8,\n"," train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=train_pipeline,\n"," scale=scale)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[250000, 250000, 250000, 250000],\n"," restart_weights=[1, 1, 1, 1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","evaluation = dict(interval=50, save_image=True, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./experiments/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:02:41,192 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/experiments/srcnn_demo\n","2021-07-01 12:02:41,192 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:02:41.529307: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:03:18,631 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.000e-04, eta: 0:57:01, time: 34.560, data_time: 34.446, memory: 586, loss_pix: 0.3999, loss: 0.3999\n","2021-07-01 12:03:18,712 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","INFO:mmedit:Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","2021-07-01 12:03:18,764 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","INFO:mmedit:Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","2021-07-01 12:03:18,840 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","INFO:mmedit:Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","2021-07-01 12:03:18,916 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","INFO:mmedit:Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","2021-07-01 12:03:18,956 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","INFO:mmedit:Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","2021-07-01 12:03:19,012 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","INFO:mmedit:Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","2021-07-01 12:03:19,070 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","INFO:mmedit:Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","2021-07-01 12:03:19,142 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","INFO:mmedit:Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","2021-07-01 12:03:19,212 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","INFO:mmedit:Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","2021-07-01 12:03:19,261 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","INFO:mmedit:Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","2021-07-01 12:03:19,302 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","INFO:mmedit:Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","2021-07-01 12:03:19,357 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","INFO:mmedit:Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","2021-07-01 12:03:19,419 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","INFO:mmedit:Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","2021-07-01 12:03:19,473 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","INFO:mmedit:Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","2021-07-01 12:03:19,538 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","INFO:mmedit:Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","2021-07-01 12:03:19,603 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","INFO:mmedit:Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","2021-07-01 12:03:19,657 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","INFO:mmedit:Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","2021-07-01 12:03:19,716 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","INFO:mmedit:Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","2021-07-01 12:03:19,772 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","INFO:mmedit:Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","2021-07-01 12:03:19,834 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","INFO:mmedit:Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","2021-07-01 12:03:19,877 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","INFO:mmedit:Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","2021-07-01 12:03:19,947 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","INFO:mmedit:Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","2021-07-01 12:03:20,014 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","INFO:mmedit:Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","2021-07-01 12:03:20,068 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","INFO:mmedit:Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","2021-07-01 12:03:20,124 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","INFO:mmedit:Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","2021-07-01 12:03:20,181 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","INFO:mmedit:Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","2021-07-01 12:03:20,244 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","INFO:mmedit:Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","2021-07-01 12:03:20,310 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","INFO:mmedit:Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","2021-07-01 12:03:20,356 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","INFO:mmedit:Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","2021-07-01 12:03:20,410 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","INFO:mmedit:Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","2021-07-01 12:03:20,480 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","INFO:mmedit:Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","2021-07-01 12:03:20,536 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","INFO:mmedit:Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","2021-07-01 12:03:20,595 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","INFO:mmedit:Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","2021-07-01 12:03:20,656 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","INFO:mmedit:Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","2021-07-01 12:03:20,710 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","INFO:mmedit:Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","2021-07-01 12:03:20,779 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:20,846 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","INFO:mmedit:Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","2021-07-01 12:03:20,907 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:20,958 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","INFO:mmedit:Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","2021-07-01 12:03:21,028 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","INFO:mmedit:Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","2021-07-01 12:03:21,122 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","INFO:mmedit:Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","2021-07-01 12:03:21,181 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:21,418 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","INFO:mmedit:Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","2021-07-01 12:03:21,480 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:21,551 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","INFO:mmedit:Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","2021-07-01 12:03:21,618 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","INFO:mmedit:Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","2021-07-01 12:03:21,667 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","INFO:mmedit:Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","2021-07-01 12:03:21,743 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","INFO:mmedit:Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","[>>] 5/5, 0.1 task/s, elapsed: 37s, ETA: 0s\n","\n","2021-07-01 12:03:59,996 - mmedit - INFO - Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","INFO:mmedit:Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","2021-07-01 12:04:00,047 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","INFO:mmedit:Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","2021-07-01 12:04:00,114 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","INFO:mmedit:Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","2021-07-01 12:04:00,181 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","INFO:mmedit:Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","2021-07-01 12:04:00,251 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","INFO:mmedit:Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","2021-07-01 12:04:00,315 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","INFO:mmedit:Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","2021-07-01 12:04:00,373 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","INFO:mmedit:Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","2021-07-01 12:04:00,418 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","INFO:mmedit:Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","2021-07-01 12:04:00,478 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","INFO:mmedit:Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","2021-07-01 12:04:00,538 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","INFO:mmedit:Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","2021-07-01 12:04:00,606 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","INFO:mmedit:Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","2021-07-01 12:04:00,647 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","INFO:mmedit:Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","2021-07-01 12:04:00,711 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","INFO:mmedit:Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","2021-07-01 12:04:00,757 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","INFO:mmedit:Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","2021-07-01 12:04:00,799 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","INFO:mmedit:Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","2021-07-01 12:04:00,871 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:00,938 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:00,995 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","INFO:mmedit:Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","2021-07-01 12:04:01,051 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","INFO:mmedit:Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","2021-07-01 12:04:01,115 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:01,196 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","INFO:mmedit:Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","2021-07-01 12:04:01,256 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","INFO:mmedit:Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","2021-07-01 12:04:01,325 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","INFO:mmedit:Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","2021-07-01 12:04:01,381 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","INFO:mmedit:Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:04:01,429 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","INFO:mmedit:Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","2021-07-01 12:04:01,497 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","INFO:mmedit:Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","2021-07-01 12:04:01,545 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","INFO:mmedit:Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","2021-07-01 12:04:01,597 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","INFO:mmedit:Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","2021-07-01 12:04:01,671 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","INFO:mmedit:Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:04:01,724 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:01,777 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","INFO:mmedit:Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","2021-07-01 12:04:01,847 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","INFO:mmedit:Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","2021-07-01 12:04:01,905 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","INFO:mmedit:Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","2021-07-01 12:04:01,953 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","INFO:mmedit:Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","2021-07-01 12:04:02,025 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","INFO:mmedit:Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","2021-07-01 12:04:02,079 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","INFO:mmedit:Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","2021-07-01 12:04:02,137 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","INFO:mmedit:Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","2021-07-01 12:04:02,193 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:02,255 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","INFO:mmedit:Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:04:02,341 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","INFO:mmedit:Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","2021-07-01 12:04:02,394 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","INFO:mmedit:Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","2021-07-01 12:04:02,496 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","INFO:mmedit:Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","2021-07-01 12:04:02,552 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:02,629 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","INFO:mmedit:Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","2021-07-01 12:04:02,682 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","INFO:mmedit:Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","2021-07-01 12:04:02,791 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","INFO:mmedit:Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","2021-07-01 12:04:02,834 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","INFO:mmedit:Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","2021-07-01 12:04:02,900 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","INFO:mmedit:Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","2021-07-01 12:04:03,053 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","INFO:mmedit:Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:04:03,108 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","INFO:mmedit:Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","[>>] 5/5, 0.2 task/s, elapsed: 33s, ETA: 0s\n","\n","2021-07-01 12:04:37,412 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:04:37,422 - mmedit - INFO - Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n","INFO:mmedit:Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n"]}],"source":["# SRCNN(图像超分辨率)\n","!./tools/dist_train.sh ./demo_files/demo_config_SRCNN.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":117937,"status":"ok","timestamp":1625141554036,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"26uZ4Ak7qbC9","outputId":"2fb26527-eb9e-4b48-e03c-ba9a91c60db8"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:10:12,619 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:10:12,619 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:10:12,619 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:10:12,619 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_EDVR.py\n","exp_name = 'edvrm_demo'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderVideoDataset'\n","val_dataset_type = 'SRFolderVideoDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:10:12,701 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/edvrm_demo\n","2021-07-01 12:10:12,702 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:10:12.951771: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:10:30,703 - mmedit - INFO - Iter [1/100]\tlr_generator: 4.000e-04, eta: 0:26:53, time: 16.295, data_time: 15.833, memory: 1341, loss_pix: 63917.2734, loss: 63917.2734\n","2021-07-01 12:10:31,046 - mmedit - INFO - Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","INFO:mmedit:Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","2021-07-01 12:10:31,386 - mmedit - INFO - Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","INFO:mmedit:Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","2021-07-01 12:10:31,731 - mmedit - INFO - Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","INFO:mmedit:Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","2021-07-01 12:10:32,071 - mmedit - INFO - Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","INFO:mmedit:Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","2021-07-01 12:10:32,414 - mmedit - INFO - Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","INFO:mmedit:Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","2021-07-01 12:10:32,760 - mmedit - INFO - Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","INFO:mmedit:Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","2021-07-01 12:10:33,102 - mmedit - INFO - Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","INFO:mmedit:Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","2021-07-01 12:10:33,447 - mmedit - INFO - Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","INFO:mmedit:Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","2021-07-01 12:10:33,792 - mmedit - INFO - Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","INFO:mmedit:Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","2021-07-01 12:10:34,138 - mmedit - INFO - Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","INFO:mmedit:Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","2021-07-01 12:10:34,484 - mmedit - INFO - Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","INFO:mmedit:Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","2021-07-01 12:10:34,829 - mmedit - INFO - Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","INFO:mmedit:Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","2021-07-01 12:10:35,175 - mmedit - INFO - Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","INFO:mmedit:Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","2021-07-01 12:10:35,522 - mmedit - INFO - Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","INFO:mmedit:Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","2021-07-01 12:10:35,866 - mmedit - INFO - Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","INFO:mmedit:Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","2021-07-01 12:10:36,212 - mmedit - INFO - Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","INFO:mmedit:Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","2021-07-01 12:10:36,560 - mmedit - INFO - Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","INFO:mmedit:Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","2021-07-01 12:10:36,904 - mmedit - INFO - Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","INFO:mmedit:Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","2021-07-01 12:10:37,249 - mmedit - INFO - Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","INFO:mmedit:Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","2021-07-01 12:10:37,595 - mmedit - INFO - Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","INFO:mmedit:Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","2021-07-01 12:10:37,939 - mmedit - INFO - Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","INFO:mmedit:Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","2021-07-01 12:10:38,283 - mmedit - INFO - Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","INFO:mmedit:Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","2021-07-01 12:10:38,628 - mmedit - INFO - Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","INFO:mmedit:Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","2021-07-01 12:10:38,974 - mmedit - INFO - Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","INFO:mmedit:Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","2021-07-01 12:10:39,318 - mmedit - INFO - Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","INFO:mmedit:Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","2021-07-01 12:10:39,665 - mmedit - INFO - Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","INFO:mmedit:Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","2021-07-01 12:10:40,011 - mmedit - INFO - Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","INFO:mmedit:Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","2021-07-01 12:10:40,356 - mmedit - INFO - Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","INFO:mmedit:Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","2021-07-01 12:10:40,703 - mmedit - INFO - Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","INFO:mmedit:Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","2021-07-01 12:10:41,049 - mmedit - INFO - Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","INFO:mmedit:Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","2021-07-01 12:10:41,396 - mmedit - INFO - Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","INFO:mmedit:Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","2021-07-01 12:10:41,745 - mmedit - INFO - Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","INFO:mmedit:Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","2021-07-01 12:10:42,097 - mmedit - INFO - Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","INFO:mmedit:Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","2021-07-01 12:10:42,444 - mmedit - INFO - Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","INFO:mmedit:Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","2021-07-01 12:10:42,790 - mmedit - INFO - Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","INFO:mmedit:Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","2021-07-01 12:10:43,140 - mmedit - INFO - Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","INFO:mmedit:Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","2021-07-01 12:10:43,490 - mmedit - INFO - Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","INFO:mmedit:Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","2021-07-01 12:10:43,841 - mmedit - INFO - Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","INFO:mmedit:Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","2021-07-01 12:10:44,193 - mmedit - INFO - Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","INFO:mmedit:Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","2021-07-01 12:10:44,541 - mmedit - INFO - Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","INFO:mmedit:Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","2021-07-01 12:10:44,895 - mmedit - INFO - Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","INFO:mmedit:Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","2021-07-01 12:10:45,248 - mmedit - INFO - Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","INFO:mmedit:Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","2021-07-01 12:10:45,595 - mmedit - INFO - Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","INFO:mmedit:Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","2021-07-01 12:10:45,950 - mmedit - INFO - Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","INFO:mmedit:Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","2021-07-01 12:10:46,301 - mmedit - INFO - Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","INFO:mmedit:Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","2021-07-01 12:10:46,649 - mmedit - INFO - Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","INFO:mmedit:Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","2021-07-01 12:10:47,003 - mmedit - INFO - Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","INFO:mmedit:Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","2021-07-01 12:10:47,356 - mmedit - INFO - Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","INFO:mmedit:Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:14,231 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","INFO:mmedit:Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","2021-07-01 12:11:14,578 - mmedit - INFO - Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","INFO:mmedit:Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","2021-07-01 12:11:14,930 - mmedit - INFO - Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","INFO:mmedit:Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","2021-07-01 12:11:15,289 - mmedit - INFO - Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","INFO:mmedit:Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","2021-07-01 12:11:15,642 - mmedit - INFO - Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","INFO:mmedit:Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","2021-07-01 12:11:15,993 - mmedit - INFO - Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","INFO:mmedit:Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","2021-07-01 12:11:16,354 - mmedit - INFO - Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","INFO:mmedit:Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","2021-07-01 12:11:16,712 - mmedit - INFO - Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","INFO:mmedit:Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","2021-07-01 12:11:17,065 - mmedit - INFO - Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","INFO:mmedit:Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","2021-07-01 12:11:17,425 - mmedit - INFO - Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","INFO:mmedit:Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","2021-07-01 12:11:17,780 - mmedit - INFO - Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","INFO:mmedit:Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","2021-07-01 12:11:18,135 - mmedit - INFO - Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","INFO:mmedit:Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","2021-07-01 12:11:18,495 - mmedit - INFO - Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","INFO:mmedit:Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","2021-07-01 12:11:18,851 - mmedit - INFO - Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","INFO:mmedit:Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","2021-07-01 12:11:19,210 - mmedit - INFO - Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","INFO:mmedit:Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","2021-07-01 12:11:19,567 - mmedit - INFO - Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","INFO:mmedit:Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","2021-07-01 12:11:19,923 - mmedit - INFO - Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","INFO:mmedit:Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","2021-07-01 12:11:20,286 - mmedit - INFO - Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","INFO:mmedit:Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","2021-07-01 12:11:20,644 - mmedit - INFO - Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","INFO:mmedit:Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","2021-07-01 12:11:21,000 - mmedit - INFO - Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","INFO:mmedit:Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","2021-07-01 12:11:21,359 - mmedit - INFO - Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","INFO:mmedit:Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","2021-07-01 12:11:21,719 - mmedit - INFO - Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","INFO:mmedit:Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","2021-07-01 12:11:22,072 - mmedit - INFO - Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","INFO:mmedit:Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","2021-07-01 12:11:22,434 - mmedit - INFO - Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","INFO:mmedit:Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","2021-07-01 12:11:22,798 - mmedit - INFO - Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","INFO:mmedit:Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","2021-07-01 12:11:23,158 - mmedit - INFO - Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","INFO:mmedit:Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","2021-07-01 12:11:23,513 - mmedit - INFO - Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","INFO:mmedit:Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","2021-07-01 12:11:23,875 - mmedit - INFO - Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","INFO:mmedit:Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","2021-07-01 12:11:24,236 - mmedit - INFO - Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","INFO:mmedit:Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","2021-07-01 12:11:24,597 - mmedit - INFO - Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","INFO:mmedit:Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","2021-07-01 12:11:24,951 - mmedit - INFO - Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","INFO:mmedit:Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","2021-07-01 12:11:25,313 - mmedit - INFO - Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","INFO:mmedit:Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","2021-07-01 12:11:25,677 - mmedit - INFO - Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","INFO:mmedit:Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","2021-07-01 12:11:26,038 - mmedit - INFO - Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","INFO:mmedit:Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","2021-07-01 12:11:26,393 - mmedit - INFO - Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","INFO:mmedit:Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","2021-07-01 12:11:26,753 - mmedit - INFO - Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","INFO:mmedit:Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","2021-07-01 12:11:27,115 - mmedit - INFO - Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","INFO:mmedit:Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","2021-07-01 12:11:27,472 - mmedit - INFO - Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","INFO:mmedit:Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","2021-07-01 12:11:27,830 - mmedit - INFO - Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","INFO:mmedit:Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","2021-07-01 12:11:28,189 - mmedit - INFO - Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","INFO:mmedit:Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","2021-07-01 12:11:28,553 - mmedit - INFO - Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","INFO:mmedit:Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","2021-07-01 12:11:28,910 - mmedit - INFO - Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","INFO:mmedit:Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","2021-07-01 12:11:29,266 - mmedit - INFO - Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","INFO:mmedit:Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","2021-07-01 12:11:29,628 - mmedit - INFO - Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","INFO:mmedit:Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","2021-07-01 12:11:29,989 - mmedit - INFO - Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","INFO:mmedit:Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","2021-07-01 12:11:30,345 - mmedit - INFO - Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","INFO:mmedit:Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","2021-07-01 12:11:30,704 - mmedit - INFO - Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","INFO:mmedit:Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","2021-07-01 12:11:31,067 - mmedit - INFO - Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","INFO:mmedit:Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","2021-07-01 12:11:31,425 - mmedit - INFO - Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","INFO:mmedit:Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","2021-07-01 12:11:31,782 - mmedit - INFO - Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","INFO:mmedit:Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:58,494 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:11:58,598 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n","INFO:mmedit:Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n"]}],"source":["# EDVR(视频超分辨率-滑动窗口)\n","!./tools/dist_train.sh ./demo_files/demo_config_EDVR.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":197033,"status":"ok","timestamp":1625141428032,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"_RdqmlT6qgt2","outputId":"b951b426-e06c-4f31-db01-449333eab333"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:06:47,253 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:06:47,253 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:06:47,254 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:06:47,254 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_BasicVSR.py\n","exp_name = 'basicvsr_demo'\n","\n","# model settings\n","model = dict(\n"," type='BasicVSR',\n"," generator=dict(\n"," type='BasicVSRNet',\n"," mid_channels=64,\n"," num_blocks=30,\n"," spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'\n"," 'basicvsr/spynet_20210409-c6c1bd09.pth'),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = dict(fix_iter=5000)\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderMultipleGTDataset'\n","val_dataset_type = 'SRFolderMultipleGTDataset'\n","\n","train_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=6,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True), # 2 gpus\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1, workers_per_gpu=1),\n","\n"," # train\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," # val\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," # test\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(\n"," generator=dict(\n"," type='Adam',\n"," lr=2e-4,\n"," betas=(0.9, 0.99),\n"," paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)})))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[300000],\n"," restart_weights=[1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," # dict(type='TensorboardLoggerHook'),\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","find_unused_parameters = True\n","\n","2021-07-01 12:06:47,291 - mmedit - INFO - Use load_from_http loader\n","2021-07-01 12:06:47,569 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/basicvsr_demo\n","2021-07-01 12:06:47,569 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:07:14,210 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.500e-05, eta: 0:42:52, time: 25.981, data_time: 24.045, memory: 3464, loss_pix: 0.0634, loss: 0.0634\n","2021-07-01 12:07:15,171 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.500e-05, eta: 0:22:00, time: 0.961, data_time: 0.011, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","2021-07-01 12:07:16,052 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.500e-05, eta: 0:14:59, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0476, loss: 0.0476\n","2021-07-01 12:07:16,940 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.500e-05, eta: 0:11:29, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:17,829 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.500e-05, eta: 0:09:22, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0796, loss: 0.0796\n","2021-07-01 12:07:18,712 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.500e-05, eta: 0:07:57, time: 0.884, data_time: 0.004, memory: 3518, loss_pix: 0.0680, loss: 0.0680\n","2021-07-01 12:07:19,594 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.500e-05, eta: 0:06:56, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0607, loss: 0.0607\n","2021-07-01 12:07:20,481 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.500e-05, eta: 0:06:10, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0598, loss: 0.0598\n","2021-07-01 12:07:21,361 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.500e-05, eta: 0:05:35, time: 0.880, data_time: 0.003, memory: 3518, loss_pix: 0.0664, loss: 0.0664\n","2021-07-01 12:07:22,274 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.500e-05, eta: 0:05:06, time: 0.913, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:07:23,161 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.500e-05, eta: 0:04:42, time: 0.887, data_time: 0.005, memory: 3518, loss_pix: 0.0771, loss: 0.0771\n","2021-07-01 12:07:24,058 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.500e-05, eta: 0:04:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0521, loss: 0.0521\n","2021-07-01 12:07:24,944 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.500e-05, eta: 0:04:05, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:07:25,835 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.500e-05, eta: 0:03:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0515, loss: 0.0515\n","2021-07-01 12:07:26,723 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.500e-05, eta: 0:03:38, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0674, loss: 0.0674\n","2021-07-01 12:07:27,609 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.500e-05, eta: 0:03:26, time: 0.886, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:28,498 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.500e-05, eta: 0:03:16, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0670, loss: 0.0670\n","2021-07-01 12:07:29,388 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.500e-05, eta: 0:03:07, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0663, loss: 0.0663\n","2021-07-01 12:07:30,284 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.500e-05, eta: 0:02:59, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0633, loss: 0.0633\n","2021-07-01 12:07:31,176 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.500e-05, eta: 0:02:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0482, loss: 0.0482\n","2021-07-01 12:07:32,073 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.500e-05, eta: 0:02:44, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0743, loss: 0.0743\n","2021-07-01 12:07:32,966 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.500e-05, eta: 0:02:38, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0690, loss: 0.0690\n","2021-07-01 12:07:33,858 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.500e-05, eta: 0:02:32, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0437, loss: 0.0437\n","2021-07-01 12:07:34,750 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.500e-05, eta: 0:02:27, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:35,642 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.500e-05, eta: 0:02:22, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0781, loss: 0.0781\n","2021-07-01 12:07:36,533 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.500e-05, eta: 0:02:17, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:07:37,427 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.500e-05, eta: 0:02:13, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:07:38,321 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.500e-05, eta: 0:02:08, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0567, loss: 0.0567\n","2021-07-01 12:07:39,212 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.500e-05, eta: 0:02:04, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0846, loss: 0.0846\n","2021-07-01 12:07:40,104 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.500e-05, eta: 0:02:01, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0658, loss: 0.0658\n","2021-07-01 12:07:40,993 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.500e-05, eta: 0:01:57, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0502, loss: 0.0502\n","2021-07-01 12:07:41,885 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.500e-05, eta: 0:01:54, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0622, loss: 0.0622\n","2021-07-01 12:07:42,787 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.500e-05, eta: 0:01:50, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0657, loss: 0.0657\n","2021-07-01 12:07:43,674 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.500e-05, eta: 0:01:47, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0643, loss: 0.0643\n","2021-07-01 12:07:44,567 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.500e-05, eta: 0:01:44, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0898, loss: 0.0898\n","2021-07-01 12:07:45,458 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.500e-05, eta: 0:01:41, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0865, loss: 0.0865\n","2021-07-01 12:07:46,341 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.500e-05, eta: 0:01:38, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0511, loss: 0.0511\n","2021-07-01 12:07:47,225 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.500e-05, eta: 0:01:36, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:48,109 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.500e-05, eta: 0:01:33, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0653, loss: 0.0653\n","2021-07-01 12:07:48,990 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:07:49,874 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.885, data_time: 0.003, memory: 3518, loss_pix: 0.0788, loss: 0.0788\n","2021-07-01 12:07:50,755 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.500e-05, eta: 0:01:26, time: 0.881, data_time: 0.005, memory: 3518, loss_pix: 0.0605, loss: 0.0605\n","2021-07-01 12:07:51,638 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.500e-05, eta: 0:01:24, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0539, loss: 0.0539\n","2021-07-01 12:07:52,518 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.500e-05, eta: 0:01:21, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0503, loss: 0.0503\n","2021-07-01 12:07:53,395 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.500e-05, eta: 0:01:19, time: 0.877, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:07:54,273 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0555, loss: 0.0555\n","2021-07-01 12:07:55,159 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.500e-05, eta: 0:01:15, time: 0.886, data_time: 0.007, memory: 3518, loss_pix: 0.0806, loss: 0.0806\n","2021-07-01 12:07:56,040 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.500e-05, eta: 0:01:13, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0576, loss: 0.0576\n","2021-07-01 12:07:56,919 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.500e-05, eta: 0:01:11, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0871, loss: 0.0871\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:08:32,618 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9899, SSIM: 0.5295\n","2021-07-01 12:08:33,591 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.500e-05, eta: 0:01:40, time: 35.792, data_time: 34.822, memory: 3518, loss_pix: 0.0773, loss: 0.0773\n","2021-07-01 12:08:34,462 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.500e-05, eta: 0:01:37, time: 0.871, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:08:35,326 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.500e-05, eta: 0:01:34, time: 0.864, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:36,192 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0575, loss: 0.0575\n","2021-07-01 12:08:37,069 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.876, data_time: 0.003, memory: 3518, loss_pix: 0.0842, loss: 0.0842\n","2021-07-01 12:08:37,942 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.500e-05, eta: 0:01:25, time: 0.873, data_time: 0.003, memory: 3518, loss_pix: 0.0836, loss: 0.0836\n","2021-07-01 12:08:38,808 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.500e-05, eta: 0:01:22, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0580, loss: 0.0580\n","2021-07-01 12:08:39,679 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.500e-05, eta: 0:01:20, time: 0.870, data_time: 0.003, memory: 3518, loss_pix: 0.0449, loss: 0.0449\n","2021-07-01 12:08:40,557 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0702, loss: 0.0702\n","2021-07-01 12:08:41,430 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.500e-05, eta: 0:01:14, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:42,308 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.500e-05, eta: 0:01:12, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:08:43,182 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.500e-05, eta: 0:01:09, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0489, loss: 0.0489\n","2021-07-01 12:08:44,056 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.500e-05, eta: 0:01:07, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0566, loss: 0.0566\n","2021-07-01 12:08:44,932 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.500e-05, eta: 0:01:05, time: 0.875, data_time: 0.003, memory: 3518, loss_pix: 0.0597, loss: 0.0597\n","2021-07-01 12:08:45,819 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.500e-05, eta: 0:01:02, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0640, loss: 0.0640\n","2021-07-01 12:08:46,698 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.500e-05, eta: 0:01:00, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:47,580 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.500e-05, eta: 0:00:58, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:08:48,464 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.500e-05, eta: 0:00:56, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:08:49,347 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.500e-05, eta: 0:00:54, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0603, loss: 0.0603\n","2021-07-01 12:08:50,229 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.500e-05, eta: 0:00:51, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0478, loss: 0.0478\n","2021-07-01 12:08:51,113 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.500e-05, eta: 0:00:49, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:08:52,000 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.500e-05, eta: 0:00:47, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0861, loss: 0.0861\n","2021-07-01 12:08:52,890 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.500e-05, eta: 0:00:45, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:08:53,792 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.500e-05, eta: 0:00:43, time: 0.903, data_time: 0.003, memory: 3518, loss_pix: 0.0787, loss: 0.0787\n","2021-07-01 12:08:54,688 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.500e-05, eta: 0:00:41, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0744, loss: 0.0744\n","2021-07-01 12:08:55,582 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.500e-05, eta: 0:00:39, time: 0.895, data_time: 0.003, memory: 3518, loss_pix: 0.0792, loss: 0.0792\n","2021-07-01 12:08:56,476 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.500e-05, eta: 0:00:38, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0645, loss: 0.0645\n","2021-07-01 12:08:57,368 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.500e-05, eta: 0:00:36, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:08:58,261 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.500e-05, eta: 0:00:34, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:59,159 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.500e-05, eta: 0:00:32, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0626, loss: 0.0626\n","2021-07-01 12:09:00,055 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.500e-05, eta: 0:00:30, time: 0.896, data_time: 0.004, memory: 3518, loss_pix: 0.0681, loss: 0.0681\n","2021-07-01 12:09:00,954 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.500e-05, eta: 0:00:28, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0671, loss: 0.0671\n","2021-07-01 12:09:01,860 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.500e-05, eta: 0:00:27, time: 0.906, data_time: 0.003, memory: 3518, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:09:02,760 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.500e-05, eta: 0:00:25, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0594, loss: 0.0594\n","2021-07-01 12:09:03,658 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.500e-05, eta: 0:00:23, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0446, loss: 0.0446\n","2021-07-01 12:09:04,555 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.500e-05, eta: 0:00:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0491, loss: 0.0491\n","2021-07-01 12:09:05,452 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.500e-05, eta: 0:00:20, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0450, loss: 0.0450\n","2021-07-01 12:09:06,351 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.500e-05, eta: 0:00:18, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0795, loss: 0.0795\n","2021-07-01 12:09:07,257 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.500e-05, eta: 0:00:17, time: 0.905, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:08,161 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.500e-05, eta: 0:00:15, time: 0.904, data_time: 0.003, memory: 3518, loss_pix: 0.0588, loss: 0.0588\n","2021-07-01 12:09:09,063 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.500e-05, eta: 0:00:13, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:09:09,955 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.500e-05, eta: 0:00:12, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0599, loss: 0.0599\n","2021-07-01 12:09:10,849 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.500e-05, eta: 0:00:10, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:11,749 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.500e-05, eta: 0:00:09, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0667, loss: 0.0667\n","2021-07-01 12:09:12,638 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.500e-05, eta: 0:00:07, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0558, loss: 0.0558\n","2021-07-01 12:09:13,576 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.500e-05, eta: 0:00:06, time: 0.938, data_time: 0.052, memory: 3518, loss_pix: 0.0577, loss: 0.0577\n","2021-07-01 12:09:14,463 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.500e-05, eta: 0:00:04, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:09:15,351 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.500e-05, eta: 0:00:02, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0578, loss: 0.0578\n","2021-07-01 12:09:16,240 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.500e-05, eta: 0:00:01, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:09:52,294 - mmedit - INFO - Saving checkpoint at 100 iterations\n","2021-07-01 12:09:52,433 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.4372, SSIM: 0.5687\n"]}],"source":["# BasicVSR(视频超分辨率 - 循环)\n","!./tools/dist_train.sh ./demo_files/demo_config_BasicVSR.py 1 "]},{"cell_type":"markdown","metadata":{"id":"QT0zwBFt7J13"},"source":["**本教程到此结束。有关更高级的用法,请参阅我们的[综合教程]()。享受使用 MMEditing 的乐趣!**"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"restorer_basic_tutorial.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3.7.7 64-bit ('pre-commit': conda)","name":"python377jvsc74a57bd04974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"},"language_info":{"name":"python","version":""},"metadata":{"interpreter":{"hash":"4974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"}}},"nbformat":4,"nbformat_minor":2} +{"cells":[{"cell_type":"markdown","metadata":{"id":"T2WWQiheMF7q"},"source":["# MMEditing 基础教程\n","\n","欢迎来到MMEditing! 这是 MMEditing 的官方 Colab 教程。在本教程中,您将学习如何使用 MMEditing 中提供的 API 训练和测试恢复器。\n","\n","这是训练和测试现有模型的快速指南。如果您想基于 MMEditing 开发自己的模型并了解有关代码结构的更多信息,请参阅我们的[综合教程]()。\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmedit/blob/main/demo/restorer_basic_tutorial.ipynb)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"-kYw3WQ0MQry"},"source":["## 安装MMEditing\n","\n","MMEditing 可以分三步安装:\n","\n","1. 安装兼容的 PyTorch 版本(你需要使用 `nvcc -V` 检查你的 CUDA 版本)。\n","2. 安装预编译的MMCV\n","3. 克隆并安装MMEditing\n","\n","步骤如下所示:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":321,"status":"ok","timestamp":1625140540858,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"uha_13idyl1b","outputId":"87056561-5930-45b3-e1a8-f9e103d10b23"},"outputs":[{"name":"stdout","output_type":"stream","text":["nvcc: NVIDIA (R) Cuda compiler driver\n","Copyright (c) 2005-2020 NVIDIA Corporation\n","Built on Wed_Jul_22_19:09:09_PDT_2020\n","Cuda compilation tools, release 11.0, V11.0.221\n","Build cuda_11.0_bu.TC445_37.28845127_0\n","gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","Copyright (C) 2017 Free Software Foundation, Inc.\n","This is free software; see the source for copying conditions. There is NO\n","warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n","\n"]}],"source":["# Check nvcc version\n","!nvcc -V\n","# Check GCC version (MMEditing needs gcc >= 5.0)\n","!gcc --version"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":279948,"status":"ok","timestamp":1625140820804,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"GIeIZEzZMfc0","outputId":"fe2e5ded-988d-4563-eb18-374344c316ef"},"outputs":[{"name":"stdout","output_type":"stream","text":["Looking in links: https://download.pytorch.org/whl/torch_stable.html\n","Collecting torch==1.7.0+cu110\n","\u001b[?25l Downloading https://download.pytorch.org/whl/cu110/torch-1.7.0%2Bcu110-cp37-cp37m-linux_x86_64.whl (1137.1MB)\n","\u001b[K |███████████████████████▌ | 834.1MB 1.3MB/s eta 0:03:50tcmalloc: large alloc 1147494400 bytes == 0x56458d07a000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |█████████████████████████████▊ | 1055.7MB 1.2MB/s eta 0:01:07tcmalloc: large alloc 1434370048 bytes == 0x5645d16d0000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |████████████████████████████████| 1137.1MB 1.1MB/s eta 0:00:01tcmalloc: large alloc 1421369344 bytes == 0x564626ebc000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645535c430a 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c4a81\n","\u001b[K |████████████████████████████████| 1137.1MB 16kB/s \n","\u001b[?25hCollecting torchvision==0.8.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/1d/3f/4f45249458a0dee85bff7acf4a2ac6177708253f1f318fcf6ee230fb864f/torchvision-0.8.0-cp37-cp37m-manylinux1_x86_64.whl (11.8MB)\n","\u001b[K |████████████████████████████████| 11.8MB 254kB/s \n","\u001b[?25hRequirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (3.7.4.3)\n","Collecting dataclasses\n"," Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n","Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (1.19.5)\n","Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (0.16.0)\n","Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.0) (7.1.2)\n","\u001b[31mERROR: torchtext 0.10.0 has requirement torch==1.9.0, but you'll have torch 1.7.0+cu110 which is incompatible.\u001b[0m\n","Installing collected packages: dataclasses, torch, torchvision\n"," Found existing installation: torch 1.9.0+cu102\n"," Uninstalling torch-1.9.0+cu102:\n"," Successfully uninstalled torch-1.9.0+cu102\n"," Found existing installation: torchvision 0.10.0+cu102\n"," Uninstalling torchvision-0.10.0+cu102:\n"," Successfully uninstalled torchvision-0.10.0+cu102\n","Successfully installed dataclasses-0.6 torch-1.7.0+cu110 torchvision-0.8.0\n","Looking in links: https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n","Collecting mmcv-full==1.3.5\n","\u001b[?25l Downloading https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/mmcv_full-1.3.5-cp37-cp37m-manylinux1_x86_64.whl (31.1MB)\n","\u001b[K |████████████████████████████████| 31.1MB 107kB/s \n","\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (1.19.5)\n","Collecting addict\n"," Downloading https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl\n","Collecting yapf\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/5f/0d/8814e79eb865eab42d95023b58b650d01dec6f8ea87fc9260978b1bf2167/yapf-0.31.0-py2.py3-none-any.whl (185kB)\n","\u001b[K |████████████████████████████████| 194kB 33.0MB/s \n","\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (7.1.2)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (4.1.2.30)\n","Installing collected packages: addict, yapf, mmcv-full\n","Successfully installed addict-2.4.0 mmcv-full-1.3.5 yapf-0.31.0\n","Cloning into 'mmediting'...\n","remote: Enumerating objects: 7162, done.\u001b[K\n","remote: Counting objects: 100% (1367/1367), done.\u001b[K\n","remote: Compressing objects: 100% (793/793), done.\u001b[K\n","remote: Total 7162 (delta 827), reused 928 (delta 554), pack-reused 5795\u001b[K\n","Receiving objects: 100% (7162/7162), 5.02 MiB | 32.14 MiB/s, done.\n","Resolving deltas: 100% (4826/4826), done.\n","/content/mmediting\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 1)) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 2)) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 3)) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 4)) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 5)) (0.31.0)\n","Collecting codecov\n"," Downloading https://files.pythonhosted.org/packages/93/9f/bbea5b6231308458963cb5c067bc5643da9949689702fa5a382714b59699/codecov-2.1.11-py2.py3-none-any.whl\n","Collecting flake8\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/fc/80/35a0716e5d5101e643404dabd20f07f5528a21f3ef4032d31a49c913237b/flake8-3.9.2-py2.py3-none-any.whl (73kB)\n","\u001b[K |████████████████████████████████| 81kB 9.7MB/s \n","\u001b[?25hCollecting interrogate\n"," Downloading https://files.pythonhosted.org/packages/cd/6d/ce3ac440b13c1b36b323a0eab191499a902adade3cc11b18078c07af3e6e/interrogate-1.4.0-py3-none-any.whl\n","Collecting isort==4.3.21\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n","\u001b[K |████████████████████████████████| 51kB 7.5MB/s \n","\u001b[?25hCollecting onnxruntime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/f9/76/3d0f8bb2776961c7335693df06eccf8d099e48fa6fb552c7546867192603/onnxruntime-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5MB)\n","\u001b[K |████████████████████████████████| 4.5MB 37.4MB/s \n","\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.7/dist-packages (from -r requirements/tests.txt (line 6)) (3.6.4)\n","Collecting pytest-runner\n"," Downloading https://files.pythonhosted.org/packages/f4/f5/6605d73bf3f4c198915872111b10c4b3c2dccd8485f47b7290ceef037190/pytest_runner-5.3.1-py3-none-any.whl\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (1.19.5)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (2.4.0)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (4.1.2.30)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (3.13)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.5.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.4.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.4.1)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.1.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (3.2.2)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.36.2)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.34.1)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.6.1)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.8.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (2.23.0)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.4.4)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (57.0.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.12.0)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.12.4)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.3.4)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.31.0)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.0.1)\n","Requirement already satisfied: coverage in /usr/local/lib/python3.7/dist-packages (from codecov->-r requirements/tests.txt (line 1)) (3.7.1)\n","Collecting pyflakes<2.4.0,>=2.3.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/11/2a745612f1d3cbbd9c69ba14b1b43a35a2f5c3c81cd0124508c52c64307f/pyflakes-2.3.1-py2.py3-none-any.whl (68kB)\n","\u001b[K |████████████████████████████████| 71kB 9.8MB/s \n","\u001b[?25hCollecting pycodestyle<2.8.0,>=2.7.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/cc/227251b1471f129bc35e966bb0fceb005969023926d744139642d847b7ae/pycodestyle-2.7.0-py2.py3-none-any.whl (41kB)\n","\u001b[K |████████████████████████████████| 51kB 8.7MB/s \n","\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n"," Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from flake8->-r requirements/tests.txt (line 2)) (4.5.0)\n","Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.8.9)\n","Collecting colorama\n"," Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n","Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (7.1.2)\n","Requirement already satisfied: toml in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.10.2)\n","Requirement already satisfied: py in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (1.10.0)\n","Requirement already satisfied: attrs in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (21.2.0)\n","Requirement already satisfied: flatbuffers in /usr/local/lib/python3.7/dist-packages (from onnxruntime->-r requirements/tests.txt (line 5)) (1.12)\n","Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (8.8.0)\n","Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (0.7.1)\n","Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.15.0)\n","Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.4.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->-r requirements/runtime.txt (line 3)) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (1.3.1)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (3.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2021.5.30)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (1.24.3)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2.10)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (1.3.0)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.7.2)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.2.2)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (3.1.1)\n","Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.7/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3.6\"->google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.4.8)\n","Installing collected packages: codecov, pyflakes, pycodestyle, mccabe, flake8, colorama, interrogate, isort, onnxruntime, pytest-runner\n","Successfully installed codecov-2.1.11 colorama-0.4.4 flake8-3.9.2 interrogate-1.4.0 isort-4.3.21 mccabe-0.6.1 onnxruntime-1.8.0 pycodestyle-2.7.0 pyflakes-2.3.1 pytest-runner-5.3.1\n","Created temporary directory: /tmp/pip-ephem-wheel-cache-hu6xvjxh\n","Created temporary directory: /tmp/pip-req-tracker-zk5q0q3z\n","Created requirements tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Created temporary directory: /tmp/pip-install-vr_vpseo\n","Obtaining file:///content/mmediting\n"," Added file:///content/mmediting to build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"," Running setup.py (path:/content/mmediting/setup.py) egg_info for package from file:///content/mmediting\n"," Running command python setup.py egg_info\n"," running egg_info\n"," creating mmedit.egg-info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," Source in /content/mmediting has version 0.8.0, which satisfies requirement mmedit==0.8.0 from file:///content/mmediting\n"," Removed mmedit==0.8.0 from file:///content/mmediting from build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.31.0)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (4.1.2.30)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (2.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (1.19.5)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.5.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.4.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.4.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (3.2.2)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.1.1)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.34.1)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.12.4)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.0.1)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.36.2)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.31.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.12.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (2.23.0)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.8.0)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.3.4)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.4.4)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.6.1)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (57.0.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->mmedit==0.8.0) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (1.3.1)\n","Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from grpcio>=1.24.3->tensorboard->mmedit==0.8.0) (1.15.0)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.2.2)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.7.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (1.24.3)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2.10)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2021.5.30)\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.8.0) (4.5.0)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (1.3.0)\n","Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.4.8)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (3.1.1)\n","Installing collected packages: mmedit\n"," Running setup.py develop for mmedit\n"," Running command /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/content/mmediting/setup.py'\"'\"'; __file__='\"'\"'/content/mmediting/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' develop --no-deps\n"," running develop\n"," running egg_info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," running build_ext\n"," Creating /usr/local/lib/python3.7/dist-packages/mmedit.egg-link (link to .)\n"," Adding mmedit 0.8.0 to easy-install.pth file\n","\n"," Installed /content/mmediting\n","Successfully installed mmedit\n","Cleaning up...\n","Removed build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"]}],"source":["# 安装 openmim 用于安装 mmcv-full\n","!pip install openmim\n","\n","# 安装 mmcv-full 使用 CUDA 算子\n","!mim install mmcv-full\n","\n","# 克隆 MMEditing\n","!rm -rf mmediting\n","!git clone https://github.com/open-mmlab/mmediting.git\n","%cd mmediting\n","\n","# 安装 MMEditing\n","!pip install -v -e ."]},{"cell_type":"markdown","metadata":{"id":"QgX96Sc_3PcV"},"source":["## 下载此演示所需的材料\n","在这个演示中,我们将需要一些数据和配置文件。我们将下载并放入 `./demo_files/`"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4723,"status":"ok","timestamp":1625140825508,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"-K0zFSJ-3V42","outputId":"528a87f7-f78e-4219-84f3-dec19b88e88a"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2021-07-01 11:59:48-- https://download.openmmlab.com/mmediting/demo_files.zip\n","Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.35\n","Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.35|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 19215781 (18M) [application/zip]\n","Saving to: ‘demo_files.zip’\n","\n","demo_files.zip 100%[===================>] 18.33M 6.00MB/s in 3.1s \n","\n","2021-07-01 11:59:52 (6.00 MB/s) - ‘demo_files.zip’ saved [19215781/19215781]\n","\n","Archive: demo_files.zip\n"," creating: demo_files/\n"," inflating: demo_files/demo_config_EDVR.py \n"," inflating: demo_files/demo_config_BasicVSR.py \n"," creating: demo_files/lq_sequences/\n"," creating: demo_files/lq_sequences/calendar/\n"," inflating: demo_files/lq_sequences/calendar/00000006.png \n"," inflating: demo_files/lq_sequences/calendar/00000007.png \n"," inflating: demo_files/lq_sequences/calendar/00000010.png \n"," inflating: demo_files/lq_sequences/calendar/00000004.png \n"," inflating: demo_files/lq_sequences/calendar/00000003.png \n"," inflating: demo_files/lq_sequences/calendar/00000001.png \n"," inflating: demo_files/lq_sequences/calendar/00000000.png \n"," inflating: demo_files/lq_sequences/calendar/00000009.png \n"," inflating: demo_files/lq_sequences/calendar/00000008.png \n"," inflating: demo_files/lq_sequences/calendar/00000002.png \n"," inflating: demo_files/lq_sequences/calendar/00000005.png \n"," creating: demo_files/lq_sequences/city/\n"," inflating: demo_files/lq_sequences/city/00000006.png \n"," inflating: demo_files/lq_sequences/city/00000007.png \n"," inflating: demo_files/lq_sequences/city/00000010.png \n"," inflating: demo_files/lq_sequences/city/00000004.png \n"," inflating: demo_files/lq_sequences/city/00000003.png \n"," inflating: demo_files/lq_sequences/city/00000001.png \n"," inflating: demo_files/lq_sequences/city/00000000.png \n"," inflating: demo_files/lq_sequences/city/00000009.png \n"," inflating: demo_files/lq_sequences/city/00000008.png \n"," inflating: demo_files/lq_sequences/city/00000002.png \n"," inflating: demo_files/lq_sequences/city/00000005.png \n"," creating: demo_files/lq_sequences/.ipynb_checkpoints/\n"," creating: demo_files/gt_images/\n"," inflating: demo_files/gt_images/bird.png \n"," inflating: demo_files/gt_images/woman.png \n"," inflating: demo_files/gt_images/head.png \n"," inflating: demo_files/gt_images/baby.png \n"," inflating: demo_files/gt_images/butterfly.png \n"," inflating: demo_files/demo_config_SRCNN.py \n"," creating: demo_files/lq_images/\n"," extracting: demo_files/lq_images/bird.png \n"," extracting: demo_files/lq_images/woman.png \n"," extracting: demo_files/lq_images/head.png \n"," extracting: demo_files/lq_images/baby.png \n"," extracting: demo_files/lq_images/butterfly.png \n"," creating: demo_files/gt_sequences/\n"," creating: demo_files/gt_sequences/calendar/\n"," inflating: demo_files/gt_sequences/calendar/00000006.png \n"," inflating: demo_files/gt_sequences/calendar/00000007.png \n"," inflating: demo_files/gt_sequences/calendar/00000010.png \n"," inflating: demo_files/gt_sequences/calendar/00000004.png \n"," inflating: demo_files/gt_sequences/calendar/00000003.png \n"," inflating: demo_files/gt_sequences/calendar/00000001.png \n"," inflating: demo_files/gt_sequences/calendar/00000000.png \n"," inflating: demo_files/gt_sequences/calendar/00000009.png \n"," inflating: demo_files/gt_sequences/calendar/00000008.png \n"," inflating: demo_files/gt_sequences/calendar/00000002.png \n"," inflating: demo_files/gt_sequences/calendar/00000005.png \n"," creating: demo_files/gt_sequences/city/\n"," inflating: demo_files/gt_sequences/city/00000006.png \n"," inflating: demo_files/gt_sequences/city/00000007.png \n"," inflating: demo_files/gt_sequences/city/00000010.png \n"," inflating: demo_files/gt_sequences/city/00000004.png \n"," inflating: demo_files/gt_sequences/city/00000003.png \n"," inflating: demo_files/gt_sequences/city/00000001.png \n"," inflating: demo_files/gt_sequences/city/00000000.png \n"," inflating: demo_files/gt_sequences/city/00000009.png \n"," inflating: demo_files/gt_sequences/city/00000008.png \n"," inflating: demo_files/gt_sequences/city/00000002.png \n"," inflating: demo_files/gt_sequences/city/00000005.png \n"," creating: demo_files/gt_sequences/.ipynb_checkpoints/\n"," creating: demo_files/.ipynb_checkpoints/\n"]}],"source":["!wget https://download.openmmlab.com/mmediting/demo_files.zip # 下载文件\n","!unzip demo_files # 解压\n","\n","# 将数据复制到 data/Set5 以备后用\n","!mkdir data\n","!mkdir data/val_set5\n","!cp -r demo_files/lq_images data/val_set5/Set5_bicLRx4\n","!cp -r demo_files/gt_images data/val_set5/Set5"]},{"cell_type":"markdown","metadata":{"id":"zXGurqGKOeNE"},"source":["## 使用预训练的图像恢复器进行推理\n","您可以使用 “restoration_demo.py” 轻松地使用预训练的恢复器对单个图像进行推理。您需要的是\n","\n","1. `CONFIG_FILE`:你要使用的 restorer 对应的配置文件。它指定您要使用的模型。\n","2. `CHECKPOINT_FILE`:预训练模型权重文件的路径。\n","3. `IMAGE_FILE`:输入图像的路径。\n","4. `SAVE_FILE`:您要存储输出图像的位置。\n","5. `imshow`:是否显示图片。(可选的)\n","6. `GPU_ID`:您想使用哪个 GPU。(可选的)\n","\n","获得所有这些详细信息后,您可以直接使用以下命令:\n","\n","```\n","python demo/restoration_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${IMAGE_FILE} ${SAVE_FILE} [--imshow] [--device ${GPU_ID}]\n","```\n","\n","**注:** \n","1. 配置文件位于 `./configs`。\n","2. 我们支持从 url 加载权重文件。您可以到相应页面(例如[这里](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan))获取预训练模型的url。\n","\n","---\n","\n","我们现在将使用 `SRCNN` 和 `ESRGAN` 作为示例。\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58677,"status":"ok","timestamp":1625140884175,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"KiPvtvlqM1zb","outputId":"be7375a7-4632-4770-8383-2a8ce654b069"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\" to /root/.cache/torch/hub/checkpoints/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\n","100% 83.9k/83.9k [00:00<00:00, 1.59MB/s]\n","2021-07-01 12:00:10,779 - mmedit - INFO - Use load_from_torchvision loader\n","Downloading: \"https://download.pytorch.org/models/vgg19-dcbb9e9d.pth\" to /root/.cache/torch/hub/checkpoints/vgg19-dcbb9e9d.pth\n","100% 548M/548M [00:07<00:00, 76.0MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\" to /root/.cache/torch/hub/checkpoints/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\n","100% 196M/196M [00:26<00:00, 7.61MB/s]\n","bird_ESRGAN.png bird_SRCNN.png\n"]}],"source":["# SRCNN\n","!python demo/restoration_demo.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth ./demo_files/lq_images/bird.png ./outputs/bird_SRCNN.png\n","\n","# ESRGAN\n","!python demo/restoration_demo.py ./configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth ./demo_files/lq_images/bird.png ./outputs/bird_ESRGAN.png\n","\n","# 检查图像是否已保存\n","!ls ./outputs"]},{"cell_type":"markdown","metadata":{"id":"W1DfGHu3Xcfd"},"source":["## 使用预训练的视频复原器进行推理\n","\n","MMEditing 也支持视频超分辨率方法,过程类似。您可以使用带有以下参数的 `restoration_video_demo.py`:\n","\n","1. `CONFIG_FILE`:你要使用的 restorer 对应的配置文件。它指定您要使用的模型。\n","2. `CHECKPOINT_FILE`:预训练模型权重文件的路径。\n","3. `INPUT_DIR`: 包含视频帧的目录。\n","4. `OUTPUT_DIR`: 要存储输出帧的位置。\n","5. `WINDOW_SIZE`: 使用滑动窗口方法时的窗口大小(可选)。\n","6. `GPU_ID`: 您想使用哪个 GPU(可选)。\n","\n","```\n","python demo/restoration_video_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${INPUT_DIR} ${OUTPUT_DIR} [--window_size=$WINDOW_SIZE] [--device ${GPU_ID}]\n","```\n","**注:** 视频超分辨率有两种不同的框架:***滑动窗口***和***循环***框架。使用 EDVR 等滑动窗口框架的方法时,需要指定 `window_size`。此值取决于您使用的模型。\n","\n","---\n","\n","我们现在将使用 `EDVR` 和 `BasicVSR` 作为示例。\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29263,"status":"ok","timestamp":1625140913405,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"iaoE7UF5Xb2i","outputId":"a022e0bd-c47a-450e-f4e4-1bf9f92e4813"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\" to /root/.cache/torch/hub/checkpoints/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\n","100% 11.5M/11.5M [00:01<00:00, 8.55MB/s]\n","2021-07-01 12:01:09,689 - mmedit - INFO - Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth\" to /root/.cache/torch/hub/checkpoints/spynet_20210409-c6c1bd09.pth\n","100% 5.50M/5.50M [00:00<00:00, 8.88MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth\" to /root/.cache/torch/hub/checkpoints/basicvsr_reds4_20120409-0e599677.pth\n","100% 24.1M/24.1M [00:02<00:00, 8.97MB/s]\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# EDVR(滑动窗口框架)\n","!python demo/restoration_video_demo.py ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_EDVR --window_size=5\n","\n","# BasicVSR(循环框架)\n","!python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_BasicVSR\n","\n","# 检查是否保存了视频帧\n","!ls ./outputs/calendar_BasicVSR"]},{"cell_type":"markdown","metadata":{"id":"Rf3LW57qMHXb"},"source":["## 使用配置文件在预定义的数据集上进行测试\n","\n","上述演示提供了一种对单个图像或视频序列进行推理的简单方法。如果要对一组图像或序列进行推理,可以使用位于 `./configs` 中的配置文件。\n"," \n","现有的配置文件允许您对常见数据集进行推理,例如图像超分辨率中的 `Set5` 和视频超分辨率中的 `REDS4`。您可以使用以下命令:\n","\n","1. `CONFIG_FILE`: 你要使用的复原器和数据集对应的配置文件\n","2. `CHECKPOINT_FILE`: 预训练模型权重文件的路径。\n","3. `GPU_NUM`: 用于测试的 GPU 数量。\n","4. `RESULT_FILE`: 输出结果 pickle 文件的路径。(可选)\n","5. `IMAGE_SAVE_PATH`: 要存储输出图像的位置。(可选)\n","\n","```\n","# 单 GPU 测试\n","python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","\n","# 多 GPU 测试\n","./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","```\n","您需要做的是修改配置文件中的 `lq_folder` 和 `gt_folder`:\n","```\n","test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/val_set5/Set5_bicLRx4',\n"," gt_folder='data/val_set5/Set5',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","```\n","\n","**注**: 某些数据集类型(例如 `SRREDSDataset`)需要一个注释文件来指定数据集的详细信息。更多细节请参考 `./mmedit/dataset/` 中的相应文件。\n","\n","---\n","\n","以下是 SRCNN 的命令。对于其他模型,您可以简单地更改配置文件和预训练模型的路径。\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14095,"status":"ok","timestamp":1625140927462,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"tClgIYgcbbVg","outputId":"c37ec2de-e1c9-42ae-ed9b-31009d48ae64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"tools/test.py\", line 136, in \n"," main()\n"," File \"tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/test.py\", line 136, in \n"," main()\n"," File \"./tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/test.py', '--local_rank=0', './configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py', 'https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth', '--launcher', 'pytorch', '--save-path', './outputs/']' returned non-zero exit status 1.\n"]}],"source":["# 单 GPU\n","!python tools/test.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/\n","\n","# 多 GPU\n","!./tools/dist_test.sh ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth 1 --save-path ./outputs/"]},{"cell_type":"markdown","metadata":{"id":"KWKVyeEQelh3"},"source":["## 在自定义数据集上进行测试\n","\n","当您想在自定义数据集上进行测试时,除了数据集路径之外,您还需要修改 `test_dataset_type`。 \n","\n","- 对于图像超分辨率,需要使用 `SRFolderDataset`\n","- 对于视频超分辨率的滑动窗口框架(例如 EDVR、TDAN),需要使用 `SRFolderVideoDataset`。\n","- 对于视频超分辨率的循环框架(例如 BasicVSR、IconVSR),需要使用 `SRFolderMultipleGTDataset`。\n","\n","这些数据集类型假定指定目录中的所有图像/序列都用于测试。文件夹结构应该是\n","```\n","| lq_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," | ...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","| gt_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," |...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","```\n","我们将使用 **SRCNN**、**EDVR**、**BasicVSR** 作为示例。请注意 `test_dataset_type` 和 `data['test']` 的设置。"]},{"cell_type":"markdown","metadata":{"id":"0p2rP8jV_dL1"},"source":["**SRCNN**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8729,"status":"ok","timestamp":1625140936180,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"4kEev4wVIq_L","outputId":"8026ed73-f781-4eb2-bb80-d3446bd131df"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 5/5, 8.6 task/s, elapsed: 1s, ETA: 0s\n","Eval-PSNR: 28.433974369836108\n","Eval-SSIM: 0.8099053586583066\n","baby.png bird.png butterfly.png head.png woman.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_SRCNN.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/testset_SRCNN\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_SRCNN"]},{"cell_type":"markdown","metadata":{"id":"RONzjTTU_gem"},"source":["**EDVR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":19671,"status":"ok","timestamp":1625140955813,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"vL8WOWXY0fNJ","outputId":"dc2a8f81-9bef-4ad4-c5b2-c6f124e6b113"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 22/22, 2.0 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 23.89569862011228\n","Eval-SSIM: 0.7667098470108678\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_EDVR.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth --save-path ./outputs/testset_EDVR\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_EDVR\n","!ls ./outputs/testset_EDVR/city"]},{"cell_type":"markdown","metadata":{"id":"5Tc7F-l5_i1e"},"source":["**BasicVSR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":20220,"status":"ok","timestamp":1625140976026,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"jpW5GWC74Yvu","outputId":"7ba02a32-d4ec-40b2-8108-ef0729b62147"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:07,780 - mmedit - INFO - Use load_from_http loader\n","Use load_from_http loader\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","[>>] 2/2, 0.2 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 24.195768601433734\n","Eval-SSIM: 0.7828541339512978\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_BasicVSR.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth --save-path ./outputs/testset_BasicVSR\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_BasicVSR\n","!ls ./outputs/testset_BasicVSR/calendar"]},{"cell_type":"markdown","metadata":{"id":"4DQxNL8BhI0y"},"source":["## 在预定义的数据集上训练恢复器\n","\n","MMEditing 使用分布式训练。以下命令可用于训练。如果要在我们的配置文件中指定的预定义数据集上进行训练,只需运行以下命令即可。\n","\n","```\n","./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]\n","```\n","\n","有关可选参数的更多详细信息,请参阅 `tools/train.py`。\n","\n","---\n","\n","这是一个使用 EDVR 的示例。\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9337,"status":"ok","timestamp":1625140985357,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"s-hOnSF6ItQM","outputId":"e40e960a-29e1-43e8-b922-5e08c4e98afe"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:31,961 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:31,961 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:31,961 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:31,961 - mmedit - INFO - Config:\n","/content/mmediting/configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py\n","exp_name = 'edvrm_wotsa_x4_g8_600k_reds'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRREDSDataset'\n","val_dataset_type = 'SRREDSDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 600000\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50000, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=100,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 54, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 63, in load_annotations\n"," with open(self.ann_file, 'r') as fin:\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/train.py\", line 145, in \n"," main()\n"," File \"./tools/train.py\", line 111, in main\n"," datasets = [build_dataset(cfg.data.train)]\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 76, in build_dataset\n"," build_dataset(cfg['dataset'], default_args), cfg['times'])\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRREDSDataset: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/train.py', '--local_rank=0', './configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py', '--launcher', 'pytorch']' returned non-zero exit status 1.\n"]}],"source":["!./tools/dist_train.sh ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py 1"]},{"cell_type":"markdown","metadata":{"id":"b0VfQkQQjg8N"},"source":["## 在自定义数据集上训练复原器\n","\n","与您要在自己的数据集上进行测试的情况类似,您需要修改 `train_dataset_type`。您需要的数据集类型是相同的:\n","\n","- 对于图像超分辨率,需要使用 `SRFolderDataset`\n","- 对于视频超分辨率的滑动窗口框架(例如 EDVR、TDAN),需要使用 `SRFolderVideoDataset`。\n","- 对于视频超分辨率的循环框架(例如 BasicVSR、IconVSR),需要使用 `SRFolderMultipleGTDataset`。\n","\n","修改数据集类型和数据路径后。一切都准备好了。"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":128384,"status":"ok","timestamp":1625141113733,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"liGEKJpbIoXZ","outputId":"84e1502e-e2cb-458f-c7c5-e4b401e570b7"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:41,185 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:41,185 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:41,185 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:41,185 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_SRCNN.py\n","exp_name = 'srcnn_demo'\n","\n","scale = 4\n","# model settings\n","model = dict(\n"," type='BasicRestorer',\n"," generator=dict(\n"," type='SRCNN',\n"," channels=(3, 64, 32, 3),\n"," kernel_sizes=(9, 1, 5),\n"," upscale_factor=scale),\n"," pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=scale)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderDataset'\n","val_dataset_type = 'SRFolderDataset'\n","train_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=128),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","test_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'lq_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=8,\n"," train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=train_pipeline,\n"," scale=scale)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[250000, 250000, 250000, 250000],\n"," restart_weights=[1, 1, 1, 1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","evaluation = dict(interval=50, save_image=True, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./experiments/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:02:41,192 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/experiments/srcnn_demo\n","2021-07-01 12:02:41,192 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:02:41.529307: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:03:18,631 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.000e-04, eta: 0:57:01, time: 34.560, data_time: 34.446, memory: 586, loss_pix: 0.3999, loss: 0.3999\n","2021-07-01 12:03:18,712 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","INFO:mmedit:Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","2021-07-01 12:03:18,764 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","INFO:mmedit:Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","2021-07-01 12:03:18,840 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","INFO:mmedit:Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","2021-07-01 12:03:18,916 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","INFO:mmedit:Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","2021-07-01 12:03:18,956 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","INFO:mmedit:Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","2021-07-01 12:03:19,012 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","INFO:mmedit:Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","2021-07-01 12:03:19,070 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","INFO:mmedit:Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","2021-07-01 12:03:19,142 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","INFO:mmedit:Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","2021-07-01 12:03:19,212 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","INFO:mmedit:Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","2021-07-01 12:03:19,261 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","INFO:mmedit:Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","2021-07-01 12:03:19,302 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","INFO:mmedit:Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","2021-07-01 12:03:19,357 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","INFO:mmedit:Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","2021-07-01 12:03:19,419 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","INFO:mmedit:Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","2021-07-01 12:03:19,473 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","INFO:mmedit:Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","2021-07-01 12:03:19,538 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","INFO:mmedit:Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","2021-07-01 12:03:19,603 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","INFO:mmedit:Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","2021-07-01 12:03:19,657 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","INFO:mmedit:Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","2021-07-01 12:03:19,716 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","INFO:mmedit:Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","2021-07-01 12:03:19,772 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","INFO:mmedit:Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","2021-07-01 12:03:19,834 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","INFO:mmedit:Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","2021-07-01 12:03:19,877 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","INFO:mmedit:Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","2021-07-01 12:03:19,947 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","INFO:mmedit:Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","2021-07-01 12:03:20,014 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","INFO:mmedit:Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","2021-07-01 12:03:20,068 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","INFO:mmedit:Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","2021-07-01 12:03:20,124 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","INFO:mmedit:Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","2021-07-01 12:03:20,181 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","INFO:mmedit:Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","2021-07-01 12:03:20,244 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","INFO:mmedit:Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","2021-07-01 12:03:20,310 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","INFO:mmedit:Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","2021-07-01 12:03:20,356 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","INFO:mmedit:Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","2021-07-01 12:03:20,410 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","INFO:mmedit:Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","2021-07-01 12:03:20,480 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","INFO:mmedit:Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","2021-07-01 12:03:20,536 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","INFO:mmedit:Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","2021-07-01 12:03:20,595 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","INFO:mmedit:Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","2021-07-01 12:03:20,656 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","INFO:mmedit:Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","2021-07-01 12:03:20,710 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","INFO:mmedit:Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","2021-07-01 12:03:20,779 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:20,846 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","INFO:mmedit:Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","2021-07-01 12:03:20,907 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:20,958 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","INFO:mmedit:Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","2021-07-01 12:03:21,028 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","INFO:mmedit:Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","2021-07-01 12:03:21,122 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","INFO:mmedit:Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","2021-07-01 12:03:21,181 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:21,418 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","INFO:mmedit:Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","2021-07-01 12:03:21,480 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:21,551 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","INFO:mmedit:Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","2021-07-01 12:03:21,618 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","INFO:mmedit:Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","2021-07-01 12:03:21,667 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","INFO:mmedit:Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","2021-07-01 12:03:21,743 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","INFO:mmedit:Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","[>>] 5/5, 0.1 task/s, elapsed: 37s, ETA: 0s\n","\n","2021-07-01 12:03:59,996 - mmedit - INFO - Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","INFO:mmedit:Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","2021-07-01 12:04:00,047 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","INFO:mmedit:Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","2021-07-01 12:04:00,114 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","INFO:mmedit:Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","2021-07-01 12:04:00,181 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","INFO:mmedit:Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","2021-07-01 12:04:00,251 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","INFO:mmedit:Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","2021-07-01 12:04:00,315 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","INFO:mmedit:Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","2021-07-01 12:04:00,373 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","INFO:mmedit:Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","2021-07-01 12:04:00,418 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","INFO:mmedit:Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","2021-07-01 12:04:00,478 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","INFO:mmedit:Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","2021-07-01 12:04:00,538 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","INFO:mmedit:Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","2021-07-01 12:04:00,606 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","INFO:mmedit:Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","2021-07-01 12:04:00,647 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","INFO:mmedit:Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","2021-07-01 12:04:00,711 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","INFO:mmedit:Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","2021-07-01 12:04:00,757 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","INFO:mmedit:Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","2021-07-01 12:04:00,799 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","INFO:mmedit:Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","2021-07-01 12:04:00,871 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:00,938 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:00,995 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","INFO:mmedit:Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","2021-07-01 12:04:01,051 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","INFO:mmedit:Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","2021-07-01 12:04:01,115 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:01,196 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","INFO:mmedit:Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","2021-07-01 12:04:01,256 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","INFO:mmedit:Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","2021-07-01 12:04:01,325 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","INFO:mmedit:Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","2021-07-01 12:04:01,381 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","INFO:mmedit:Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:04:01,429 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","INFO:mmedit:Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","2021-07-01 12:04:01,497 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","INFO:mmedit:Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","2021-07-01 12:04:01,545 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","INFO:mmedit:Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","2021-07-01 12:04:01,597 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","INFO:mmedit:Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","2021-07-01 12:04:01,671 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","INFO:mmedit:Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:04:01,724 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:01,777 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","INFO:mmedit:Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","2021-07-01 12:04:01,847 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","INFO:mmedit:Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","2021-07-01 12:04:01,905 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","INFO:mmedit:Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","2021-07-01 12:04:01,953 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","INFO:mmedit:Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","2021-07-01 12:04:02,025 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","INFO:mmedit:Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","2021-07-01 12:04:02,079 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","INFO:mmedit:Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","2021-07-01 12:04:02,137 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","INFO:mmedit:Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","2021-07-01 12:04:02,193 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:02,255 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","INFO:mmedit:Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:04:02,341 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","INFO:mmedit:Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","2021-07-01 12:04:02,394 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","INFO:mmedit:Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","2021-07-01 12:04:02,496 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","INFO:mmedit:Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","2021-07-01 12:04:02,552 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:02,629 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","INFO:mmedit:Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","2021-07-01 12:04:02,682 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","INFO:mmedit:Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","2021-07-01 12:04:02,791 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","INFO:mmedit:Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","2021-07-01 12:04:02,834 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","INFO:mmedit:Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","2021-07-01 12:04:02,900 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","INFO:mmedit:Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","2021-07-01 12:04:03,053 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","INFO:mmedit:Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:04:03,108 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","INFO:mmedit:Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","[>>] 5/5, 0.2 task/s, elapsed: 33s, ETA: 0s\n","\n","2021-07-01 12:04:37,412 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:04:37,422 - mmedit - INFO - Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n","INFO:mmedit:Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n"]}],"source":["# SRCNN(图像超分辨率)\n","!./tools/dist_train.sh ./demo_files/demo_config_SRCNN.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":117937,"status":"ok","timestamp":1625141554036,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"26uZ4Ak7qbC9","outputId":"2fb26527-eb9e-4b48-e03c-ba9a91c60db8"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:10:12,619 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:10:12,619 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:10:12,619 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:10:12,619 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_EDVR.py\n","exp_name = 'edvrm_demo'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderVideoDataset'\n","val_dataset_type = 'SRFolderVideoDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:10:12,701 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/edvrm_demo\n","2021-07-01 12:10:12,702 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:10:12.951771: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:10:30,703 - mmedit - INFO - Iter [1/100]\tlr_generator: 4.000e-04, eta: 0:26:53, time: 16.295, data_time: 15.833, memory: 1341, loss_pix: 63917.2734, loss: 63917.2734\n","2021-07-01 12:10:31,046 - mmedit - INFO - Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","INFO:mmedit:Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","2021-07-01 12:10:31,386 - mmedit - INFO - Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","INFO:mmedit:Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","2021-07-01 12:10:31,731 - mmedit - INFO - Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","INFO:mmedit:Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","2021-07-01 12:10:32,071 - mmedit - INFO - Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","INFO:mmedit:Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","2021-07-01 12:10:32,414 - mmedit - INFO - Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","INFO:mmedit:Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","2021-07-01 12:10:32,760 - mmedit - INFO - Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","INFO:mmedit:Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","2021-07-01 12:10:33,102 - mmedit - INFO - Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","INFO:mmedit:Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","2021-07-01 12:10:33,447 - mmedit - INFO - Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","INFO:mmedit:Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","2021-07-01 12:10:33,792 - mmedit - INFO - Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","INFO:mmedit:Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","2021-07-01 12:10:34,138 - mmedit - INFO - Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","INFO:mmedit:Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","2021-07-01 12:10:34,484 - mmedit - INFO - Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","INFO:mmedit:Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","2021-07-01 12:10:34,829 - mmedit - INFO - Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","INFO:mmedit:Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","2021-07-01 12:10:35,175 - mmedit - INFO - Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","INFO:mmedit:Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","2021-07-01 12:10:35,522 - mmedit - INFO - Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","INFO:mmedit:Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","2021-07-01 12:10:35,866 - mmedit - INFO - Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","INFO:mmedit:Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","2021-07-01 12:10:36,212 - mmedit - INFO - Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","INFO:mmedit:Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","2021-07-01 12:10:36,560 - mmedit - INFO - Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","INFO:mmedit:Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","2021-07-01 12:10:36,904 - mmedit - INFO - Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","INFO:mmedit:Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","2021-07-01 12:10:37,249 - mmedit - INFO - Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","INFO:mmedit:Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","2021-07-01 12:10:37,595 - mmedit - INFO - Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","INFO:mmedit:Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","2021-07-01 12:10:37,939 - mmedit - INFO - Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","INFO:mmedit:Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","2021-07-01 12:10:38,283 - mmedit - INFO - Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","INFO:mmedit:Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","2021-07-01 12:10:38,628 - mmedit - INFO - Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","INFO:mmedit:Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","2021-07-01 12:10:38,974 - mmedit - INFO - Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","INFO:mmedit:Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","2021-07-01 12:10:39,318 - mmedit - INFO - Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","INFO:mmedit:Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","2021-07-01 12:10:39,665 - mmedit - INFO - Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","INFO:mmedit:Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","2021-07-01 12:10:40,011 - mmedit - INFO - Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","INFO:mmedit:Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","2021-07-01 12:10:40,356 - mmedit - INFO - Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","INFO:mmedit:Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","2021-07-01 12:10:40,703 - mmedit - INFO - Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","INFO:mmedit:Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","2021-07-01 12:10:41,049 - mmedit - INFO - Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","INFO:mmedit:Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","2021-07-01 12:10:41,396 - mmedit - INFO - Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","INFO:mmedit:Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","2021-07-01 12:10:41,745 - mmedit - INFO - Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","INFO:mmedit:Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","2021-07-01 12:10:42,097 - mmedit - INFO - Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","INFO:mmedit:Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","2021-07-01 12:10:42,444 - mmedit - INFO - Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","INFO:mmedit:Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","2021-07-01 12:10:42,790 - mmedit - INFO - Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","INFO:mmedit:Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","2021-07-01 12:10:43,140 - mmedit - INFO - Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","INFO:mmedit:Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","2021-07-01 12:10:43,490 - mmedit - INFO - Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","INFO:mmedit:Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","2021-07-01 12:10:43,841 - mmedit - INFO - Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","INFO:mmedit:Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","2021-07-01 12:10:44,193 - mmedit - INFO - Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","INFO:mmedit:Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","2021-07-01 12:10:44,541 - mmedit - INFO - Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","INFO:mmedit:Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","2021-07-01 12:10:44,895 - mmedit - INFO - Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","INFO:mmedit:Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","2021-07-01 12:10:45,248 - mmedit - INFO - Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","INFO:mmedit:Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","2021-07-01 12:10:45,595 - mmedit - INFO - Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","INFO:mmedit:Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","2021-07-01 12:10:45,950 - mmedit - INFO - Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","INFO:mmedit:Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","2021-07-01 12:10:46,301 - mmedit - INFO - Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","INFO:mmedit:Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","2021-07-01 12:10:46,649 - mmedit - INFO - Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","INFO:mmedit:Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","2021-07-01 12:10:47,003 - mmedit - INFO - Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","INFO:mmedit:Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","2021-07-01 12:10:47,356 - mmedit - INFO - Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","INFO:mmedit:Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:14,231 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","INFO:mmedit:Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","2021-07-01 12:11:14,578 - mmedit - INFO - Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","INFO:mmedit:Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","2021-07-01 12:11:14,930 - mmedit - INFO - Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","INFO:mmedit:Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","2021-07-01 12:11:15,289 - mmedit - INFO - Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","INFO:mmedit:Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","2021-07-01 12:11:15,642 - mmedit - INFO - Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","INFO:mmedit:Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","2021-07-01 12:11:15,993 - mmedit - INFO - Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","INFO:mmedit:Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","2021-07-01 12:11:16,354 - mmedit - INFO - Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","INFO:mmedit:Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","2021-07-01 12:11:16,712 - mmedit - INFO - Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","INFO:mmedit:Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","2021-07-01 12:11:17,065 - mmedit - INFO - Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","INFO:mmedit:Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","2021-07-01 12:11:17,425 - mmedit - INFO - Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","INFO:mmedit:Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","2021-07-01 12:11:17,780 - mmedit - INFO - Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","INFO:mmedit:Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","2021-07-01 12:11:18,135 - mmedit - INFO - Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","INFO:mmedit:Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","2021-07-01 12:11:18,495 - mmedit - INFO - Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","INFO:mmedit:Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","2021-07-01 12:11:18,851 - mmedit - INFO - Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","INFO:mmedit:Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","2021-07-01 12:11:19,210 - mmedit - INFO - Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","INFO:mmedit:Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","2021-07-01 12:11:19,567 - mmedit - INFO - Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","INFO:mmedit:Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","2021-07-01 12:11:19,923 - mmedit - INFO - Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","INFO:mmedit:Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","2021-07-01 12:11:20,286 - mmedit - INFO - Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","INFO:mmedit:Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","2021-07-01 12:11:20,644 - mmedit - INFO - Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","INFO:mmedit:Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","2021-07-01 12:11:21,000 - mmedit - INFO - Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","INFO:mmedit:Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","2021-07-01 12:11:21,359 - mmedit - INFO - Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","INFO:mmedit:Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","2021-07-01 12:11:21,719 - mmedit - INFO - Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","INFO:mmedit:Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","2021-07-01 12:11:22,072 - mmedit - INFO - Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","INFO:mmedit:Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","2021-07-01 12:11:22,434 - mmedit - INFO - Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","INFO:mmedit:Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","2021-07-01 12:11:22,798 - mmedit - INFO - Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","INFO:mmedit:Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","2021-07-01 12:11:23,158 - mmedit - INFO - Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","INFO:mmedit:Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","2021-07-01 12:11:23,513 - mmedit - INFO - Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","INFO:mmedit:Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","2021-07-01 12:11:23,875 - mmedit - INFO - Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","INFO:mmedit:Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","2021-07-01 12:11:24,236 - mmedit - INFO - Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","INFO:mmedit:Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","2021-07-01 12:11:24,597 - mmedit - INFO - Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","INFO:mmedit:Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","2021-07-01 12:11:24,951 - mmedit - INFO - Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","INFO:mmedit:Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","2021-07-01 12:11:25,313 - mmedit - INFO - Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","INFO:mmedit:Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","2021-07-01 12:11:25,677 - mmedit - INFO - Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","INFO:mmedit:Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","2021-07-01 12:11:26,038 - mmedit - INFO - Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","INFO:mmedit:Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","2021-07-01 12:11:26,393 - mmedit - INFO - Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","INFO:mmedit:Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","2021-07-01 12:11:26,753 - mmedit - INFO - Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","INFO:mmedit:Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","2021-07-01 12:11:27,115 - mmedit - INFO - Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","INFO:mmedit:Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","2021-07-01 12:11:27,472 - mmedit - INFO - Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","INFO:mmedit:Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","2021-07-01 12:11:27,830 - mmedit - INFO - Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","INFO:mmedit:Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","2021-07-01 12:11:28,189 - mmedit - INFO - Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","INFO:mmedit:Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","2021-07-01 12:11:28,553 - mmedit - INFO - Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","INFO:mmedit:Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","2021-07-01 12:11:28,910 - mmedit - INFO - Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","INFO:mmedit:Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","2021-07-01 12:11:29,266 - mmedit - INFO - Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","INFO:mmedit:Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","2021-07-01 12:11:29,628 - mmedit - INFO - Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","INFO:mmedit:Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","2021-07-01 12:11:29,989 - mmedit - INFO - Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","INFO:mmedit:Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","2021-07-01 12:11:30,345 - mmedit - INFO - Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","INFO:mmedit:Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","2021-07-01 12:11:30,704 - mmedit - INFO - Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","INFO:mmedit:Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","2021-07-01 12:11:31,067 - mmedit - INFO - Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","INFO:mmedit:Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","2021-07-01 12:11:31,425 - mmedit - INFO - Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","INFO:mmedit:Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","2021-07-01 12:11:31,782 - mmedit - INFO - Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","INFO:mmedit:Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:58,494 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:11:58,598 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n","INFO:mmedit:Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n"]}],"source":["# EDVR(视频超分辨率-滑动窗口)\n","!./tools/dist_train.sh ./demo_files/demo_config_EDVR.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":197033,"status":"ok","timestamp":1625141428032,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"_RdqmlT6qgt2","outputId":"b951b426-e06c-4f31-db01-449333eab333"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:06:47,253 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:06:47,253 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:06:47,254 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:06:47,254 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_BasicVSR.py\n","exp_name = 'basicvsr_demo'\n","\n","# model settings\n","model = dict(\n"," type='BasicVSR',\n"," generator=dict(\n"," type='BasicVSRNet',\n"," mid_channels=64,\n"," num_blocks=30,\n"," spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'\n"," 'basicvsr/spynet_20210409-c6c1bd09.pth'),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = dict(fix_iter=5000)\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderMultipleGTDataset'\n","val_dataset_type = 'SRFolderMultipleGTDataset'\n","\n","train_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=6,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True), # 2 gpus\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1, workers_per_gpu=1),\n","\n"," # train\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," # val\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," # test\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(\n"," generator=dict(\n"," type='Adam',\n"," lr=2e-4,\n"," betas=(0.9, 0.99),\n"," paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)})))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[300000],\n"," restart_weights=[1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," # dict(type='TensorboardLoggerHook'),\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","find_unused_parameters = True\n","\n","2021-07-01 12:06:47,291 - mmedit - INFO - Use load_from_http loader\n","2021-07-01 12:06:47,569 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/basicvsr_demo\n","2021-07-01 12:06:47,569 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:07:14,210 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.500e-05, eta: 0:42:52, time: 25.981, data_time: 24.045, memory: 3464, loss_pix: 0.0634, loss: 0.0634\n","2021-07-01 12:07:15,171 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.500e-05, eta: 0:22:00, time: 0.961, data_time: 0.011, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","2021-07-01 12:07:16,052 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.500e-05, eta: 0:14:59, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0476, loss: 0.0476\n","2021-07-01 12:07:16,940 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.500e-05, eta: 0:11:29, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:17,829 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.500e-05, eta: 0:09:22, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0796, loss: 0.0796\n","2021-07-01 12:07:18,712 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.500e-05, eta: 0:07:57, time: 0.884, data_time: 0.004, memory: 3518, loss_pix: 0.0680, loss: 0.0680\n","2021-07-01 12:07:19,594 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.500e-05, eta: 0:06:56, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0607, loss: 0.0607\n","2021-07-01 12:07:20,481 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.500e-05, eta: 0:06:10, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0598, loss: 0.0598\n","2021-07-01 12:07:21,361 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.500e-05, eta: 0:05:35, time: 0.880, data_time: 0.003, memory: 3518, loss_pix: 0.0664, loss: 0.0664\n","2021-07-01 12:07:22,274 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.500e-05, eta: 0:05:06, time: 0.913, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:07:23,161 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.500e-05, eta: 0:04:42, time: 0.887, data_time: 0.005, memory: 3518, loss_pix: 0.0771, loss: 0.0771\n","2021-07-01 12:07:24,058 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.500e-05, eta: 0:04:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0521, loss: 0.0521\n","2021-07-01 12:07:24,944 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.500e-05, eta: 0:04:05, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:07:25,835 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.500e-05, eta: 0:03:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0515, loss: 0.0515\n","2021-07-01 12:07:26,723 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.500e-05, eta: 0:03:38, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0674, loss: 0.0674\n","2021-07-01 12:07:27,609 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.500e-05, eta: 0:03:26, time: 0.886, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:28,498 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.500e-05, eta: 0:03:16, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0670, loss: 0.0670\n","2021-07-01 12:07:29,388 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.500e-05, eta: 0:03:07, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0663, loss: 0.0663\n","2021-07-01 12:07:30,284 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.500e-05, eta: 0:02:59, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0633, loss: 0.0633\n","2021-07-01 12:07:31,176 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.500e-05, eta: 0:02:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0482, loss: 0.0482\n","2021-07-01 12:07:32,073 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.500e-05, eta: 0:02:44, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0743, loss: 0.0743\n","2021-07-01 12:07:32,966 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.500e-05, eta: 0:02:38, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0690, loss: 0.0690\n","2021-07-01 12:07:33,858 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.500e-05, eta: 0:02:32, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0437, loss: 0.0437\n","2021-07-01 12:07:34,750 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.500e-05, eta: 0:02:27, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:35,642 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.500e-05, eta: 0:02:22, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0781, loss: 0.0781\n","2021-07-01 12:07:36,533 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.500e-05, eta: 0:02:17, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:07:37,427 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.500e-05, eta: 0:02:13, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:07:38,321 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.500e-05, eta: 0:02:08, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0567, loss: 0.0567\n","2021-07-01 12:07:39,212 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.500e-05, eta: 0:02:04, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0846, loss: 0.0846\n","2021-07-01 12:07:40,104 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.500e-05, eta: 0:02:01, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0658, loss: 0.0658\n","2021-07-01 12:07:40,993 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.500e-05, eta: 0:01:57, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0502, loss: 0.0502\n","2021-07-01 12:07:41,885 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.500e-05, eta: 0:01:54, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0622, loss: 0.0622\n","2021-07-01 12:07:42,787 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.500e-05, eta: 0:01:50, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0657, loss: 0.0657\n","2021-07-01 12:07:43,674 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.500e-05, eta: 0:01:47, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0643, loss: 0.0643\n","2021-07-01 12:07:44,567 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.500e-05, eta: 0:01:44, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0898, loss: 0.0898\n","2021-07-01 12:07:45,458 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.500e-05, eta: 0:01:41, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0865, loss: 0.0865\n","2021-07-01 12:07:46,341 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.500e-05, eta: 0:01:38, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0511, loss: 0.0511\n","2021-07-01 12:07:47,225 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.500e-05, eta: 0:01:36, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:48,109 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.500e-05, eta: 0:01:33, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0653, loss: 0.0653\n","2021-07-01 12:07:48,990 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:07:49,874 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.885, data_time: 0.003, memory: 3518, loss_pix: 0.0788, loss: 0.0788\n","2021-07-01 12:07:50,755 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.500e-05, eta: 0:01:26, time: 0.881, data_time: 0.005, memory: 3518, loss_pix: 0.0605, loss: 0.0605\n","2021-07-01 12:07:51,638 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.500e-05, eta: 0:01:24, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0539, loss: 0.0539\n","2021-07-01 12:07:52,518 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.500e-05, eta: 0:01:21, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0503, loss: 0.0503\n","2021-07-01 12:07:53,395 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.500e-05, eta: 0:01:19, time: 0.877, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:07:54,273 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0555, loss: 0.0555\n","2021-07-01 12:07:55,159 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.500e-05, eta: 0:01:15, time: 0.886, data_time: 0.007, memory: 3518, loss_pix: 0.0806, loss: 0.0806\n","2021-07-01 12:07:56,040 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.500e-05, eta: 0:01:13, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0576, loss: 0.0576\n","2021-07-01 12:07:56,919 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.500e-05, eta: 0:01:11, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0871, loss: 0.0871\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:08:32,618 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9899, SSIM: 0.5295\n","2021-07-01 12:08:33,591 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.500e-05, eta: 0:01:40, time: 35.792, data_time: 34.822, memory: 3518, loss_pix: 0.0773, loss: 0.0773\n","2021-07-01 12:08:34,462 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.500e-05, eta: 0:01:37, time: 0.871, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:08:35,326 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.500e-05, eta: 0:01:34, time: 0.864, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:36,192 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0575, loss: 0.0575\n","2021-07-01 12:08:37,069 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.876, data_time: 0.003, memory: 3518, loss_pix: 0.0842, loss: 0.0842\n","2021-07-01 12:08:37,942 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.500e-05, eta: 0:01:25, time: 0.873, data_time: 0.003, memory: 3518, loss_pix: 0.0836, loss: 0.0836\n","2021-07-01 12:08:38,808 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.500e-05, eta: 0:01:22, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0580, loss: 0.0580\n","2021-07-01 12:08:39,679 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.500e-05, eta: 0:01:20, time: 0.870, data_time: 0.003, memory: 3518, loss_pix: 0.0449, loss: 0.0449\n","2021-07-01 12:08:40,557 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0702, loss: 0.0702\n","2021-07-01 12:08:41,430 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.500e-05, eta: 0:01:14, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:42,308 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.500e-05, eta: 0:01:12, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:08:43,182 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.500e-05, eta: 0:01:09, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0489, loss: 0.0489\n","2021-07-01 12:08:44,056 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.500e-05, eta: 0:01:07, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0566, loss: 0.0566\n","2021-07-01 12:08:44,932 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.500e-05, eta: 0:01:05, time: 0.875, data_time: 0.003, memory: 3518, loss_pix: 0.0597, loss: 0.0597\n","2021-07-01 12:08:45,819 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.500e-05, eta: 0:01:02, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0640, loss: 0.0640\n","2021-07-01 12:08:46,698 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.500e-05, eta: 0:01:00, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:47,580 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.500e-05, eta: 0:00:58, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:08:48,464 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.500e-05, eta: 0:00:56, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:08:49,347 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.500e-05, eta: 0:00:54, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0603, loss: 0.0603\n","2021-07-01 12:08:50,229 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.500e-05, eta: 0:00:51, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0478, loss: 0.0478\n","2021-07-01 12:08:51,113 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.500e-05, eta: 0:00:49, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:08:52,000 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.500e-05, eta: 0:00:47, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0861, loss: 0.0861\n","2021-07-01 12:08:52,890 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.500e-05, eta: 0:00:45, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:08:53,792 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.500e-05, eta: 0:00:43, time: 0.903, data_time: 0.003, memory: 3518, loss_pix: 0.0787, loss: 0.0787\n","2021-07-01 12:08:54,688 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.500e-05, eta: 0:00:41, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0744, loss: 0.0744\n","2021-07-01 12:08:55,582 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.500e-05, eta: 0:00:39, time: 0.895, data_time: 0.003, memory: 3518, loss_pix: 0.0792, loss: 0.0792\n","2021-07-01 12:08:56,476 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.500e-05, eta: 0:00:38, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0645, loss: 0.0645\n","2021-07-01 12:08:57,368 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.500e-05, eta: 0:00:36, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:08:58,261 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.500e-05, eta: 0:00:34, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:59,159 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.500e-05, eta: 0:00:32, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0626, loss: 0.0626\n","2021-07-01 12:09:00,055 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.500e-05, eta: 0:00:30, time: 0.896, data_time: 0.004, memory: 3518, loss_pix: 0.0681, loss: 0.0681\n","2021-07-01 12:09:00,954 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.500e-05, eta: 0:00:28, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0671, loss: 0.0671\n","2021-07-01 12:09:01,860 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.500e-05, eta: 0:00:27, time: 0.906, data_time: 0.003, memory: 3518, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:09:02,760 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.500e-05, eta: 0:00:25, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0594, loss: 0.0594\n","2021-07-01 12:09:03,658 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.500e-05, eta: 0:00:23, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0446, loss: 0.0446\n","2021-07-01 12:09:04,555 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.500e-05, eta: 0:00:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0491, loss: 0.0491\n","2021-07-01 12:09:05,452 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.500e-05, eta: 0:00:20, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0450, loss: 0.0450\n","2021-07-01 12:09:06,351 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.500e-05, eta: 0:00:18, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0795, loss: 0.0795\n","2021-07-01 12:09:07,257 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.500e-05, eta: 0:00:17, time: 0.905, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:08,161 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.500e-05, eta: 0:00:15, time: 0.904, data_time: 0.003, memory: 3518, loss_pix: 0.0588, loss: 0.0588\n","2021-07-01 12:09:09,063 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.500e-05, eta: 0:00:13, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:09:09,955 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.500e-05, eta: 0:00:12, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0599, loss: 0.0599\n","2021-07-01 12:09:10,849 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.500e-05, eta: 0:00:10, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:11,749 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.500e-05, eta: 0:00:09, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0667, loss: 0.0667\n","2021-07-01 12:09:12,638 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.500e-05, eta: 0:00:07, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0558, loss: 0.0558\n","2021-07-01 12:09:13,576 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.500e-05, eta: 0:00:06, time: 0.938, data_time: 0.052, memory: 3518, loss_pix: 0.0577, loss: 0.0577\n","2021-07-01 12:09:14,463 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.500e-05, eta: 0:00:04, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:09:15,351 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.500e-05, eta: 0:00:02, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0578, loss: 0.0578\n","2021-07-01 12:09:16,240 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.500e-05, eta: 0:00:01, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:09:52,294 - mmedit - INFO - Saving checkpoint at 100 iterations\n","2021-07-01 12:09:52,433 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.4372, SSIM: 0.5687\n"]}],"source":["# BasicVSR(视频超分辨率 - 循环)\n","!./tools/dist_train.sh ./demo_files/demo_config_BasicVSR.py 1 "]},{"cell_type":"markdown","metadata":{"id":"QT0zwBFt7J13"},"source":["**本教程到此结束。有关更高级的用法,请参阅我们的[综合教程]()。享受使用 MMEditing 的乐趣!**"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"restorer_basic_tutorial.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3.7.7 64-bit ('pre-commit': conda)","name":"python377jvsc74a57bd04974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"},"language_info":{"name":"python","version":""},"metadata":{"interpreter":{"hash":"4974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"}}},"nbformat":4,"nbformat_minor":2} diff --git a/demo/singan_demo.py b/demo/singan_demo.py index 9633adfe1a..d263c494be 100644 --- a/demo/singan_demo.py +++ b/demo/singan_demo.py @@ -12,11 +12,11 @@ # yapf: disable sys.path.append(os.path.abspath(os.path.join(__file__, '../..'))) # isort:skip # noqa -from mmedit.engine import * # isort:skip # noqa: F401,F403,E402 -from mmedit.datasets import * # isort:skip # noqa: F401,F403,E402 -from mmedit.models import * # isort:skip # noqa: F401,F403,E402 +from mmagic.engine import * # isort:skip # noqa: F401,F403,E402 +from mmagic.datasets import * # isort:skip # noqa: F401,F403,E402 +from mmagic.models import * # isort:skip # noqa: F401,F403,E402 -from mmedit.registry import MODELS # isort:skip # noqa +from mmagic.registry import MODELS # isort:skip # noqa # yapf: enable @@ -58,7 +58,7 @@ def _tensor2img(img): @torch.no_grad() def main(): - MMLogger.get_instance('mmedit') + MMLogger.get_instance('mmagic') args = parse_args() cfg = Config.fromfile(args.config) @@ -71,7 +71,7 @@ def main(): set_random_seed(args.seed, deterministic=args.deterministic) # set scope manually - cfg.model['_scope_'] = 'mmedit' + cfg.model['_scope_'] = 'mmagic' # build the model and load checkpoint model = MODELS.build(cfg.model) diff --git a/demo/translation_demo.py b/demo/translation_demo.py index 683c8c2245..a42698608c 100644 --- a/demo/translation_demo.py +++ b/demo/translation_demo.py @@ -10,7 +10,7 @@ # yapf: disable sys.path.append(os.path.abspath(os.path.join(__file__, '../..'))) # isort:skip # noqa -from mmedit.apis import init_model, sample_img2img_model # isort:skip # noqa +from mmagic.apis import init_model, sample_img2img_model # isort:skip # noqa # yapf: enable diff --git a/demo/unconditional_demo.py b/demo/unconditional_demo.py index bae007ec77..0e7ddec7aa 100644 --- a/demo/unconditional_demo.py +++ b/demo/unconditional_demo.py @@ -10,7 +10,7 @@ # yapf: disable sys.path.append(os.path.abspath(os.path.join(__file__, '../..'))) # isort:skip # noqa -from mmedit.apis import init_model, sample_unconditional_model # isort:skip # noqa +from mmagic.apis import init_model, sample_unconditional_model # isort:skip # noqa # yapf: enable diff --git a/demo/video_interpolation_demo.py b/demo/video_interpolation_demo.py index 1cb3d8f83d..02ac110995 100644 --- a/demo/video_interpolation_demo.py +++ b/demo/video_interpolation_demo.py @@ -3,8 +3,8 @@ import torch -from mmedit.apis import init_model, video_interpolation_inference -from mmedit.utils import modify_args +from mmagic.apis import init_model, video_interpolation_inference +from mmagic.utils import modify_args VIDEO_EXTENSIONS = ('.mp4', '.mov', '.avi') From a75b3fe7f5321a002b2ae648a669cd42eb808fa5 Mon Sep 17 00:00:00 2001 From: zhangjingdong <1396925302@qq.com> Date: Wed, 19 Apr 2023 18:01:46 +0800 Subject: [PATCH 21/42] [Rename] rename to mmagic in demo --- demo/conditional_demo.py | 2 +- demo/matting_tutorial.ipynb | 24 +++++------ demo/mmediting_inference_tutorial.ipynb | 54 ++++++++++++------------ demo/restorer_basic_tutorial.ipynb | 2 +- demo/restorer_basic_tutorial_zh-CN.ipynb | 2 +- demo/translation_demo.py | 2 +- demo/unconditional_demo.py | 2 +- 7 files changed, 44 insertions(+), 44 deletions(-) diff --git a/demo/conditional_demo.py b/demo/conditional_demo.py index e8798c297a..4b81419246 100644 --- a/demo/conditional_demo.py +++ b/demo/conditional_demo.py @@ -10,7 +10,7 @@ # yapf: disable sys.path.append(os.path.abspath(os.path.join(__file__, '../..'))) # isort:skip # noqa -from mmagic.apis import init_model, sample_conditional_model # isort:skip # noqa +from mmagic.apis import init_model, sample_conditional_model # isort:skip # noqa # yapf: enable diff --git a/demo/matting_tutorial.ipynb b/demo/matting_tutorial.ipynb index e9aa953171..45757e652e 100644 --- a/demo/matting_tutorial.ipynb +++ b/demo/matting_tutorial.ipynb @@ -143,12 +143,12 @@ "Resolving deltas: 100% (6710/6710), done.\n", "/content/mmediting\n", "Obtaining file:///content/mmediting\n", - "Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.99)\n", - "Requirement already satisfied: mmcv-full>=1.3.1 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (1.4.6)\n", - "Requirement already satisfied: opencv-python<=4.5.4.60 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (4.1.2.30)\n", - "Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.18.3)\n", - "Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (2.8.0)\n", - "Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.32.0)\n", + "Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.99)\n", + "Requirement already satisfied: mmcv-full>=1.3.1 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (1.4.6)\n", + "Requirement already satisfied: opencv-python<=4.5.4.60 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (4.1.2.30)\n", + "Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.18.3)\n", + "Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (2.8.0)\n", + "Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.32.0)\n", "Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (7.1.2)\n", "Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (2.4.0)\n", "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (3.13)\n", @@ -313,7 +313,7 @@ } ], "source": [ - "from mmagic.apis import matting_inference, init_model\n", + "from mmagic.apis import matting_inference, init_model\n", "\n", "# Choose to use a config and initialize the mattor\n", "config = 'configs/indexnet/indexnet_mobv2_1x16_78k_comp1k.py'\n", @@ -1368,9 +1368,9 @@ "source": [ "import os.path as osp\n", "\n", - "from mmagic.datasets import build_dataset\n", - "from mmagic.models import build_model\n", - "from mmagic.apis import train_model\n", + "from mmagic.datasets import build_dataset\n", + "from mmagic.models import build_model\n", + "from mmagic.apis import train_model\n", "\n", "import mmcv\n", "\n", @@ -1433,8 +1433,8 @@ } ], "source": [ - "from mmagic.apis import single_gpu_test\n", - "from mmagic.datasets import build_dataloader\n", + "from mmagic.apis import single_gpu_test\n", + "from mmagic.datasets import build_dataloader\n", "from mmcv.parallel import MMDataParallel\n", "\n", "# Build a test dataloader and model\n", diff --git a/demo/mmediting_inference_tutorial.ipynb b/demo/mmediting_inference_tutorial.ipynb index 85901c202c..afdbdcd305 100644 --- a/demo/mmediting_inference_tutorial.ipynb +++ b/demo/mmediting_inference_tutorial.ipynb @@ -162,19 +162,19 @@ "/mnt/petrelfs/liuwenran/develop/mmediting\n", "Obtaining file:///mnt/petrelfs/liuwenran/develop/mmediting\n", " Preparing metadata (setup.py) ... \u001b[?25ldone\n", - "\u001b[?25hRequirement already satisfied: av in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (10.0.0)\n", - "Requirement already satisfied: face-alignment in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.3.5)\n", - "Requirement already satisfied: facexlib in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.2.5)\n", - "Requirement already satisfied: lmdb in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.3.0)\n", - "Requirement already satisfied: lpips in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.1.4)\n", - "Requirement already satisfied: mmcv>=2.0.0rc1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (2.0.0rc2)\n", - "Requirement already satisfied: mmengine in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.2.0)\n", - "Requirement already satisfied: numpy in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.23.4)\n", - "Requirement already satisfied: opencv-python!=4.5.5.62,!=4.5.5.64 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (4.6.0.66)\n", - "Requirement already satisfied: Pillow in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (9.2.0)\n", - "Requirement already satisfied: tensorboard in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (2.10.1)\n", - "Requirement already satisfied: torch in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.9.0+cu111)\n", - "Requirement already satisfied: torchvision in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.10.0+cu111)\n", + "\u001b[?25hRequirement already satisfied: av in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (10.0.0)\n", + "Requirement already satisfied: face-alignment in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.3.5)\n", + "Requirement already satisfied: facexlib in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.2.5)\n", + "Requirement already satisfied: lmdb in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.3.0)\n", + "Requirement already satisfied: lpips in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.1.4)\n", + "Requirement already satisfied: mmcv>=2.0.0rc1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (2.0.0rc2)\n", + "Requirement already satisfied: mmengine in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.2.0)\n", + "Requirement already satisfied: numpy in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.23.4)\n", + "Requirement already satisfied: opencv-python!=4.5.5.62,!=4.5.5.64 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (4.6.0.66)\n", + "Requirement already satisfied: Pillow in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (9.2.0)\n", + "Requirement already satisfied: tensorboard in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (2.10.1)\n", + "Requirement already satisfied: torch in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.9.0+cu111)\n", + "Requirement already satisfied: torchvision in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.10.0+cu111)\n", "Requirement already satisfied: addict in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1->mmedit==1.0.0rc3) (2.4.0)\n", "Requirement already satisfied: packaging in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1->mmedit==1.0.0rc3) (21.3)\n", "Requirement already satisfied: yapf in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1->mmedit==1.0.0rc3) (0.32.0)\n", @@ -292,7 +292,7 @@ } ], "source": [ - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# print all supported models for inference.\n", "inference_supported_models = MMEdit.get_inference_supported_models()\n", @@ -485,7 +485,7 @@ } ], "source": [ - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# Create a MMEdit instance\n", "editor = MMEdit('pix2pix')\n", @@ -564,7 +564,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "result_out_dir = '../resources/output/conditional/tutorial_conditinal_biggan_res_setting1.jpg'\n", "# configure setting to 1\n", @@ -614,7 +614,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "result_out_dir = '../resources/output/conditional/tutorial_conditinal_biggan_res_sample6.jpg'\n", "# use a dict to pass the parameters, num_batches means images output num for one inference\n", @@ -651,7 +651,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "editor = MMEdit('biggan', model_setting=1) \n", "editor.print_extra_parameters()\n", @@ -716,7 +716,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# Create a MMEdit instance and infer\n", "result_out_dir = '../resources/output/conditional/tutorial_conditinal_biggan_res.jpg'\n", @@ -784,7 +784,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "img = '../resources/input/inpainting/celeba_test.png'\n", "mask = '../resources/input/inpainting/bbox_mask.png'\n", @@ -867,7 +867,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "img = '../resources/input/matting/GT05.jpg'\n", "trimap = '../resources/input/matting/GT05_trimap.jpg'\n", @@ -926,7 +926,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# Create a MMEdit instance and infer\n", "img = '../resources/input/restoration/0901x2.png'\n", @@ -985,7 +985,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "img = '../resources/input/translation/gt_mask_0.png'\n", "\n", @@ -1042,7 +1042,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# Create a MMEdit instance and infer\n", "result_out_dir = '../resources/output/unconditional/tutorial_unconditional_styleganv1_res.png'\n", @@ -1082,7 +1082,7 @@ ], "source": [ "import os\n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "from mmengine import mkdir_or_exist\n", "\n", "# Create a MMEdit instance and infer\n", @@ -1126,7 +1126,7 @@ ], "source": [ "import os\n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "from mmengine import mkdir_or_exist\n", "\n", "# Create a MMEdit instance and infer\n", @@ -1194,7 +1194,7 @@ "source": [ "import mmcv\n", "import matplotlib.pyplot as plt \n", - "from mmagic.edit import MMEdit\n", + "from mmagic.edit import MMEdit\n", "\n", "# Create a MMEdit instance and infer\n", "editor = MMEdit(model_name='disco_diffusion')\n", diff --git a/demo/restorer_basic_tutorial.ipynb b/demo/restorer_basic_tutorial.ipynb index d87666c3eb..141aa69684 100644 --- a/demo/restorer_basic_tutorial.ipynb +++ b/demo/restorer_basic_tutorial.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","metadata":{"id":"T2WWQiheMF7q"},"source":["# MMEditing Basic Tutorial\n","\n","Welcome to MMEditing! This is the official Colab tutorial for MMEditing. In this tutorial you will learn how to train and test a restorer using the APIs provided in MMEditing. \n","\n","This is a quick guide for you to train and test existing models. If you want to develop you own models based on MMEditing and know more about the code structures, please refer to our comprehensive tutorial [here]().\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmedit/blob/main/demo/restorer_basic_tutorial.ipynb)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"-kYw3WQ0MQry"},"source":["## Install MMEditing\n","\n","MMEditing can be installed in three steps:\n","\n","1. Install a compatible PyTorch version (You need to check you CUDA version by using `nvcc -V`).\n","2. Install pre-compiled MMCV\n","3. Clone and install MMEditing\n","\n","The steps are shown below:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":279948,"status":"ok","timestamp":1625140820804,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"GIeIZEzZMfc0","outputId":"fe2e5ded-988d-4563-eb18-374344c316ef"},"outputs":[{"name":"stdout","output_type":"stream","text":["Looking in links: https://download.pytorch.org/whl/torch_stable.html\n","Collecting torch==1.7.0+cu110\n","\u001b[?25l Downloading https://download.pytorch.org/whl/cu110/torch-1.7.0%2Bcu110-cp37-cp37m-linux_x86_64.whl (1137.1MB)\n","\u001b[K |███████████████████████▌ | 834.1MB 1.3MB/s eta 0:03:50tcmalloc: large alloc 1147494400 bytes == 0x56458d07a000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |█████████████████████████████▊ | 1055.7MB 1.2MB/s eta 0:01:07tcmalloc: large alloc 1434370048 bytes == 0x5645d16d0000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |████████████████████████████████| 1137.1MB 1.1MB/s eta 0:00:01tcmalloc: large alloc 1421369344 bytes == 0x564626ebc000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645535c430a 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c4a81\n","\u001b[K |████████████████████████████████| 1137.1MB 16kB/s \n","\u001b[?25hCollecting torchvision==0.8.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/1d/3f/4f45249458a0dee85bff7acf4a2ac6177708253f1f318fcf6ee230fb864f/torchvision-0.8.0-cp37-cp37m-manylinux1_x86_64.whl (11.8MB)\n","\u001b[K |████████████████████████████████| 11.8MB 254kB/s \n","\u001b[?25hRequirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (3.7.4.3)\n","Collecting dataclasses\n"," Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n","Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (1.19.5)\n","Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (0.16.0)\n","Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.0) (7.1.2)\n","\u001b[31mERROR: torchtext 0.10.0 has requirement torch==1.9.0, but you'll have torch 1.7.0+cu110 which is incompatible.\u001b[0m\n","Installing collected packages: dataclasses, torch, torchvision\n"," Found existing installation: torch 1.9.0+cu102\n"," Uninstalling torch-1.9.0+cu102:\n"," Successfully uninstalled torch-1.9.0+cu102\n"," Found existing installation: torchvision 0.10.0+cu102\n"," Uninstalling torchvision-0.10.0+cu102:\n"," Successfully uninstalled torchvision-0.10.0+cu102\n","Successfully installed dataclasses-0.6 torch-1.7.0+cu110 torchvision-0.8.0\n","Looking in links: https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n","Collecting mmcv-full==1.3.5\n","\u001b[?25l Downloading https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/mmcv_full-1.3.5-cp37-cp37m-manylinux1_x86_64.whl (31.1MB)\n","\u001b[K |████████████████████████████████| 31.1MB 107kB/s \n","\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (1.19.5)\n","Collecting addict\n"," Downloading https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl\n","Collecting yapf\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/5f/0d/8814e79eb865eab42d95023b58b650d01dec6f8ea87fc9260978b1bf2167/yapf-0.31.0-py2.py3-none-any.whl (185kB)\n","\u001b[K |████████████████████████████████| 194kB 33.0MB/s \n","\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (7.1.2)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (4.1.2.30)\n","Installing collected packages: addict, yapf, mmcv-full\n","Successfully installed addict-2.4.0 mmcv-full-1.3.5 yapf-0.31.0\n","Cloning into 'mmediting'...\n","remote: Enumerating objects: 7162, done.\u001b[K\n","remote: Counting objects: 100% (1367/1367), done.\u001b[K\n","remote: Compressing objects: 100% (793/793), done.\u001b[K\n","remote: Total 7162 (delta 827), reused 928 (delta 554), pack-reused 5795\u001b[K\n","Receiving objects: 100% (7162/7162), 5.02 MiB | 32.14 MiB/s, done.\n","Resolving deltas: 100% (4826/4826), done.\n","/content/mmediting\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 1)) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 2)) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 3)) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 4)) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 5)) (0.31.0)\n","Collecting codecov\n"," Downloading https://files.pythonhosted.org/packages/93/9f/bbea5b6231308458963cb5c067bc5643da9949689702fa5a382714b59699/codecov-2.1.11-py2.py3-none-any.whl\n","Collecting flake8\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/fc/80/35a0716e5d5101e643404dabd20f07f5528a21f3ef4032d31a49c913237b/flake8-3.9.2-py2.py3-none-any.whl (73kB)\n","\u001b[K |████████████████████████████████| 81kB 9.7MB/s \n","\u001b[?25hCollecting interrogate\n"," Downloading https://files.pythonhosted.org/packages/cd/6d/ce3ac440b13c1b36b323a0eab191499a902adade3cc11b18078c07af3e6e/interrogate-1.4.0-py3-none-any.whl\n","Collecting isort==4.3.21\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n","\u001b[K |████████████████████████████████| 51kB 7.5MB/s \n","\u001b[?25hCollecting onnxruntime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/f9/76/3d0f8bb2776961c7335693df06eccf8d099e48fa6fb552c7546867192603/onnxruntime-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5MB)\n","\u001b[K |████████████████████████████████| 4.5MB 37.4MB/s \n","\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.7/dist-packages (from -r requirements/tests.txt (line 6)) (3.6.4)\n","Collecting pytest-runner\n"," Downloading https://files.pythonhosted.org/packages/f4/f5/6605d73bf3f4c198915872111b10c4b3c2dccd8485f47b7290ceef037190/pytest_runner-5.3.1-py3-none-any.whl\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (1.19.5)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (2.4.0)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (4.1.2.30)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (3.13)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.5.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.4.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.4.1)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.1.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (3.2.2)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.36.2)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.34.1)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.6.1)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.8.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (2.23.0)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.4.4)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (57.0.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.12.0)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.12.4)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.3.4)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.31.0)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.0.1)\n","Requirement already satisfied: coverage in /usr/local/lib/python3.7/dist-packages (from codecov->-r requirements/tests.txt (line 1)) (3.7.1)\n","Collecting pyflakes<2.4.0,>=2.3.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/11/2a745612f1d3cbbd9c69ba14b1b43a35a2f5c3c81cd0124508c52c64307f/pyflakes-2.3.1-py2.py3-none-any.whl (68kB)\n","\u001b[K |████████████████████████████████| 71kB 9.8MB/s \n","\u001b[?25hCollecting pycodestyle<2.8.0,>=2.7.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/cc/227251b1471f129bc35e966bb0fceb005969023926d744139642d847b7ae/pycodestyle-2.7.0-py2.py3-none-any.whl (41kB)\n","\u001b[K |████████████████████████████████| 51kB 8.7MB/s \n","\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n"," Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from flake8->-r requirements/tests.txt (line 2)) (4.5.0)\n","Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.8.9)\n","Collecting colorama\n"," Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n","Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (7.1.2)\n","Requirement already satisfied: toml in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.10.2)\n","Requirement already satisfied: py in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (1.10.0)\n","Requirement already satisfied: attrs in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (21.2.0)\n","Requirement already satisfied: flatbuffers in /usr/local/lib/python3.7/dist-packages (from onnxruntime->-r requirements/tests.txt (line 5)) (1.12)\n","Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (8.8.0)\n","Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (0.7.1)\n","Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.15.0)\n","Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.4.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->-r requirements/runtime.txt (line 3)) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (1.3.1)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (3.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2021.5.30)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (1.24.3)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2.10)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (1.3.0)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.7.2)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.2.2)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (3.1.1)\n","Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.7/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3.6\"->google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.4.8)\n","Installing collected packages: codecov, pyflakes, pycodestyle, mccabe, flake8, colorama, interrogate, isort, onnxruntime, pytest-runner\n","Successfully installed codecov-2.1.11 colorama-0.4.4 flake8-3.9.2 interrogate-1.4.0 isort-4.3.21 mccabe-0.6.1 onnxruntime-1.8.0 pycodestyle-2.7.0 pyflakes-2.3.1 pytest-runner-5.3.1\n","Created temporary directory: /tmp/pip-ephem-wheel-cache-hu6xvjxh\n","Created temporary directory: /tmp/pip-req-tracker-zk5q0q3z\n","Created requirements tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Created temporary directory: /tmp/pip-install-vr_vpseo\n","Obtaining file:///content/mmediting\n"," Added file:///content/mmediting to build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"," Running setup.py (path:/content/mmediting/setup.py) egg_info for package from file:///content/mmediting\n"," Running command python setup.py egg_info\n"," running egg_info\n"," creating mmedit.egg-info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," Source in /content/mmediting has version 0.8.0, which satisfies requirement mmedit==0.8.0 from file:///content/mmediting\n"," Removed mmedit==0.8.0 from file:///content/mmediting from build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.31.0)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (4.1.2.30)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (2.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (1.19.5)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.5.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.4.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.4.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (3.2.2)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.1.1)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.34.1)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.12.4)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.0.1)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.36.2)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.31.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.12.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (2.23.0)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.8.0)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.3.4)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.4.4)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.6.1)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (57.0.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->mmedit==0.8.0) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (1.3.1)\n","Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from grpcio>=1.24.3->tensorboard->mmedit==0.8.0) (1.15.0)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.2.2)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.7.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (1.24.3)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2.10)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2021.5.30)\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.8.0) (4.5.0)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (1.3.0)\n","Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.4.8)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (3.1.1)\n","Installing collected packages: mmedit\n"," Running setup.py develop for mmedit\n"," Running command /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/content/mmediting/setup.py'\"'\"'; __file__='\"'\"'/content/mmediting/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' develop --no-deps\n"," running develop\n"," running egg_info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," running build_ext\n"," Creating /usr/local/lib/python3.7/dist-packages/mmedit.egg-link (link to .)\n"," Adding mmedit 0.8.0 to easy-install.pth file\n","\n"," Installed /content/mmediting\n","Successfully installed mmedit\n","Cleaning up...\n","Removed build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"]}],"source":["# Install openmim for the installation of mmcv-full\n","!pip install openmim\n","\n","# Install mmcv-full thus we could use CUDA operators\n","!mim install mmcv-full\n","\n","# Clone MMEditing\n","!rm -rf mmediting\n","!git clone https://github.com/open-mmlab/mmediting.git\n","%cd mmediting\n","\n","# Install MMEditing\n","!pip install -v -e ."]},{"cell_type":"markdown","metadata":{"id":"QgX96Sc_3PcV"},"source":["## Download necessary material for this demo\n","We will need some data and configuration files in this demo. We will download it and put it in `./demo_files/`"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4723,"status":"ok","timestamp":1625140825508,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"-K0zFSJ-3V42","outputId":"528a87f7-f78e-4219-84f3-dec19b88e88a"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2021-07-01 11:59:48-- https://download.openmmlab.com/mmediting/demo_files.zip\n","Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.35\n","Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.35|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 19215781 (18M) [application/zip]\n","Saving to: ‘demo_files.zip’\n","\n","demo_files.zip 100%[===================>] 18.33M 6.00MB/s in 3.1s \n","\n","2021-07-01 11:59:52 (6.00 MB/s) - ‘demo_files.zip’ saved [19215781/19215781]\n","\n","Archive: demo_files.zip\n"," creating: demo_files/\n"," inflating: demo_files/demo_config_EDVR.py \n"," inflating: demo_files/demo_config_BasicVSR.py \n"," creating: demo_files/lq_sequences/\n"," creating: demo_files/lq_sequences/calendar/\n"," inflating: demo_files/lq_sequences/calendar/00000006.png \n"," inflating: demo_files/lq_sequences/calendar/00000007.png \n"," inflating: demo_files/lq_sequences/calendar/00000010.png \n"," inflating: demo_files/lq_sequences/calendar/00000004.png \n"," inflating: demo_files/lq_sequences/calendar/00000003.png \n"," inflating: demo_files/lq_sequences/calendar/00000001.png \n"," inflating: demo_files/lq_sequences/calendar/00000000.png \n"," inflating: demo_files/lq_sequences/calendar/00000009.png \n"," inflating: demo_files/lq_sequences/calendar/00000008.png \n"," inflating: demo_files/lq_sequences/calendar/00000002.png \n"," inflating: demo_files/lq_sequences/calendar/00000005.png \n"," creating: demo_files/lq_sequences/city/\n"," inflating: demo_files/lq_sequences/city/00000006.png \n"," inflating: demo_files/lq_sequences/city/00000007.png \n"," inflating: demo_files/lq_sequences/city/00000010.png \n"," inflating: demo_files/lq_sequences/city/00000004.png \n"," inflating: demo_files/lq_sequences/city/00000003.png \n"," inflating: demo_files/lq_sequences/city/00000001.png \n"," inflating: demo_files/lq_sequences/city/00000000.png \n"," inflating: demo_files/lq_sequences/city/00000009.png \n"," inflating: demo_files/lq_sequences/city/00000008.png \n"," inflating: demo_files/lq_sequences/city/00000002.png \n"," inflating: demo_files/lq_sequences/city/00000005.png \n"," creating: demo_files/lq_sequences/.ipynb_checkpoints/\n"," creating: demo_files/gt_images/\n"," inflating: demo_files/gt_images/bird.png \n"," inflating: demo_files/gt_images/woman.png \n"," inflating: demo_files/gt_images/head.png \n"," inflating: demo_files/gt_images/baby.png \n"," inflating: demo_files/gt_images/butterfly.png \n"," inflating: demo_files/demo_config_SRCNN.py \n"," creating: demo_files/lq_images/\n"," extracting: demo_files/lq_images/bird.png \n"," extracting: demo_files/lq_images/woman.png \n"," extracting: demo_files/lq_images/head.png \n"," extracting: demo_files/lq_images/baby.png \n"," extracting: demo_files/lq_images/butterfly.png \n"," creating: demo_files/gt_sequences/\n"," creating: demo_files/gt_sequences/calendar/\n"," inflating: demo_files/gt_sequences/calendar/00000006.png \n"," inflating: demo_files/gt_sequences/calendar/00000007.png \n"," inflating: demo_files/gt_sequences/calendar/00000010.png \n"," inflating: demo_files/gt_sequences/calendar/00000004.png \n"," inflating: demo_files/gt_sequences/calendar/00000003.png \n"," inflating: demo_files/gt_sequences/calendar/00000001.png \n"," inflating: demo_files/gt_sequences/calendar/00000000.png \n"," inflating: demo_files/gt_sequences/calendar/00000009.png \n"," inflating: demo_files/gt_sequences/calendar/00000008.png \n"," inflating: demo_files/gt_sequences/calendar/00000002.png \n"," inflating: demo_files/gt_sequences/calendar/00000005.png \n"," creating: demo_files/gt_sequences/city/\n"," inflating: demo_files/gt_sequences/city/00000006.png \n"," inflating: demo_files/gt_sequences/city/00000007.png \n"," inflating: demo_files/gt_sequences/city/00000010.png \n"," inflating: demo_files/gt_sequences/city/00000004.png \n"," inflating: demo_files/gt_sequences/city/00000003.png \n"," inflating: demo_files/gt_sequences/city/00000001.png \n"," inflating: demo_files/gt_sequences/city/00000000.png \n"," inflating: demo_files/gt_sequences/city/00000009.png \n"," inflating: demo_files/gt_sequences/city/00000008.png \n"," inflating: demo_files/gt_sequences/city/00000002.png \n"," inflating: demo_files/gt_sequences/city/00000005.png \n"," creating: demo_files/gt_sequences/.ipynb_checkpoints/\n"," creating: demo_files/.ipynb_checkpoints/\n"]}],"source":["!wget https://download.openmmlab.com/mmediting/demo_files.zip # download files\n","!unzip demo_files # unzip\n","\n","# copy the data to data/Set5 for later use\n","!mkdir data\n","!mkdir data/val_set5\n","!cp -r demo_files/lq_images data/val_set5/Set5_bicLRx4\n","!cp -r demo_files/gt_images data/val_set5/Set5"]},{"cell_type":"markdown","metadata":{"id":"zXGurqGKOeNE"},"source":["## Inference with a pre-trained image restorer\n","You can easily perform inference on a single image with a pre-trained restorer by using `restoration_demo.py`. What you need are \n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer you want to use. It specifies the model you want to use. \n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model. \n","3. `IMAGE_FILE`: The path to the input image.\n","4. `SAVE_FILE`: The location where you want to store the output image.\n","5. `imshow`: Whether to show the image. (Optional)\n","6. `GPU_ID`: Which GPU you want to use. (Optional)\n","\n","Once you have all these details, you can directly use the following command:\n","\n","```\n","python demo/restoration_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${IMAGE_FILE} ${SAVE_FILE} [--imshow] [--device ${GPU_ID}]\n","```\n","\n","**Notes:** \n","1. Configuration files are located in `./configs`. \n","2. We support loading checkpoints from url. You can go to the corresponding page (e.g. [here](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan)) to obtain the url of the pretrained model.\n","\n","---\n","\n","We will now use `SRCNN` and `ESRGAN` as examples.\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58677,"status":"ok","timestamp":1625140884175,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"KiPvtvlqM1zb","outputId":"be7375a7-4632-4770-8383-2a8ce654b069"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\" to /root/.cache/torch/hub/checkpoints/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\n","100% 83.9k/83.9k [00:00<00:00, 1.59MB/s]\n","2021-07-01 12:00:10,779 - mmedit - INFO - Use load_from_torchvision loader\n","Downloading: \"https://download.pytorch.org/models/vgg19-dcbb9e9d.pth\" to /root/.cache/torch/hub/checkpoints/vgg19-dcbb9e9d.pth\n","100% 548M/548M [00:07<00:00, 76.0MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\" to /root/.cache/torch/hub/checkpoints/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\n","100% 196M/196M [00:26<00:00, 7.61MB/s]\n","bird_ESRGAN.png bird_SRCNN.png\n"]}],"source":["# SRCNN\n","!python demo/restoration_demo.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth ./demo_files/lq_images/bird.png ./outputs/bird_SRCNN.png\n","\n","# ESRGAN\n","!python demo/restoration_demo.py ./configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth ./demo_files/lq_images/bird.png ./outputs/bird_ESRGAN.png\n","\n","# Check whether images are saved\n","!ls ./outputs"]},{"cell_type":"markdown","metadata":{"id":"W1DfGHu3Xcfd"},"source":["## Inference with a pre-trained video restorer\n","\n","MMEditing also supports video super-resolution methods, and the procedure is similar. You can use `restoration_video_demo.py` with the following arguments:\n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer you want to use\n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model. \n","3. `INPUT_DIR`: The directory containing the video frames.\n","4. `OUTPUT_DIR`: The location where you want to store the output frames.\n","5. `WINDOW_SIZE`: The window size if you are using sliding-window method (Optional).\n","6. `GPU_ID`: Which GPU you want to use (Optional).\n","```\n","python demo/restoration_video_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${INPUT_DIR} ${OUTPUT_DIR} [--window_size=$WINDOW_SIZE] [--device ${GPU_ID}]\n","```\n","**Note:** There are two different frameworks in video super-resolution: ***sliding-window*** and ***recurrent*** frameworks. When you use the methods of the sliding-window framework, such as EDVR, you need to specify `window_size`. This value is dependent on the model you use.\n","\n","---\n","\n","We will now use `EDVR` and `BasicVSR` as examples.\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29263,"status":"ok","timestamp":1625140913405,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"iaoE7UF5Xb2i","outputId":"a022e0bd-c47a-450e-f4e4-1bf9f92e4813"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\" to /root/.cache/torch/hub/checkpoints/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\n","100% 11.5M/11.5M [00:01<00:00, 8.55MB/s]\n","2021-07-01 12:01:09,689 - mmedit - INFO - Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth\" to /root/.cache/torch/hub/checkpoints/spynet_20210409-c6c1bd09.pth\n","100% 5.50M/5.50M [00:00<00:00, 8.88MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth\" to /root/.cache/torch/hub/checkpoints/basicvsr_reds4_20120409-0e599677.pth\n","100% 24.1M/24.1M [00:02<00:00, 8.97MB/s]\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# EDVR (Sliding-window framework)\n","!python demo/restoration_video_demo.py ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_EDVR --window_size=5\n","\n","# BasicVSR (Recurrent framework)\n","!python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_BasicVSR\n","\n","# Check whether video frames are saved\n","!ls ./outputs/calendar_BasicVSR"]},{"cell_type":"markdown","metadata":{"id":"Rf3LW57qMHXb"},"source":["## Test on a pre-defined dataset using the configuration file\n","\n","The above demos provide an easy way to perform inference on a single image or video sequence. If you want to perform inference on a set of images or sequences, you can make use of the configuration files located in `./configs`.\n"," \n","Existing configuration files allow you to perform inference on common datasets, such as `Set5` in image super-resolution and `REDS4` in video super-resolution. You can use the following command:\n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer and dataset you want to use\n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model.\n","3. `GPU_NUM`: Number of GPUs used for test. \n","4. `RESULT_FILE`: The path to the output result pickle file. (Optional)\n","5. `IMAGE_SAVE_PATH`: The location where you want to store the output image. (Optional)\n","\n","```\n","# single-gpu testing\n","python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","\n","# multi-gpu testing\n","./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","```\n","What you need to do is to modify the `lq_folder` and `gt_folder` in the configuration file:\n","```\n","test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/val_set5/Set5_bicLRx4',\n"," gt_folder='data/val_set5/Set5',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","```\n","\n","**Note**: Some dataset type (e.g. `SRREDSDataset`) requires an annotation file specifying the details of the dataset. Please refer to the corresponding file\n","in `./mmedit/dataset/` for more details. \n","\n","---\n","\n","The following is the command for SRCNN. For other models, you can simply change the paths to the configuration file and pretrained model. \n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14095,"status":"ok","timestamp":1625140927462,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"tClgIYgcbbVg","outputId":"c37ec2de-e1c9-42ae-ed9b-31009d48ae64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"tools/test.py\", line 136, in \n"," main()\n"," File \"tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/test.py\", line 136, in \n"," main()\n"," File \"./tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/test.py', '--local_rank=0', './configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py', 'https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth', '--launcher', 'pytorch', '--save-path', './outputs/']' returned non-zero exit status 1.\n"]}],"source":["# single-gpu\n","!python tools/test.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/\n","\n","# multi-gpu testing\n","!./tools/dist_test.sh ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth 1 --save-path ./outputs/"]},{"cell_type":"markdown","metadata":{"id":"KWKVyeEQelh3"},"source":["## Test on your own datasets\n","\n","When you want to test on your own datasets, you need to modify `test_dataset_type` in addition to the dataset paths. \n","\n","- For image super-resolution, you need to use `SRFolderDataset`\n","- For sliding-window framework in video super-resolution (e.g. EDVR, TDAN), you need to use `SRFolderVideoDataset`.\n","- For recurrent framework in video super-resolution (e.g. BasicVSR, IconVSR), you need to use `SRFolderMultipleGTDataset`.\n","\n","These dataset types assume that all images/sequences in the specified directory are used for test. The folder structures should be\n","```\n","| lq_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," | ...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","| gt_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," |...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","```\n","We will use **SRCNN**, **EDVR**, **BasicVSR** as examples. Please pay attention to the settings of `test_dataset_type` and `data['test']`. "]},{"cell_type":"markdown","metadata":{"id":"0p2rP8jV_dL1"},"source":["**SRCNN**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8729,"status":"ok","timestamp":1625140936180,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"4kEev4wVIq_L","outputId":"8026ed73-f781-4eb2-bb80-d3446bd131df"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 5/5, 8.6 task/s, elapsed: 1s, ETA: 0s\n","Eval-PSNR: 28.433974369836108\n","Eval-SSIM: 0.8099053586583066\n","baby.png bird.png butterfly.png head.png woman.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_SRCNN.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/testset_SRCNN\n","\n","# Check the output folder\n","!ls ./outputs/testset_SRCNN"]},{"cell_type":"markdown","metadata":{"id":"RONzjTTU_gem"},"source":["**EDVR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":19671,"status":"ok","timestamp":1625140955813,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"vL8WOWXY0fNJ","outputId":"dc2a8f81-9bef-4ad4-c5b2-c6f124e6b113"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 22/22, 2.0 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 23.89569862011228\n","Eval-SSIM: 0.7667098470108678\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_EDVR.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth --save-path ./outputs/testset_EDVR\n","\n","# # Check the output folder\n","!ls ./outputs/testset_EDVR\n","!ls ./outputs/testset_EDVR/city"]},{"cell_type":"markdown","metadata":{"id":"5Tc7F-l5_i1e"},"source":["**BasicVSR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":20220,"status":"ok","timestamp":1625140976026,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"jpW5GWC74Yvu","outputId":"7ba02a32-d4ec-40b2-8108-ef0729b62147"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:07,780 - mmedit - INFO - Use load_from_http loader\n","Use load_from_http loader\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","[>>] 2/2, 0.2 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 24.195768601433734\n","Eval-SSIM: 0.7828541339512978\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_BasicVSR.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth --save-path ./outputs/testset_BasicVSR\n","\n","# # Check the output folder\n","!ls ./outputs/testset_BasicVSR\n","!ls ./outputs/testset_BasicVSR/calendar"]},{"cell_type":"markdown","metadata":{"id":"4DQxNL8BhI0y"},"source":["## Train a restorer on a pre-defined dataset\n","\n","MMEditing uses distributed training. The following command can be used for training. If you want to train on the pre-defined datasets specified in our configuration file, you can simply run the following command.\n","\n","```\n","./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]\n","```\n","\n","For more details about the optional arguments, please refer to `tools/train.py`.\n","\n","---\n","\n","Here is an example using EDVR.\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9337,"status":"ok","timestamp":1625140985357,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"s-hOnSF6ItQM","outputId":"e40e960a-29e1-43e8-b922-5e08c4e98afe"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:31,961 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:31,961 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:31,961 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:31,961 - mmedit - INFO - Config:\n","/content/mmediting/configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py\n","exp_name = 'edvrm_wotsa_x4_g8_600k_reds'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRREDSDataset'\n","val_dataset_type = 'SRREDSDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 600000\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50000, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=100,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 54, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 63, in load_annotations\n"," with open(self.ann_file, 'r') as fin:\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/train.py\", line 145, in \n"," main()\n"," File \"./tools/train.py\", line 111, in main\n"," datasets = [build_dataset(cfg.data.train)]\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 76, in build_dataset\n"," build_dataset(cfg['dataset'], default_args), cfg['times'])\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRREDSDataset: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/train.py', '--local_rank=0', './configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py', '--launcher', 'pytorch']' returned non-zero exit status 1.\n"]}],"source":["!./tools/dist_train.sh ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py 1"]},{"cell_type":"markdown","metadata":{"id":"b0VfQkQQjg8N"},"source":["## Train a restorer on your own datasets\n","\n","Similar to the case when you want to test on your own datasets, you need to modify `train_dataset_type`. The dataset type you need is identical:\n","\n","- For image super-resolution, you need to use `SRFolderDataset`\n","- For sliding-window framework in video super-resolution (e.g. EDVR, TDAN), you need to use `SRFolderVideoDataset`.\n","- For recurrent framework in video super-resolution (e.g. BasicVSR, IconVSR), you need to use `SRFolderMultipleGTDataset`.\n","\n","After you modified the dataset type and the data path. You are all set to go."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":128384,"status":"ok","timestamp":1625141113733,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"liGEKJpbIoXZ","outputId":"84e1502e-e2cb-458f-c7c5-e4b401e570b7"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:41,185 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:41,185 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:41,185 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:41,185 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_SRCNN.py\n","exp_name = 'srcnn_demo'\n","\n","scale = 4\n","# model settings\n","model = dict(\n"," type='BasicRestorer',\n"," generator=dict(\n"," type='SRCNN',\n"," channels=(3, 64, 32, 3),\n"," kernel_sizes=(9, 1, 5),\n"," upscale_factor=scale),\n"," pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=scale)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderDataset'\n","val_dataset_type = 'SRFolderDataset'\n","train_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=128),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","test_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'lq_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=8,\n"," train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=train_pipeline,\n"," scale=scale)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[250000, 250000, 250000, 250000],\n"," restart_weights=[1, 1, 1, 1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","evaluation = dict(interval=50, save_image=True, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./experiments/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:02:41,192 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/experiments/srcnn_demo\n","2021-07-01 12:02:41,192 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:02:41.529307: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:03:18,631 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.000e-04, eta: 0:57:01, time: 34.560, data_time: 34.446, memory: 586, loss_pix: 0.3999, loss: 0.3999\n","2021-07-01 12:03:18,712 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","INFO:mmedit:Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","2021-07-01 12:03:18,764 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","INFO:mmedit:Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","2021-07-01 12:03:18,840 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","INFO:mmedit:Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","2021-07-01 12:03:18,916 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","INFO:mmedit:Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","2021-07-01 12:03:18,956 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","INFO:mmedit:Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","2021-07-01 12:03:19,012 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","INFO:mmedit:Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","2021-07-01 12:03:19,070 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","INFO:mmedit:Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","2021-07-01 12:03:19,142 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","INFO:mmedit:Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","2021-07-01 12:03:19,212 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","INFO:mmedit:Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","2021-07-01 12:03:19,261 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","INFO:mmedit:Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","2021-07-01 12:03:19,302 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","INFO:mmedit:Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","2021-07-01 12:03:19,357 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","INFO:mmedit:Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","2021-07-01 12:03:19,419 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","INFO:mmedit:Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","2021-07-01 12:03:19,473 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","INFO:mmedit:Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","2021-07-01 12:03:19,538 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","INFO:mmedit:Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","2021-07-01 12:03:19,603 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","INFO:mmedit:Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","2021-07-01 12:03:19,657 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","INFO:mmedit:Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","2021-07-01 12:03:19,716 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","INFO:mmedit:Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","2021-07-01 12:03:19,772 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","INFO:mmedit:Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","2021-07-01 12:03:19,834 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","INFO:mmedit:Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","2021-07-01 12:03:19,877 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","INFO:mmedit:Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","2021-07-01 12:03:19,947 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","INFO:mmedit:Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","2021-07-01 12:03:20,014 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","INFO:mmedit:Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","2021-07-01 12:03:20,068 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","INFO:mmedit:Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","2021-07-01 12:03:20,124 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","INFO:mmedit:Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","2021-07-01 12:03:20,181 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","INFO:mmedit:Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","2021-07-01 12:03:20,244 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","INFO:mmedit:Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","2021-07-01 12:03:20,310 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","INFO:mmedit:Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","2021-07-01 12:03:20,356 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","INFO:mmedit:Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","2021-07-01 12:03:20,410 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","INFO:mmedit:Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","2021-07-01 12:03:20,480 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","INFO:mmedit:Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","2021-07-01 12:03:20,536 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","INFO:mmedit:Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","2021-07-01 12:03:20,595 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","INFO:mmedit:Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","2021-07-01 12:03:20,656 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","INFO:mmedit:Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","2021-07-01 12:03:20,710 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","INFO:mmedit:Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","2021-07-01 12:03:20,779 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:20,846 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","INFO:mmedit:Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","2021-07-01 12:03:20,907 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:20,958 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","INFO:mmedit:Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","2021-07-01 12:03:21,028 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","INFO:mmedit:Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","2021-07-01 12:03:21,122 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","INFO:mmedit:Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","2021-07-01 12:03:21,181 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:21,418 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","INFO:mmedit:Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","2021-07-01 12:03:21,480 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:21,551 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","INFO:mmedit:Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","2021-07-01 12:03:21,618 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","INFO:mmedit:Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","2021-07-01 12:03:21,667 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","INFO:mmedit:Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","2021-07-01 12:03:21,743 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","INFO:mmedit:Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","[>>] 5/5, 0.1 task/s, elapsed: 37s, ETA: 0s\n","\n","2021-07-01 12:03:59,996 - mmedit - INFO - Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","INFO:mmedit:Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","2021-07-01 12:04:00,047 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","INFO:mmedit:Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","2021-07-01 12:04:00,114 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","INFO:mmedit:Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","2021-07-01 12:04:00,181 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","INFO:mmedit:Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","2021-07-01 12:04:00,251 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","INFO:mmedit:Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","2021-07-01 12:04:00,315 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","INFO:mmedit:Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","2021-07-01 12:04:00,373 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","INFO:mmedit:Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","2021-07-01 12:04:00,418 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","INFO:mmedit:Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","2021-07-01 12:04:00,478 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","INFO:mmedit:Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","2021-07-01 12:04:00,538 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","INFO:mmedit:Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","2021-07-01 12:04:00,606 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","INFO:mmedit:Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","2021-07-01 12:04:00,647 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","INFO:mmedit:Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","2021-07-01 12:04:00,711 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","INFO:mmedit:Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","2021-07-01 12:04:00,757 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","INFO:mmedit:Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","2021-07-01 12:04:00,799 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","INFO:mmedit:Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","2021-07-01 12:04:00,871 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:00,938 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:00,995 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","INFO:mmedit:Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","2021-07-01 12:04:01,051 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","INFO:mmedit:Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","2021-07-01 12:04:01,115 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:01,196 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","INFO:mmedit:Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","2021-07-01 12:04:01,256 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","INFO:mmedit:Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","2021-07-01 12:04:01,325 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","INFO:mmedit:Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","2021-07-01 12:04:01,381 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","INFO:mmedit:Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:04:01,429 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","INFO:mmedit:Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","2021-07-01 12:04:01,497 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","INFO:mmedit:Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","2021-07-01 12:04:01,545 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","INFO:mmedit:Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","2021-07-01 12:04:01,597 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","INFO:mmedit:Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","2021-07-01 12:04:01,671 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","INFO:mmedit:Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:04:01,724 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:01,777 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","INFO:mmedit:Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","2021-07-01 12:04:01,847 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","INFO:mmedit:Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","2021-07-01 12:04:01,905 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","INFO:mmedit:Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","2021-07-01 12:04:01,953 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","INFO:mmedit:Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","2021-07-01 12:04:02,025 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","INFO:mmedit:Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","2021-07-01 12:04:02,079 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","INFO:mmedit:Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","2021-07-01 12:04:02,137 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","INFO:mmedit:Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","2021-07-01 12:04:02,193 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:02,255 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","INFO:mmedit:Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:04:02,341 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","INFO:mmedit:Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","2021-07-01 12:04:02,394 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","INFO:mmedit:Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","2021-07-01 12:04:02,496 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","INFO:mmedit:Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","2021-07-01 12:04:02,552 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:02,629 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","INFO:mmedit:Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","2021-07-01 12:04:02,682 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","INFO:mmedit:Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","2021-07-01 12:04:02,791 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","INFO:mmedit:Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","2021-07-01 12:04:02,834 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","INFO:mmedit:Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","2021-07-01 12:04:02,900 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","INFO:mmedit:Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","2021-07-01 12:04:03,053 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","INFO:mmedit:Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:04:03,108 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","INFO:mmedit:Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","[>>] 5/5, 0.2 task/s, elapsed: 33s, ETA: 0s\n","\n","2021-07-01 12:04:37,412 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:04:37,422 - mmedit - INFO - Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n","INFO:mmedit:Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n"]}],"source":["# SRCNN (Single Image Super-Resolution)\n","!./tools/dist_train.sh ./demo_files/demo_config_SRCNN.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":117937,"status":"ok","timestamp":1625141554036,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"26uZ4Ak7qbC9","outputId":"2fb26527-eb9e-4b48-e03c-ba9a91c60db8"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:10:12,619 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:10:12,619 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:10:12,619 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:10:12,619 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_EDVR.py\n","exp_name = 'edvrm_demo'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderVideoDataset'\n","val_dataset_type = 'SRFolderVideoDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:10:12,701 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/edvrm_demo\n","2021-07-01 12:10:12,702 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:10:12.951771: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:10:30,703 - mmedit - INFO - Iter [1/100]\tlr_generator: 4.000e-04, eta: 0:26:53, time: 16.295, data_time: 15.833, memory: 1341, loss_pix: 63917.2734, loss: 63917.2734\n","2021-07-01 12:10:31,046 - mmedit - INFO - Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","INFO:mmedit:Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","2021-07-01 12:10:31,386 - mmedit - INFO - Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","INFO:mmedit:Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","2021-07-01 12:10:31,731 - mmedit - INFO - Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","INFO:mmedit:Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","2021-07-01 12:10:32,071 - mmedit - INFO - Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","INFO:mmedit:Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","2021-07-01 12:10:32,414 - mmedit - INFO - Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","INFO:mmedit:Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","2021-07-01 12:10:32,760 - mmedit - INFO - Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","INFO:mmedit:Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","2021-07-01 12:10:33,102 - mmedit - INFO - Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","INFO:mmedit:Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","2021-07-01 12:10:33,447 - mmedit - INFO - Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","INFO:mmedit:Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","2021-07-01 12:10:33,792 - mmedit - INFO - Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","INFO:mmedit:Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","2021-07-01 12:10:34,138 - mmedit - INFO - Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","INFO:mmedit:Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","2021-07-01 12:10:34,484 - mmedit - INFO - Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","INFO:mmedit:Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","2021-07-01 12:10:34,829 - mmedit - INFO - Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","INFO:mmedit:Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","2021-07-01 12:10:35,175 - mmedit - INFO - Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","INFO:mmedit:Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","2021-07-01 12:10:35,522 - mmedit - INFO - Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","INFO:mmedit:Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","2021-07-01 12:10:35,866 - mmedit - INFO - Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","INFO:mmedit:Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","2021-07-01 12:10:36,212 - mmedit - INFO - Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","INFO:mmedit:Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","2021-07-01 12:10:36,560 - mmedit - INFO - Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","INFO:mmedit:Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","2021-07-01 12:10:36,904 - mmedit - INFO - Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","INFO:mmedit:Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","2021-07-01 12:10:37,249 - mmedit - INFO - Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","INFO:mmedit:Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","2021-07-01 12:10:37,595 - mmedit - INFO - Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","INFO:mmedit:Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","2021-07-01 12:10:37,939 - mmedit - INFO - Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","INFO:mmedit:Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","2021-07-01 12:10:38,283 - mmedit - INFO - Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","INFO:mmedit:Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","2021-07-01 12:10:38,628 - mmedit - INFO - Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","INFO:mmedit:Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","2021-07-01 12:10:38,974 - mmedit - INFO - Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","INFO:mmedit:Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","2021-07-01 12:10:39,318 - mmedit - INFO - Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","INFO:mmedit:Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","2021-07-01 12:10:39,665 - mmedit - INFO - Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","INFO:mmedit:Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","2021-07-01 12:10:40,011 - mmedit - INFO - Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","INFO:mmedit:Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","2021-07-01 12:10:40,356 - mmedit - INFO - Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","INFO:mmedit:Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","2021-07-01 12:10:40,703 - mmedit - INFO - Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","INFO:mmedit:Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","2021-07-01 12:10:41,049 - mmedit - INFO - Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","INFO:mmedit:Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","2021-07-01 12:10:41,396 - mmedit - INFO - Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","INFO:mmedit:Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","2021-07-01 12:10:41,745 - mmedit - INFO - Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","INFO:mmedit:Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","2021-07-01 12:10:42,097 - mmedit - INFO - Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","INFO:mmedit:Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","2021-07-01 12:10:42,444 - mmedit - INFO - Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","INFO:mmedit:Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","2021-07-01 12:10:42,790 - mmedit - INFO - Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","INFO:mmedit:Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","2021-07-01 12:10:43,140 - mmedit - INFO - Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","INFO:mmedit:Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","2021-07-01 12:10:43,490 - mmedit - INFO - Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","INFO:mmedit:Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","2021-07-01 12:10:43,841 - mmedit - INFO - Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","INFO:mmedit:Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","2021-07-01 12:10:44,193 - mmedit - INFO - Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","INFO:mmedit:Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","2021-07-01 12:10:44,541 - mmedit - INFO - Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","INFO:mmedit:Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","2021-07-01 12:10:44,895 - mmedit - INFO - Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","INFO:mmedit:Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","2021-07-01 12:10:45,248 - mmedit - INFO - Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","INFO:mmedit:Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","2021-07-01 12:10:45,595 - mmedit - INFO - Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","INFO:mmedit:Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","2021-07-01 12:10:45,950 - mmedit - INFO - Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","INFO:mmedit:Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","2021-07-01 12:10:46,301 - mmedit - INFO - Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","INFO:mmedit:Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","2021-07-01 12:10:46,649 - mmedit - INFO - Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","INFO:mmedit:Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","2021-07-01 12:10:47,003 - mmedit - INFO - Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","INFO:mmedit:Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","2021-07-01 12:10:47,356 - mmedit - INFO - Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","INFO:mmedit:Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:14,231 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","INFO:mmedit:Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","2021-07-01 12:11:14,578 - mmedit - INFO - Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","INFO:mmedit:Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","2021-07-01 12:11:14,930 - mmedit - INFO - Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","INFO:mmedit:Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","2021-07-01 12:11:15,289 - mmedit - INFO - Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","INFO:mmedit:Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","2021-07-01 12:11:15,642 - mmedit - INFO - Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","INFO:mmedit:Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","2021-07-01 12:11:15,993 - mmedit - INFO - Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","INFO:mmedit:Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","2021-07-01 12:11:16,354 - mmedit - INFO - Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","INFO:mmedit:Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","2021-07-01 12:11:16,712 - mmedit - INFO - Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","INFO:mmedit:Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","2021-07-01 12:11:17,065 - mmedit - INFO - Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","INFO:mmedit:Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","2021-07-01 12:11:17,425 - mmedit - INFO - Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","INFO:mmedit:Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","2021-07-01 12:11:17,780 - mmedit - INFO - Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","INFO:mmedit:Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","2021-07-01 12:11:18,135 - mmedit - INFO - Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","INFO:mmedit:Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","2021-07-01 12:11:18,495 - mmedit - INFO - Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","INFO:mmedit:Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","2021-07-01 12:11:18,851 - mmedit - INFO - Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","INFO:mmedit:Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","2021-07-01 12:11:19,210 - mmedit - INFO - Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","INFO:mmedit:Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","2021-07-01 12:11:19,567 - mmedit - INFO - Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","INFO:mmedit:Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","2021-07-01 12:11:19,923 - mmedit - INFO - Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","INFO:mmedit:Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","2021-07-01 12:11:20,286 - mmedit - INFO - Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","INFO:mmedit:Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","2021-07-01 12:11:20,644 - mmedit - INFO - Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","INFO:mmedit:Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","2021-07-01 12:11:21,000 - mmedit - INFO - Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","INFO:mmedit:Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","2021-07-01 12:11:21,359 - mmedit - INFO - Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","INFO:mmedit:Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","2021-07-01 12:11:21,719 - mmedit - INFO - Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","INFO:mmedit:Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","2021-07-01 12:11:22,072 - mmedit - INFO - Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","INFO:mmedit:Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","2021-07-01 12:11:22,434 - mmedit - INFO - Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","INFO:mmedit:Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","2021-07-01 12:11:22,798 - mmedit - INFO - Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","INFO:mmedit:Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","2021-07-01 12:11:23,158 - mmedit - INFO - Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","INFO:mmedit:Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","2021-07-01 12:11:23,513 - mmedit - INFO - Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","INFO:mmedit:Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","2021-07-01 12:11:23,875 - mmedit - INFO - Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","INFO:mmedit:Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","2021-07-01 12:11:24,236 - mmedit - INFO - Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","INFO:mmedit:Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","2021-07-01 12:11:24,597 - mmedit - INFO - Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","INFO:mmedit:Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","2021-07-01 12:11:24,951 - mmedit - INFO - Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","INFO:mmedit:Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","2021-07-01 12:11:25,313 - mmedit - INFO - Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","INFO:mmedit:Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","2021-07-01 12:11:25,677 - mmedit - INFO - Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","INFO:mmedit:Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","2021-07-01 12:11:26,038 - mmedit - INFO - Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","INFO:mmedit:Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","2021-07-01 12:11:26,393 - mmedit - INFO - Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","INFO:mmedit:Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","2021-07-01 12:11:26,753 - mmedit - INFO - Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","INFO:mmedit:Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","2021-07-01 12:11:27,115 - mmedit - INFO - Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","INFO:mmedit:Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","2021-07-01 12:11:27,472 - mmedit - INFO - Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","INFO:mmedit:Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","2021-07-01 12:11:27,830 - mmedit - INFO - Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","INFO:mmedit:Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","2021-07-01 12:11:28,189 - mmedit - INFO - Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","INFO:mmedit:Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","2021-07-01 12:11:28,553 - mmedit - INFO - Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","INFO:mmedit:Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","2021-07-01 12:11:28,910 - mmedit - INFO - Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","INFO:mmedit:Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","2021-07-01 12:11:29,266 - mmedit - INFO - Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","INFO:mmedit:Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","2021-07-01 12:11:29,628 - mmedit - INFO - Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","INFO:mmedit:Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","2021-07-01 12:11:29,989 - mmedit - INFO - Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","INFO:mmedit:Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","2021-07-01 12:11:30,345 - mmedit - INFO - Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","INFO:mmedit:Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","2021-07-01 12:11:30,704 - mmedit - INFO - Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","INFO:mmedit:Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","2021-07-01 12:11:31,067 - mmedit - INFO - Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","INFO:mmedit:Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","2021-07-01 12:11:31,425 - mmedit - INFO - Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","INFO:mmedit:Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","2021-07-01 12:11:31,782 - mmedit - INFO - Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","INFO:mmedit:Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:58,494 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:11:58,598 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n","INFO:mmedit:Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n"]}],"source":["# EDVR (Video Super-Resolution - Sliding Window)\n","!./tools/dist_train.sh ./demo_files/demo_config_EDVR.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":197033,"status":"ok","timestamp":1625141428032,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"_RdqmlT6qgt2","outputId":"b951b426-e06c-4f31-db01-449333eab333"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:06:47,253 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:06:47,253 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:06:47,254 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:06:47,254 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_BasicVSR.py\n","exp_name = 'basicvsr_demo'\n","\n","# model settings\n","model = dict(\n"," type='BasicVSR',\n"," generator=dict(\n"," type='BasicVSRNet',\n"," mid_channels=64,\n"," num_blocks=30,\n"," spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'\n"," 'basicvsr/spynet_20210409-c6c1bd09.pth'),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = dict(fix_iter=5000)\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderMultipleGTDataset'\n","val_dataset_type = 'SRFolderMultipleGTDataset'\n","\n","train_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=6,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True), # 2 gpus\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1, workers_per_gpu=1),\n","\n"," # train\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," # val\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," # test\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(\n"," generator=dict(\n"," type='Adam',\n"," lr=2e-4,\n"," betas=(0.9, 0.99),\n"," paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)})))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[300000],\n"," restart_weights=[1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," # dict(type='TensorboardLoggerHook'),\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","find_unused_parameters = True\n","\n","2021-07-01 12:06:47,291 - mmedit - INFO - Use load_from_http loader\n","2021-07-01 12:06:47,569 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/basicvsr_demo\n","2021-07-01 12:06:47,569 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:07:14,210 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.500e-05, eta: 0:42:52, time: 25.981, data_time: 24.045, memory: 3464, loss_pix: 0.0634, loss: 0.0634\n","2021-07-01 12:07:15,171 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.500e-05, eta: 0:22:00, time: 0.961, data_time: 0.011, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","2021-07-01 12:07:16,052 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.500e-05, eta: 0:14:59, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0476, loss: 0.0476\n","2021-07-01 12:07:16,940 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.500e-05, eta: 0:11:29, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:17,829 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.500e-05, eta: 0:09:22, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0796, loss: 0.0796\n","2021-07-01 12:07:18,712 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.500e-05, eta: 0:07:57, time: 0.884, data_time: 0.004, memory: 3518, loss_pix: 0.0680, loss: 0.0680\n","2021-07-01 12:07:19,594 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.500e-05, eta: 0:06:56, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0607, loss: 0.0607\n","2021-07-01 12:07:20,481 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.500e-05, eta: 0:06:10, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0598, loss: 0.0598\n","2021-07-01 12:07:21,361 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.500e-05, eta: 0:05:35, time: 0.880, data_time: 0.003, memory: 3518, loss_pix: 0.0664, loss: 0.0664\n","2021-07-01 12:07:22,274 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.500e-05, eta: 0:05:06, time: 0.913, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:07:23,161 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.500e-05, eta: 0:04:42, time: 0.887, data_time: 0.005, memory: 3518, loss_pix: 0.0771, loss: 0.0771\n","2021-07-01 12:07:24,058 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.500e-05, eta: 0:04:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0521, loss: 0.0521\n","2021-07-01 12:07:24,944 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.500e-05, eta: 0:04:05, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:07:25,835 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.500e-05, eta: 0:03:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0515, loss: 0.0515\n","2021-07-01 12:07:26,723 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.500e-05, eta: 0:03:38, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0674, loss: 0.0674\n","2021-07-01 12:07:27,609 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.500e-05, eta: 0:03:26, time: 0.886, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:28,498 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.500e-05, eta: 0:03:16, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0670, loss: 0.0670\n","2021-07-01 12:07:29,388 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.500e-05, eta: 0:03:07, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0663, loss: 0.0663\n","2021-07-01 12:07:30,284 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.500e-05, eta: 0:02:59, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0633, loss: 0.0633\n","2021-07-01 12:07:31,176 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.500e-05, eta: 0:02:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0482, loss: 0.0482\n","2021-07-01 12:07:32,073 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.500e-05, eta: 0:02:44, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0743, loss: 0.0743\n","2021-07-01 12:07:32,966 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.500e-05, eta: 0:02:38, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0690, loss: 0.0690\n","2021-07-01 12:07:33,858 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.500e-05, eta: 0:02:32, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0437, loss: 0.0437\n","2021-07-01 12:07:34,750 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.500e-05, eta: 0:02:27, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:35,642 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.500e-05, eta: 0:02:22, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0781, loss: 0.0781\n","2021-07-01 12:07:36,533 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.500e-05, eta: 0:02:17, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:07:37,427 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.500e-05, eta: 0:02:13, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:07:38,321 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.500e-05, eta: 0:02:08, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0567, loss: 0.0567\n","2021-07-01 12:07:39,212 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.500e-05, eta: 0:02:04, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0846, loss: 0.0846\n","2021-07-01 12:07:40,104 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.500e-05, eta: 0:02:01, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0658, loss: 0.0658\n","2021-07-01 12:07:40,993 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.500e-05, eta: 0:01:57, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0502, loss: 0.0502\n","2021-07-01 12:07:41,885 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.500e-05, eta: 0:01:54, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0622, loss: 0.0622\n","2021-07-01 12:07:42,787 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.500e-05, eta: 0:01:50, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0657, loss: 0.0657\n","2021-07-01 12:07:43,674 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.500e-05, eta: 0:01:47, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0643, loss: 0.0643\n","2021-07-01 12:07:44,567 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.500e-05, eta: 0:01:44, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0898, loss: 0.0898\n","2021-07-01 12:07:45,458 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.500e-05, eta: 0:01:41, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0865, loss: 0.0865\n","2021-07-01 12:07:46,341 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.500e-05, eta: 0:01:38, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0511, loss: 0.0511\n","2021-07-01 12:07:47,225 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.500e-05, eta: 0:01:36, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:48,109 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.500e-05, eta: 0:01:33, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0653, loss: 0.0653\n","2021-07-01 12:07:48,990 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:07:49,874 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.885, data_time: 0.003, memory: 3518, loss_pix: 0.0788, loss: 0.0788\n","2021-07-01 12:07:50,755 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.500e-05, eta: 0:01:26, time: 0.881, data_time: 0.005, memory: 3518, loss_pix: 0.0605, loss: 0.0605\n","2021-07-01 12:07:51,638 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.500e-05, eta: 0:01:24, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0539, loss: 0.0539\n","2021-07-01 12:07:52,518 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.500e-05, eta: 0:01:21, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0503, loss: 0.0503\n","2021-07-01 12:07:53,395 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.500e-05, eta: 0:01:19, time: 0.877, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:07:54,273 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0555, loss: 0.0555\n","2021-07-01 12:07:55,159 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.500e-05, eta: 0:01:15, time: 0.886, data_time: 0.007, memory: 3518, loss_pix: 0.0806, loss: 0.0806\n","2021-07-01 12:07:56,040 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.500e-05, eta: 0:01:13, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0576, loss: 0.0576\n","2021-07-01 12:07:56,919 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.500e-05, eta: 0:01:11, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0871, loss: 0.0871\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:08:32,618 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9899, SSIM: 0.5295\n","2021-07-01 12:08:33,591 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.500e-05, eta: 0:01:40, time: 35.792, data_time: 34.822, memory: 3518, loss_pix: 0.0773, loss: 0.0773\n","2021-07-01 12:08:34,462 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.500e-05, eta: 0:01:37, time: 0.871, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:08:35,326 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.500e-05, eta: 0:01:34, time: 0.864, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:36,192 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0575, loss: 0.0575\n","2021-07-01 12:08:37,069 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.876, data_time: 0.003, memory: 3518, loss_pix: 0.0842, loss: 0.0842\n","2021-07-01 12:08:37,942 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.500e-05, eta: 0:01:25, time: 0.873, data_time: 0.003, memory: 3518, loss_pix: 0.0836, loss: 0.0836\n","2021-07-01 12:08:38,808 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.500e-05, eta: 0:01:22, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0580, loss: 0.0580\n","2021-07-01 12:08:39,679 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.500e-05, eta: 0:01:20, time: 0.870, data_time: 0.003, memory: 3518, loss_pix: 0.0449, loss: 0.0449\n","2021-07-01 12:08:40,557 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0702, loss: 0.0702\n","2021-07-01 12:08:41,430 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.500e-05, eta: 0:01:14, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:42,308 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.500e-05, eta: 0:01:12, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:08:43,182 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.500e-05, eta: 0:01:09, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0489, loss: 0.0489\n","2021-07-01 12:08:44,056 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.500e-05, eta: 0:01:07, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0566, loss: 0.0566\n","2021-07-01 12:08:44,932 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.500e-05, eta: 0:01:05, time: 0.875, data_time: 0.003, memory: 3518, loss_pix: 0.0597, loss: 0.0597\n","2021-07-01 12:08:45,819 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.500e-05, eta: 0:01:02, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0640, loss: 0.0640\n","2021-07-01 12:08:46,698 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.500e-05, eta: 0:01:00, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:47,580 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.500e-05, eta: 0:00:58, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:08:48,464 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.500e-05, eta: 0:00:56, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:08:49,347 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.500e-05, eta: 0:00:54, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0603, loss: 0.0603\n","2021-07-01 12:08:50,229 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.500e-05, eta: 0:00:51, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0478, loss: 0.0478\n","2021-07-01 12:08:51,113 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.500e-05, eta: 0:00:49, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:08:52,000 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.500e-05, eta: 0:00:47, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0861, loss: 0.0861\n","2021-07-01 12:08:52,890 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.500e-05, eta: 0:00:45, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:08:53,792 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.500e-05, eta: 0:00:43, time: 0.903, data_time: 0.003, memory: 3518, loss_pix: 0.0787, loss: 0.0787\n","2021-07-01 12:08:54,688 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.500e-05, eta: 0:00:41, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0744, loss: 0.0744\n","2021-07-01 12:08:55,582 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.500e-05, eta: 0:00:39, time: 0.895, data_time: 0.003, memory: 3518, loss_pix: 0.0792, loss: 0.0792\n","2021-07-01 12:08:56,476 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.500e-05, eta: 0:00:38, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0645, loss: 0.0645\n","2021-07-01 12:08:57,368 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.500e-05, eta: 0:00:36, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:08:58,261 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.500e-05, eta: 0:00:34, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:59,159 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.500e-05, eta: 0:00:32, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0626, loss: 0.0626\n","2021-07-01 12:09:00,055 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.500e-05, eta: 0:00:30, time: 0.896, data_time: 0.004, memory: 3518, loss_pix: 0.0681, loss: 0.0681\n","2021-07-01 12:09:00,954 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.500e-05, eta: 0:00:28, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0671, loss: 0.0671\n","2021-07-01 12:09:01,860 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.500e-05, eta: 0:00:27, time: 0.906, data_time: 0.003, memory: 3518, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:09:02,760 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.500e-05, eta: 0:00:25, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0594, loss: 0.0594\n","2021-07-01 12:09:03,658 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.500e-05, eta: 0:00:23, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0446, loss: 0.0446\n","2021-07-01 12:09:04,555 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.500e-05, eta: 0:00:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0491, loss: 0.0491\n","2021-07-01 12:09:05,452 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.500e-05, eta: 0:00:20, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0450, loss: 0.0450\n","2021-07-01 12:09:06,351 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.500e-05, eta: 0:00:18, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0795, loss: 0.0795\n","2021-07-01 12:09:07,257 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.500e-05, eta: 0:00:17, time: 0.905, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:08,161 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.500e-05, eta: 0:00:15, time: 0.904, data_time: 0.003, memory: 3518, loss_pix: 0.0588, loss: 0.0588\n","2021-07-01 12:09:09,063 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.500e-05, eta: 0:00:13, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:09:09,955 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.500e-05, eta: 0:00:12, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0599, loss: 0.0599\n","2021-07-01 12:09:10,849 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.500e-05, eta: 0:00:10, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:11,749 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.500e-05, eta: 0:00:09, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0667, loss: 0.0667\n","2021-07-01 12:09:12,638 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.500e-05, eta: 0:00:07, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0558, loss: 0.0558\n","2021-07-01 12:09:13,576 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.500e-05, eta: 0:00:06, time: 0.938, data_time: 0.052, memory: 3518, loss_pix: 0.0577, loss: 0.0577\n","2021-07-01 12:09:14,463 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.500e-05, eta: 0:00:04, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:09:15,351 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.500e-05, eta: 0:00:02, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0578, loss: 0.0578\n","2021-07-01 12:09:16,240 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.500e-05, eta: 0:00:01, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:09:52,294 - mmedit - INFO - Saving checkpoint at 100 iterations\n","2021-07-01 12:09:52,433 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.4372, SSIM: 0.5687\n"]}],"source":["# BasicVSR (Video Super-Resolution - Recurrent)\n","!./tools/dist_train.sh ./demo_files/demo_config_BasicVSR.py 1 "]},{"cell_type":"markdown","metadata":{"id":"QT0zwBFt7J13"},"source":["**This is the end of this tutorial. For more advanced usage, please see our comprehensive tutorial [here](). Enjoy coding with MMEditing!**"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"restorer_basic_tutorial.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3.7.7 64-bit ('pre-commit': conda)","name":"python377jvsc74a57bd04974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"},"language_info":{"name":"python","version":""},"metadata":{"interpreter":{"hash":"4974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"}}},"nbformat":4,"nbformat_minor":2} +{"cells":[{"cell_type":"markdown","metadata":{"id":"T2WWQiheMF7q"},"source":["# MMEditing Basic Tutorial\n","\n","Welcome to MMEditing! This is the official Colab tutorial for MMEditing. In this tutorial you will learn how to train and test a restorer using the APIs provided in MMEditing. \n","\n","This is a quick guide for you to train and test existing models. If you want to develop you own models based on MMEditing and know more about the code structures, please refer to our comprehensive tutorial [here]().\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmedit/blob/main/demo/restorer_basic_tutorial.ipynb)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"-kYw3WQ0MQry"},"source":["## Install MMEditing\n","\n","MMEditing can be installed in three steps:\n","\n","1. Install a compatible PyTorch version (You need to check you CUDA version by using `nvcc -V`).\n","2. Install pre-compiled MMCV\n","3. Clone and install MMEditing\n","\n","The steps are shown below:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":279948,"status":"ok","timestamp":1625140820804,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"GIeIZEzZMfc0","outputId":"fe2e5ded-988d-4563-eb18-374344c316ef"},"outputs":[{"name":"stdout","output_type":"stream","text":["Looking in links: https://download.pytorch.org/whl/torch_stable.html\n","Collecting torch==1.7.0+cu110\n","\u001b[?25l Downloading https://download.pytorch.org/whl/cu110/torch-1.7.0%2Bcu110-cp37-cp37m-linux_x86_64.whl (1137.1MB)\n","\u001b[K |███████████████████████▌ | 834.1MB 1.3MB/s eta 0:03:50tcmalloc: large alloc 1147494400 bytes == 0x56458d07a000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |█████████████████████████████▊ | 1055.7MB 1.2MB/s eta 0:01:07tcmalloc: large alloc 1434370048 bytes == 0x5645d16d0000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |████████████████████████████████| 1137.1MB 1.1MB/s eta 0:00:01tcmalloc: large alloc 1421369344 bytes == 0x564626ebc000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645535c430a 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c4a81\n","\u001b[K |████████████████████████████████| 1137.1MB 16kB/s \n","\u001b[?25hCollecting torchvision==0.8.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/1d/3f/4f45249458a0dee85bff7acf4a2ac6177708253f1f318fcf6ee230fb864f/torchvision-0.8.0-cp37-cp37m-manylinux1_x86_64.whl (11.8MB)\n","\u001b[K |████████████████████████████████| 11.8MB 254kB/s \n","\u001b[?25hRequirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (3.7.4.3)\n","Collecting dataclasses\n"," Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n","Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (1.19.5)\n","Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (0.16.0)\n","Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.0) (7.1.2)\n","\u001b[31mERROR: torchtext 0.10.0 has requirement torch==1.9.0, but you'll have torch 1.7.0+cu110 which is incompatible.\u001b[0m\n","Installing collected packages: dataclasses, torch, torchvision\n"," Found existing installation: torch 1.9.0+cu102\n"," Uninstalling torch-1.9.0+cu102:\n"," Successfully uninstalled torch-1.9.0+cu102\n"," Found existing installation: torchvision 0.10.0+cu102\n"," Uninstalling torchvision-0.10.0+cu102:\n"," Successfully uninstalled torchvision-0.10.0+cu102\n","Successfully installed dataclasses-0.6 torch-1.7.0+cu110 torchvision-0.8.0\n","Looking in links: https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n","Collecting mmcv-full==1.3.5\n","\u001b[?25l Downloading https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/mmcv_full-1.3.5-cp37-cp37m-manylinux1_x86_64.whl (31.1MB)\n","\u001b[K |████████████████████████████████| 31.1MB 107kB/s \n","\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (1.19.5)\n","Collecting addict\n"," Downloading https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl\n","Collecting yapf\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/5f/0d/8814e79eb865eab42d95023b58b650d01dec6f8ea87fc9260978b1bf2167/yapf-0.31.0-py2.py3-none-any.whl (185kB)\n","\u001b[K |████████████████████████████████| 194kB 33.0MB/s \n","\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (7.1.2)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (4.1.2.30)\n","Installing collected packages: addict, yapf, mmcv-full\n","Successfully installed addict-2.4.0 mmcv-full-1.3.5 yapf-0.31.0\n","Cloning into 'mmediting'...\n","remote: Enumerating objects: 7162, done.\u001b[K\n","remote: Counting objects: 100% (1367/1367), done.\u001b[K\n","remote: Compressing objects: 100% (793/793), done.\u001b[K\n","remote: Total 7162 (delta 827), reused 928 (delta 554), pack-reused 5795\u001b[K\n","Receiving objects: 100% (7162/7162), 5.02 MiB | 32.14 MiB/s, done.\n","Resolving deltas: 100% (4826/4826), done.\n","/content/mmediting\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 1)) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 2)) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 3)) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 4)) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 5)) (0.31.0)\n","Collecting codecov\n"," Downloading https://files.pythonhosted.org/packages/93/9f/bbea5b6231308458963cb5c067bc5643da9949689702fa5a382714b59699/codecov-2.1.11-py2.py3-none-any.whl\n","Collecting flake8\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/fc/80/35a0716e5d5101e643404dabd20f07f5528a21f3ef4032d31a49c913237b/flake8-3.9.2-py2.py3-none-any.whl (73kB)\n","\u001b[K |████████████████████████████████| 81kB 9.7MB/s \n","\u001b[?25hCollecting interrogate\n"," Downloading https://files.pythonhosted.org/packages/cd/6d/ce3ac440b13c1b36b323a0eab191499a902adade3cc11b18078c07af3e6e/interrogate-1.4.0-py3-none-any.whl\n","Collecting isort==4.3.21\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n","\u001b[K |████████████████████████████████| 51kB 7.5MB/s \n","\u001b[?25hCollecting onnxruntime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/f9/76/3d0f8bb2776961c7335693df06eccf8d099e48fa6fb552c7546867192603/onnxruntime-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5MB)\n","\u001b[K |████████████████████████████████| 4.5MB 37.4MB/s \n","\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.7/dist-packages (from -r requirements/tests.txt (line 6)) (3.6.4)\n","Collecting pytest-runner\n"," Downloading https://files.pythonhosted.org/packages/f4/f5/6605d73bf3f4c198915872111b10c4b3c2dccd8485f47b7290ceef037190/pytest_runner-5.3.1-py3-none-any.whl\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (1.19.5)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (2.4.0)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (4.1.2.30)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (3.13)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.5.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.4.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.4.1)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.1.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (3.2.2)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.36.2)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.34.1)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.6.1)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.8.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (2.23.0)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.4.4)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (57.0.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.12.0)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.12.4)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.3.4)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.31.0)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.0.1)\n","Requirement already satisfied: coverage in /usr/local/lib/python3.7/dist-packages (from codecov->-r requirements/tests.txt (line 1)) (3.7.1)\n","Collecting pyflakes<2.4.0,>=2.3.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/11/2a745612f1d3cbbd9c69ba14b1b43a35a2f5c3c81cd0124508c52c64307f/pyflakes-2.3.1-py2.py3-none-any.whl (68kB)\n","\u001b[K |████████████████████████████████| 71kB 9.8MB/s \n","\u001b[?25hCollecting pycodestyle<2.8.0,>=2.7.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/cc/227251b1471f129bc35e966bb0fceb005969023926d744139642d847b7ae/pycodestyle-2.7.0-py2.py3-none-any.whl (41kB)\n","\u001b[K |████████████████████████████████| 51kB 8.7MB/s \n","\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n"," Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from flake8->-r requirements/tests.txt (line 2)) (4.5.0)\n","Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.8.9)\n","Collecting colorama\n"," Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n","Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (7.1.2)\n","Requirement already satisfied: toml in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.10.2)\n","Requirement already satisfied: py in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (1.10.0)\n","Requirement already satisfied: attrs in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (21.2.0)\n","Requirement already satisfied: flatbuffers in /usr/local/lib/python3.7/dist-packages (from onnxruntime->-r requirements/tests.txt (line 5)) (1.12)\n","Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (8.8.0)\n","Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (0.7.1)\n","Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.15.0)\n","Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.4.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->-r requirements/runtime.txt (line 3)) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (1.3.1)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (3.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2021.5.30)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (1.24.3)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2.10)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (1.3.0)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.7.2)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.2.2)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (3.1.1)\n","Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.7/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3.6\"->google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.4.8)\n","Installing collected packages: codecov, pyflakes, pycodestyle, mccabe, flake8, colorama, interrogate, isort, onnxruntime, pytest-runner\n","Successfully installed codecov-2.1.11 colorama-0.4.4 flake8-3.9.2 interrogate-1.4.0 isort-4.3.21 mccabe-0.6.1 onnxruntime-1.8.0 pycodestyle-2.7.0 pyflakes-2.3.1 pytest-runner-5.3.1\n","Created temporary directory: /tmp/pip-ephem-wheel-cache-hu6xvjxh\n","Created temporary directory: /tmp/pip-req-tracker-zk5q0q3z\n","Created requirements tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Created temporary directory: /tmp/pip-install-vr_vpseo\n","Obtaining file:///content/mmediting\n"," Added file:///content/mmediting to build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"," Running setup.py (path:/content/mmediting/setup.py) egg_info for package from file:///content/mmediting\n"," Running command python setup.py egg_info\n"," running egg_info\n"," creating mmedit.egg-info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," Source in /content/mmediting has version 0.8.0, which satisfies requirement mmedit==0.8.0 from file:///content/mmediting\n"," Removed mmedit==0.8.0 from file:///content/mmediting from build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.31.0)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (4.1.2.30)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (2.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (1.19.5)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.5.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.4.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.4.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (3.2.2)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.1.1)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.34.1)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.12.4)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.0.1)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.36.2)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.31.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.12.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (2.23.0)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.8.0)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.3.4)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.4.4)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.6.1)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (57.0.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->mmedit==0.8.0) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (1.3.1)\n","Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from grpcio>=1.24.3->tensorboard->mmedit==0.8.0) (1.15.0)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.2.2)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.7.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (1.24.3)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2.10)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2021.5.30)\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.8.0) (4.5.0)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (1.3.0)\n","Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.4.8)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (3.1.1)\n","Installing collected packages: mmedit\n"," Running setup.py develop for mmedit\n"," Running command /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/content/mmediting/setup.py'\"'\"'; __file__='\"'\"'/content/mmediting/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' develop --no-deps\n"," running develop\n"," running egg_info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," running build_ext\n"," Creating /usr/local/lib/python3.7/dist-packages/mmedit.egg-link (link to .)\n"," Adding mmedit 0.8.0 to easy-install.pth file\n","\n"," Installed /content/mmediting\n","Successfully installed mmedit\n","Cleaning up...\n","Removed build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"]}],"source":["# Install openmim for the installation of mmcv-full\n","!pip install openmim\n","\n","# Install mmcv-full thus we could use CUDA operators\n","!mim install mmcv-full\n","\n","# Clone MMEditing\n","!rm -rf mmediting\n","!git clone https://github.com/open-mmlab/mmediting.git\n","%cd mmediting\n","\n","# Install MMEditing\n","!pip install -v -e ."]},{"cell_type":"markdown","metadata":{"id":"QgX96Sc_3PcV"},"source":["## Download necessary material for this demo\n","We will need some data and configuration files in this demo. We will download it and put it in `./demo_files/`"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4723,"status":"ok","timestamp":1625140825508,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"-K0zFSJ-3V42","outputId":"528a87f7-f78e-4219-84f3-dec19b88e88a"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2021-07-01 11:59:48-- https://download.openmmlab.com/mmediting/demo_files.zip\n","Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.35\n","Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.35|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 19215781 (18M) [application/zip]\n","Saving to: ‘demo_files.zip’\n","\n","demo_files.zip 100%[===================>] 18.33M 6.00MB/s in 3.1s \n","\n","2021-07-01 11:59:52 (6.00 MB/s) - ‘demo_files.zip’ saved [19215781/19215781]\n","\n","Archive: demo_files.zip\n"," creating: demo_files/\n"," inflating: demo_files/demo_config_EDVR.py \n"," inflating: demo_files/demo_config_BasicVSR.py \n"," creating: demo_files/lq_sequences/\n"," creating: demo_files/lq_sequences/calendar/\n"," inflating: demo_files/lq_sequences/calendar/00000006.png \n"," inflating: demo_files/lq_sequences/calendar/00000007.png \n"," inflating: demo_files/lq_sequences/calendar/00000010.png \n"," inflating: demo_files/lq_sequences/calendar/00000004.png \n"," inflating: demo_files/lq_sequences/calendar/00000003.png \n"," inflating: demo_files/lq_sequences/calendar/00000001.png \n"," inflating: demo_files/lq_sequences/calendar/00000000.png \n"," inflating: demo_files/lq_sequences/calendar/00000009.png \n"," inflating: demo_files/lq_sequences/calendar/00000008.png \n"," inflating: demo_files/lq_sequences/calendar/00000002.png \n"," inflating: demo_files/lq_sequences/calendar/00000005.png \n"," creating: demo_files/lq_sequences/city/\n"," inflating: demo_files/lq_sequences/city/00000006.png \n"," inflating: demo_files/lq_sequences/city/00000007.png \n"," inflating: demo_files/lq_sequences/city/00000010.png \n"," inflating: demo_files/lq_sequences/city/00000004.png \n"," inflating: demo_files/lq_sequences/city/00000003.png \n"," inflating: demo_files/lq_sequences/city/00000001.png \n"," inflating: demo_files/lq_sequences/city/00000000.png \n"," inflating: demo_files/lq_sequences/city/00000009.png \n"," inflating: demo_files/lq_sequences/city/00000008.png \n"," inflating: demo_files/lq_sequences/city/00000002.png \n"," inflating: demo_files/lq_sequences/city/00000005.png \n"," creating: demo_files/lq_sequences/.ipynb_checkpoints/\n"," creating: demo_files/gt_images/\n"," inflating: demo_files/gt_images/bird.png \n"," inflating: demo_files/gt_images/woman.png \n"," inflating: demo_files/gt_images/head.png \n"," inflating: demo_files/gt_images/baby.png \n"," inflating: demo_files/gt_images/butterfly.png \n"," inflating: demo_files/demo_config_SRCNN.py \n"," creating: demo_files/lq_images/\n"," extracting: demo_files/lq_images/bird.png \n"," extracting: demo_files/lq_images/woman.png \n"," extracting: demo_files/lq_images/head.png \n"," extracting: demo_files/lq_images/baby.png \n"," extracting: demo_files/lq_images/butterfly.png \n"," creating: demo_files/gt_sequences/\n"," creating: demo_files/gt_sequences/calendar/\n"," inflating: demo_files/gt_sequences/calendar/00000006.png \n"," inflating: demo_files/gt_sequences/calendar/00000007.png \n"," inflating: demo_files/gt_sequences/calendar/00000010.png \n"," inflating: demo_files/gt_sequences/calendar/00000004.png \n"," inflating: demo_files/gt_sequences/calendar/00000003.png \n"," inflating: demo_files/gt_sequences/calendar/00000001.png \n"," inflating: demo_files/gt_sequences/calendar/00000000.png \n"," inflating: demo_files/gt_sequences/calendar/00000009.png \n"," inflating: demo_files/gt_sequences/calendar/00000008.png \n"," inflating: demo_files/gt_sequences/calendar/00000002.png \n"," inflating: demo_files/gt_sequences/calendar/00000005.png \n"," creating: demo_files/gt_sequences/city/\n"," inflating: demo_files/gt_sequences/city/00000006.png \n"," inflating: demo_files/gt_sequences/city/00000007.png \n"," inflating: demo_files/gt_sequences/city/00000010.png \n"," inflating: demo_files/gt_sequences/city/00000004.png \n"," inflating: demo_files/gt_sequences/city/00000003.png \n"," inflating: demo_files/gt_sequences/city/00000001.png \n"," inflating: demo_files/gt_sequences/city/00000000.png \n"," inflating: demo_files/gt_sequences/city/00000009.png \n"," inflating: demo_files/gt_sequences/city/00000008.png \n"," inflating: demo_files/gt_sequences/city/00000002.png \n"," inflating: demo_files/gt_sequences/city/00000005.png \n"," creating: demo_files/gt_sequences/.ipynb_checkpoints/\n"," creating: demo_files/.ipynb_checkpoints/\n"]}],"source":["!wget https://download.openmmlab.com/mmediting/demo_files.zip # download files\n","!unzip demo_files # unzip\n","\n","# copy the data to data/Set5 for later use\n","!mkdir data\n","!mkdir data/val_set5\n","!cp -r demo_files/lq_images data/val_set5/Set5_bicLRx4\n","!cp -r demo_files/gt_images data/val_set5/Set5"]},{"cell_type":"markdown","metadata":{"id":"zXGurqGKOeNE"},"source":["## Inference with a pre-trained image restorer\n","You can easily perform inference on a single image with a pre-trained restorer by using `restoration_demo.py`. What you need are \n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer you want to use. It specifies the model you want to use. \n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model. \n","3. `IMAGE_FILE`: The path to the input image.\n","4. `SAVE_FILE`: The location where you want to store the output image.\n","5. `imshow`: Whether to show the image. (Optional)\n","6. `GPU_ID`: Which GPU you want to use. (Optional)\n","\n","Once you have all these details, you can directly use the following command:\n","\n","```\n","python demo/restoration_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${IMAGE_FILE} ${SAVE_FILE} [--imshow] [--device ${GPU_ID}]\n","```\n","\n","**Notes:** \n","1. Configuration files are located in `./configs`. \n","2. We support loading checkpoints from url. You can go to the corresponding page (e.g. [here](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan)) to obtain the url of the pretrained model.\n","\n","---\n","\n","We will now use `SRCNN` and `ESRGAN` as examples.\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58677,"status":"ok","timestamp":1625140884175,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"KiPvtvlqM1zb","outputId":"be7375a7-4632-4770-8383-2a8ce654b069"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\" to /root/.cache/torch/hub/checkpoints/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\n","100% 83.9k/83.9k [00:00<00:00, 1.59MB/s]\n","2021-07-01 12:00:10,779 - mmedit - INFO - Use load_from_torchvision loader\n","Downloading: \"https://download.pytorch.org/models/vgg19-dcbb9e9d.pth\" to /root/.cache/torch/hub/checkpoints/vgg19-dcbb9e9d.pth\n","100% 548M/548M [00:07<00:00, 76.0MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\" to /root/.cache/torch/hub/checkpoints/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\n","100% 196M/196M [00:26<00:00, 7.61MB/s]\n","bird_ESRGAN.png bird_SRCNN.png\n"]}],"source":["# SRCNN\n","!python demo/restoration_demo.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth ./demo_files/lq_images/bird.png ./outputs/bird_SRCNN.png\n","\n","# ESRGAN\n","!python demo/restoration_demo.py ./configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth ./demo_files/lq_images/bird.png ./outputs/bird_ESRGAN.png\n","\n","# Check whether images are saved\n","!ls ./outputs"]},{"cell_type":"markdown","metadata":{"id":"W1DfGHu3Xcfd"},"source":["## Inference with a pre-trained video restorer\n","\n","MMEditing also supports video super-resolution methods, and the procedure is similar. You can use `restoration_video_demo.py` with the following arguments:\n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer you want to use\n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model. \n","3. `INPUT_DIR`: The directory containing the video frames.\n","4. `OUTPUT_DIR`: The location where you want to store the output frames.\n","5. `WINDOW_SIZE`: The window size if you are using sliding-window method (Optional).\n","6. `GPU_ID`: Which GPU you want to use (Optional).\n","```\n","python demo/restoration_video_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${INPUT_DIR} ${OUTPUT_DIR} [--window_size=$WINDOW_SIZE] [--device ${GPU_ID}]\n","```\n","**Note:** There are two different frameworks in video super-resolution: ***sliding-window*** and ***recurrent*** frameworks. When you use the methods of the sliding-window framework, such as EDVR, you need to specify `window_size`. This value is dependent on the model you use.\n","\n","---\n","\n","We will now use `EDVR` and `BasicVSR` as examples.\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29263,"status":"ok","timestamp":1625140913405,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"iaoE7UF5Xb2i","outputId":"a022e0bd-c47a-450e-f4e4-1bf9f92e4813"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\" to /root/.cache/torch/hub/checkpoints/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\n","100% 11.5M/11.5M [00:01<00:00, 8.55MB/s]\n","2021-07-01 12:01:09,689 - mmedit - INFO - Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth\" to /root/.cache/torch/hub/checkpoints/spynet_20210409-c6c1bd09.pth\n","100% 5.50M/5.50M [00:00<00:00, 8.88MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth\" to /root/.cache/torch/hub/checkpoints/basicvsr_reds4_20120409-0e599677.pth\n","100% 24.1M/24.1M [00:02<00:00, 8.97MB/s]\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# EDVR (Sliding-window framework)\n","!python demo/restoration_video_demo.py ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_EDVR --window_size=5\n","\n","# BasicVSR (Recurrent framework)\n","!python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_BasicVSR\n","\n","# Check whether video frames are saved\n","!ls ./outputs/calendar_BasicVSR"]},{"cell_type":"markdown","metadata":{"id":"Rf3LW57qMHXb"},"source":["## Test on a pre-defined dataset using the configuration file\n","\n","The above demos provide an easy way to perform inference on a single image or video sequence. If you want to perform inference on a set of images or sequences, you can make use of the configuration files located in `./configs`.\n"," \n","Existing configuration files allow you to perform inference on common datasets, such as `Set5` in image super-resolution and `REDS4` in video super-resolution. You can use the following command:\n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer and dataset you want to use\n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model.\n","3. `GPU_NUM`: Number of GPUs used for test. \n","4. `RESULT_FILE`: The path to the output result pickle file. (Optional)\n","5. `IMAGE_SAVE_PATH`: The location where you want to store the output image. (Optional)\n","\n","```\n","# single-gpu testing\n","python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","\n","# multi-gpu testing\n","./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","```\n","What you need to do is to modify the `lq_folder` and `gt_folder` in the configuration file:\n","```\n","test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/val_set5/Set5_bicLRx4',\n"," gt_folder='data/val_set5/Set5',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","```\n","\n","**Note**: Some dataset type (e.g. `SRREDSDataset`) requires an annotation file specifying the details of the dataset. Please refer to the corresponding file\n","in `./mmedit/dataset/` for more details. \n","\n","---\n","\n","The following is the command for SRCNN. For other models, you can simply change the paths to the configuration file and pretrained model. \n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14095,"status":"ok","timestamp":1625140927462,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"tClgIYgcbbVg","outputId":"c37ec2de-e1c9-42ae-ed9b-31009d48ae64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"tools/test.py\", line 136, in \n"," main()\n"," File \"tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/test.py\", line 136, in \n"," main()\n"," File \"./tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/test.py', '--local_rank=0', './configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py', 'https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth', '--launcher', 'pytorch', '--save-path', './outputs/']' returned non-zero exit status 1.\n"]}],"source":["# single-gpu\n","!python tools/test.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/\n","\n","# multi-gpu testing\n","!./tools/dist_test.sh ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth 1 --save-path ./outputs/"]},{"cell_type":"markdown","metadata":{"id":"KWKVyeEQelh3"},"source":["## Test on your own datasets\n","\n","When you want to test on your own datasets, you need to modify `test_dataset_type` in addition to the dataset paths. \n","\n","- For image super-resolution, you need to use `SRFolderDataset`\n","- For sliding-window framework in video super-resolution (e.g. EDVR, TDAN), you need to use `SRFolderVideoDataset`.\n","- For recurrent framework in video super-resolution (e.g. BasicVSR, IconVSR), you need to use `SRFolderMultipleGTDataset`.\n","\n","These dataset types assume that all images/sequences in the specified directory are used for test. The folder structures should be\n","```\n","| lq_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," | ...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","| gt_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," |...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","```\n","We will use **SRCNN**, **EDVR**, **BasicVSR** as examples. Please pay attention to the settings of `test_dataset_type` and `data['test']`. "]},{"cell_type":"markdown","metadata":{"id":"0p2rP8jV_dL1"},"source":["**SRCNN**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8729,"status":"ok","timestamp":1625140936180,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"4kEev4wVIq_L","outputId":"8026ed73-f781-4eb2-bb80-d3446bd131df"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 5/5, 8.6 task/s, elapsed: 1s, ETA: 0s\n","Eval-PSNR: 28.433974369836108\n","Eval-SSIM: 0.8099053586583066\n","baby.png bird.png butterfly.png head.png woman.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_SRCNN.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/testset_SRCNN\n","\n","# Check the output folder\n","!ls ./outputs/testset_SRCNN"]},{"cell_type":"markdown","metadata":{"id":"RONzjTTU_gem"},"source":["**EDVR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":19671,"status":"ok","timestamp":1625140955813,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"vL8WOWXY0fNJ","outputId":"dc2a8f81-9bef-4ad4-c5b2-c6f124e6b113"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 22/22, 2.0 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 23.89569862011228\n","Eval-SSIM: 0.7667098470108678\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_EDVR.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth --save-path ./outputs/testset_EDVR\n","\n","# # Check the output folder\n","!ls ./outputs/testset_EDVR\n","!ls ./outputs/testset_EDVR/city"]},{"cell_type":"markdown","metadata":{"id":"5Tc7F-l5_i1e"},"source":["**BasicVSR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":20220,"status":"ok","timestamp":1625140976026,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"jpW5GWC74Yvu","outputId":"7ba02a32-d4ec-40b2-8108-ef0729b62147"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:07,780 - mmedit - INFO - Use load_from_http loader\n","Use load_from_http loader\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","[>>] 2/2, 0.2 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 24.195768601433734\n","Eval-SSIM: 0.7828541339512978\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_BasicVSR.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth --save-path ./outputs/testset_BasicVSR\n","\n","# # Check the output folder\n","!ls ./outputs/testset_BasicVSR\n","!ls ./outputs/testset_BasicVSR/calendar"]},{"cell_type":"markdown","metadata":{"id":"4DQxNL8BhI0y"},"source":["## Train a restorer on a pre-defined dataset\n","\n","MMEditing uses distributed training. The following command can be used for training. If you want to train on the pre-defined datasets specified in our configuration file, you can simply run the following command.\n","\n","```\n","./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]\n","```\n","\n","For more details about the optional arguments, please refer to `tools/train.py`.\n","\n","---\n","\n","Here is an example using EDVR.\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9337,"status":"ok","timestamp":1625140985357,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"s-hOnSF6ItQM","outputId":"e40e960a-29e1-43e8-b922-5e08c4e98afe"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:31,961 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:31,961 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:31,961 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:31,961 - mmedit - INFO - Config:\n","/content/mmediting/configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py\n","exp_name = 'edvrm_wotsa_x4_g8_600k_reds'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRREDSDataset'\n","val_dataset_type = 'SRREDSDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 600000\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50000, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=100,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 54, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 63, in load_annotations\n"," with open(self.ann_file, 'r') as fin:\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/train.py\", line 145, in \n"," main()\n"," File \"./tools/train.py\", line 111, in main\n"," datasets = [build_dataset(cfg.data.train)]\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 76, in build_dataset\n"," build_dataset(cfg['dataset'], default_args), cfg['times'])\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRREDSDataset: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/train.py', '--local_rank=0', './configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py', '--launcher', 'pytorch']' returned non-zero exit status 1.\n"]}],"source":["!./tools/dist_train.sh ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py 1"]},{"cell_type":"markdown","metadata":{"id":"b0VfQkQQjg8N"},"source":["## Train a restorer on your own datasets\n","\n","Similar to the case when you want to test on your own datasets, you need to modify `train_dataset_type`. The dataset type you need is identical:\n","\n","- For image super-resolution, you need to use `SRFolderDataset`\n","- For sliding-window framework in video super-resolution (e.g. EDVR, TDAN), you need to use `SRFolderVideoDataset`.\n","- For recurrent framework in video super-resolution (e.g. BasicVSR, IconVSR), you need to use `SRFolderMultipleGTDataset`.\n","\n","After you modified the dataset type and the data path. You are all set to go."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":128384,"status":"ok","timestamp":1625141113733,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"liGEKJpbIoXZ","outputId":"84e1502e-e2cb-458f-c7c5-e4b401e570b7"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:41,185 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:41,185 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:41,185 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:41,185 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_SRCNN.py\n","exp_name = 'srcnn_demo'\n","\n","scale = 4\n","# model settings\n","model = dict(\n"," type='BasicRestorer',\n"," generator=dict(\n"," type='SRCNN',\n"," channels=(3, 64, 32, 3),\n"," kernel_sizes=(9, 1, 5),\n"," upscale_factor=scale),\n"," pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=scale)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderDataset'\n","val_dataset_type = 'SRFolderDataset'\n","train_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=128),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","test_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'lq_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=8,\n"," train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=train_pipeline,\n"," scale=scale)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[250000, 250000, 250000, 250000],\n"," restart_weights=[1, 1, 1, 1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","evaluation = dict(interval=50, save_image=True, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./experiments/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:02:41,192 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/experiments/srcnn_demo\n","2021-07-01 12:02:41,192 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:02:41.529307: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:03:18,631 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.000e-04, eta: 0:57:01, time: 34.560, data_time: 34.446, memory: 586, loss_pix: 0.3999, loss: 0.3999\n","2021-07-01 12:03:18,712 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","INFO:mmedit:Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","2021-07-01 12:03:18,764 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","INFO:mmedit:Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","2021-07-01 12:03:18,840 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","INFO:mmedit:Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","2021-07-01 12:03:18,916 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","INFO:mmedit:Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","2021-07-01 12:03:18,956 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","INFO:mmedit:Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","2021-07-01 12:03:19,012 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","INFO:mmedit:Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","2021-07-01 12:03:19,070 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","INFO:mmedit:Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","2021-07-01 12:03:19,142 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","INFO:mmedit:Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","2021-07-01 12:03:19,212 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","INFO:mmedit:Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","2021-07-01 12:03:19,261 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","INFO:mmedit:Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","2021-07-01 12:03:19,302 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","INFO:mmedit:Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","2021-07-01 12:03:19,357 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","INFO:mmedit:Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","2021-07-01 12:03:19,419 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","INFO:mmedit:Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","2021-07-01 12:03:19,473 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","INFO:mmedit:Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","2021-07-01 12:03:19,538 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","INFO:mmedit:Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","2021-07-01 12:03:19,603 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","INFO:mmedit:Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","2021-07-01 12:03:19,657 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","INFO:mmedit:Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","2021-07-01 12:03:19,716 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","INFO:mmedit:Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","2021-07-01 12:03:19,772 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","INFO:mmedit:Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","2021-07-01 12:03:19,834 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","INFO:mmedit:Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","2021-07-01 12:03:19,877 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","INFO:mmedit:Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","2021-07-01 12:03:19,947 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","INFO:mmedit:Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","2021-07-01 12:03:20,014 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","INFO:mmedit:Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","2021-07-01 12:03:20,068 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","INFO:mmedit:Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","2021-07-01 12:03:20,124 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","INFO:mmedit:Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","2021-07-01 12:03:20,181 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","INFO:mmedit:Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","2021-07-01 12:03:20,244 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","INFO:mmedit:Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","2021-07-01 12:03:20,310 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","INFO:mmedit:Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","2021-07-01 12:03:20,356 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","INFO:mmedit:Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","2021-07-01 12:03:20,410 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","INFO:mmedit:Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","2021-07-01 12:03:20,480 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","INFO:mmedit:Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","2021-07-01 12:03:20,536 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","INFO:mmedit:Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","2021-07-01 12:03:20,595 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","INFO:mmedit:Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","2021-07-01 12:03:20,656 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","INFO:mmedit:Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","2021-07-01 12:03:20,710 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","INFO:mmedit:Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","2021-07-01 12:03:20,779 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:20,846 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","INFO:mmedit:Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","2021-07-01 12:03:20,907 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:20,958 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","INFO:mmedit:Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","2021-07-01 12:03:21,028 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","INFO:mmedit:Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","2021-07-01 12:03:21,122 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","INFO:mmedit:Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","2021-07-01 12:03:21,181 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:21,418 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","INFO:mmedit:Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","2021-07-01 12:03:21,480 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:21,551 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","INFO:mmedit:Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","2021-07-01 12:03:21,618 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","INFO:mmedit:Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","2021-07-01 12:03:21,667 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","INFO:mmedit:Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","2021-07-01 12:03:21,743 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","INFO:mmedit:Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","[>>] 5/5, 0.1 task/s, elapsed: 37s, ETA: 0s\n","\n","2021-07-01 12:03:59,996 - mmedit - INFO - Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","INFO:mmedit:Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","2021-07-01 12:04:00,047 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","INFO:mmedit:Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","2021-07-01 12:04:00,114 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","INFO:mmedit:Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","2021-07-01 12:04:00,181 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","INFO:mmedit:Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","2021-07-01 12:04:00,251 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","INFO:mmedit:Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","2021-07-01 12:04:00,315 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","INFO:mmedit:Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","2021-07-01 12:04:00,373 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","INFO:mmedit:Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","2021-07-01 12:04:00,418 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","INFO:mmedit:Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","2021-07-01 12:04:00,478 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","INFO:mmedit:Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","2021-07-01 12:04:00,538 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","INFO:mmedit:Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","2021-07-01 12:04:00,606 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","INFO:mmedit:Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","2021-07-01 12:04:00,647 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","INFO:mmedit:Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","2021-07-01 12:04:00,711 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","INFO:mmedit:Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","2021-07-01 12:04:00,757 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","INFO:mmedit:Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","2021-07-01 12:04:00,799 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","INFO:mmedit:Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","2021-07-01 12:04:00,871 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:00,938 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:00,995 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","INFO:mmedit:Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","2021-07-01 12:04:01,051 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","INFO:mmedit:Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","2021-07-01 12:04:01,115 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:01,196 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","INFO:mmedit:Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","2021-07-01 12:04:01,256 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","INFO:mmedit:Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","2021-07-01 12:04:01,325 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","INFO:mmedit:Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","2021-07-01 12:04:01,381 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","INFO:mmedit:Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:04:01,429 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","INFO:mmedit:Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","2021-07-01 12:04:01,497 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","INFO:mmedit:Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","2021-07-01 12:04:01,545 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","INFO:mmedit:Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","2021-07-01 12:04:01,597 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","INFO:mmedit:Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","2021-07-01 12:04:01,671 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","INFO:mmedit:Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:04:01,724 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:01,777 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","INFO:mmedit:Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","2021-07-01 12:04:01,847 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","INFO:mmedit:Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","2021-07-01 12:04:01,905 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","INFO:mmedit:Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","2021-07-01 12:04:01,953 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","INFO:mmedit:Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","2021-07-01 12:04:02,025 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","INFO:mmedit:Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","2021-07-01 12:04:02,079 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","INFO:mmedit:Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","2021-07-01 12:04:02,137 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","INFO:mmedit:Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","2021-07-01 12:04:02,193 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:02,255 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","INFO:mmedit:Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:04:02,341 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","INFO:mmedit:Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","2021-07-01 12:04:02,394 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","INFO:mmedit:Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","2021-07-01 12:04:02,496 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","INFO:mmedit:Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","2021-07-01 12:04:02,552 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:02,629 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","INFO:mmedit:Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","2021-07-01 12:04:02,682 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","INFO:mmedit:Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","2021-07-01 12:04:02,791 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","INFO:mmedit:Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","2021-07-01 12:04:02,834 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","INFO:mmedit:Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","2021-07-01 12:04:02,900 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","INFO:mmedit:Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","2021-07-01 12:04:03,053 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","INFO:mmedit:Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:04:03,108 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","INFO:mmedit:Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","[>>] 5/5, 0.2 task/s, elapsed: 33s, ETA: 0s\n","\n","2021-07-01 12:04:37,412 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:04:37,422 - mmedit - INFO - Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n","INFO:mmedit:Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n"]}],"source":["# SRCNN (Single Image Super-Resolution)\n","!./tools/dist_train.sh ./demo_files/demo_config_SRCNN.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":117937,"status":"ok","timestamp":1625141554036,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"26uZ4Ak7qbC9","outputId":"2fb26527-eb9e-4b48-e03c-ba9a91c60db8"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:10:12,619 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:10:12,619 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:10:12,619 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:10:12,619 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_EDVR.py\n","exp_name = 'edvrm_demo'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderVideoDataset'\n","val_dataset_type = 'SRFolderVideoDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:10:12,701 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/edvrm_demo\n","2021-07-01 12:10:12,702 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:10:12.951771: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:10:30,703 - mmedit - INFO - Iter [1/100]\tlr_generator: 4.000e-04, eta: 0:26:53, time: 16.295, data_time: 15.833, memory: 1341, loss_pix: 63917.2734, loss: 63917.2734\n","2021-07-01 12:10:31,046 - mmedit - INFO - Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","INFO:mmedit:Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","2021-07-01 12:10:31,386 - mmedit - INFO - Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","INFO:mmedit:Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","2021-07-01 12:10:31,731 - mmedit - INFO - Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","INFO:mmedit:Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","2021-07-01 12:10:32,071 - mmedit - INFO - Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","INFO:mmedit:Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","2021-07-01 12:10:32,414 - mmedit - INFO - Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","INFO:mmedit:Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","2021-07-01 12:10:32,760 - mmedit - INFO - Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","INFO:mmedit:Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","2021-07-01 12:10:33,102 - mmedit - INFO - Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","INFO:mmedit:Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","2021-07-01 12:10:33,447 - mmedit - INFO - Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","INFO:mmedit:Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","2021-07-01 12:10:33,792 - mmedit - INFO - Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","INFO:mmedit:Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","2021-07-01 12:10:34,138 - mmedit - INFO - Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","INFO:mmedit:Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","2021-07-01 12:10:34,484 - mmedit - INFO - Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","INFO:mmedit:Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","2021-07-01 12:10:34,829 - mmedit - INFO - Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","INFO:mmedit:Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","2021-07-01 12:10:35,175 - mmedit - INFO - Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","INFO:mmedit:Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","2021-07-01 12:10:35,522 - mmedit - INFO - Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","INFO:mmedit:Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","2021-07-01 12:10:35,866 - mmedit - INFO - Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","INFO:mmedit:Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","2021-07-01 12:10:36,212 - mmedit - INFO - Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","INFO:mmedit:Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","2021-07-01 12:10:36,560 - mmedit - INFO - Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","INFO:mmedit:Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","2021-07-01 12:10:36,904 - mmedit - INFO - Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","INFO:mmedit:Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","2021-07-01 12:10:37,249 - mmedit - INFO - Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","INFO:mmedit:Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","2021-07-01 12:10:37,595 - mmedit - INFO - Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","INFO:mmedit:Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","2021-07-01 12:10:37,939 - mmedit - INFO - Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","INFO:mmedit:Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","2021-07-01 12:10:38,283 - mmedit - INFO - Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","INFO:mmedit:Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","2021-07-01 12:10:38,628 - mmedit - INFO - Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","INFO:mmedit:Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","2021-07-01 12:10:38,974 - mmedit - INFO - Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","INFO:mmedit:Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","2021-07-01 12:10:39,318 - mmedit - INFO - Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","INFO:mmedit:Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","2021-07-01 12:10:39,665 - mmedit - INFO - Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","INFO:mmedit:Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","2021-07-01 12:10:40,011 - mmedit - INFO - Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","INFO:mmedit:Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","2021-07-01 12:10:40,356 - mmedit - INFO - Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","INFO:mmedit:Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","2021-07-01 12:10:40,703 - mmedit - INFO - Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","INFO:mmedit:Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","2021-07-01 12:10:41,049 - mmedit - INFO - Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","INFO:mmedit:Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","2021-07-01 12:10:41,396 - mmedit - INFO - Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","INFO:mmedit:Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","2021-07-01 12:10:41,745 - mmedit - INFO - Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","INFO:mmedit:Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","2021-07-01 12:10:42,097 - mmedit - INFO - Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","INFO:mmedit:Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","2021-07-01 12:10:42,444 - mmedit - INFO - Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","INFO:mmedit:Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","2021-07-01 12:10:42,790 - mmedit - INFO - Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","INFO:mmedit:Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","2021-07-01 12:10:43,140 - mmedit - INFO - Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","INFO:mmedit:Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","2021-07-01 12:10:43,490 - mmedit - INFO - Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","INFO:mmedit:Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","2021-07-01 12:10:43,841 - mmedit - INFO - Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","INFO:mmedit:Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","2021-07-01 12:10:44,193 - mmedit - INFO - Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","INFO:mmedit:Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","2021-07-01 12:10:44,541 - mmedit - INFO - Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","INFO:mmedit:Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","2021-07-01 12:10:44,895 - mmedit - INFO - Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","INFO:mmedit:Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","2021-07-01 12:10:45,248 - mmedit - INFO - Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","INFO:mmedit:Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","2021-07-01 12:10:45,595 - mmedit - INFO - Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","INFO:mmedit:Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","2021-07-01 12:10:45,950 - mmedit - INFO - Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","INFO:mmedit:Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","2021-07-01 12:10:46,301 - mmedit - INFO - Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","INFO:mmedit:Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","2021-07-01 12:10:46,649 - mmedit - INFO - Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","INFO:mmedit:Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","2021-07-01 12:10:47,003 - mmedit - INFO - Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","INFO:mmedit:Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","2021-07-01 12:10:47,356 - mmedit - INFO - Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","INFO:mmedit:Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:14,231 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","INFO:mmedit:Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","2021-07-01 12:11:14,578 - mmedit - INFO - Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","INFO:mmedit:Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","2021-07-01 12:11:14,930 - mmedit - INFO - Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","INFO:mmedit:Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","2021-07-01 12:11:15,289 - mmedit - INFO - Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","INFO:mmedit:Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","2021-07-01 12:11:15,642 - mmedit - INFO - Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","INFO:mmedit:Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","2021-07-01 12:11:15,993 - mmedit - INFO - Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","INFO:mmedit:Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","2021-07-01 12:11:16,354 - mmedit - INFO - Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","INFO:mmedit:Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","2021-07-01 12:11:16,712 - mmedit - INFO - Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","INFO:mmedit:Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","2021-07-01 12:11:17,065 - mmedit - INFO - Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","INFO:mmedit:Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","2021-07-01 12:11:17,425 - mmedit - INFO - Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","INFO:mmedit:Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","2021-07-01 12:11:17,780 - mmedit - INFO - Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","INFO:mmedit:Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","2021-07-01 12:11:18,135 - mmedit - INFO - Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","INFO:mmedit:Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","2021-07-01 12:11:18,495 - mmedit - INFO - Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","INFO:mmedit:Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","2021-07-01 12:11:18,851 - mmedit - INFO - Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","INFO:mmedit:Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","2021-07-01 12:11:19,210 - mmedit - INFO - Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","INFO:mmedit:Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","2021-07-01 12:11:19,567 - mmedit - INFO - Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","INFO:mmedit:Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","2021-07-01 12:11:19,923 - mmedit - INFO - Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","INFO:mmedit:Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","2021-07-01 12:11:20,286 - mmedit - INFO - Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","INFO:mmedit:Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","2021-07-01 12:11:20,644 - mmedit - INFO - Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","INFO:mmedit:Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","2021-07-01 12:11:21,000 - mmedit - INFO - Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","INFO:mmedit:Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","2021-07-01 12:11:21,359 - mmedit - INFO - Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","INFO:mmedit:Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","2021-07-01 12:11:21,719 - mmedit - INFO - Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","INFO:mmedit:Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","2021-07-01 12:11:22,072 - mmedit - INFO - Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","INFO:mmedit:Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","2021-07-01 12:11:22,434 - mmedit - INFO - Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","INFO:mmedit:Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","2021-07-01 12:11:22,798 - mmedit - INFO - Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","INFO:mmedit:Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","2021-07-01 12:11:23,158 - mmedit - INFO - Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","INFO:mmedit:Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","2021-07-01 12:11:23,513 - mmedit - INFO - Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","INFO:mmedit:Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","2021-07-01 12:11:23,875 - mmedit - INFO - Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","INFO:mmedit:Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","2021-07-01 12:11:24,236 - mmedit - INFO - Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","INFO:mmedit:Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","2021-07-01 12:11:24,597 - mmedit - INFO - Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","INFO:mmedit:Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","2021-07-01 12:11:24,951 - mmedit - INFO - Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","INFO:mmedit:Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","2021-07-01 12:11:25,313 - mmedit - INFO - Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","INFO:mmedit:Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","2021-07-01 12:11:25,677 - mmedit - INFO - Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","INFO:mmedit:Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","2021-07-01 12:11:26,038 - mmedit - INFO - Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","INFO:mmedit:Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","2021-07-01 12:11:26,393 - mmedit - INFO - Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","INFO:mmedit:Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","2021-07-01 12:11:26,753 - mmedit - INFO - Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","INFO:mmedit:Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","2021-07-01 12:11:27,115 - mmedit - INFO - Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","INFO:mmedit:Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","2021-07-01 12:11:27,472 - mmedit - INFO - Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","INFO:mmedit:Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","2021-07-01 12:11:27,830 - mmedit - INFO - Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","INFO:mmedit:Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","2021-07-01 12:11:28,189 - mmedit - INFO - Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","INFO:mmedit:Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","2021-07-01 12:11:28,553 - mmedit - INFO - Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","INFO:mmedit:Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","2021-07-01 12:11:28,910 - mmedit - INFO - Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","INFO:mmedit:Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","2021-07-01 12:11:29,266 - mmedit - INFO - Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","INFO:mmedit:Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","2021-07-01 12:11:29,628 - mmedit - INFO - Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","INFO:mmedit:Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","2021-07-01 12:11:29,989 - mmedit - INFO - Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","INFO:mmedit:Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","2021-07-01 12:11:30,345 - mmedit - INFO - Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","INFO:mmedit:Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","2021-07-01 12:11:30,704 - mmedit - INFO - Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","INFO:mmedit:Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","2021-07-01 12:11:31,067 - mmedit - INFO - Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","INFO:mmedit:Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","2021-07-01 12:11:31,425 - mmedit - INFO - Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","INFO:mmedit:Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","2021-07-01 12:11:31,782 - mmedit - INFO - Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","INFO:mmedit:Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:58,494 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:11:58,598 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n","INFO:mmedit:Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n"]}],"source":["# EDVR (Video Super-Resolution - Sliding Window)\n","!./tools/dist_train.sh ./demo_files/demo_config_EDVR.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":197033,"status":"ok","timestamp":1625141428032,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"_RdqmlT6qgt2","outputId":"b951b426-e06c-4f31-db01-449333eab333"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:06:47,253 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:06:47,253 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:06:47,254 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:06:47,254 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_BasicVSR.py\n","exp_name = 'basicvsr_demo'\n","\n","# model settings\n","model = dict(\n"," type='BasicVSR',\n"," generator=dict(\n"," type='BasicVSRNet',\n"," mid_channels=64,\n"," num_blocks=30,\n"," spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'\n"," 'basicvsr/spynet_20210409-c6c1bd09.pth'),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = dict(fix_iter=5000)\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderMultipleGTDataset'\n","val_dataset_type = 'SRFolderMultipleGTDataset'\n","\n","train_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=6,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True), # 2 gpus\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1, workers_per_gpu=1),\n","\n"," # train\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," # val\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," # test\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(\n"," generator=dict(\n"," type='Adam',\n"," lr=2e-4,\n"," betas=(0.9, 0.99),\n"," paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)})))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[300000],\n"," restart_weights=[1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," # dict(type='TensorboardLoggerHook'),\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","find_unused_parameters = True\n","\n","2021-07-01 12:06:47,291 - mmedit - INFO - Use load_from_http loader\n","2021-07-01 12:06:47,569 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/basicvsr_demo\n","2021-07-01 12:06:47,569 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:07:14,210 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.500e-05, eta: 0:42:52, time: 25.981, data_time: 24.045, memory: 3464, loss_pix: 0.0634, loss: 0.0634\n","2021-07-01 12:07:15,171 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.500e-05, eta: 0:22:00, time: 0.961, data_time: 0.011, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","2021-07-01 12:07:16,052 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.500e-05, eta: 0:14:59, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0476, loss: 0.0476\n","2021-07-01 12:07:16,940 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.500e-05, eta: 0:11:29, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:17,829 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.500e-05, eta: 0:09:22, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0796, loss: 0.0796\n","2021-07-01 12:07:18,712 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.500e-05, eta: 0:07:57, time: 0.884, data_time: 0.004, memory: 3518, loss_pix: 0.0680, loss: 0.0680\n","2021-07-01 12:07:19,594 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.500e-05, eta: 0:06:56, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0607, loss: 0.0607\n","2021-07-01 12:07:20,481 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.500e-05, eta: 0:06:10, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0598, loss: 0.0598\n","2021-07-01 12:07:21,361 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.500e-05, eta: 0:05:35, time: 0.880, data_time: 0.003, memory: 3518, loss_pix: 0.0664, loss: 0.0664\n","2021-07-01 12:07:22,274 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.500e-05, eta: 0:05:06, time: 0.913, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:07:23,161 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.500e-05, eta: 0:04:42, time: 0.887, data_time: 0.005, memory: 3518, loss_pix: 0.0771, loss: 0.0771\n","2021-07-01 12:07:24,058 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.500e-05, eta: 0:04:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0521, loss: 0.0521\n","2021-07-01 12:07:24,944 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.500e-05, eta: 0:04:05, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:07:25,835 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.500e-05, eta: 0:03:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0515, loss: 0.0515\n","2021-07-01 12:07:26,723 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.500e-05, eta: 0:03:38, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0674, loss: 0.0674\n","2021-07-01 12:07:27,609 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.500e-05, eta: 0:03:26, time: 0.886, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:28,498 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.500e-05, eta: 0:03:16, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0670, loss: 0.0670\n","2021-07-01 12:07:29,388 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.500e-05, eta: 0:03:07, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0663, loss: 0.0663\n","2021-07-01 12:07:30,284 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.500e-05, eta: 0:02:59, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0633, loss: 0.0633\n","2021-07-01 12:07:31,176 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.500e-05, eta: 0:02:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0482, loss: 0.0482\n","2021-07-01 12:07:32,073 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.500e-05, eta: 0:02:44, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0743, loss: 0.0743\n","2021-07-01 12:07:32,966 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.500e-05, eta: 0:02:38, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0690, loss: 0.0690\n","2021-07-01 12:07:33,858 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.500e-05, eta: 0:02:32, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0437, loss: 0.0437\n","2021-07-01 12:07:34,750 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.500e-05, eta: 0:02:27, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:35,642 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.500e-05, eta: 0:02:22, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0781, loss: 0.0781\n","2021-07-01 12:07:36,533 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.500e-05, eta: 0:02:17, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:07:37,427 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.500e-05, eta: 0:02:13, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:07:38,321 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.500e-05, eta: 0:02:08, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0567, loss: 0.0567\n","2021-07-01 12:07:39,212 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.500e-05, eta: 0:02:04, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0846, loss: 0.0846\n","2021-07-01 12:07:40,104 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.500e-05, eta: 0:02:01, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0658, loss: 0.0658\n","2021-07-01 12:07:40,993 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.500e-05, eta: 0:01:57, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0502, loss: 0.0502\n","2021-07-01 12:07:41,885 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.500e-05, eta: 0:01:54, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0622, loss: 0.0622\n","2021-07-01 12:07:42,787 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.500e-05, eta: 0:01:50, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0657, loss: 0.0657\n","2021-07-01 12:07:43,674 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.500e-05, eta: 0:01:47, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0643, loss: 0.0643\n","2021-07-01 12:07:44,567 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.500e-05, eta: 0:01:44, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0898, loss: 0.0898\n","2021-07-01 12:07:45,458 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.500e-05, eta: 0:01:41, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0865, loss: 0.0865\n","2021-07-01 12:07:46,341 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.500e-05, eta: 0:01:38, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0511, loss: 0.0511\n","2021-07-01 12:07:47,225 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.500e-05, eta: 0:01:36, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:48,109 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.500e-05, eta: 0:01:33, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0653, loss: 0.0653\n","2021-07-01 12:07:48,990 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:07:49,874 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.885, data_time: 0.003, memory: 3518, loss_pix: 0.0788, loss: 0.0788\n","2021-07-01 12:07:50,755 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.500e-05, eta: 0:01:26, time: 0.881, data_time: 0.005, memory: 3518, loss_pix: 0.0605, loss: 0.0605\n","2021-07-01 12:07:51,638 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.500e-05, eta: 0:01:24, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0539, loss: 0.0539\n","2021-07-01 12:07:52,518 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.500e-05, eta: 0:01:21, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0503, loss: 0.0503\n","2021-07-01 12:07:53,395 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.500e-05, eta: 0:01:19, time: 0.877, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:07:54,273 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0555, loss: 0.0555\n","2021-07-01 12:07:55,159 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.500e-05, eta: 0:01:15, time: 0.886, data_time: 0.007, memory: 3518, loss_pix: 0.0806, loss: 0.0806\n","2021-07-01 12:07:56,040 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.500e-05, eta: 0:01:13, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0576, loss: 0.0576\n","2021-07-01 12:07:56,919 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.500e-05, eta: 0:01:11, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0871, loss: 0.0871\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:08:32,618 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9899, SSIM: 0.5295\n","2021-07-01 12:08:33,591 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.500e-05, eta: 0:01:40, time: 35.792, data_time: 34.822, memory: 3518, loss_pix: 0.0773, loss: 0.0773\n","2021-07-01 12:08:34,462 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.500e-05, eta: 0:01:37, time: 0.871, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:08:35,326 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.500e-05, eta: 0:01:34, time: 0.864, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:36,192 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0575, loss: 0.0575\n","2021-07-01 12:08:37,069 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.876, data_time: 0.003, memory: 3518, loss_pix: 0.0842, loss: 0.0842\n","2021-07-01 12:08:37,942 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.500e-05, eta: 0:01:25, time: 0.873, data_time: 0.003, memory: 3518, loss_pix: 0.0836, loss: 0.0836\n","2021-07-01 12:08:38,808 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.500e-05, eta: 0:01:22, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0580, loss: 0.0580\n","2021-07-01 12:08:39,679 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.500e-05, eta: 0:01:20, time: 0.870, data_time: 0.003, memory: 3518, loss_pix: 0.0449, loss: 0.0449\n","2021-07-01 12:08:40,557 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0702, loss: 0.0702\n","2021-07-01 12:08:41,430 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.500e-05, eta: 0:01:14, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:42,308 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.500e-05, eta: 0:01:12, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:08:43,182 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.500e-05, eta: 0:01:09, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0489, loss: 0.0489\n","2021-07-01 12:08:44,056 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.500e-05, eta: 0:01:07, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0566, loss: 0.0566\n","2021-07-01 12:08:44,932 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.500e-05, eta: 0:01:05, time: 0.875, data_time: 0.003, memory: 3518, loss_pix: 0.0597, loss: 0.0597\n","2021-07-01 12:08:45,819 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.500e-05, eta: 0:01:02, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0640, loss: 0.0640\n","2021-07-01 12:08:46,698 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.500e-05, eta: 0:01:00, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:47,580 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.500e-05, eta: 0:00:58, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:08:48,464 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.500e-05, eta: 0:00:56, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:08:49,347 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.500e-05, eta: 0:00:54, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0603, loss: 0.0603\n","2021-07-01 12:08:50,229 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.500e-05, eta: 0:00:51, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0478, loss: 0.0478\n","2021-07-01 12:08:51,113 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.500e-05, eta: 0:00:49, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:08:52,000 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.500e-05, eta: 0:00:47, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0861, loss: 0.0861\n","2021-07-01 12:08:52,890 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.500e-05, eta: 0:00:45, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:08:53,792 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.500e-05, eta: 0:00:43, time: 0.903, data_time: 0.003, memory: 3518, loss_pix: 0.0787, loss: 0.0787\n","2021-07-01 12:08:54,688 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.500e-05, eta: 0:00:41, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0744, loss: 0.0744\n","2021-07-01 12:08:55,582 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.500e-05, eta: 0:00:39, time: 0.895, data_time: 0.003, memory: 3518, loss_pix: 0.0792, loss: 0.0792\n","2021-07-01 12:08:56,476 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.500e-05, eta: 0:00:38, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0645, loss: 0.0645\n","2021-07-01 12:08:57,368 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.500e-05, eta: 0:00:36, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:08:58,261 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.500e-05, eta: 0:00:34, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:59,159 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.500e-05, eta: 0:00:32, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0626, loss: 0.0626\n","2021-07-01 12:09:00,055 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.500e-05, eta: 0:00:30, time: 0.896, data_time: 0.004, memory: 3518, loss_pix: 0.0681, loss: 0.0681\n","2021-07-01 12:09:00,954 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.500e-05, eta: 0:00:28, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0671, loss: 0.0671\n","2021-07-01 12:09:01,860 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.500e-05, eta: 0:00:27, time: 0.906, data_time: 0.003, memory: 3518, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:09:02,760 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.500e-05, eta: 0:00:25, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0594, loss: 0.0594\n","2021-07-01 12:09:03,658 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.500e-05, eta: 0:00:23, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0446, loss: 0.0446\n","2021-07-01 12:09:04,555 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.500e-05, eta: 0:00:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0491, loss: 0.0491\n","2021-07-01 12:09:05,452 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.500e-05, eta: 0:00:20, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0450, loss: 0.0450\n","2021-07-01 12:09:06,351 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.500e-05, eta: 0:00:18, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0795, loss: 0.0795\n","2021-07-01 12:09:07,257 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.500e-05, eta: 0:00:17, time: 0.905, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:08,161 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.500e-05, eta: 0:00:15, time: 0.904, data_time: 0.003, memory: 3518, loss_pix: 0.0588, loss: 0.0588\n","2021-07-01 12:09:09,063 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.500e-05, eta: 0:00:13, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:09:09,955 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.500e-05, eta: 0:00:12, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0599, loss: 0.0599\n","2021-07-01 12:09:10,849 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.500e-05, eta: 0:00:10, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:11,749 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.500e-05, eta: 0:00:09, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0667, loss: 0.0667\n","2021-07-01 12:09:12,638 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.500e-05, eta: 0:00:07, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0558, loss: 0.0558\n","2021-07-01 12:09:13,576 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.500e-05, eta: 0:00:06, time: 0.938, data_time: 0.052, memory: 3518, loss_pix: 0.0577, loss: 0.0577\n","2021-07-01 12:09:14,463 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.500e-05, eta: 0:00:04, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:09:15,351 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.500e-05, eta: 0:00:02, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0578, loss: 0.0578\n","2021-07-01 12:09:16,240 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.500e-05, eta: 0:00:01, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:09:52,294 - mmedit - INFO - Saving checkpoint at 100 iterations\n","2021-07-01 12:09:52,433 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.4372, SSIM: 0.5687\n"]}],"source":["# BasicVSR (Video Super-Resolution - Recurrent)\n","!./tools/dist_train.sh ./demo_files/demo_config_BasicVSR.py 1 "]},{"cell_type":"markdown","metadata":{"id":"QT0zwBFt7J13"},"source":["**This is the end of this tutorial. For more advanced usage, please see our comprehensive tutorial [here](). Enjoy coding with MMEditing!**"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"restorer_basic_tutorial.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3.7.7 64-bit ('pre-commit': conda)","name":"python377jvsc74a57bd04974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"},"language_info":{"name":"python","version":""},"metadata":{"interpreter":{"hash":"4974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"}}},"nbformat":4,"nbformat_minor":2} diff --git a/demo/restorer_basic_tutorial_zh-CN.ipynb b/demo/restorer_basic_tutorial_zh-CN.ipynb index 90796a7d00..fdd18f0c84 100644 --- a/demo/restorer_basic_tutorial_zh-CN.ipynb +++ b/demo/restorer_basic_tutorial_zh-CN.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","metadata":{"id":"T2WWQiheMF7q"},"source":["# MMEditing 基础教程\n","\n","欢迎来到MMEditing! 这是 MMEditing 的官方 Colab 教程。在本教程中,您将学习如何使用 MMEditing 中提供的 API 训练和测试恢复器。\n","\n","这是训练和测试现有模型的快速指南。如果您想基于 MMEditing 开发自己的模型并了解有关代码结构的更多信息,请参阅我们的[综合教程]()。\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmedit/blob/main/demo/restorer_basic_tutorial.ipynb)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"-kYw3WQ0MQry"},"source":["## 安装MMEditing\n","\n","MMEditing 可以分三步安装:\n","\n","1. 安装兼容的 PyTorch 版本(你需要使用 `nvcc -V` 检查你的 CUDA 版本)。\n","2. 安装预编译的MMCV\n","3. 克隆并安装MMEditing\n","\n","步骤如下所示:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":321,"status":"ok","timestamp":1625140540858,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"uha_13idyl1b","outputId":"87056561-5930-45b3-e1a8-f9e103d10b23"},"outputs":[{"name":"stdout","output_type":"stream","text":["nvcc: NVIDIA (R) Cuda compiler driver\n","Copyright (c) 2005-2020 NVIDIA Corporation\n","Built on Wed_Jul_22_19:09:09_PDT_2020\n","Cuda compilation tools, release 11.0, V11.0.221\n","Build cuda_11.0_bu.TC445_37.28845127_0\n","gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","Copyright (C) 2017 Free Software Foundation, Inc.\n","This is free software; see the source for copying conditions. There is NO\n","warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n","\n"]}],"source":["# Check nvcc version\n","!nvcc -V\n","# Check GCC version (MMEditing needs gcc >= 5.0)\n","!gcc --version"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":279948,"status":"ok","timestamp":1625140820804,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"GIeIZEzZMfc0","outputId":"fe2e5ded-988d-4563-eb18-374344c316ef"},"outputs":[{"name":"stdout","output_type":"stream","text":["Looking in links: https://download.pytorch.org/whl/torch_stable.html\n","Collecting torch==1.7.0+cu110\n","\u001b[?25l Downloading https://download.pytorch.org/whl/cu110/torch-1.7.0%2Bcu110-cp37-cp37m-linux_x86_64.whl (1137.1MB)\n","\u001b[K |███████████████████████▌ | 834.1MB 1.3MB/s eta 0:03:50tcmalloc: large alloc 1147494400 bytes == 0x56458d07a000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |█████████████████████████████▊ | 1055.7MB 1.2MB/s eta 0:01:07tcmalloc: large alloc 1434370048 bytes == 0x5645d16d0000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |████████████████████████████████| 1137.1MB 1.1MB/s eta 0:00:01tcmalloc: large alloc 1421369344 bytes == 0x564626ebc000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645535c430a 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c4a81\n","\u001b[K |████████████████████████████████| 1137.1MB 16kB/s \n","\u001b[?25hCollecting torchvision==0.8.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/1d/3f/4f45249458a0dee85bff7acf4a2ac6177708253f1f318fcf6ee230fb864f/torchvision-0.8.0-cp37-cp37m-manylinux1_x86_64.whl (11.8MB)\n","\u001b[K |████████████████████████████████| 11.8MB 254kB/s \n","\u001b[?25hRequirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (3.7.4.3)\n","Collecting dataclasses\n"," Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n","Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (1.19.5)\n","Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (0.16.0)\n","Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.0) (7.1.2)\n","\u001b[31mERROR: torchtext 0.10.0 has requirement torch==1.9.0, but you'll have torch 1.7.0+cu110 which is incompatible.\u001b[0m\n","Installing collected packages: dataclasses, torch, torchvision\n"," Found existing installation: torch 1.9.0+cu102\n"," Uninstalling torch-1.9.0+cu102:\n"," Successfully uninstalled torch-1.9.0+cu102\n"," Found existing installation: torchvision 0.10.0+cu102\n"," Uninstalling torchvision-0.10.0+cu102:\n"," Successfully uninstalled torchvision-0.10.0+cu102\n","Successfully installed dataclasses-0.6 torch-1.7.0+cu110 torchvision-0.8.0\n","Looking in links: https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n","Collecting mmcv-full==1.3.5\n","\u001b[?25l Downloading https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/mmcv_full-1.3.5-cp37-cp37m-manylinux1_x86_64.whl (31.1MB)\n","\u001b[K |████████████████████████████████| 31.1MB 107kB/s \n","\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (1.19.5)\n","Collecting addict\n"," Downloading https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl\n","Collecting yapf\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/5f/0d/8814e79eb865eab42d95023b58b650d01dec6f8ea87fc9260978b1bf2167/yapf-0.31.0-py2.py3-none-any.whl (185kB)\n","\u001b[K |████████████████████████████████| 194kB 33.0MB/s \n","\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (7.1.2)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (4.1.2.30)\n","Installing collected packages: addict, yapf, mmcv-full\n","Successfully installed addict-2.4.0 mmcv-full-1.3.5 yapf-0.31.0\n","Cloning into 'mmediting'...\n","remote: Enumerating objects: 7162, done.\u001b[K\n","remote: Counting objects: 100% (1367/1367), done.\u001b[K\n","remote: Compressing objects: 100% (793/793), done.\u001b[K\n","remote: Total 7162 (delta 827), reused 928 (delta 554), pack-reused 5795\u001b[K\n","Receiving objects: 100% (7162/7162), 5.02 MiB | 32.14 MiB/s, done.\n","Resolving deltas: 100% (4826/4826), done.\n","/content/mmediting\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 1)) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 2)) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 3)) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 4)) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 5)) (0.31.0)\n","Collecting codecov\n"," Downloading https://files.pythonhosted.org/packages/93/9f/bbea5b6231308458963cb5c067bc5643da9949689702fa5a382714b59699/codecov-2.1.11-py2.py3-none-any.whl\n","Collecting flake8\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/fc/80/35a0716e5d5101e643404dabd20f07f5528a21f3ef4032d31a49c913237b/flake8-3.9.2-py2.py3-none-any.whl (73kB)\n","\u001b[K |████████████████████████████████| 81kB 9.7MB/s \n","\u001b[?25hCollecting interrogate\n"," Downloading https://files.pythonhosted.org/packages/cd/6d/ce3ac440b13c1b36b323a0eab191499a902adade3cc11b18078c07af3e6e/interrogate-1.4.0-py3-none-any.whl\n","Collecting isort==4.3.21\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n","\u001b[K |████████████████████████████████| 51kB 7.5MB/s \n","\u001b[?25hCollecting onnxruntime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/f9/76/3d0f8bb2776961c7335693df06eccf8d099e48fa6fb552c7546867192603/onnxruntime-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5MB)\n","\u001b[K |████████████████████████████████| 4.5MB 37.4MB/s \n","\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.7/dist-packages (from -r requirements/tests.txt (line 6)) (3.6.4)\n","Collecting pytest-runner\n"," Downloading https://files.pythonhosted.org/packages/f4/f5/6605d73bf3f4c198915872111b10c4b3c2dccd8485f47b7290ceef037190/pytest_runner-5.3.1-py3-none-any.whl\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (1.19.5)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (2.4.0)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (4.1.2.30)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (3.13)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.5.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.4.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.4.1)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.1.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (3.2.2)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.36.2)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.34.1)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.6.1)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.8.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (2.23.0)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.4.4)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (57.0.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.12.0)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.12.4)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.3.4)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.31.0)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.0.1)\n","Requirement already satisfied: coverage in /usr/local/lib/python3.7/dist-packages (from codecov->-r requirements/tests.txt (line 1)) (3.7.1)\n","Collecting pyflakes<2.4.0,>=2.3.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/11/2a745612f1d3cbbd9c69ba14b1b43a35a2f5c3c81cd0124508c52c64307f/pyflakes-2.3.1-py2.py3-none-any.whl (68kB)\n","\u001b[K |████████████████████████████████| 71kB 9.8MB/s \n","\u001b[?25hCollecting pycodestyle<2.8.0,>=2.7.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/cc/227251b1471f129bc35e966bb0fceb005969023926d744139642d847b7ae/pycodestyle-2.7.0-py2.py3-none-any.whl (41kB)\n","\u001b[K |████████████████████████████████| 51kB 8.7MB/s \n","\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n"," Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from flake8->-r requirements/tests.txt (line 2)) (4.5.0)\n","Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.8.9)\n","Collecting colorama\n"," Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n","Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (7.1.2)\n","Requirement already satisfied: toml in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.10.2)\n","Requirement already satisfied: py in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (1.10.0)\n","Requirement already satisfied: attrs in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (21.2.0)\n","Requirement already satisfied: flatbuffers in /usr/local/lib/python3.7/dist-packages (from onnxruntime->-r requirements/tests.txt (line 5)) (1.12)\n","Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (8.8.0)\n","Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (0.7.1)\n","Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.15.0)\n","Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.4.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->-r requirements/runtime.txt (line 3)) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (1.3.1)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (3.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2021.5.30)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (1.24.3)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2.10)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (1.3.0)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.7.2)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.2.2)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (3.1.1)\n","Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.7/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3.6\"->google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.4.8)\n","Installing collected packages: codecov, pyflakes, pycodestyle, mccabe, flake8, colorama, interrogate, isort, onnxruntime, pytest-runner\n","Successfully installed codecov-2.1.11 colorama-0.4.4 flake8-3.9.2 interrogate-1.4.0 isort-4.3.21 mccabe-0.6.1 onnxruntime-1.8.0 pycodestyle-2.7.0 pyflakes-2.3.1 pytest-runner-5.3.1\n","Created temporary directory: /tmp/pip-ephem-wheel-cache-hu6xvjxh\n","Created temporary directory: /tmp/pip-req-tracker-zk5q0q3z\n","Created requirements tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Created temporary directory: /tmp/pip-install-vr_vpseo\n","Obtaining file:///content/mmediting\n"," Added file:///content/mmediting to build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"," Running setup.py (path:/content/mmediting/setup.py) egg_info for package from file:///content/mmediting\n"," Running command python setup.py egg_info\n"," running egg_info\n"," creating mmedit.egg-info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," Source in /content/mmediting has version 0.8.0, which satisfies requirement mmedit==0.8.0 from file:///content/mmediting\n"," Removed mmedit==0.8.0 from file:///content/mmediting from build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.31.0)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (4.1.2.30)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (2.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (1.19.5)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.5.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.4.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.4.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (3.2.2)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.1.1)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.34.1)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.12.4)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.0.1)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.36.2)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.31.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.12.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (2.23.0)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.8.0)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.3.4)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.4.4)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.6.1)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (57.0.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->mmedit==0.8.0) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (1.3.1)\n","Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from grpcio>=1.24.3->tensorboard->mmedit==0.8.0) (1.15.0)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.2.2)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.7.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (1.24.3)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2.10)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2021.5.30)\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.8.0) (4.5.0)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (1.3.0)\n","Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.4.8)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (3.1.1)\n","Installing collected packages: mmedit\n"," Running setup.py develop for mmedit\n"," Running command /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/content/mmediting/setup.py'\"'\"'; __file__='\"'\"'/content/mmediting/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' develop --no-deps\n"," running develop\n"," running egg_info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," running build_ext\n"," Creating /usr/local/lib/python3.7/dist-packages/mmedit.egg-link (link to .)\n"," Adding mmedit 0.8.0 to easy-install.pth file\n","\n"," Installed /content/mmediting\n","Successfully installed mmedit\n","Cleaning up...\n","Removed build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"]}],"source":["# 安装 openmim 用于安装 mmcv-full\n","!pip install openmim\n","\n","# 安装 mmcv-full 使用 CUDA 算子\n","!mim install mmcv-full\n","\n","# 克隆 MMEditing\n","!rm -rf mmediting\n","!git clone https://github.com/open-mmlab/mmediting.git\n","%cd mmediting\n","\n","# 安装 MMEditing\n","!pip install -v -e ."]},{"cell_type":"markdown","metadata":{"id":"QgX96Sc_3PcV"},"source":["## 下载此演示所需的材料\n","在这个演示中,我们将需要一些数据和配置文件。我们将下载并放入 `./demo_files/`"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4723,"status":"ok","timestamp":1625140825508,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"-K0zFSJ-3V42","outputId":"528a87f7-f78e-4219-84f3-dec19b88e88a"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2021-07-01 11:59:48-- https://download.openmmlab.com/mmediting/demo_files.zip\n","Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.35\n","Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.35|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 19215781 (18M) [application/zip]\n","Saving to: ‘demo_files.zip’\n","\n","demo_files.zip 100%[===================>] 18.33M 6.00MB/s in 3.1s \n","\n","2021-07-01 11:59:52 (6.00 MB/s) - ‘demo_files.zip’ saved [19215781/19215781]\n","\n","Archive: demo_files.zip\n"," creating: demo_files/\n"," inflating: demo_files/demo_config_EDVR.py \n"," inflating: demo_files/demo_config_BasicVSR.py \n"," creating: demo_files/lq_sequences/\n"," creating: demo_files/lq_sequences/calendar/\n"," inflating: demo_files/lq_sequences/calendar/00000006.png \n"," inflating: demo_files/lq_sequences/calendar/00000007.png \n"," inflating: demo_files/lq_sequences/calendar/00000010.png \n"," inflating: demo_files/lq_sequences/calendar/00000004.png \n"," inflating: demo_files/lq_sequences/calendar/00000003.png \n"," inflating: demo_files/lq_sequences/calendar/00000001.png \n"," inflating: demo_files/lq_sequences/calendar/00000000.png \n"," inflating: demo_files/lq_sequences/calendar/00000009.png \n"," inflating: demo_files/lq_sequences/calendar/00000008.png \n"," inflating: demo_files/lq_sequences/calendar/00000002.png \n"," inflating: demo_files/lq_sequences/calendar/00000005.png \n"," creating: demo_files/lq_sequences/city/\n"," inflating: demo_files/lq_sequences/city/00000006.png \n"," inflating: demo_files/lq_sequences/city/00000007.png \n"," inflating: demo_files/lq_sequences/city/00000010.png \n"," inflating: demo_files/lq_sequences/city/00000004.png \n"," inflating: demo_files/lq_sequences/city/00000003.png \n"," inflating: demo_files/lq_sequences/city/00000001.png \n"," inflating: demo_files/lq_sequences/city/00000000.png \n"," inflating: demo_files/lq_sequences/city/00000009.png \n"," inflating: demo_files/lq_sequences/city/00000008.png \n"," inflating: demo_files/lq_sequences/city/00000002.png \n"," inflating: demo_files/lq_sequences/city/00000005.png \n"," creating: demo_files/lq_sequences/.ipynb_checkpoints/\n"," creating: demo_files/gt_images/\n"," inflating: demo_files/gt_images/bird.png \n"," inflating: demo_files/gt_images/woman.png \n"," inflating: demo_files/gt_images/head.png \n"," inflating: demo_files/gt_images/baby.png \n"," inflating: demo_files/gt_images/butterfly.png \n"," inflating: demo_files/demo_config_SRCNN.py \n"," creating: demo_files/lq_images/\n"," extracting: demo_files/lq_images/bird.png \n"," extracting: demo_files/lq_images/woman.png \n"," extracting: demo_files/lq_images/head.png \n"," extracting: demo_files/lq_images/baby.png \n"," extracting: demo_files/lq_images/butterfly.png \n"," creating: demo_files/gt_sequences/\n"," creating: demo_files/gt_sequences/calendar/\n"," inflating: demo_files/gt_sequences/calendar/00000006.png \n"," inflating: demo_files/gt_sequences/calendar/00000007.png \n"," inflating: demo_files/gt_sequences/calendar/00000010.png \n"," inflating: demo_files/gt_sequences/calendar/00000004.png \n"," inflating: demo_files/gt_sequences/calendar/00000003.png \n"," inflating: demo_files/gt_sequences/calendar/00000001.png \n"," inflating: demo_files/gt_sequences/calendar/00000000.png \n"," inflating: demo_files/gt_sequences/calendar/00000009.png \n"," inflating: demo_files/gt_sequences/calendar/00000008.png \n"," inflating: demo_files/gt_sequences/calendar/00000002.png \n"," inflating: demo_files/gt_sequences/calendar/00000005.png \n"," creating: demo_files/gt_sequences/city/\n"," inflating: demo_files/gt_sequences/city/00000006.png \n"," inflating: demo_files/gt_sequences/city/00000007.png \n"," inflating: demo_files/gt_sequences/city/00000010.png \n"," inflating: demo_files/gt_sequences/city/00000004.png \n"," inflating: demo_files/gt_sequences/city/00000003.png \n"," inflating: demo_files/gt_sequences/city/00000001.png \n"," inflating: demo_files/gt_sequences/city/00000000.png \n"," inflating: demo_files/gt_sequences/city/00000009.png \n"," inflating: demo_files/gt_sequences/city/00000008.png \n"," inflating: demo_files/gt_sequences/city/00000002.png \n"," inflating: demo_files/gt_sequences/city/00000005.png \n"," creating: demo_files/gt_sequences/.ipynb_checkpoints/\n"," creating: demo_files/.ipynb_checkpoints/\n"]}],"source":["!wget https://download.openmmlab.com/mmediting/demo_files.zip # 下载文件\n","!unzip demo_files # 解压\n","\n","# 将数据复制到 data/Set5 以备后用\n","!mkdir data\n","!mkdir data/val_set5\n","!cp -r demo_files/lq_images data/val_set5/Set5_bicLRx4\n","!cp -r demo_files/gt_images data/val_set5/Set5"]},{"cell_type":"markdown","metadata":{"id":"zXGurqGKOeNE"},"source":["## 使用预训练的图像恢复器进行推理\n","您可以使用 “restoration_demo.py” 轻松地使用预训练的恢复器对单个图像进行推理。您需要的是\n","\n","1. `CONFIG_FILE`:你要使用的 restorer 对应的配置文件。它指定您要使用的模型。\n","2. `CHECKPOINT_FILE`:预训练模型权重文件的路径。\n","3. `IMAGE_FILE`:输入图像的路径。\n","4. `SAVE_FILE`:您要存储输出图像的位置。\n","5. `imshow`:是否显示图片。(可选的)\n","6. `GPU_ID`:您想使用哪个 GPU。(可选的)\n","\n","获得所有这些详细信息后,您可以直接使用以下命令:\n","\n","```\n","python demo/restoration_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${IMAGE_FILE} ${SAVE_FILE} [--imshow] [--device ${GPU_ID}]\n","```\n","\n","**注:** \n","1. 配置文件位于 `./configs`。\n","2. 我们支持从 url 加载权重文件。您可以到相应页面(例如[这里](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan))获取预训练模型的url。\n","\n","---\n","\n","我们现在将使用 `SRCNN` 和 `ESRGAN` 作为示例。\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58677,"status":"ok","timestamp":1625140884175,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"KiPvtvlqM1zb","outputId":"be7375a7-4632-4770-8383-2a8ce654b069"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\" to /root/.cache/torch/hub/checkpoints/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\n","100% 83.9k/83.9k [00:00<00:00, 1.59MB/s]\n","2021-07-01 12:00:10,779 - mmedit - INFO - Use load_from_torchvision loader\n","Downloading: \"https://download.pytorch.org/models/vgg19-dcbb9e9d.pth\" to /root/.cache/torch/hub/checkpoints/vgg19-dcbb9e9d.pth\n","100% 548M/548M [00:07<00:00, 76.0MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\" to /root/.cache/torch/hub/checkpoints/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\n","100% 196M/196M [00:26<00:00, 7.61MB/s]\n","bird_ESRGAN.png bird_SRCNN.png\n"]}],"source":["# SRCNN\n","!python demo/restoration_demo.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth ./demo_files/lq_images/bird.png ./outputs/bird_SRCNN.png\n","\n","# ESRGAN\n","!python demo/restoration_demo.py ./configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth ./demo_files/lq_images/bird.png ./outputs/bird_ESRGAN.png\n","\n","# 检查图像是否已保存\n","!ls ./outputs"]},{"cell_type":"markdown","metadata":{"id":"W1DfGHu3Xcfd"},"source":["## 使用预训练的视频复原器进行推理\n","\n","MMEditing 也支持视频超分辨率方法,过程类似。您可以使用带有以下参数的 `restoration_video_demo.py`:\n","\n","1. `CONFIG_FILE`:你要使用的 restorer 对应的配置文件。它指定您要使用的模型。\n","2. `CHECKPOINT_FILE`:预训练模型权重文件的路径。\n","3. `INPUT_DIR`: 包含视频帧的目录。\n","4. `OUTPUT_DIR`: 要存储输出帧的位置。\n","5. `WINDOW_SIZE`: 使用滑动窗口方法时的窗口大小(可选)。\n","6. `GPU_ID`: 您想使用哪个 GPU(可选)。\n","\n","```\n","python demo/restoration_video_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${INPUT_DIR} ${OUTPUT_DIR} [--window_size=$WINDOW_SIZE] [--device ${GPU_ID}]\n","```\n","**注:** 视频超分辨率有两种不同的框架:***滑动窗口***和***循环***框架。使用 EDVR 等滑动窗口框架的方法时,需要指定 `window_size`。此值取决于您使用的模型。\n","\n","---\n","\n","我们现在将使用 `EDVR` 和 `BasicVSR` 作为示例。\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29263,"status":"ok","timestamp":1625140913405,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"iaoE7UF5Xb2i","outputId":"a022e0bd-c47a-450e-f4e4-1bf9f92e4813"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\" to /root/.cache/torch/hub/checkpoints/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\n","100% 11.5M/11.5M [00:01<00:00, 8.55MB/s]\n","2021-07-01 12:01:09,689 - mmedit - INFO - Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth\" to /root/.cache/torch/hub/checkpoints/spynet_20210409-c6c1bd09.pth\n","100% 5.50M/5.50M [00:00<00:00, 8.88MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth\" to /root/.cache/torch/hub/checkpoints/basicvsr_reds4_20120409-0e599677.pth\n","100% 24.1M/24.1M [00:02<00:00, 8.97MB/s]\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# EDVR(滑动窗口框架)\n","!python demo/restoration_video_demo.py ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_EDVR --window_size=5\n","\n","# BasicVSR(循环框架)\n","!python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_BasicVSR\n","\n","# 检查是否保存了视频帧\n","!ls ./outputs/calendar_BasicVSR"]},{"cell_type":"markdown","metadata":{"id":"Rf3LW57qMHXb"},"source":["## 使用配置文件在预定义的数据集上进行测试\n","\n","上述演示提供了一种对单个图像或视频序列进行推理的简单方法。如果要对一组图像或序列进行推理,可以使用位于 `./configs` 中的配置文件。\n"," \n","现有的配置文件允许您对常见数据集进行推理,例如图像超分辨率中的 `Set5` 和视频超分辨率中的 `REDS4`。您可以使用以下命令:\n","\n","1. `CONFIG_FILE`: 你要使用的复原器和数据集对应的配置文件\n","2. `CHECKPOINT_FILE`: 预训练模型权重文件的路径。\n","3. `GPU_NUM`: 用于测试的 GPU 数量。\n","4. `RESULT_FILE`: 输出结果 pickle 文件的路径。(可选)\n","5. `IMAGE_SAVE_PATH`: 要存储输出图像的位置。(可选)\n","\n","```\n","# 单 GPU 测试\n","python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","\n","# 多 GPU 测试\n","./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","```\n","您需要做的是修改配置文件中的 `lq_folder` 和 `gt_folder`:\n","```\n","test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/val_set5/Set5_bicLRx4',\n"," gt_folder='data/val_set5/Set5',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","```\n","\n","**注**: 某些数据集类型(例如 `SRREDSDataset`)需要一个注释文件来指定数据集的详细信息。更多细节请参考 `./mmedit/dataset/` 中的相应文件。\n","\n","---\n","\n","以下是 SRCNN 的命令。对于其他模型,您可以简单地更改配置文件和预训练模型的路径。\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14095,"status":"ok","timestamp":1625140927462,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"tClgIYgcbbVg","outputId":"c37ec2de-e1c9-42ae-ed9b-31009d48ae64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"tools/test.py\", line 136, in \n"," main()\n"," File \"tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/test.py\", line 136, in \n"," main()\n"," File \"./tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/test.py', '--local_rank=0', './configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py', 'https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth', '--launcher', 'pytorch', '--save-path', './outputs/']' returned non-zero exit status 1.\n"]}],"source":["# 单 GPU\n","!python tools/test.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/\n","\n","# 多 GPU\n","!./tools/dist_test.sh ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth 1 --save-path ./outputs/"]},{"cell_type":"markdown","metadata":{"id":"KWKVyeEQelh3"},"source":["## 在自定义数据集上进行测试\n","\n","当您想在自定义数据集上进行测试时,除了数据集路径之外,您还需要修改 `test_dataset_type`。 \n","\n","- 对于图像超分辨率,需要使用 `SRFolderDataset`\n","- 对于视频超分辨率的滑动窗口框架(例如 EDVR、TDAN),需要使用 `SRFolderVideoDataset`。\n","- 对于视频超分辨率的循环框架(例如 BasicVSR、IconVSR),需要使用 `SRFolderMultipleGTDataset`。\n","\n","这些数据集类型假定指定目录中的所有图像/序列都用于测试。文件夹结构应该是\n","```\n","| lq_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," | ...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","| gt_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," |...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","```\n","我们将使用 **SRCNN**、**EDVR**、**BasicVSR** 作为示例。请注意 `test_dataset_type` 和 `data['test']` 的设置。"]},{"cell_type":"markdown","metadata":{"id":"0p2rP8jV_dL1"},"source":["**SRCNN**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8729,"status":"ok","timestamp":1625140936180,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"4kEev4wVIq_L","outputId":"8026ed73-f781-4eb2-bb80-d3446bd131df"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 5/5, 8.6 task/s, elapsed: 1s, ETA: 0s\n","Eval-PSNR: 28.433974369836108\n","Eval-SSIM: 0.8099053586583066\n","baby.png bird.png butterfly.png head.png woman.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_SRCNN.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/testset_SRCNN\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_SRCNN"]},{"cell_type":"markdown","metadata":{"id":"RONzjTTU_gem"},"source":["**EDVR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":19671,"status":"ok","timestamp":1625140955813,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"vL8WOWXY0fNJ","outputId":"dc2a8f81-9bef-4ad4-c5b2-c6f124e6b113"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 22/22, 2.0 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 23.89569862011228\n","Eval-SSIM: 0.7667098470108678\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_EDVR.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth --save-path ./outputs/testset_EDVR\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_EDVR\n","!ls ./outputs/testset_EDVR/city"]},{"cell_type":"markdown","metadata":{"id":"5Tc7F-l5_i1e"},"source":["**BasicVSR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":20220,"status":"ok","timestamp":1625140976026,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"jpW5GWC74Yvu","outputId":"7ba02a32-d4ec-40b2-8108-ef0729b62147"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:07,780 - mmedit - INFO - Use load_from_http loader\n","Use load_from_http loader\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","[>>] 2/2, 0.2 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 24.195768601433734\n","Eval-SSIM: 0.7828541339512978\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_BasicVSR.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth --save-path ./outputs/testset_BasicVSR\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_BasicVSR\n","!ls ./outputs/testset_BasicVSR/calendar"]},{"cell_type":"markdown","metadata":{"id":"4DQxNL8BhI0y"},"source":["## 在预定义的数据集上训练恢复器\n","\n","MMEditing 使用分布式训练。以下命令可用于训练。如果要在我们的配置文件中指定的预定义数据集上进行训练,只需运行以下命令即可。\n","\n","```\n","./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]\n","```\n","\n","有关可选参数的更多详细信息,请参阅 `tools/train.py`。\n","\n","---\n","\n","这是一个使用 EDVR 的示例。\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9337,"status":"ok","timestamp":1625140985357,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"s-hOnSF6ItQM","outputId":"e40e960a-29e1-43e8-b922-5e08c4e98afe"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:31,961 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:31,961 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:31,961 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:31,961 - mmedit - INFO - Config:\n","/content/mmediting/configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py\n","exp_name = 'edvrm_wotsa_x4_g8_600k_reds'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRREDSDataset'\n","val_dataset_type = 'SRREDSDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 600000\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50000, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=100,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 54, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 63, in load_annotations\n"," with open(self.ann_file, 'r') as fin:\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/train.py\", line 145, in \n"," main()\n"," File \"./tools/train.py\", line 111, in main\n"," datasets = [build_dataset(cfg.data.train)]\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 76, in build_dataset\n"," build_dataset(cfg['dataset'], default_args), cfg['times'])\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRREDSDataset: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/train.py', '--local_rank=0', './configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py', '--launcher', 'pytorch']' returned non-zero exit status 1.\n"]}],"source":["!./tools/dist_train.sh ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py 1"]},{"cell_type":"markdown","metadata":{"id":"b0VfQkQQjg8N"},"source":["## 在自定义数据集上训练复原器\n","\n","与您要在自己的数据集上进行测试的情况类似,您需要修改 `train_dataset_type`。您需要的数据集类型是相同的:\n","\n","- 对于图像超分辨率,需要使用 `SRFolderDataset`\n","- 对于视频超分辨率的滑动窗口框架(例如 EDVR、TDAN),需要使用 `SRFolderVideoDataset`。\n","- 对于视频超分辨率的循环框架(例如 BasicVSR、IconVSR),需要使用 `SRFolderMultipleGTDataset`。\n","\n","修改数据集类型和数据路径后。一切都准备好了。"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":128384,"status":"ok","timestamp":1625141113733,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"liGEKJpbIoXZ","outputId":"84e1502e-e2cb-458f-c7c5-e4b401e570b7"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:41,185 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:41,185 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:41,185 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:41,185 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_SRCNN.py\n","exp_name = 'srcnn_demo'\n","\n","scale = 4\n","# model settings\n","model = dict(\n"," type='BasicRestorer',\n"," generator=dict(\n"," type='SRCNN',\n"," channels=(3, 64, 32, 3),\n"," kernel_sizes=(9, 1, 5),\n"," upscale_factor=scale),\n"," pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=scale)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderDataset'\n","val_dataset_type = 'SRFolderDataset'\n","train_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=128),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","test_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'lq_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=8,\n"," train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=train_pipeline,\n"," scale=scale)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[250000, 250000, 250000, 250000],\n"," restart_weights=[1, 1, 1, 1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","evaluation = dict(interval=50, save_image=True, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./experiments/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:02:41,192 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/experiments/srcnn_demo\n","2021-07-01 12:02:41,192 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:02:41.529307: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:03:18,631 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.000e-04, eta: 0:57:01, time: 34.560, data_time: 34.446, memory: 586, loss_pix: 0.3999, loss: 0.3999\n","2021-07-01 12:03:18,712 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","INFO:mmedit:Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","2021-07-01 12:03:18,764 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","INFO:mmedit:Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","2021-07-01 12:03:18,840 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","INFO:mmedit:Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","2021-07-01 12:03:18,916 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","INFO:mmedit:Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","2021-07-01 12:03:18,956 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","INFO:mmedit:Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","2021-07-01 12:03:19,012 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","INFO:mmedit:Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","2021-07-01 12:03:19,070 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","INFO:mmedit:Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","2021-07-01 12:03:19,142 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","INFO:mmedit:Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","2021-07-01 12:03:19,212 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","INFO:mmedit:Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","2021-07-01 12:03:19,261 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","INFO:mmedit:Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","2021-07-01 12:03:19,302 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","INFO:mmedit:Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","2021-07-01 12:03:19,357 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","INFO:mmedit:Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","2021-07-01 12:03:19,419 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","INFO:mmedit:Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","2021-07-01 12:03:19,473 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","INFO:mmedit:Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","2021-07-01 12:03:19,538 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","INFO:mmedit:Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","2021-07-01 12:03:19,603 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","INFO:mmedit:Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","2021-07-01 12:03:19,657 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","INFO:mmedit:Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","2021-07-01 12:03:19,716 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","INFO:mmedit:Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","2021-07-01 12:03:19,772 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","INFO:mmedit:Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","2021-07-01 12:03:19,834 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","INFO:mmedit:Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","2021-07-01 12:03:19,877 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","INFO:mmedit:Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","2021-07-01 12:03:19,947 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","INFO:mmedit:Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","2021-07-01 12:03:20,014 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","INFO:mmedit:Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","2021-07-01 12:03:20,068 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","INFO:mmedit:Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","2021-07-01 12:03:20,124 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","INFO:mmedit:Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","2021-07-01 12:03:20,181 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","INFO:mmedit:Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","2021-07-01 12:03:20,244 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","INFO:mmedit:Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","2021-07-01 12:03:20,310 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","INFO:mmedit:Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","2021-07-01 12:03:20,356 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","INFO:mmedit:Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","2021-07-01 12:03:20,410 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","INFO:mmedit:Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","2021-07-01 12:03:20,480 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","INFO:mmedit:Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","2021-07-01 12:03:20,536 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","INFO:mmedit:Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","2021-07-01 12:03:20,595 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","INFO:mmedit:Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","2021-07-01 12:03:20,656 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","INFO:mmedit:Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","2021-07-01 12:03:20,710 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","INFO:mmedit:Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","2021-07-01 12:03:20,779 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:20,846 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","INFO:mmedit:Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","2021-07-01 12:03:20,907 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:20,958 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","INFO:mmedit:Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","2021-07-01 12:03:21,028 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","INFO:mmedit:Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","2021-07-01 12:03:21,122 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","INFO:mmedit:Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","2021-07-01 12:03:21,181 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:21,418 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","INFO:mmedit:Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","2021-07-01 12:03:21,480 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:21,551 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","INFO:mmedit:Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","2021-07-01 12:03:21,618 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","INFO:mmedit:Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","2021-07-01 12:03:21,667 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","INFO:mmedit:Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","2021-07-01 12:03:21,743 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","INFO:mmedit:Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","[>>] 5/5, 0.1 task/s, elapsed: 37s, ETA: 0s\n","\n","2021-07-01 12:03:59,996 - mmedit - INFO - Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","INFO:mmedit:Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","2021-07-01 12:04:00,047 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","INFO:mmedit:Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","2021-07-01 12:04:00,114 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","INFO:mmedit:Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","2021-07-01 12:04:00,181 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","INFO:mmedit:Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","2021-07-01 12:04:00,251 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","INFO:mmedit:Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","2021-07-01 12:04:00,315 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","INFO:mmedit:Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","2021-07-01 12:04:00,373 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","INFO:mmedit:Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","2021-07-01 12:04:00,418 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","INFO:mmedit:Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","2021-07-01 12:04:00,478 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","INFO:mmedit:Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","2021-07-01 12:04:00,538 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","INFO:mmedit:Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","2021-07-01 12:04:00,606 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","INFO:mmedit:Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","2021-07-01 12:04:00,647 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","INFO:mmedit:Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","2021-07-01 12:04:00,711 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","INFO:mmedit:Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","2021-07-01 12:04:00,757 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","INFO:mmedit:Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","2021-07-01 12:04:00,799 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","INFO:mmedit:Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","2021-07-01 12:04:00,871 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:00,938 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:00,995 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","INFO:mmedit:Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","2021-07-01 12:04:01,051 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","INFO:mmedit:Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","2021-07-01 12:04:01,115 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:01,196 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","INFO:mmedit:Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","2021-07-01 12:04:01,256 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","INFO:mmedit:Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","2021-07-01 12:04:01,325 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","INFO:mmedit:Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","2021-07-01 12:04:01,381 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","INFO:mmedit:Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:04:01,429 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","INFO:mmedit:Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","2021-07-01 12:04:01,497 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","INFO:mmedit:Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","2021-07-01 12:04:01,545 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","INFO:mmedit:Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","2021-07-01 12:04:01,597 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","INFO:mmedit:Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","2021-07-01 12:04:01,671 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","INFO:mmedit:Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:04:01,724 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:01,777 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","INFO:mmedit:Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","2021-07-01 12:04:01,847 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","INFO:mmedit:Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","2021-07-01 12:04:01,905 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","INFO:mmedit:Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","2021-07-01 12:04:01,953 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","INFO:mmedit:Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","2021-07-01 12:04:02,025 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","INFO:mmedit:Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","2021-07-01 12:04:02,079 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","INFO:mmedit:Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","2021-07-01 12:04:02,137 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","INFO:mmedit:Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","2021-07-01 12:04:02,193 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:02,255 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","INFO:mmedit:Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:04:02,341 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","INFO:mmedit:Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","2021-07-01 12:04:02,394 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","INFO:mmedit:Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","2021-07-01 12:04:02,496 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","INFO:mmedit:Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","2021-07-01 12:04:02,552 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:02,629 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","INFO:mmedit:Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","2021-07-01 12:04:02,682 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","INFO:mmedit:Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","2021-07-01 12:04:02,791 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","INFO:mmedit:Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","2021-07-01 12:04:02,834 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","INFO:mmedit:Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","2021-07-01 12:04:02,900 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","INFO:mmedit:Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","2021-07-01 12:04:03,053 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","INFO:mmedit:Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:04:03,108 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","INFO:mmedit:Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","[>>] 5/5, 0.2 task/s, elapsed: 33s, ETA: 0s\n","\n","2021-07-01 12:04:37,412 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:04:37,422 - mmedit - INFO - Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n","INFO:mmedit:Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n"]}],"source":["# SRCNN(图像超分辨率)\n","!./tools/dist_train.sh ./demo_files/demo_config_SRCNN.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":117937,"status":"ok","timestamp":1625141554036,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"26uZ4Ak7qbC9","outputId":"2fb26527-eb9e-4b48-e03c-ba9a91c60db8"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:10:12,619 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:10:12,619 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:10:12,619 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:10:12,619 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_EDVR.py\n","exp_name = 'edvrm_demo'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderVideoDataset'\n","val_dataset_type = 'SRFolderVideoDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:10:12,701 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/edvrm_demo\n","2021-07-01 12:10:12,702 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:10:12.951771: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:10:30,703 - mmedit - INFO - Iter [1/100]\tlr_generator: 4.000e-04, eta: 0:26:53, time: 16.295, data_time: 15.833, memory: 1341, loss_pix: 63917.2734, loss: 63917.2734\n","2021-07-01 12:10:31,046 - mmedit - INFO - Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","INFO:mmedit:Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","2021-07-01 12:10:31,386 - mmedit - INFO - Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","INFO:mmedit:Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","2021-07-01 12:10:31,731 - mmedit - INFO - Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","INFO:mmedit:Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","2021-07-01 12:10:32,071 - mmedit - INFO - Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","INFO:mmedit:Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","2021-07-01 12:10:32,414 - mmedit - INFO - Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","INFO:mmedit:Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","2021-07-01 12:10:32,760 - mmedit - INFO - Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","INFO:mmedit:Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","2021-07-01 12:10:33,102 - mmedit - INFO - Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","INFO:mmedit:Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","2021-07-01 12:10:33,447 - mmedit - INFO - Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","INFO:mmedit:Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","2021-07-01 12:10:33,792 - mmedit - INFO - Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","INFO:mmedit:Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","2021-07-01 12:10:34,138 - mmedit - INFO - Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","INFO:mmedit:Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","2021-07-01 12:10:34,484 - mmedit - INFO - Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","INFO:mmedit:Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","2021-07-01 12:10:34,829 - mmedit - INFO - Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","INFO:mmedit:Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","2021-07-01 12:10:35,175 - mmedit - INFO - Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","INFO:mmedit:Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","2021-07-01 12:10:35,522 - mmedit - INFO - Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","INFO:mmedit:Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","2021-07-01 12:10:35,866 - mmedit - INFO - Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","INFO:mmedit:Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","2021-07-01 12:10:36,212 - mmedit - INFO - Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","INFO:mmedit:Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","2021-07-01 12:10:36,560 - mmedit - INFO - Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","INFO:mmedit:Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","2021-07-01 12:10:36,904 - mmedit - INFO - Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","INFO:mmedit:Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","2021-07-01 12:10:37,249 - mmedit - INFO - Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","INFO:mmedit:Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","2021-07-01 12:10:37,595 - mmedit - INFO - Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","INFO:mmedit:Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","2021-07-01 12:10:37,939 - mmedit - INFO - Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","INFO:mmedit:Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","2021-07-01 12:10:38,283 - mmedit - INFO - Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","INFO:mmedit:Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","2021-07-01 12:10:38,628 - mmedit - INFO - Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","INFO:mmedit:Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","2021-07-01 12:10:38,974 - mmedit - INFO - Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","INFO:mmedit:Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","2021-07-01 12:10:39,318 - mmedit - INFO - Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","INFO:mmedit:Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","2021-07-01 12:10:39,665 - mmedit - INFO - Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","INFO:mmedit:Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","2021-07-01 12:10:40,011 - mmedit - INFO - Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","INFO:mmedit:Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","2021-07-01 12:10:40,356 - mmedit - INFO - Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","INFO:mmedit:Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","2021-07-01 12:10:40,703 - mmedit - INFO - Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","INFO:mmedit:Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","2021-07-01 12:10:41,049 - mmedit - INFO - Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","INFO:mmedit:Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","2021-07-01 12:10:41,396 - mmedit - INFO - Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","INFO:mmedit:Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","2021-07-01 12:10:41,745 - mmedit - INFO - Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","INFO:mmedit:Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","2021-07-01 12:10:42,097 - mmedit - INFO - Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","INFO:mmedit:Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","2021-07-01 12:10:42,444 - mmedit - INFO - Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","INFO:mmedit:Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","2021-07-01 12:10:42,790 - mmedit - INFO - Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","INFO:mmedit:Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","2021-07-01 12:10:43,140 - mmedit - INFO - Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","INFO:mmedit:Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","2021-07-01 12:10:43,490 - mmedit - INFO - Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","INFO:mmedit:Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","2021-07-01 12:10:43,841 - mmedit - INFO - Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","INFO:mmedit:Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","2021-07-01 12:10:44,193 - mmedit - INFO - Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","INFO:mmedit:Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","2021-07-01 12:10:44,541 - mmedit - INFO - Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","INFO:mmedit:Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","2021-07-01 12:10:44,895 - mmedit - INFO - Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","INFO:mmedit:Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","2021-07-01 12:10:45,248 - mmedit - INFO - Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","INFO:mmedit:Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","2021-07-01 12:10:45,595 - mmedit - INFO - Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","INFO:mmedit:Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","2021-07-01 12:10:45,950 - mmedit - INFO - Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","INFO:mmedit:Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","2021-07-01 12:10:46,301 - mmedit - INFO - Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","INFO:mmedit:Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","2021-07-01 12:10:46,649 - mmedit - INFO - Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","INFO:mmedit:Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","2021-07-01 12:10:47,003 - mmedit - INFO - Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","INFO:mmedit:Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","2021-07-01 12:10:47,356 - mmedit - INFO - Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","INFO:mmedit:Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:14,231 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","INFO:mmedit:Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","2021-07-01 12:11:14,578 - mmedit - INFO - Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","INFO:mmedit:Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","2021-07-01 12:11:14,930 - mmedit - INFO - Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","INFO:mmedit:Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","2021-07-01 12:11:15,289 - mmedit - INFO - Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","INFO:mmedit:Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","2021-07-01 12:11:15,642 - mmedit - INFO - Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","INFO:mmedit:Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","2021-07-01 12:11:15,993 - mmedit - INFO - Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","INFO:mmedit:Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","2021-07-01 12:11:16,354 - mmedit - INFO - Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","INFO:mmedit:Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","2021-07-01 12:11:16,712 - mmedit - INFO - Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","INFO:mmedit:Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","2021-07-01 12:11:17,065 - mmedit - INFO - Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","INFO:mmedit:Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","2021-07-01 12:11:17,425 - mmedit - INFO - Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","INFO:mmedit:Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","2021-07-01 12:11:17,780 - mmedit - INFO - Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","INFO:mmedit:Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","2021-07-01 12:11:18,135 - mmedit - INFO - Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","INFO:mmedit:Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","2021-07-01 12:11:18,495 - mmedit - INFO - Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","INFO:mmedit:Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","2021-07-01 12:11:18,851 - mmedit - INFO - Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","INFO:mmedit:Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","2021-07-01 12:11:19,210 - mmedit - INFO - Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","INFO:mmedit:Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","2021-07-01 12:11:19,567 - mmedit - INFO - Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","INFO:mmedit:Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","2021-07-01 12:11:19,923 - mmedit - INFO - Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","INFO:mmedit:Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","2021-07-01 12:11:20,286 - mmedit - INFO - Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","INFO:mmedit:Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","2021-07-01 12:11:20,644 - mmedit - INFO - Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","INFO:mmedit:Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","2021-07-01 12:11:21,000 - mmedit - INFO - Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","INFO:mmedit:Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","2021-07-01 12:11:21,359 - mmedit - INFO - Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","INFO:mmedit:Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","2021-07-01 12:11:21,719 - mmedit - INFO - Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","INFO:mmedit:Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","2021-07-01 12:11:22,072 - mmedit - INFO - Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","INFO:mmedit:Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","2021-07-01 12:11:22,434 - mmedit - INFO - Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","INFO:mmedit:Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","2021-07-01 12:11:22,798 - mmedit - INFO - Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","INFO:mmedit:Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","2021-07-01 12:11:23,158 - mmedit - INFO - Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","INFO:mmedit:Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","2021-07-01 12:11:23,513 - mmedit - INFO - Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","INFO:mmedit:Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","2021-07-01 12:11:23,875 - mmedit - INFO - Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","INFO:mmedit:Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","2021-07-01 12:11:24,236 - mmedit - INFO - Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","INFO:mmedit:Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","2021-07-01 12:11:24,597 - mmedit - INFO - Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","INFO:mmedit:Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","2021-07-01 12:11:24,951 - mmedit - INFO - Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","INFO:mmedit:Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","2021-07-01 12:11:25,313 - mmedit - INFO - Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","INFO:mmedit:Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","2021-07-01 12:11:25,677 - mmedit - INFO - Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","INFO:mmedit:Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","2021-07-01 12:11:26,038 - mmedit - INFO - Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","INFO:mmedit:Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","2021-07-01 12:11:26,393 - mmedit - INFO - Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","INFO:mmedit:Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","2021-07-01 12:11:26,753 - mmedit - INFO - Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","INFO:mmedit:Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","2021-07-01 12:11:27,115 - mmedit - INFO - Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","INFO:mmedit:Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","2021-07-01 12:11:27,472 - mmedit - INFO - Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","INFO:mmedit:Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","2021-07-01 12:11:27,830 - mmedit - INFO - Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","INFO:mmedit:Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","2021-07-01 12:11:28,189 - mmedit - INFO - Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","INFO:mmedit:Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","2021-07-01 12:11:28,553 - mmedit - INFO - Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","INFO:mmedit:Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","2021-07-01 12:11:28,910 - mmedit - INFO - Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","INFO:mmedit:Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","2021-07-01 12:11:29,266 - mmedit - INFO - Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","INFO:mmedit:Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","2021-07-01 12:11:29,628 - mmedit - INFO - Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","INFO:mmedit:Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","2021-07-01 12:11:29,989 - mmedit - INFO - Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","INFO:mmedit:Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","2021-07-01 12:11:30,345 - mmedit - INFO - Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","INFO:mmedit:Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","2021-07-01 12:11:30,704 - mmedit - INFO - Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","INFO:mmedit:Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","2021-07-01 12:11:31,067 - mmedit - INFO - Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","INFO:mmedit:Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","2021-07-01 12:11:31,425 - mmedit - INFO - Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","INFO:mmedit:Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","2021-07-01 12:11:31,782 - mmedit - INFO - Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","INFO:mmedit:Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:58,494 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:11:58,598 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n","INFO:mmedit:Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n"]}],"source":["# EDVR(视频超分辨率-滑动窗口)\n","!./tools/dist_train.sh ./demo_files/demo_config_EDVR.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":197033,"status":"ok","timestamp":1625141428032,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"_RdqmlT6qgt2","outputId":"b951b426-e06c-4f31-db01-449333eab333"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:06:47,253 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:06:47,253 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:06:47,254 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:06:47,254 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_BasicVSR.py\n","exp_name = 'basicvsr_demo'\n","\n","# model settings\n","model = dict(\n"," type='BasicVSR',\n"," generator=dict(\n"," type='BasicVSRNet',\n"," mid_channels=64,\n"," num_blocks=30,\n"," spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'\n"," 'basicvsr/spynet_20210409-c6c1bd09.pth'),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = dict(fix_iter=5000)\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderMultipleGTDataset'\n","val_dataset_type = 'SRFolderMultipleGTDataset'\n","\n","train_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=6,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True), # 2 gpus\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1, workers_per_gpu=1),\n","\n"," # train\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," # val\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," # test\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(\n"," generator=dict(\n"," type='Adam',\n"," lr=2e-4,\n"," betas=(0.9, 0.99),\n"," paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)})))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[300000],\n"," restart_weights=[1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," # dict(type='TensorboardLoggerHook'),\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","find_unused_parameters = True\n","\n","2021-07-01 12:06:47,291 - mmedit - INFO - Use load_from_http loader\n","2021-07-01 12:06:47,569 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/basicvsr_demo\n","2021-07-01 12:06:47,569 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:07:14,210 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.500e-05, eta: 0:42:52, time: 25.981, data_time: 24.045, memory: 3464, loss_pix: 0.0634, loss: 0.0634\n","2021-07-01 12:07:15,171 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.500e-05, eta: 0:22:00, time: 0.961, data_time: 0.011, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","2021-07-01 12:07:16,052 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.500e-05, eta: 0:14:59, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0476, loss: 0.0476\n","2021-07-01 12:07:16,940 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.500e-05, eta: 0:11:29, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:17,829 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.500e-05, eta: 0:09:22, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0796, loss: 0.0796\n","2021-07-01 12:07:18,712 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.500e-05, eta: 0:07:57, time: 0.884, data_time: 0.004, memory: 3518, loss_pix: 0.0680, loss: 0.0680\n","2021-07-01 12:07:19,594 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.500e-05, eta: 0:06:56, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0607, loss: 0.0607\n","2021-07-01 12:07:20,481 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.500e-05, eta: 0:06:10, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0598, loss: 0.0598\n","2021-07-01 12:07:21,361 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.500e-05, eta: 0:05:35, time: 0.880, data_time: 0.003, memory: 3518, loss_pix: 0.0664, loss: 0.0664\n","2021-07-01 12:07:22,274 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.500e-05, eta: 0:05:06, time: 0.913, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:07:23,161 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.500e-05, eta: 0:04:42, time: 0.887, data_time: 0.005, memory: 3518, loss_pix: 0.0771, loss: 0.0771\n","2021-07-01 12:07:24,058 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.500e-05, eta: 0:04:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0521, loss: 0.0521\n","2021-07-01 12:07:24,944 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.500e-05, eta: 0:04:05, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:07:25,835 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.500e-05, eta: 0:03:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0515, loss: 0.0515\n","2021-07-01 12:07:26,723 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.500e-05, eta: 0:03:38, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0674, loss: 0.0674\n","2021-07-01 12:07:27,609 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.500e-05, eta: 0:03:26, time: 0.886, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:28,498 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.500e-05, eta: 0:03:16, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0670, loss: 0.0670\n","2021-07-01 12:07:29,388 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.500e-05, eta: 0:03:07, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0663, loss: 0.0663\n","2021-07-01 12:07:30,284 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.500e-05, eta: 0:02:59, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0633, loss: 0.0633\n","2021-07-01 12:07:31,176 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.500e-05, eta: 0:02:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0482, loss: 0.0482\n","2021-07-01 12:07:32,073 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.500e-05, eta: 0:02:44, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0743, loss: 0.0743\n","2021-07-01 12:07:32,966 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.500e-05, eta: 0:02:38, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0690, loss: 0.0690\n","2021-07-01 12:07:33,858 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.500e-05, eta: 0:02:32, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0437, loss: 0.0437\n","2021-07-01 12:07:34,750 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.500e-05, eta: 0:02:27, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:35,642 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.500e-05, eta: 0:02:22, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0781, loss: 0.0781\n","2021-07-01 12:07:36,533 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.500e-05, eta: 0:02:17, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:07:37,427 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.500e-05, eta: 0:02:13, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:07:38,321 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.500e-05, eta: 0:02:08, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0567, loss: 0.0567\n","2021-07-01 12:07:39,212 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.500e-05, eta: 0:02:04, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0846, loss: 0.0846\n","2021-07-01 12:07:40,104 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.500e-05, eta: 0:02:01, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0658, loss: 0.0658\n","2021-07-01 12:07:40,993 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.500e-05, eta: 0:01:57, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0502, loss: 0.0502\n","2021-07-01 12:07:41,885 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.500e-05, eta: 0:01:54, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0622, loss: 0.0622\n","2021-07-01 12:07:42,787 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.500e-05, eta: 0:01:50, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0657, loss: 0.0657\n","2021-07-01 12:07:43,674 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.500e-05, eta: 0:01:47, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0643, loss: 0.0643\n","2021-07-01 12:07:44,567 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.500e-05, eta: 0:01:44, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0898, loss: 0.0898\n","2021-07-01 12:07:45,458 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.500e-05, eta: 0:01:41, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0865, loss: 0.0865\n","2021-07-01 12:07:46,341 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.500e-05, eta: 0:01:38, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0511, loss: 0.0511\n","2021-07-01 12:07:47,225 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.500e-05, eta: 0:01:36, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:48,109 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.500e-05, eta: 0:01:33, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0653, loss: 0.0653\n","2021-07-01 12:07:48,990 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:07:49,874 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.885, data_time: 0.003, memory: 3518, loss_pix: 0.0788, loss: 0.0788\n","2021-07-01 12:07:50,755 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.500e-05, eta: 0:01:26, time: 0.881, data_time: 0.005, memory: 3518, loss_pix: 0.0605, loss: 0.0605\n","2021-07-01 12:07:51,638 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.500e-05, eta: 0:01:24, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0539, loss: 0.0539\n","2021-07-01 12:07:52,518 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.500e-05, eta: 0:01:21, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0503, loss: 0.0503\n","2021-07-01 12:07:53,395 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.500e-05, eta: 0:01:19, time: 0.877, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:07:54,273 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0555, loss: 0.0555\n","2021-07-01 12:07:55,159 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.500e-05, eta: 0:01:15, time: 0.886, data_time: 0.007, memory: 3518, loss_pix: 0.0806, loss: 0.0806\n","2021-07-01 12:07:56,040 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.500e-05, eta: 0:01:13, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0576, loss: 0.0576\n","2021-07-01 12:07:56,919 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.500e-05, eta: 0:01:11, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0871, loss: 0.0871\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:08:32,618 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9899, SSIM: 0.5295\n","2021-07-01 12:08:33,591 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.500e-05, eta: 0:01:40, time: 35.792, data_time: 34.822, memory: 3518, loss_pix: 0.0773, loss: 0.0773\n","2021-07-01 12:08:34,462 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.500e-05, eta: 0:01:37, time: 0.871, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:08:35,326 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.500e-05, eta: 0:01:34, time: 0.864, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:36,192 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0575, loss: 0.0575\n","2021-07-01 12:08:37,069 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.876, data_time: 0.003, memory: 3518, loss_pix: 0.0842, loss: 0.0842\n","2021-07-01 12:08:37,942 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.500e-05, eta: 0:01:25, time: 0.873, data_time: 0.003, memory: 3518, loss_pix: 0.0836, loss: 0.0836\n","2021-07-01 12:08:38,808 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.500e-05, eta: 0:01:22, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0580, loss: 0.0580\n","2021-07-01 12:08:39,679 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.500e-05, eta: 0:01:20, time: 0.870, data_time: 0.003, memory: 3518, loss_pix: 0.0449, loss: 0.0449\n","2021-07-01 12:08:40,557 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0702, loss: 0.0702\n","2021-07-01 12:08:41,430 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.500e-05, eta: 0:01:14, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:42,308 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.500e-05, eta: 0:01:12, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:08:43,182 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.500e-05, eta: 0:01:09, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0489, loss: 0.0489\n","2021-07-01 12:08:44,056 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.500e-05, eta: 0:01:07, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0566, loss: 0.0566\n","2021-07-01 12:08:44,932 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.500e-05, eta: 0:01:05, time: 0.875, data_time: 0.003, memory: 3518, loss_pix: 0.0597, loss: 0.0597\n","2021-07-01 12:08:45,819 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.500e-05, eta: 0:01:02, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0640, loss: 0.0640\n","2021-07-01 12:08:46,698 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.500e-05, eta: 0:01:00, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:47,580 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.500e-05, eta: 0:00:58, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:08:48,464 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.500e-05, eta: 0:00:56, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:08:49,347 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.500e-05, eta: 0:00:54, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0603, loss: 0.0603\n","2021-07-01 12:08:50,229 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.500e-05, eta: 0:00:51, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0478, loss: 0.0478\n","2021-07-01 12:08:51,113 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.500e-05, eta: 0:00:49, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:08:52,000 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.500e-05, eta: 0:00:47, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0861, loss: 0.0861\n","2021-07-01 12:08:52,890 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.500e-05, eta: 0:00:45, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:08:53,792 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.500e-05, eta: 0:00:43, time: 0.903, data_time: 0.003, memory: 3518, loss_pix: 0.0787, loss: 0.0787\n","2021-07-01 12:08:54,688 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.500e-05, eta: 0:00:41, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0744, loss: 0.0744\n","2021-07-01 12:08:55,582 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.500e-05, eta: 0:00:39, time: 0.895, data_time: 0.003, memory: 3518, loss_pix: 0.0792, loss: 0.0792\n","2021-07-01 12:08:56,476 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.500e-05, eta: 0:00:38, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0645, loss: 0.0645\n","2021-07-01 12:08:57,368 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.500e-05, eta: 0:00:36, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:08:58,261 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.500e-05, eta: 0:00:34, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:59,159 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.500e-05, eta: 0:00:32, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0626, loss: 0.0626\n","2021-07-01 12:09:00,055 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.500e-05, eta: 0:00:30, time: 0.896, data_time: 0.004, memory: 3518, loss_pix: 0.0681, loss: 0.0681\n","2021-07-01 12:09:00,954 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.500e-05, eta: 0:00:28, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0671, loss: 0.0671\n","2021-07-01 12:09:01,860 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.500e-05, eta: 0:00:27, time: 0.906, data_time: 0.003, memory: 3518, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:09:02,760 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.500e-05, eta: 0:00:25, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0594, loss: 0.0594\n","2021-07-01 12:09:03,658 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.500e-05, eta: 0:00:23, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0446, loss: 0.0446\n","2021-07-01 12:09:04,555 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.500e-05, eta: 0:00:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0491, loss: 0.0491\n","2021-07-01 12:09:05,452 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.500e-05, eta: 0:00:20, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0450, loss: 0.0450\n","2021-07-01 12:09:06,351 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.500e-05, eta: 0:00:18, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0795, loss: 0.0795\n","2021-07-01 12:09:07,257 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.500e-05, eta: 0:00:17, time: 0.905, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:08,161 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.500e-05, eta: 0:00:15, time: 0.904, data_time: 0.003, memory: 3518, loss_pix: 0.0588, loss: 0.0588\n","2021-07-01 12:09:09,063 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.500e-05, eta: 0:00:13, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:09:09,955 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.500e-05, eta: 0:00:12, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0599, loss: 0.0599\n","2021-07-01 12:09:10,849 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.500e-05, eta: 0:00:10, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:11,749 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.500e-05, eta: 0:00:09, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0667, loss: 0.0667\n","2021-07-01 12:09:12,638 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.500e-05, eta: 0:00:07, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0558, loss: 0.0558\n","2021-07-01 12:09:13,576 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.500e-05, eta: 0:00:06, time: 0.938, data_time: 0.052, memory: 3518, loss_pix: 0.0577, loss: 0.0577\n","2021-07-01 12:09:14,463 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.500e-05, eta: 0:00:04, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:09:15,351 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.500e-05, eta: 0:00:02, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0578, loss: 0.0578\n","2021-07-01 12:09:16,240 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.500e-05, eta: 0:00:01, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:09:52,294 - mmedit - INFO - Saving checkpoint at 100 iterations\n","2021-07-01 12:09:52,433 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.4372, SSIM: 0.5687\n"]}],"source":["# BasicVSR(视频超分辨率 - 循环)\n","!./tools/dist_train.sh ./demo_files/demo_config_BasicVSR.py 1 "]},{"cell_type":"markdown","metadata":{"id":"QT0zwBFt7J13"},"source":["**本教程到此结束。有关更高级的用法,请参阅我们的[综合教程]()。享受使用 MMEditing 的乐趣!**"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"restorer_basic_tutorial.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3.7.7 64-bit ('pre-commit': conda)","name":"python377jvsc74a57bd04974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"},"language_info":{"name":"python","version":""},"metadata":{"interpreter":{"hash":"4974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"}}},"nbformat":4,"nbformat_minor":2} +{"cells":[{"cell_type":"markdown","metadata":{"id":"T2WWQiheMF7q"},"source":["# MMEditing 基础教程\n","\n","欢迎来到MMEditing! 这是 MMEditing 的官方 Colab 教程。在本教程中,您将学习如何使用 MMEditing 中提供的 API 训练和测试恢复器。\n","\n","这是训练和测试现有模型的快速指南。如果您想基于 MMEditing 开发自己的模型并了解有关代码结构的更多信息,请参阅我们的[综合教程]()。\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmedit/blob/main/demo/restorer_basic_tutorial.ipynb)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"-kYw3WQ0MQry"},"source":["## 安装MMEditing\n","\n","MMEditing 可以分三步安装:\n","\n","1. 安装兼容的 PyTorch 版本(你需要使用 `nvcc -V` 检查你的 CUDA 版本)。\n","2. 安装预编译的MMCV\n","3. 克隆并安装MMEditing\n","\n","步骤如下所示:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":321,"status":"ok","timestamp":1625140540858,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"uha_13idyl1b","outputId":"87056561-5930-45b3-e1a8-f9e103d10b23"},"outputs":[{"name":"stdout","output_type":"stream","text":["nvcc: NVIDIA (R) Cuda compiler driver\n","Copyright (c) 2005-2020 NVIDIA Corporation\n","Built on Wed_Jul_22_19:09:09_PDT_2020\n","Cuda compilation tools, release 11.0, V11.0.221\n","Build cuda_11.0_bu.TC445_37.28845127_0\n","gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","Copyright (C) 2017 Free Software Foundation, Inc.\n","This is free software; see the source for copying conditions. There is NO\n","warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n","\n"]}],"source":["# Check nvcc version\n","!nvcc -V\n","# Check GCC version (MMEditing needs gcc >= 5.0)\n","!gcc --version"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":279948,"status":"ok","timestamp":1625140820804,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"GIeIZEzZMfc0","outputId":"fe2e5ded-988d-4563-eb18-374344c316ef"},"outputs":[{"name":"stdout","output_type":"stream","text":["Looking in links: https://download.pytorch.org/whl/torch_stable.html\n","Collecting torch==1.7.0+cu110\n","\u001b[?25l Downloading https://download.pytorch.org/whl/cu110/torch-1.7.0%2Bcu110-cp37-cp37m-linux_x86_64.whl (1137.1MB)\n","\u001b[K |███████████████████████▌ | 834.1MB 1.3MB/s eta 0:03:50tcmalloc: large alloc 1147494400 bytes == 0x56458d07a000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |█████████████████████████████▊ | 1055.7MB 1.2MB/s eta 0:01:07tcmalloc: large alloc 1434370048 bytes == 0x5645d16d0000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |████████████████████████████████| 1137.1MB 1.1MB/s eta 0:00:01tcmalloc: large alloc 1421369344 bytes == 0x564626ebc000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645535c430a 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c4a81\n","\u001b[K |████████████████████████████████| 1137.1MB 16kB/s \n","\u001b[?25hCollecting torchvision==0.8.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/1d/3f/4f45249458a0dee85bff7acf4a2ac6177708253f1f318fcf6ee230fb864f/torchvision-0.8.0-cp37-cp37m-manylinux1_x86_64.whl (11.8MB)\n","\u001b[K |████████████████████████████████| 11.8MB 254kB/s \n","\u001b[?25hRequirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (3.7.4.3)\n","Collecting dataclasses\n"," Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n","Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (1.19.5)\n","Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (0.16.0)\n","Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.0) (7.1.2)\n","\u001b[31mERROR: torchtext 0.10.0 has requirement torch==1.9.0, but you'll have torch 1.7.0+cu110 which is incompatible.\u001b[0m\n","Installing collected packages: dataclasses, torch, torchvision\n"," Found existing installation: torch 1.9.0+cu102\n"," Uninstalling torch-1.9.0+cu102:\n"," Successfully uninstalled torch-1.9.0+cu102\n"," Found existing installation: torchvision 0.10.0+cu102\n"," Uninstalling torchvision-0.10.0+cu102:\n"," Successfully uninstalled torchvision-0.10.0+cu102\n","Successfully installed dataclasses-0.6 torch-1.7.0+cu110 torchvision-0.8.0\n","Looking in links: https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n","Collecting mmcv-full==1.3.5\n","\u001b[?25l Downloading https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/mmcv_full-1.3.5-cp37-cp37m-manylinux1_x86_64.whl (31.1MB)\n","\u001b[K |████████████████████████████████| 31.1MB 107kB/s \n","\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (1.19.5)\n","Collecting addict\n"," Downloading https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl\n","Collecting yapf\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/5f/0d/8814e79eb865eab42d95023b58b650d01dec6f8ea87fc9260978b1bf2167/yapf-0.31.0-py2.py3-none-any.whl (185kB)\n","\u001b[K |████████████████████████████████| 194kB 33.0MB/s \n","\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (7.1.2)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (4.1.2.30)\n","Installing collected packages: addict, yapf, mmcv-full\n","Successfully installed addict-2.4.0 mmcv-full-1.3.5 yapf-0.31.0\n","Cloning into 'mmediting'...\n","remote: Enumerating objects: 7162, done.\u001b[K\n","remote: Counting objects: 100% (1367/1367), done.\u001b[K\n","remote: Compressing objects: 100% (793/793), done.\u001b[K\n","remote: Total 7162 (delta 827), reused 928 (delta 554), pack-reused 5795\u001b[K\n","Receiving objects: 100% (7162/7162), 5.02 MiB | 32.14 MiB/s, done.\n","Resolving deltas: 100% (4826/4826), done.\n","/content/mmediting\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 1)) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 2)) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 3)) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 4)) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 5)) (0.31.0)\n","Collecting codecov\n"," Downloading https://files.pythonhosted.org/packages/93/9f/bbea5b6231308458963cb5c067bc5643da9949689702fa5a382714b59699/codecov-2.1.11-py2.py3-none-any.whl\n","Collecting flake8\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/fc/80/35a0716e5d5101e643404dabd20f07f5528a21f3ef4032d31a49c913237b/flake8-3.9.2-py2.py3-none-any.whl (73kB)\n","\u001b[K |████████████████████████████████| 81kB 9.7MB/s \n","\u001b[?25hCollecting interrogate\n"," Downloading https://files.pythonhosted.org/packages/cd/6d/ce3ac440b13c1b36b323a0eab191499a902adade3cc11b18078c07af3e6e/interrogate-1.4.0-py3-none-any.whl\n","Collecting isort==4.3.21\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n","\u001b[K |████████████████████████████████| 51kB 7.5MB/s \n","\u001b[?25hCollecting onnxruntime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/f9/76/3d0f8bb2776961c7335693df06eccf8d099e48fa6fb552c7546867192603/onnxruntime-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5MB)\n","\u001b[K |████████████████████████████████| 4.5MB 37.4MB/s \n","\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.7/dist-packages (from -r requirements/tests.txt (line 6)) (3.6.4)\n","Collecting pytest-runner\n"," Downloading https://files.pythonhosted.org/packages/f4/f5/6605d73bf3f4c198915872111b10c4b3c2dccd8485f47b7290ceef037190/pytest_runner-5.3.1-py3-none-any.whl\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (1.19.5)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (2.4.0)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (4.1.2.30)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (3.13)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.5.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.4.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.4.1)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.1.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (3.2.2)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.36.2)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.34.1)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.6.1)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.8.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (2.23.0)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.4.4)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (57.0.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.12.0)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.12.4)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.3.4)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.31.0)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.0.1)\n","Requirement already satisfied: coverage in /usr/local/lib/python3.7/dist-packages (from codecov->-r requirements/tests.txt (line 1)) (3.7.1)\n","Collecting pyflakes<2.4.0,>=2.3.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/11/2a745612f1d3cbbd9c69ba14b1b43a35a2f5c3c81cd0124508c52c64307f/pyflakes-2.3.1-py2.py3-none-any.whl (68kB)\n","\u001b[K |████████████████████████████████| 71kB 9.8MB/s \n","\u001b[?25hCollecting pycodestyle<2.8.0,>=2.7.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/cc/227251b1471f129bc35e966bb0fceb005969023926d744139642d847b7ae/pycodestyle-2.7.0-py2.py3-none-any.whl (41kB)\n","\u001b[K |████████████████████████████████| 51kB 8.7MB/s \n","\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n"," Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from flake8->-r requirements/tests.txt (line 2)) (4.5.0)\n","Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.8.9)\n","Collecting colorama\n"," Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n","Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (7.1.2)\n","Requirement already satisfied: toml in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.10.2)\n","Requirement already satisfied: py in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (1.10.0)\n","Requirement already satisfied: attrs in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (21.2.0)\n","Requirement already satisfied: flatbuffers in /usr/local/lib/python3.7/dist-packages (from onnxruntime->-r requirements/tests.txt (line 5)) (1.12)\n","Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (8.8.0)\n","Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (0.7.1)\n","Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.15.0)\n","Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.4.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->-r requirements/runtime.txt (line 3)) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (1.3.1)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (3.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2021.5.30)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (1.24.3)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2.10)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (1.3.0)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.7.2)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.2.2)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (3.1.1)\n","Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.7/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3.6\"->google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.4.8)\n","Installing collected packages: codecov, pyflakes, pycodestyle, mccabe, flake8, colorama, interrogate, isort, onnxruntime, pytest-runner\n","Successfully installed codecov-2.1.11 colorama-0.4.4 flake8-3.9.2 interrogate-1.4.0 isort-4.3.21 mccabe-0.6.1 onnxruntime-1.8.0 pycodestyle-2.7.0 pyflakes-2.3.1 pytest-runner-5.3.1\n","Created temporary directory: /tmp/pip-ephem-wheel-cache-hu6xvjxh\n","Created temporary directory: /tmp/pip-req-tracker-zk5q0q3z\n","Created requirements tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Created temporary directory: /tmp/pip-install-vr_vpseo\n","Obtaining file:///content/mmediting\n"," Added file:///content/mmediting to build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"," Running setup.py (path:/content/mmediting/setup.py) egg_info for package from file:///content/mmediting\n"," Running command python setup.py egg_info\n"," running egg_info\n"," creating mmedit.egg-info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," Source in /content/mmediting has version 0.8.0, which satisfies requirement mmedit==0.8.0 from file:///content/mmediting\n"," Removed mmedit==0.8.0 from file:///content/mmediting from build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.31.0)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (4.1.2.30)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (2.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (1.19.5)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.5.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.4.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.4.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (3.2.2)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.1.1)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.34.1)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.12.4)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.0.1)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.36.2)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.31.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.12.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (2.23.0)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.8.0)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.3.4)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.4.4)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.6.1)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (57.0.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->mmedit==0.8.0) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (1.3.1)\n","Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from grpcio>=1.24.3->tensorboard->mmedit==0.8.0) (1.15.0)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.2.2)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.7.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (1.24.3)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2.10)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2021.5.30)\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.8.0) (4.5.0)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (1.3.0)\n","Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.4.8)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (3.1.1)\n","Installing collected packages: mmedit\n"," Running setup.py develop for mmedit\n"," Running command /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/content/mmediting/setup.py'\"'\"'; __file__='\"'\"'/content/mmediting/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' develop --no-deps\n"," running develop\n"," running egg_info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," running build_ext\n"," Creating /usr/local/lib/python3.7/dist-packages/mmedit.egg-link (link to .)\n"," Adding mmedit 0.8.0 to easy-install.pth file\n","\n"," Installed /content/mmediting\n","Successfully installed mmedit\n","Cleaning up...\n","Removed build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"]}],"source":["# 安装 openmim 用于安装 mmcv-full\n","!pip install openmim\n","\n","# 安装 mmcv-full 使用 CUDA 算子\n","!mim install mmcv-full\n","\n","# 克隆 MMEditing\n","!rm -rf mmediting\n","!git clone https://github.com/open-mmlab/mmediting.git\n","%cd mmediting\n","\n","# 安装 MMEditing\n","!pip install -v -e ."]},{"cell_type":"markdown","metadata":{"id":"QgX96Sc_3PcV"},"source":["## 下载此演示所需的材料\n","在这个演示中,我们将需要一些数据和配置文件。我们将下载并放入 `./demo_files/`"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4723,"status":"ok","timestamp":1625140825508,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"-K0zFSJ-3V42","outputId":"528a87f7-f78e-4219-84f3-dec19b88e88a"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2021-07-01 11:59:48-- https://download.openmmlab.com/mmediting/demo_files.zip\n","Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.35\n","Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.35|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 19215781 (18M) [application/zip]\n","Saving to: ‘demo_files.zip’\n","\n","demo_files.zip 100%[===================>] 18.33M 6.00MB/s in 3.1s \n","\n","2021-07-01 11:59:52 (6.00 MB/s) - ‘demo_files.zip’ saved [19215781/19215781]\n","\n","Archive: demo_files.zip\n"," creating: demo_files/\n"," inflating: demo_files/demo_config_EDVR.py \n"," inflating: demo_files/demo_config_BasicVSR.py \n"," creating: demo_files/lq_sequences/\n"," creating: demo_files/lq_sequences/calendar/\n"," inflating: demo_files/lq_sequences/calendar/00000006.png \n"," inflating: demo_files/lq_sequences/calendar/00000007.png \n"," inflating: demo_files/lq_sequences/calendar/00000010.png \n"," inflating: demo_files/lq_sequences/calendar/00000004.png \n"," inflating: demo_files/lq_sequences/calendar/00000003.png \n"," inflating: demo_files/lq_sequences/calendar/00000001.png \n"," inflating: demo_files/lq_sequences/calendar/00000000.png \n"," inflating: demo_files/lq_sequences/calendar/00000009.png \n"," inflating: demo_files/lq_sequences/calendar/00000008.png \n"," inflating: demo_files/lq_sequences/calendar/00000002.png \n"," inflating: demo_files/lq_sequences/calendar/00000005.png \n"," creating: demo_files/lq_sequences/city/\n"," inflating: demo_files/lq_sequences/city/00000006.png \n"," inflating: demo_files/lq_sequences/city/00000007.png \n"," inflating: demo_files/lq_sequences/city/00000010.png \n"," inflating: demo_files/lq_sequences/city/00000004.png \n"," inflating: demo_files/lq_sequences/city/00000003.png \n"," inflating: demo_files/lq_sequences/city/00000001.png \n"," inflating: demo_files/lq_sequences/city/00000000.png \n"," inflating: demo_files/lq_sequences/city/00000009.png \n"," inflating: demo_files/lq_sequences/city/00000008.png \n"," inflating: demo_files/lq_sequences/city/00000002.png \n"," inflating: demo_files/lq_sequences/city/00000005.png \n"," creating: demo_files/lq_sequences/.ipynb_checkpoints/\n"," creating: demo_files/gt_images/\n"," inflating: demo_files/gt_images/bird.png \n"," inflating: demo_files/gt_images/woman.png \n"," inflating: demo_files/gt_images/head.png \n"," inflating: demo_files/gt_images/baby.png \n"," inflating: demo_files/gt_images/butterfly.png \n"," inflating: demo_files/demo_config_SRCNN.py \n"," creating: demo_files/lq_images/\n"," extracting: demo_files/lq_images/bird.png \n"," extracting: demo_files/lq_images/woman.png \n"," extracting: demo_files/lq_images/head.png \n"," extracting: demo_files/lq_images/baby.png \n"," extracting: demo_files/lq_images/butterfly.png \n"," creating: demo_files/gt_sequences/\n"," creating: demo_files/gt_sequences/calendar/\n"," inflating: demo_files/gt_sequences/calendar/00000006.png \n"," inflating: demo_files/gt_sequences/calendar/00000007.png \n"," inflating: demo_files/gt_sequences/calendar/00000010.png \n"," inflating: demo_files/gt_sequences/calendar/00000004.png \n"," inflating: demo_files/gt_sequences/calendar/00000003.png \n"," inflating: demo_files/gt_sequences/calendar/00000001.png \n"," inflating: demo_files/gt_sequences/calendar/00000000.png \n"," inflating: demo_files/gt_sequences/calendar/00000009.png \n"," inflating: demo_files/gt_sequences/calendar/00000008.png \n"," inflating: demo_files/gt_sequences/calendar/00000002.png \n"," inflating: demo_files/gt_sequences/calendar/00000005.png \n"," creating: demo_files/gt_sequences/city/\n"," inflating: demo_files/gt_sequences/city/00000006.png \n"," inflating: demo_files/gt_sequences/city/00000007.png \n"," inflating: demo_files/gt_sequences/city/00000010.png \n"," inflating: demo_files/gt_sequences/city/00000004.png \n"," inflating: demo_files/gt_sequences/city/00000003.png \n"," inflating: demo_files/gt_sequences/city/00000001.png \n"," inflating: demo_files/gt_sequences/city/00000000.png \n"," inflating: demo_files/gt_sequences/city/00000009.png \n"," inflating: demo_files/gt_sequences/city/00000008.png \n"," inflating: demo_files/gt_sequences/city/00000002.png \n"," inflating: demo_files/gt_sequences/city/00000005.png \n"," creating: demo_files/gt_sequences/.ipynb_checkpoints/\n"," creating: demo_files/.ipynb_checkpoints/\n"]}],"source":["!wget https://download.openmmlab.com/mmediting/demo_files.zip # 下载文件\n","!unzip demo_files # 解压\n","\n","# 将数据复制到 data/Set5 以备后用\n","!mkdir data\n","!mkdir data/val_set5\n","!cp -r demo_files/lq_images data/val_set5/Set5_bicLRx4\n","!cp -r demo_files/gt_images data/val_set5/Set5"]},{"cell_type":"markdown","metadata":{"id":"zXGurqGKOeNE"},"source":["## 使用预训练的图像恢复器进行推理\n","您可以使用 “restoration_demo.py” 轻松地使用预训练的恢复器对单个图像进行推理。您需要的是\n","\n","1. `CONFIG_FILE`:你要使用的 restorer 对应的配置文件。它指定您要使用的模型。\n","2. `CHECKPOINT_FILE`:预训练模型权重文件的路径。\n","3. `IMAGE_FILE`:输入图像的路径。\n","4. `SAVE_FILE`:您要存储输出图像的位置。\n","5. `imshow`:是否显示图片。(可选的)\n","6. `GPU_ID`:您想使用哪个 GPU。(可选的)\n","\n","获得所有这些详细信息后,您可以直接使用以下命令:\n","\n","```\n","python demo/restoration_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${IMAGE_FILE} ${SAVE_FILE} [--imshow] [--device ${GPU_ID}]\n","```\n","\n","**注:** \n","1. 配置文件位于 `./configs`。\n","2. 我们支持从 url 加载权重文件。您可以到相应页面(例如[这里](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan))获取预训练模型的url。\n","\n","---\n","\n","我们现在将使用 `SRCNN` 和 `ESRGAN` 作为示例。\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58677,"status":"ok","timestamp":1625140884175,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"KiPvtvlqM1zb","outputId":"be7375a7-4632-4770-8383-2a8ce654b069"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\" to /root/.cache/torch/hub/checkpoints/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\n","100% 83.9k/83.9k [00:00<00:00, 1.59MB/s]\n","2021-07-01 12:00:10,779 - mmedit - INFO - Use load_from_torchvision loader\n","Downloading: \"https://download.pytorch.org/models/vgg19-dcbb9e9d.pth\" to /root/.cache/torch/hub/checkpoints/vgg19-dcbb9e9d.pth\n","100% 548M/548M [00:07<00:00, 76.0MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\" to /root/.cache/torch/hub/checkpoints/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\n","100% 196M/196M [00:26<00:00, 7.61MB/s]\n","bird_ESRGAN.png bird_SRCNN.png\n"]}],"source":["# SRCNN\n","!python demo/restoration_demo.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth ./demo_files/lq_images/bird.png ./outputs/bird_SRCNN.png\n","\n","# ESRGAN\n","!python demo/restoration_demo.py ./configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth ./demo_files/lq_images/bird.png ./outputs/bird_ESRGAN.png\n","\n","# 检查图像是否已保存\n","!ls ./outputs"]},{"cell_type":"markdown","metadata":{"id":"W1DfGHu3Xcfd"},"source":["## 使用预训练的视频复原器进行推理\n","\n","MMEditing 也支持视频超分辨率方法,过程类似。您可以使用带有以下参数的 `restoration_video_demo.py`:\n","\n","1. `CONFIG_FILE`:你要使用的 restorer 对应的配置文件。它指定您要使用的模型。\n","2. `CHECKPOINT_FILE`:预训练模型权重文件的路径。\n","3. `INPUT_DIR`: 包含视频帧的目录。\n","4. `OUTPUT_DIR`: 要存储输出帧的位置。\n","5. `WINDOW_SIZE`: 使用滑动窗口方法时的窗口大小(可选)。\n","6. `GPU_ID`: 您想使用哪个 GPU(可选)。\n","\n","```\n","python demo/restoration_video_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${INPUT_DIR} ${OUTPUT_DIR} [--window_size=$WINDOW_SIZE] [--device ${GPU_ID}]\n","```\n","**注:** 视频超分辨率有两种不同的框架:***滑动窗口***和***循环***框架。使用 EDVR 等滑动窗口框架的方法时,需要指定 `window_size`。此值取决于您使用的模型。\n","\n","---\n","\n","我们现在将使用 `EDVR` 和 `BasicVSR` 作为示例。\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29263,"status":"ok","timestamp":1625140913405,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"iaoE7UF5Xb2i","outputId":"a022e0bd-c47a-450e-f4e4-1bf9f92e4813"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\" to /root/.cache/torch/hub/checkpoints/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\n","100% 11.5M/11.5M [00:01<00:00, 8.55MB/s]\n","2021-07-01 12:01:09,689 - mmedit - INFO - Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth\" to /root/.cache/torch/hub/checkpoints/spynet_20210409-c6c1bd09.pth\n","100% 5.50M/5.50M [00:00<00:00, 8.88MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth\" to /root/.cache/torch/hub/checkpoints/basicvsr_reds4_20120409-0e599677.pth\n","100% 24.1M/24.1M [00:02<00:00, 8.97MB/s]\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# EDVR(滑动窗口框架)\n","!python demo/restoration_video_demo.py ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_EDVR --window_size=5\n","\n","# BasicVSR(循环框架)\n","!python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_BasicVSR\n","\n","# 检查是否保存了视频帧\n","!ls ./outputs/calendar_BasicVSR"]},{"cell_type":"markdown","metadata":{"id":"Rf3LW57qMHXb"},"source":["## 使用配置文件在预定义的数据集上进行测试\n","\n","上述演示提供了一种对单个图像或视频序列进行推理的简单方法。如果要对一组图像或序列进行推理,可以使用位于 `./configs` 中的配置文件。\n"," \n","现有的配置文件允许您对常见数据集进行推理,例如图像超分辨率中的 `Set5` 和视频超分辨率中的 `REDS4`。您可以使用以下命令:\n","\n","1. `CONFIG_FILE`: 你要使用的复原器和数据集对应的配置文件\n","2. `CHECKPOINT_FILE`: 预训练模型权重文件的路径。\n","3. `GPU_NUM`: 用于测试的 GPU 数量。\n","4. `RESULT_FILE`: 输出结果 pickle 文件的路径。(可选)\n","5. `IMAGE_SAVE_PATH`: 要存储输出图像的位置。(可选)\n","\n","```\n","# 单 GPU 测试\n","python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","\n","# 多 GPU 测试\n","./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","```\n","您需要做的是修改配置文件中的 `lq_folder` 和 `gt_folder`:\n","```\n","test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/val_set5/Set5_bicLRx4',\n"," gt_folder='data/val_set5/Set5',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","```\n","\n","**注**: 某些数据集类型(例如 `SRREDSDataset`)需要一个注释文件来指定数据集的详细信息。更多细节请参考 `./mmedit/dataset/` 中的相应文件。\n","\n","---\n","\n","以下是 SRCNN 的命令。对于其他模型,您可以简单地更改配置文件和预训练模型的路径。\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14095,"status":"ok","timestamp":1625140927462,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"tClgIYgcbbVg","outputId":"c37ec2de-e1c9-42ae-ed9b-31009d48ae64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"tools/test.py\", line 136, in \n"," main()\n"," File \"tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/test.py\", line 136, in \n"," main()\n"," File \"./tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/test.py', '--local_rank=0', './configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py', 'https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth', '--launcher', 'pytorch', '--save-path', './outputs/']' returned non-zero exit status 1.\n"]}],"source":["# 单 GPU\n","!python tools/test.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/\n","\n","# 多 GPU\n","!./tools/dist_test.sh ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth 1 --save-path ./outputs/"]},{"cell_type":"markdown","metadata":{"id":"KWKVyeEQelh3"},"source":["## 在自定义数据集上进行测试\n","\n","当您想在自定义数据集上进行测试时,除了数据集路径之外,您还需要修改 `test_dataset_type`。 \n","\n","- 对于图像超分辨率,需要使用 `SRFolderDataset`\n","- 对于视频超分辨率的滑动窗口框架(例如 EDVR、TDAN),需要使用 `SRFolderVideoDataset`。\n","- 对于视频超分辨率的循环框架(例如 BasicVSR、IconVSR),需要使用 `SRFolderMultipleGTDataset`。\n","\n","这些数据集类型假定指定目录中的所有图像/序列都用于测试。文件夹结构应该是\n","```\n","| lq_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," | ...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","| gt_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," |...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","```\n","我们将使用 **SRCNN**、**EDVR**、**BasicVSR** 作为示例。请注意 `test_dataset_type` 和 `data['test']` 的设置。"]},{"cell_type":"markdown","metadata":{"id":"0p2rP8jV_dL1"},"source":["**SRCNN**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8729,"status":"ok","timestamp":1625140936180,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"4kEev4wVIq_L","outputId":"8026ed73-f781-4eb2-bb80-d3446bd131df"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 5/5, 8.6 task/s, elapsed: 1s, ETA: 0s\n","Eval-PSNR: 28.433974369836108\n","Eval-SSIM: 0.8099053586583066\n","baby.png bird.png butterfly.png head.png woman.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_SRCNN.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/testset_SRCNN\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_SRCNN"]},{"cell_type":"markdown","metadata":{"id":"RONzjTTU_gem"},"source":["**EDVR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":19671,"status":"ok","timestamp":1625140955813,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"vL8WOWXY0fNJ","outputId":"dc2a8f81-9bef-4ad4-c5b2-c6f124e6b113"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 22/22, 2.0 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 23.89569862011228\n","Eval-SSIM: 0.7667098470108678\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_EDVR.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth --save-path ./outputs/testset_EDVR\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_EDVR\n","!ls ./outputs/testset_EDVR/city"]},{"cell_type":"markdown","metadata":{"id":"5Tc7F-l5_i1e"},"source":["**BasicVSR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":20220,"status":"ok","timestamp":1625140976026,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"jpW5GWC74Yvu","outputId":"7ba02a32-d4ec-40b2-8108-ef0729b62147"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:07,780 - mmedit - INFO - Use load_from_http loader\n","Use load_from_http loader\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","[>>] 2/2, 0.2 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 24.195768601433734\n","Eval-SSIM: 0.7828541339512978\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_BasicVSR.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth --save-path ./outputs/testset_BasicVSR\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_BasicVSR\n","!ls ./outputs/testset_BasicVSR/calendar"]},{"cell_type":"markdown","metadata":{"id":"4DQxNL8BhI0y"},"source":["## 在预定义的数据集上训练恢复器\n","\n","MMEditing 使用分布式训练。以下命令可用于训练。如果要在我们的配置文件中指定的预定义数据集上进行训练,只需运行以下命令即可。\n","\n","```\n","./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]\n","```\n","\n","有关可选参数的更多详细信息,请参阅 `tools/train.py`。\n","\n","---\n","\n","这是一个使用 EDVR 的示例。\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9337,"status":"ok","timestamp":1625140985357,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"s-hOnSF6ItQM","outputId":"e40e960a-29e1-43e8-b922-5e08c4e98afe"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:31,961 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:31,961 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:31,961 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:31,961 - mmedit - INFO - Config:\n","/content/mmediting/configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py\n","exp_name = 'edvrm_wotsa_x4_g8_600k_reds'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRREDSDataset'\n","val_dataset_type = 'SRREDSDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 600000\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50000, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=100,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 54, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 63, in load_annotations\n"," with open(self.ann_file, 'r') as fin:\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/train.py\", line 145, in \n"," main()\n"," File \"./tools/train.py\", line 111, in main\n"," datasets = [build_dataset(cfg.data.train)]\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 76, in build_dataset\n"," build_dataset(cfg['dataset'], default_args), cfg['times'])\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRREDSDataset: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/train.py', '--local_rank=0', './configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py', '--launcher', 'pytorch']' returned non-zero exit status 1.\n"]}],"source":["!./tools/dist_train.sh ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py 1"]},{"cell_type":"markdown","metadata":{"id":"b0VfQkQQjg8N"},"source":["## 在自定义数据集上训练复原器\n","\n","与您要在自己的数据集上进行测试的情况类似,您需要修改 `train_dataset_type`。您需要的数据集类型是相同的:\n","\n","- 对于图像超分辨率,需要使用 `SRFolderDataset`\n","- 对于视频超分辨率的滑动窗口框架(例如 EDVR、TDAN),需要使用 `SRFolderVideoDataset`。\n","- 对于视频超分辨率的循环框架(例如 BasicVSR、IconVSR),需要使用 `SRFolderMultipleGTDataset`。\n","\n","修改数据集类型和数据路径后。一切都准备好了。"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":128384,"status":"ok","timestamp":1625141113733,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"liGEKJpbIoXZ","outputId":"84e1502e-e2cb-458f-c7c5-e4b401e570b7"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:41,185 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:41,185 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:41,185 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:41,185 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_SRCNN.py\n","exp_name = 'srcnn_demo'\n","\n","scale = 4\n","# model settings\n","model = dict(\n"," type='BasicRestorer',\n"," generator=dict(\n"," type='SRCNN',\n"," channels=(3, 64, 32, 3),\n"," kernel_sizes=(9, 1, 5),\n"," upscale_factor=scale),\n"," pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=scale)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderDataset'\n","val_dataset_type = 'SRFolderDataset'\n","train_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=128),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","test_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'lq_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=8,\n"," train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=train_pipeline,\n"," scale=scale)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[250000, 250000, 250000, 250000],\n"," restart_weights=[1, 1, 1, 1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","evaluation = dict(interval=50, save_image=True, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./experiments/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:02:41,192 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/experiments/srcnn_demo\n","2021-07-01 12:02:41,192 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:02:41.529307: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:03:18,631 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.000e-04, eta: 0:57:01, time: 34.560, data_time: 34.446, memory: 586, loss_pix: 0.3999, loss: 0.3999\n","2021-07-01 12:03:18,712 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","INFO:mmedit:Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","2021-07-01 12:03:18,764 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","INFO:mmedit:Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","2021-07-01 12:03:18,840 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","INFO:mmedit:Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","2021-07-01 12:03:18,916 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","INFO:mmedit:Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","2021-07-01 12:03:18,956 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","INFO:mmedit:Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","2021-07-01 12:03:19,012 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","INFO:mmedit:Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","2021-07-01 12:03:19,070 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","INFO:mmedit:Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","2021-07-01 12:03:19,142 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","INFO:mmedit:Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","2021-07-01 12:03:19,212 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","INFO:mmedit:Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","2021-07-01 12:03:19,261 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","INFO:mmedit:Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","2021-07-01 12:03:19,302 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","INFO:mmedit:Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","2021-07-01 12:03:19,357 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","INFO:mmedit:Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","2021-07-01 12:03:19,419 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","INFO:mmedit:Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","2021-07-01 12:03:19,473 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","INFO:mmedit:Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","2021-07-01 12:03:19,538 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","INFO:mmedit:Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","2021-07-01 12:03:19,603 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","INFO:mmedit:Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","2021-07-01 12:03:19,657 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","INFO:mmedit:Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","2021-07-01 12:03:19,716 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","INFO:mmedit:Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","2021-07-01 12:03:19,772 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","INFO:mmedit:Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","2021-07-01 12:03:19,834 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","INFO:mmedit:Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","2021-07-01 12:03:19,877 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","INFO:mmedit:Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","2021-07-01 12:03:19,947 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","INFO:mmedit:Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","2021-07-01 12:03:20,014 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","INFO:mmedit:Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","2021-07-01 12:03:20,068 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","INFO:mmedit:Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","2021-07-01 12:03:20,124 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","INFO:mmedit:Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","2021-07-01 12:03:20,181 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","INFO:mmedit:Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","2021-07-01 12:03:20,244 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","INFO:mmedit:Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","2021-07-01 12:03:20,310 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","INFO:mmedit:Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","2021-07-01 12:03:20,356 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","INFO:mmedit:Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","2021-07-01 12:03:20,410 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","INFO:mmedit:Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","2021-07-01 12:03:20,480 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","INFO:mmedit:Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","2021-07-01 12:03:20,536 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","INFO:mmedit:Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","2021-07-01 12:03:20,595 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","INFO:mmedit:Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","2021-07-01 12:03:20,656 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","INFO:mmedit:Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","2021-07-01 12:03:20,710 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","INFO:mmedit:Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","2021-07-01 12:03:20,779 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:20,846 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","INFO:mmedit:Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","2021-07-01 12:03:20,907 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:20,958 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","INFO:mmedit:Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","2021-07-01 12:03:21,028 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","INFO:mmedit:Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","2021-07-01 12:03:21,122 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","INFO:mmedit:Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","2021-07-01 12:03:21,181 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:21,418 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","INFO:mmedit:Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","2021-07-01 12:03:21,480 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:21,551 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","INFO:mmedit:Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","2021-07-01 12:03:21,618 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","INFO:mmedit:Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","2021-07-01 12:03:21,667 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","INFO:mmedit:Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","2021-07-01 12:03:21,743 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","INFO:mmedit:Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","[>>] 5/5, 0.1 task/s, elapsed: 37s, ETA: 0s\n","\n","2021-07-01 12:03:59,996 - mmedit - INFO - Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","INFO:mmedit:Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","2021-07-01 12:04:00,047 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","INFO:mmedit:Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","2021-07-01 12:04:00,114 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","INFO:mmedit:Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","2021-07-01 12:04:00,181 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","INFO:mmedit:Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","2021-07-01 12:04:00,251 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","INFO:mmedit:Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","2021-07-01 12:04:00,315 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","INFO:mmedit:Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","2021-07-01 12:04:00,373 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","INFO:mmedit:Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","2021-07-01 12:04:00,418 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","INFO:mmedit:Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","2021-07-01 12:04:00,478 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","INFO:mmedit:Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","2021-07-01 12:04:00,538 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","INFO:mmedit:Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","2021-07-01 12:04:00,606 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","INFO:mmedit:Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","2021-07-01 12:04:00,647 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","INFO:mmedit:Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","2021-07-01 12:04:00,711 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","INFO:mmedit:Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","2021-07-01 12:04:00,757 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","INFO:mmedit:Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","2021-07-01 12:04:00,799 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","INFO:mmedit:Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","2021-07-01 12:04:00,871 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:00,938 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:00,995 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","INFO:mmedit:Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","2021-07-01 12:04:01,051 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","INFO:mmedit:Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","2021-07-01 12:04:01,115 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:01,196 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","INFO:mmedit:Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","2021-07-01 12:04:01,256 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","INFO:mmedit:Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","2021-07-01 12:04:01,325 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","INFO:mmedit:Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","2021-07-01 12:04:01,381 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","INFO:mmedit:Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:04:01,429 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","INFO:mmedit:Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","2021-07-01 12:04:01,497 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","INFO:mmedit:Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","2021-07-01 12:04:01,545 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","INFO:mmedit:Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","2021-07-01 12:04:01,597 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","INFO:mmedit:Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","2021-07-01 12:04:01,671 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","INFO:mmedit:Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:04:01,724 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:01,777 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","INFO:mmedit:Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","2021-07-01 12:04:01,847 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","INFO:mmedit:Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","2021-07-01 12:04:01,905 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","INFO:mmedit:Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","2021-07-01 12:04:01,953 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","INFO:mmedit:Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","2021-07-01 12:04:02,025 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","INFO:mmedit:Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","2021-07-01 12:04:02,079 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","INFO:mmedit:Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","2021-07-01 12:04:02,137 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","INFO:mmedit:Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","2021-07-01 12:04:02,193 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:02,255 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","INFO:mmedit:Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:04:02,341 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","INFO:mmedit:Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","2021-07-01 12:04:02,394 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","INFO:mmedit:Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","2021-07-01 12:04:02,496 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","INFO:mmedit:Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","2021-07-01 12:04:02,552 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:02,629 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","INFO:mmedit:Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","2021-07-01 12:04:02,682 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","INFO:mmedit:Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","2021-07-01 12:04:02,791 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","INFO:mmedit:Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","2021-07-01 12:04:02,834 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","INFO:mmedit:Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","2021-07-01 12:04:02,900 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","INFO:mmedit:Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","2021-07-01 12:04:03,053 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","INFO:mmedit:Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:04:03,108 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","INFO:mmedit:Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","[>>] 5/5, 0.2 task/s, elapsed: 33s, ETA: 0s\n","\n","2021-07-01 12:04:37,412 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:04:37,422 - mmedit - INFO - Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n","INFO:mmedit:Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n"]}],"source":["# SRCNN(图像超分辨率)\n","!./tools/dist_train.sh ./demo_files/demo_config_SRCNN.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":117937,"status":"ok","timestamp":1625141554036,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"26uZ4Ak7qbC9","outputId":"2fb26527-eb9e-4b48-e03c-ba9a91c60db8"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:10:12,619 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:10:12,619 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:10:12,619 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:10:12,619 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_EDVR.py\n","exp_name = 'edvrm_demo'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderVideoDataset'\n","val_dataset_type = 'SRFolderVideoDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:10:12,701 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/edvrm_demo\n","2021-07-01 12:10:12,702 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:10:12.951771: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:10:30,703 - mmedit - INFO - Iter [1/100]\tlr_generator: 4.000e-04, eta: 0:26:53, time: 16.295, data_time: 15.833, memory: 1341, loss_pix: 63917.2734, loss: 63917.2734\n","2021-07-01 12:10:31,046 - mmedit - INFO - Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","INFO:mmedit:Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","2021-07-01 12:10:31,386 - mmedit - INFO - Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","INFO:mmedit:Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","2021-07-01 12:10:31,731 - mmedit - INFO - Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","INFO:mmedit:Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","2021-07-01 12:10:32,071 - mmedit - INFO - Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","INFO:mmedit:Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","2021-07-01 12:10:32,414 - mmedit - INFO - Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","INFO:mmedit:Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","2021-07-01 12:10:32,760 - mmedit - INFO - Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","INFO:mmedit:Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","2021-07-01 12:10:33,102 - mmedit - INFO - Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","INFO:mmedit:Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","2021-07-01 12:10:33,447 - mmedit - INFO - Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","INFO:mmedit:Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","2021-07-01 12:10:33,792 - mmedit - INFO - Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","INFO:mmedit:Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","2021-07-01 12:10:34,138 - mmedit - INFO - Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","INFO:mmedit:Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","2021-07-01 12:10:34,484 - mmedit - INFO - Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","INFO:mmedit:Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","2021-07-01 12:10:34,829 - mmedit - INFO - Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","INFO:mmedit:Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","2021-07-01 12:10:35,175 - mmedit - INFO - Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","INFO:mmedit:Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","2021-07-01 12:10:35,522 - mmedit - INFO - Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","INFO:mmedit:Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","2021-07-01 12:10:35,866 - mmedit - INFO - Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","INFO:mmedit:Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","2021-07-01 12:10:36,212 - mmedit - INFO - Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","INFO:mmedit:Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","2021-07-01 12:10:36,560 - mmedit - INFO - Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","INFO:mmedit:Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","2021-07-01 12:10:36,904 - mmedit - INFO - Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","INFO:mmedit:Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","2021-07-01 12:10:37,249 - mmedit - INFO - Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","INFO:mmedit:Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","2021-07-01 12:10:37,595 - mmedit - INFO - Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","INFO:mmedit:Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","2021-07-01 12:10:37,939 - mmedit - INFO - Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","INFO:mmedit:Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","2021-07-01 12:10:38,283 - mmedit - INFO - Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","INFO:mmedit:Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","2021-07-01 12:10:38,628 - mmedit - INFO - Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","INFO:mmedit:Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","2021-07-01 12:10:38,974 - mmedit - INFO - Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","INFO:mmedit:Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","2021-07-01 12:10:39,318 - mmedit - INFO - Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","INFO:mmedit:Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","2021-07-01 12:10:39,665 - mmedit - INFO - Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","INFO:mmedit:Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","2021-07-01 12:10:40,011 - mmedit - INFO - Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","INFO:mmedit:Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","2021-07-01 12:10:40,356 - mmedit - INFO - Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","INFO:mmedit:Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","2021-07-01 12:10:40,703 - mmedit - INFO - Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","INFO:mmedit:Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","2021-07-01 12:10:41,049 - mmedit - INFO - Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","INFO:mmedit:Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","2021-07-01 12:10:41,396 - mmedit - INFO - Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","INFO:mmedit:Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","2021-07-01 12:10:41,745 - mmedit - INFO - Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","INFO:mmedit:Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","2021-07-01 12:10:42,097 - mmedit - INFO - Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","INFO:mmedit:Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","2021-07-01 12:10:42,444 - mmedit - INFO - Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","INFO:mmedit:Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","2021-07-01 12:10:42,790 - mmedit - INFO - Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","INFO:mmedit:Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","2021-07-01 12:10:43,140 - mmedit - INFO - Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","INFO:mmedit:Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","2021-07-01 12:10:43,490 - mmedit - INFO - Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","INFO:mmedit:Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","2021-07-01 12:10:43,841 - mmedit - INFO - Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","INFO:mmedit:Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","2021-07-01 12:10:44,193 - mmedit - INFO - Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","INFO:mmedit:Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","2021-07-01 12:10:44,541 - mmedit - INFO - Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","INFO:mmedit:Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","2021-07-01 12:10:44,895 - mmedit - INFO - Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","INFO:mmedit:Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","2021-07-01 12:10:45,248 - mmedit - INFO - Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","INFO:mmedit:Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","2021-07-01 12:10:45,595 - mmedit - INFO - Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","INFO:mmedit:Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","2021-07-01 12:10:45,950 - mmedit - INFO - Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","INFO:mmedit:Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","2021-07-01 12:10:46,301 - mmedit - INFO - Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","INFO:mmedit:Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","2021-07-01 12:10:46,649 - mmedit - INFO - Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","INFO:mmedit:Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","2021-07-01 12:10:47,003 - mmedit - INFO - Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","INFO:mmedit:Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","2021-07-01 12:10:47,356 - mmedit - INFO - Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","INFO:mmedit:Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:14,231 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","INFO:mmedit:Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","2021-07-01 12:11:14,578 - mmedit - INFO - Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","INFO:mmedit:Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","2021-07-01 12:11:14,930 - mmedit - INFO - Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","INFO:mmedit:Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","2021-07-01 12:11:15,289 - mmedit - INFO - Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","INFO:mmedit:Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","2021-07-01 12:11:15,642 - mmedit - INFO - Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","INFO:mmedit:Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","2021-07-01 12:11:15,993 - mmedit - INFO - Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","INFO:mmedit:Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","2021-07-01 12:11:16,354 - mmedit - INFO - Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","INFO:mmedit:Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","2021-07-01 12:11:16,712 - mmedit - INFO - Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","INFO:mmedit:Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","2021-07-01 12:11:17,065 - mmedit - INFO - Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","INFO:mmedit:Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","2021-07-01 12:11:17,425 - mmedit - INFO - Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","INFO:mmedit:Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","2021-07-01 12:11:17,780 - mmedit - INFO - Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","INFO:mmedit:Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","2021-07-01 12:11:18,135 - mmedit - INFO - Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","INFO:mmedit:Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","2021-07-01 12:11:18,495 - mmedit - INFO - Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","INFO:mmedit:Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","2021-07-01 12:11:18,851 - mmedit - INFO - Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","INFO:mmedit:Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","2021-07-01 12:11:19,210 - mmedit - INFO - Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","INFO:mmedit:Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","2021-07-01 12:11:19,567 - mmedit - INFO - Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","INFO:mmedit:Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","2021-07-01 12:11:19,923 - mmedit - INFO - Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","INFO:mmedit:Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","2021-07-01 12:11:20,286 - mmedit - INFO - Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","INFO:mmedit:Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","2021-07-01 12:11:20,644 - mmedit - INFO - Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","INFO:mmedit:Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","2021-07-01 12:11:21,000 - mmedit - INFO - Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","INFO:mmedit:Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","2021-07-01 12:11:21,359 - mmedit - INFO - Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","INFO:mmedit:Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","2021-07-01 12:11:21,719 - mmedit - INFO - Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","INFO:mmedit:Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","2021-07-01 12:11:22,072 - mmedit - INFO - Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","INFO:mmedit:Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","2021-07-01 12:11:22,434 - mmedit - INFO - Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","INFO:mmedit:Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","2021-07-01 12:11:22,798 - mmedit - INFO - Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","INFO:mmedit:Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","2021-07-01 12:11:23,158 - mmedit - INFO - Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","INFO:mmedit:Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","2021-07-01 12:11:23,513 - mmedit - INFO - Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","INFO:mmedit:Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","2021-07-01 12:11:23,875 - mmedit - INFO - Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","INFO:mmedit:Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","2021-07-01 12:11:24,236 - mmedit - INFO - Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","INFO:mmedit:Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","2021-07-01 12:11:24,597 - mmedit - INFO - Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","INFO:mmedit:Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","2021-07-01 12:11:24,951 - mmedit - INFO - Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","INFO:mmedit:Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","2021-07-01 12:11:25,313 - mmedit - INFO - Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","INFO:mmedit:Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","2021-07-01 12:11:25,677 - mmedit - INFO - Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","INFO:mmedit:Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","2021-07-01 12:11:26,038 - mmedit - INFO - Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","INFO:mmedit:Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","2021-07-01 12:11:26,393 - mmedit - INFO - Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","INFO:mmedit:Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","2021-07-01 12:11:26,753 - mmedit - INFO - Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","INFO:mmedit:Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","2021-07-01 12:11:27,115 - mmedit - INFO - Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","INFO:mmedit:Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","2021-07-01 12:11:27,472 - mmedit - INFO - Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","INFO:mmedit:Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","2021-07-01 12:11:27,830 - mmedit - INFO - Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","INFO:mmedit:Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","2021-07-01 12:11:28,189 - mmedit - INFO - Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","INFO:mmedit:Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","2021-07-01 12:11:28,553 - mmedit - INFO - Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","INFO:mmedit:Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","2021-07-01 12:11:28,910 - mmedit - INFO - Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","INFO:mmedit:Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","2021-07-01 12:11:29,266 - mmedit - INFO - Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","INFO:mmedit:Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","2021-07-01 12:11:29,628 - mmedit - INFO - Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","INFO:mmedit:Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","2021-07-01 12:11:29,989 - mmedit - INFO - Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","INFO:mmedit:Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","2021-07-01 12:11:30,345 - mmedit - INFO - Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","INFO:mmedit:Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","2021-07-01 12:11:30,704 - mmedit - INFO - Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","INFO:mmedit:Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","2021-07-01 12:11:31,067 - mmedit - INFO - Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","INFO:mmedit:Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","2021-07-01 12:11:31,425 - mmedit - INFO - Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","INFO:mmedit:Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","2021-07-01 12:11:31,782 - mmedit - INFO - Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","INFO:mmedit:Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:58,494 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:11:58,598 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n","INFO:mmedit:Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n"]}],"source":["# EDVR(视频超分辨率-滑动窗口)\n","!./tools/dist_train.sh ./demo_files/demo_config_EDVR.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":197033,"status":"ok","timestamp":1625141428032,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"_RdqmlT6qgt2","outputId":"b951b426-e06c-4f31-db01-449333eab333"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:06:47,253 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:06:47,253 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:06:47,254 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:06:47,254 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_BasicVSR.py\n","exp_name = 'basicvsr_demo'\n","\n","# model settings\n","model = dict(\n"," type='BasicVSR',\n"," generator=dict(\n"," type='BasicVSRNet',\n"," mid_channels=64,\n"," num_blocks=30,\n"," spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'\n"," 'basicvsr/spynet_20210409-c6c1bd09.pth'),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = dict(fix_iter=5000)\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderMultipleGTDataset'\n","val_dataset_type = 'SRFolderMultipleGTDataset'\n","\n","train_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=6,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True), # 2 gpus\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1, workers_per_gpu=1),\n","\n"," # train\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," # val\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," # test\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(\n"," generator=dict(\n"," type='Adam',\n"," lr=2e-4,\n"," betas=(0.9, 0.99),\n"," paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)})))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[300000],\n"," restart_weights=[1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," # dict(type='TensorboardLoggerHook'),\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","find_unused_parameters = True\n","\n","2021-07-01 12:06:47,291 - mmedit - INFO - Use load_from_http loader\n","2021-07-01 12:06:47,569 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/basicvsr_demo\n","2021-07-01 12:06:47,569 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:07:14,210 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.500e-05, eta: 0:42:52, time: 25.981, data_time: 24.045, memory: 3464, loss_pix: 0.0634, loss: 0.0634\n","2021-07-01 12:07:15,171 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.500e-05, eta: 0:22:00, time: 0.961, data_time: 0.011, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","2021-07-01 12:07:16,052 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.500e-05, eta: 0:14:59, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0476, loss: 0.0476\n","2021-07-01 12:07:16,940 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.500e-05, eta: 0:11:29, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:17,829 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.500e-05, eta: 0:09:22, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0796, loss: 0.0796\n","2021-07-01 12:07:18,712 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.500e-05, eta: 0:07:57, time: 0.884, data_time: 0.004, memory: 3518, loss_pix: 0.0680, loss: 0.0680\n","2021-07-01 12:07:19,594 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.500e-05, eta: 0:06:56, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0607, loss: 0.0607\n","2021-07-01 12:07:20,481 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.500e-05, eta: 0:06:10, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0598, loss: 0.0598\n","2021-07-01 12:07:21,361 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.500e-05, eta: 0:05:35, time: 0.880, data_time: 0.003, memory: 3518, loss_pix: 0.0664, loss: 0.0664\n","2021-07-01 12:07:22,274 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.500e-05, eta: 0:05:06, time: 0.913, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:07:23,161 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.500e-05, eta: 0:04:42, time: 0.887, data_time: 0.005, memory: 3518, loss_pix: 0.0771, loss: 0.0771\n","2021-07-01 12:07:24,058 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.500e-05, eta: 0:04:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0521, loss: 0.0521\n","2021-07-01 12:07:24,944 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.500e-05, eta: 0:04:05, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:07:25,835 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.500e-05, eta: 0:03:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0515, loss: 0.0515\n","2021-07-01 12:07:26,723 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.500e-05, eta: 0:03:38, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0674, loss: 0.0674\n","2021-07-01 12:07:27,609 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.500e-05, eta: 0:03:26, time: 0.886, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:28,498 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.500e-05, eta: 0:03:16, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0670, loss: 0.0670\n","2021-07-01 12:07:29,388 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.500e-05, eta: 0:03:07, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0663, loss: 0.0663\n","2021-07-01 12:07:30,284 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.500e-05, eta: 0:02:59, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0633, loss: 0.0633\n","2021-07-01 12:07:31,176 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.500e-05, eta: 0:02:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0482, loss: 0.0482\n","2021-07-01 12:07:32,073 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.500e-05, eta: 0:02:44, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0743, loss: 0.0743\n","2021-07-01 12:07:32,966 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.500e-05, eta: 0:02:38, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0690, loss: 0.0690\n","2021-07-01 12:07:33,858 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.500e-05, eta: 0:02:32, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0437, loss: 0.0437\n","2021-07-01 12:07:34,750 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.500e-05, eta: 0:02:27, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:35,642 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.500e-05, eta: 0:02:22, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0781, loss: 0.0781\n","2021-07-01 12:07:36,533 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.500e-05, eta: 0:02:17, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:07:37,427 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.500e-05, eta: 0:02:13, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:07:38,321 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.500e-05, eta: 0:02:08, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0567, loss: 0.0567\n","2021-07-01 12:07:39,212 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.500e-05, eta: 0:02:04, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0846, loss: 0.0846\n","2021-07-01 12:07:40,104 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.500e-05, eta: 0:02:01, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0658, loss: 0.0658\n","2021-07-01 12:07:40,993 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.500e-05, eta: 0:01:57, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0502, loss: 0.0502\n","2021-07-01 12:07:41,885 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.500e-05, eta: 0:01:54, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0622, loss: 0.0622\n","2021-07-01 12:07:42,787 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.500e-05, eta: 0:01:50, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0657, loss: 0.0657\n","2021-07-01 12:07:43,674 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.500e-05, eta: 0:01:47, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0643, loss: 0.0643\n","2021-07-01 12:07:44,567 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.500e-05, eta: 0:01:44, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0898, loss: 0.0898\n","2021-07-01 12:07:45,458 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.500e-05, eta: 0:01:41, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0865, loss: 0.0865\n","2021-07-01 12:07:46,341 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.500e-05, eta: 0:01:38, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0511, loss: 0.0511\n","2021-07-01 12:07:47,225 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.500e-05, eta: 0:01:36, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:48,109 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.500e-05, eta: 0:01:33, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0653, loss: 0.0653\n","2021-07-01 12:07:48,990 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:07:49,874 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.885, data_time: 0.003, memory: 3518, loss_pix: 0.0788, loss: 0.0788\n","2021-07-01 12:07:50,755 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.500e-05, eta: 0:01:26, time: 0.881, data_time: 0.005, memory: 3518, loss_pix: 0.0605, loss: 0.0605\n","2021-07-01 12:07:51,638 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.500e-05, eta: 0:01:24, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0539, loss: 0.0539\n","2021-07-01 12:07:52,518 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.500e-05, eta: 0:01:21, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0503, loss: 0.0503\n","2021-07-01 12:07:53,395 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.500e-05, eta: 0:01:19, time: 0.877, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:07:54,273 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0555, loss: 0.0555\n","2021-07-01 12:07:55,159 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.500e-05, eta: 0:01:15, time: 0.886, data_time: 0.007, memory: 3518, loss_pix: 0.0806, loss: 0.0806\n","2021-07-01 12:07:56,040 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.500e-05, eta: 0:01:13, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0576, loss: 0.0576\n","2021-07-01 12:07:56,919 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.500e-05, eta: 0:01:11, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0871, loss: 0.0871\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:08:32,618 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9899, SSIM: 0.5295\n","2021-07-01 12:08:33,591 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.500e-05, eta: 0:01:40, time: 35.792, data_time: 34.822, memory: 3518, loss_pix: 0.0773, loss: 0.0773\n","2021-07-01 12:08:34,462 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.500e-05, eta: 0:01:37, time: 0.871, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:08:35,326 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.500e-05, eta: 0:01:34, time: 0.864, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:36,192 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0575, loss: 0.0575\n","2021-07-01 12:08:37,069 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.876, data_time: 0.003, memory: 3518, loss_pix: 0.0842, loss: 0.0842\n","2021-07-01 12:08:37,942 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.500e-05, eta: 0:01:25, time: 0.873, data_time: 0.003, memory: 3518, loss_pix: 0.0836, loss: 0.0836\n","2021-07-01 12:08:38,808 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.500e-05, eta: 0:01:22, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0580, loss: 0.0580\n","2021-07-01 12:08:39,679 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.500e-05, eta: 0:01:20, time: 0.870, data_time: 0.003, memory: 3518, loss_pix: 0.0449, loss: 0.0449\n","2021-07-01 12:08:40,557 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0702, loss: 0.0702\n","2021-07-01 12:08:41,430 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.500e-05, eta: 0:01:14, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:42,308 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.500e-05, eta: 0:01:12, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:08:43,182 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.500e-05, eta: 0:01:09, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0489, loss: 0.0489\n","2021-07-01 12:08:44,056 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.500e-05, eta: 0:01:07, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0566, loss: 0.0566\n","2021-07-01 12:08:44,932 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.500e-05, eta: 0:01:05, time: 0.875, data_time: 0.003, memory: 3518, loss_pix: 0.0597, loss: 0.0597\n","2021-07-01 12:08:45,819 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.500e-05, eta: 0:01:02, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0640, loss: 0.0640\n","2021-07-01 12:08:46,698 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.500e-05, eta: 0:01:00, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:47,580 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.500e-05, eta: 0:00:58, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:08:48,464 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.500e-05, eta: 0:00:56, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:08:49,347 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.500e-05, eta: 0:00:54, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0603, loss: 0.0603\n","2021-07-01 12:08:50,229 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.500e-05, eta: 0:00:51, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0478, loss: 0.0478\n","2021-07-01 12:08:51,113 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.500e-05, eta: 0:00:49, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:08:52,000 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.500e-05, eta: 0:00:47, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0861, loss: 0.0861\n","2021-07-01 12:08:52,890 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.500e-05, eta: 0:00:45, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:08:53,792 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.500e-05, eta: 0:00:43, time: 0.903, data_time: 0.003, memory: 3518, loss_pix: 0.0787, loss: 0.0787\n","2021-07-01 12:08:54,688 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.500e-05, eta: 0:00:41, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0744, loss: 0.0744\n","2021-07-01 12:08:55,582 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.500e-05, eta: 0:00:39, time: 0.895, data_time: 0.003, memory: 3518, loss_pix: 0.0792, loss: 0.0792\n","2021-07-01 12:08:56,476 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.500e-05, eta: 0:00:38, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0645, loss: 0.0645\n","2021-07-01 12:08:57,368 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.500e-05, eta: 0:00:36, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:08:58,261 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.500e-05, eta: 0:00:34, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:59,159 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.500e-05, eta: 0:00:32, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0626, loss: 0.0626\n","2021-07-01 12:09:00,055 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.500e-05, eta: 0:00:30, time: 0.896, data_time: 0.004, memory: 3518, loss_pix: 0.0681, loss: 0.0681\n","2021-07-01 12:09:00,954 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.500e-05, eta: 0:00:28, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0671, loss: 0.0671\n","2021-07-01 12:09:01,860 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.500e-05, eta: 0:00:27, time: 0.906, data_time: 0.003, memory: 3518, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:09:02,760 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.500e-05, eta: 0:00:25, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0594, loss: 0.0594\n","2021-07-01 12:09:03,658 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.500e-05, eta: 0:00:23, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0446, loss: 0.0446\n","2021-07-01 12:09:04,555 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.500e-05, eta: 0:00:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0491, loss: 0.0491\n","2021-07-01 12:09:05,452 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.500e-05, eta: 0:00:20, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0450, loss: 0.0450\n","2021-07-01 12:09:06,351 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.500e-05, eta: 0:00:18, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0795, loss: 0.0795\n","2021-07-01 12:09:07,257 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.500e-05, eta: 0:00:17, time: 0.905, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:08,161 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.500e-05, eta: 0:00:15, time: 0.904, data_time: 0.003, memory: 3518, loss_pix: 0.0588, loss: 0.0588\n","2021-07-01 12:09:09,063 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.500e-05, eta: 0:00:13, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:09:09,955 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.500e-05, eta: 0:00:12, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0599, loss: 0.0599\n","2021-07-01 12:09:10,849 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.500e-05, eta: 0:00:10, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:11,749 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.500e-05, eta: 0:00:09, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0667, loss: 0.0667\n","2021-07-01 12:09:12,638 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.500e-05, eta: 0:00:07, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0558, loss: 0.0558\n","2021-07-01 12:09:13,576 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.500e-05, eta: 0:00:06, time: 0.938, data_time: 0.052, memory: 3518, loss_pix: 0.0577, loss: 0.0577\n","2021-07-01 12:09:14,463 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.500e-05, eta: 0:00:04, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:09:15,351 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.500e-05, eta: 0:00:02, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0578, loss: 0.0578\n","2021-07-01 12:09:16,240 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.500e-05, eta: 0:00:01, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:09:52,294 - mmedit - INFO - Saving checkpoint at 100 iterations\n","2021-07-01 12:09:52,433 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.4372, SSIM: 0.5687\n"]}],"source":["# BasicVSR(视频超分辨率 - 循环)\n","!./tools/dist_train.sh ./demo_files/demo_config_BasicVSR.py 1 "]},{"cell_type":"markdown","metadata":{"id":"QT0zwBFt7J13"},"source":["**本教程到此结束。有关更高级的用法,请参阅我们的[综合教程]()。享受使用 MMEditing 的乐趣!**"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"restorer_basic_tutorial.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3.7.7 64-bit ('pre-commit': conda)","name":"python377jvsc74a57bd04974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"},"language_info":{"name":"python","version":""},"metadata":{"interpreter":{"hash":"4974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"}}},"nbformat":4,"nbformat_minor":2} diff --git a/demo/translation_demo.py b/demo/translation_demo.py index a42698608c..149a2aaeb3 100644 --- a/demo/translation_demo.py +++ b/demo/translation_demo.py @@ -10,7 +10,7 @@ # yapf: disable sys.path.append(os.path.abspath(os.path.join(__file__, '../..'))) # isort:skip # noqa -from mmagic.apis import init_model, sample_img2img_model # isort:skip # noqa +from mmagic.apis import init_model, sample_img2img_model # isort:skip # noqa # yapf: enable diff --git a/demo/unconditional_demo.py b/demo/unconditional_demo.py index 0e7ddec7aa..da017568f9 100644 --- a/demo/unconditional_demo.py +++ b/demo/unconditional_demo.py @@ -10,7 +10,7 @@ # yapf: disable sys.path.append(os.path.abspath(os.path.join(__file__, '../..'))) # isort:skip # noqa -from mmagic.apis import init_model, sample_unconditional_model # isort:skip # noqa +from mmagic.apis import init_model, sample_unconditional_model # isort:skip # noqa # yapf: enable From 8f4cc50c42e04ba55b3788f1e10e45ebe06ea8c6 Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Wed, 19 Apr 2023 19:08:45 +0800 Subject: [PATCH 22/42] [Rename] update mmagic CI (#1772) * [Rename] update mmagic CI * fix tests * fix docs * fix docs --- .circleci/config.yml | 2 +- .circleci/test.yml | 24 ++++++------- .github/workflows/lint.yml | 2 +- .github/workflows/merge_stage_test.yml | 12 +++---- .github/workflows/pr_stage_test.yml | 6 ++-- .github/workflows/publish-to-pypi.yml | 2 +- .github/workflows/test_mim.yml | 2 +- .gitignore | 2 +- MANIFEST.in | 12 +++---- docs/en/conf.py | 4 +-- docs/en/index.rst | 36 +++++++++---------- docs/zh_cn/conf.py | 4 +-- docs/zh_cn/index.rst | 36 +++++++++---------- setup.cfg | 2 +- setup.py | 12 +++---- .../test_models/test_losses/test_clip_loss.py | 2 +- .../test_loss_comps/test_clip_loss_comps.py | 2 +- 17 files changed, 81 insertions(+), 81 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 746b786d6b..424d9e2f53 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -26,7 +26,7 @@ workflows: .github/.* lint_only true demo/.* lint_only true projects/.* lint_only true - mmedit/.* lint_only false + mmagic/.* lint_only false requirements/.* lint_only false tests/.* lint_only false .circleci/.* lint_only false diff --git a/.circleci/test.yml b/.circleci/test.yml index 3fcd589743..1ec66deb15 100644 --- a/.circleci/test.yml +++ b/.circleci/test.yml @@ -25,7 +25,7 @@ jobs: name: Check docstring coverage command: | pip install interrogate - interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --ignore-magic --ignore-regex "__repr__" --fail-under 90 mmedit + interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --ignore-magic --ignore-regex "__repr__" --fail-under 90 mmagic build_cpu: parameters: # The python version must match available image tags in @@ -57,7 +57,7 @@ jobs: python -V pip install torch==<< parameters.torch >>+cpu torchvision==<< parameters.torchvision >>+cpu -f https://download.pytorch.org/whl/torch_stable.html - run: - name: Install mmediting dependencies + name: Install mmagic dependencies command: | pip install git+https://github.com/open-mmlab/mmengine.git@main pip install -U openmim @@ -70,7 +70,7 @@ jobs: - run: name: Run unittests command: | - coverage run --branch --source mmedit -m pytest tests/ + coverage run --branch --source mmagic -m pytest tests/ coverage xml coverage report -m build_cuda: @@ -97,23 +97,23 @@ jobs: - run: name: Build Docker image command: | - docker build .circleci/docker -t mmedit:gpu --build-arg PYTORCH=<< parameters.torch >> --build-arg CUDA=<< parameters.cuda >> --build-arg CUDNN=<< parameters.cudnn >> - docker run --gpus all -t -d -v /home/circleci/project:/mmedit -v /home/circleci/mmengine:/mmengine -v /home/circleci/mmdetection:/mmdetection -w /mmedit --name mmedit mmedit:gpu + docker build .circleci/docker -t mmagic:gpu --build-arg PYTORCH=<< parameters.torch >> --build-arg CUDA=<< parameters.cuda >> --build-arg CUDNN=<< parameters.cudnn >> + docker run --gpus all -t -d -v /home/circleci/project:/mmagic -v /home/circleci/mmengine:/mmengine -v /home/circleci/mmdetection:/mmdetection -w /mmagic --name mmagic mmagic:gpu - run: - name: Install mmedit dependencies + name: Install mmagic dependencies command: | - docker exec mmedit pip install -e /mmengine - docker exec mmedit pip install -U openmim - docker exec mmedit mim install 'mmcv >= 2.0.0' - docker exec mmedit pip install -r requirements/tests.txt + docker exec mmagic pip install -e /mmengine + docker exec mmagic pip install -U openmim + docker exec mmagic mim install 'mmcv >= 2.0.0' + docker exec mmagic pip install -r requirements/tests.txt - run: name: Build and install command: | - docker exec mmedit pip install -e . + docker exec mmagic pip install -e . - run: name: Run unittests command: | - docker exec mmedit pytest tests/ + docker exec mmagic pytest tests/ workflows: pr_stage_lint: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 89dd0f24ba..1db59bbe6f 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -24,4 +24,4 @@ jobs: - name: Check docstring coverage run: | pip install interrogate - interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --ignore-regex "__repr__" --fail-under 90 mmedit + interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --ignore-regex "__repr__" --fail-under 90 mmagic diff --git a/.github/workflows/merge_stage_test.yml b/.github/workflows/merge_stage_test.yml index 5089f91eca..690981f1d8 100644 --- a/.github/workflows/merge_stage_test.yml +++ b/.github/workflows/merge_stage_test.yml @@ -54,7 +54,7 @@ jobs: run: rm -rf .eggs && pip install -e . - name: Run unittests and generate coverage report run: | - coverage run --branch --source mmedit -m pytest tests/ + coverage run --branch --source mmagic -m pytest tests/ coverage xml coverage report -m @@ -100,7 +100,7 @@ jobs: run: rm -rf .eggs && pip install -e . - name: Run unittests and generate coverage report run: | - coverage run --branch --source mmedit -m pytest tests/ + coverage run --branch --source mmagic -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 # Only upload coverage report for python3.7 && pytorch1.8.1 cpu @@ -141,7 +141,7 @@ jobs: apt-get update && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 - name: Install PyTorch run: 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 + - name: Install mmagic dependencies run: | pip install -U openmim mim install 'mmcv >= 2.0.0' @@ -177,7 +177,7 @@ jobs: apt-get update && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 - name: Install PyTorch run: pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/cpu - - name: Install mmediting dependencies + - name: Install mmagic dependencies run: | pip install git+https://github.com/open-mmlab/mmengine.git@main pip install -U openmim @@ -188,7 +188,7 @@ jobs: pip install -e . - name: Run unittests and generate coverage report run: | - coverage run --branch --source mmedit -m pytest tests/ + coverage run --branch --source mmagic -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 @@ -210,7 +210,7 @@ jobs: run: python -m pip install lmdb - name: Install PyTorch run: python -m pip install torch==1.8.1+${{matrix.platform}} torchvision==0.9.1+${{matrix.platform}} -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html - - name: Install mmediting dependencies + - name: Install mmagic dependencies run: | python -m pip install git+https://github.com/open-mmlab/mmengine.git@main python -m pip install -U openmim diff --git a/.github/workflows/pr_stage_test.yml b/.github/workflows/pr_stage_test.yml index 0e2ed5af98..de25fe85bc 100644 --- a/.github/workflows/pr_stage_test.yml +++ b/.github/workflows/pr_stage_test.yml @@ -47,7 +47,7 @@ jobs: run: rm -rf .eggs && pip install -e . - name: Run unittests and generate coverage report run: | - coverage run --branch --source mmedit -m pytest tests/ + coverage run --branch --source mmagic -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 # Upload coverage report for python3.7 && pytorch1.8.1 cpu @@ -88,7 +88,7 @@ jobs: apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libxrender-dev - name: Install PyTorch run: pip install torch==1.8.1+cpu torchvision==0.9.1+cpu -f https://download.pytorch.org/whl/torch_stable.html - - name: Install mmedit dependencies + - name: Install mmagic dependencies run: | pip install git+https://github.com/open-mmlab/mmengine.git@main pip install -U openmim @@ -119,7 +119,7 @@ jobs: run: python -m pip install lmdb - name: Install PyTorch run: python -m pip install torch==1.8.1+${{matrix.platform}} torchvision==0.9.1+${{matrix.platform}} -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html - - name: Install mmedit dependencies + - name: Install mmagic dependencies run: | python -m pip install git+https://github.com/open-mmlab/mmengine.git@main python -m pip install -U openmim diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml index e60a8001b6..69a364aa07 100644 --- a/.github/workflows/publish-to-pypi.yml +++ b/.github/workflows/publish-to-pypi.yml @@ -16,7 +16,7 @@ jobs: uses: actions/setup-python@v1 with: python-version: 3.7 - - name: Build MMEditing + - name: Build MMagic run: | pip install torch==1.8.1+cpu torchvision==0.9.1+cpu -f https://download.pytorch.org/whl/torch_stable.html pip install wheel diff --git a/.github/workflows/test_mim.yml b/.github/workflows/test_mim.yml index aa4754a433..c030d4ef17 100644 --- a/.github/workflows/test_mim.yml +++ b/.github/workflows/test_mim.yml @@ -41,4 +41,4 @@ jobs: - name: Build and install run: rm -rf .eggs && mim install -e . - name: test commands of mim - run: mim search mmedit + run: mim search mmagic diff --git a/.gitignore b/.gitignore index f36947c727..cb327676ac 100644 --- a/.gitignore +++ b/.gitignore @@ -121,7 +121,7 @@ configs_ceph/ configs_ceph_*/ /data/ /data -mmedit/.mim +mmagic/.mim demo/*.png *.csv out/*.png diff --git a/MANIFEST.in b/MANIFEST.in index 4012bf5f0b..92940d2a6e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,7 @@ include requirements/*.txt -include mmedit/.mim/VERSION -include mmedit/.mim/model-index.yml -include mmedit/evaluation/metrics/niqe_pris_params.npz -recursive-include mmedit/.mim/configs *.py *.yml -recursive-include mmedit/.mim/tools *.sh *.py -recursive-include mmedit/.mim/demo *.py +include mmagic/.mim/VERSION +include mmagic/.mim/model-index.yml +include mmagic/evaluation/metrics/niqe_pris_params.npz +recursive-include mmagic/.mim/configs *.py *.yml +recursive-include mmagic/.mim/tools *.sh *.py +recursive-include mmagic/.mim/demo *.py diff --git a/docs/en/conf.py b/docs/en/conf.py index 2bb373af14..17e2c3944d 100644 --- a/docs/en/conf.py +++ b/docs/en/conf.py @@ -45,7 +45,7 @@ extensions.append('autoapi.extension') autoapi_type = 'python' -autoapi_dirs = ['../../mmedit'] +autoapi_dirs = ['../../mmagic'] autoapi_add_toctree_entry = False autoapi_template_dir = '_templates' # autoapi_options = ['members', 'undoc-members', 'show-module-summary'] @@ -67,7 +67,7 @@ # autodoc_inherit_docstrings = True autodoc_mock_imports = [ - 'mmedit.version', 'mmcv._ext', 'mmcv.ops.ModulatedDeformConv2d', + 'mmagic.version', 'mmcv._ext', 'mmcv.ops.ModulatedDeformConv2d', 'mmcv.ops.modulated_deform_conv2d', 'clip', 'resize_right', 'pandas' ] diff --git a/docs/en/index.rst b/docs/en/index.rst index de7ad78d6a..827dc43584 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -117,24 +117,24 @@ Documentation :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 + mmagic.apis.inferencers + mmagic.structures + mmagic.datasets + mmagic.datasets.transforms + mmagic.evaluation + mmagic.visualization + mmagic.engine.hooks + mmagic.engine.logging + mmagic.engine.optimizers + mmagic.engine.runner + mmagic.engine.schedulers + mmagic.models.base_archs + mmagic.models.base_models + mmagic.models.losses + mmagic.models.data_preprocessors + mmagic.models.utils + mmagic.models.editors + mmagic.utils .. toctree:: diff --git a/docs/zh_cn/conf.py b/docs/zh_cn/conf.py index 4e077144d5..77421b37ad 100644 --- a/docs/zh_cn/conf.py +++ b/docs/zh_cn/conf.py @@ -45,7 +45,7 @@ extensions.append('autoapi.extension') autoapi_type = 'python' -autoapi_dirs = ['../../mmedit'] +autoapi_dirs = ['../../mmagic'] autoapi_add_toctree_entry = False autoapi_template_dir = '_templates' # autoapi_options = ['members', 'undoc-members', 'show-module-summary'] @@ -67,7 +67,7 @@ # autodoc_inherit_docstrings = True autodoc_mock_imports = [ - 'mmedit.version', 'mmcv._ext', 'mmcv.ops.ModulatedDeformConv2d', + 'mmagic.version', 'mmcv._ext', 'mmcv.ops.ModulatedDeformConv2d', 'mmcv.ops.modulated_deform_conv2d', 'clip', 'resize_right', 'pandas' ] diff --git a/docs/zh_cn/index.rst b/docs/zh_cn/index.rst index 478c9fc0b4..e3ab303dc8 100644 --- a/docs/zh_cn/index.rst +++ b/docs/zh_cn/index.rst @@ -88,24 +88,24 @@ :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 + mmagic/apis.inferencers + mmagic/structures + mmagic/datasets + mmagic/datasets.transforms + mmagic/evaluation + mmagic/visualization + mmagic/engine.hooks + mmagic/engine.logging + mmagic/engine.optimizers + mmagic/engine.runner + mmagic/engine.schedulers + mmagic/models.base_archs + mmagic/models.base_models + mmagic/models.losses + mmagic/models.data_preprocessors + mmagic/models.utils + mmagic/models.editors + mmagic/utils .. toctree:: :maxdepth: 1 diff --git a/setup.cfg b/setup.cfg index 0aecef9eba..d38c213a4c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -18,7 +18,7 @@ SPLIT_PENALTY_AFTER_OPENING_BRACKET=888 line_length = 79 multi_line_output = 0 extra_standard_library = setuptools -known_first_party = mmedit +known_first_party = mmagic known_third_party = PIL,cv2,lmdb,mmcv,numpy,onnx,onnxruntime,packaging,pymatting,pytest,pytorch_sphinx_theme,requests,scipy,titlecase,torch,torchvision,ts no_lines_before = STDLIB,LOCALFOLDER default_section = THIRDPARTY diff --git a/setup.py b/setup.py index dc8924b9b5..84ea711ee6 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ def readme(): return content -version_file = 'mmedit/version.py' +version_file = 'mmagic/version.py' def get_git_hash(): @@ -51,7 +51,7 @@ def get_hash(): sha = get_git_hash()[:7] elif os.path.exists(version_file): try: - from mmedit.version import __version__ + from mmagic.version import __version__ sha = __version__.split('+')[-1] except ImportError: raise ImportError('Unable to get git version') @@ -191,7 +191,7 @@ def add_mim_extention(): filenames = ['tools', 'configs', 'demo', 'model-index.yml'] repo_path = osp.dirname(__file__) - mim_path = osp.join(repo_path, 'mmedit', '.mim') + mim_path = osp.join(repo_path, 'mmagic', '.mim') os.makedirs(mim_path, exist_ok=True) for filename in filenames: @@ -232,16 +232,16 @@ def add_mim_extention(): if __name__ == '__main__': add_mim_extention() setup( - name='mmedit', + name='mmagic', version=get_version(), description='OpenMMLab Image and Video Editing Toolbox and Benchmark', long_description=readme(), long_description_content_type='text/markdown', - maintainer='MMEditing Contributors', + maintainer='MMagic Contributors', maintainer_email='openmmlab@gmail.com', keywords='computer vision, super resolution, video interpolation, ' 'inpainting, matting, SISR, RefSR, VSR, GAN, VFI', - url='https://github.com/open-mmlab/mmediting', + url='https://github.com/open-mmlab/mmagic', packages=find_packages(exclude=('configs', 'tools', 'demo')), include_package_data=True, classifiers=[ diff --git a/tests/test_models/test_losses/test_clip_loss.py b/tests/test_models/test_losses/test_clip_loss.py index 015c96c78d..e93683e960 100644 --- a/tests/test_models/test_losses/test_clip_loss.py +++ b/tests/test_models/test_losses/test_clip_loss.py @@ -1,12 +1,12 @@ # Copyright (c) OpenMMLab. All rights reserved. import platform +import clip import pytest import torch from mmengine.utils import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -import clip from mmagic.models.losses import CLIPLoss diff --git a/tests/test_models/test_losses/test_loss_comps/test_clip_loss_comps.py b/tests/test_models/test_losses/test_loss_comps/test_clip_loss_comps.py index f8531b0bdc..d1bedd5495 100644 --- a/tests/test_models/test_losses/test_loss_comps/test_clip_loss_comps.py +++ b/tests/test_models/test_losses/test_loss_comps/test_clip_loss_comps.py @@ -1,12 +1,12 @@ # Copyright (c) OpenMMLab. All rights reserved. import platform +import clip import pytest import torch from mmengine.utils import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -import clip from mmagic.models.losses import CLIPLossComps From 4f26c32efc3b239d7b58f04d03bb94aef9bc4f37 Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Wed, 19 Apr 2023 21:02:19 +0800 Subject: [PATCH 23/42] [Rename] update mmagic's demo, .github, docker (#1774) --- .github/CONTRIBUTING.md | 4 +- .github/ISSUE_TEMPLATE/1-bug-report.yml | 14 +- .github/ISSUE_TEMPLATE/2-feature-request.yml | 2 +- .github/ISSUE_TEMPLATE/4-documentation.yml | 4 +- .github/ISSUE_TEMPLATE/config.yml | 4 +- .github/pull_request_template.md | 4 +- demo/README.md | 16 +- demo/mmediting_inference_demo.py | 6 +- demo/mmediting_inference_tutorial.ipynb | 194 +++--------------- docker/Dockerfile | 6 +- docker/README.md | 4 +- .../evaluation/functional/inception_utils.py | 8 +- mmagic/utils/__init__.py | 4 +- mmagic/utils/io_utils.py | 4 +- 14 files changed, 71 insertions(+), 203 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 17952d0387..0814085f50 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# Contributing to MMEditing +# Contributing to MMagic All kinds of contributions are welcome, including but not limited to the following. @@ -8,7 +8,7 @@ All kinds of contributions are welcome, including but not limited to the followi ## Workflow -1. fork and pull the latest MMEditing repository (MMEditing) +1. fork and pull the latest MMagic repository (MMagic) 2. checkout a new branch (do not use master branch for PRs) 3. commit your changes 4. create a PR diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml index 5b65aaab02..fe523ad454 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.yml +++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -7,7 +7,7 @@ body: - type: markdown attributes: value: | - If you have already identified the reason, we strongly appreciate you creating a new PR to fix it [here](https://github.com/open-mmlab/mmediting/pulls)! + If you have already identified the reason, we strongly appreciate you creating a new PR to fix it [here](https://github.com/open-mmlab/mmagic/pulls)! If this issue is about installing MMCV, please file an issue at [MMCV](https://github.com/open-mmlab/mmcv/issues/new/choose). If you need our help, please fill in as much of the following form as you're able to. @@ -18,11 +18,11 @@ body: label: Prerequisite description: Please check the following items before creating a new issue. options: - - label: I have searched [Issues](https://github.com/open-mmlab/mmediting/issues) and [Discussions](https://github.com/open-mmlab/mmediting/discussions) but cannot get the expected help. + - label: I have searched [Issues](https://github.com/open-mmlab/mmagic/issues) and [Discussions](https://github.com/open-mmlab/mmagic/discussions) but cannot get the expected help. required: true - - label: I have read the [FAQ documentation](https://mmediting.readthedocs.io/en/latest/faq.html) but cannot get the expected help. + - label: I have read the [FAQ documentation](https://mmagic.readthedocs.io/en/latest/faq.html) but cannot get the expected help. required: true - - label: The bug has not been fixed in the [latest version (main)](https://github.com/open-mmlab/mmediting) or [latest version (0.x)](https://github.com/open-mmlab/mmediting/tree/0.x). + - label: The bug has not been fixed in the [latest version (main)](https://github.com/open-mmlab/mmagic) or [latest version (0.x)](https://github.com/open-mmlab/mmagic/tree/0.x). required: true - type: dropdown @@ -42,8 +42,8 @@ body: label: Branch description: The problem arises when I'm working on options: - - main branch https://github.com/open-mmlab/mmediting - - 0.x branch https://github.com/open-mmlab/mmediting/tree/0.x + - main branch https://github.com/open-mmlab/mmagic + - 0.x branch https://github.com/open-mmlab/mmagic/tree/0.x validations: required: true @@ -52,7 +52,7 @@ body: attributes: label: Environment description: | - Please run `python mmedit/utils/collect_env.py` to collect necessary environment information and copy-paste it here. + Please run `python mmagic/utils/collect_env.py` to collect necessary environment information and copy-paste it here. You may add additional information that may be helpful for locating the problem, such as - How you installed PyTorch \[e.g., pip, conda, source\] - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.yml b/.github/ISSUE_TEMPLATE/2-feature-request.yml index 99802169db..ff273f40b7 100644 --- a/.github/ISSUE_TEMPLATE/2-feature-request.yml +++ b/.github/ISSUE_TEMPLATE/2-feature-request.yml @@ -7,7 +7,7 @@ body: - type: markdown attributes: value: | - We strongly appreciate you creating a PR to implement this feature [here](https://github.com/open-mmlab/mmediting/pulls)! + We strongly appreciate you creating a PR to implement this feature [here](https://github.com/open-mmlab/mmagic/pulls)! If you need our help, please fill in as much of the following form as you're able to. **The less clear the description, the longer it will take to solve it.** diff --git a/.github/ISSUE_TEMPLATE/4-documentation.yml b/.github/ISSUE_TEMPLATE/4-documentation.yml index 1a95a7a0dc..a558f60f36 100644 --- a/.github/ISSUE_TEMPLATE/4-documentation.yml +++ b/.github/ISSUE_TEMPLATE/4-documentation.yml @@ -10,8 +10,8 @@ body: label: Branch description: This issue is related to the options: - - main branch https://mmediting.readthedocs.io/en/latest/ - - 0.x branch https://mmediting.readthedocs.io/en/0.x/ + - main branch https://mmagic.readthedocs.io/en/latest/ + - 0.x branch https://mmagic.readthedocs.io/en/0.x/ validations: required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 664ef7c988..1192d78314 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,8 +2,8 @@ blank_issues_enabled: false contact_links: - name: 💬 Forum - url: https://github.com/open-mmlab/mmediting/discussions - about: Ask general usage questions and discuss with other MMEditing community members + url: https://github.com/open-mmlab/mmagic/discussions + about: Ask general usage questions and discuss with other MMagic community members - name: 🌐 Explore OpenMMLab url: https://openmmlab.com/ about: Get to know more about OpenMMLab diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c3f8d84ec6..6a050ed96a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -21,8 +21,8 @@ If this PR introduces a new feature, it is better to list some use cases here, a **Before PR**: -- [ ] I have read and followed the workflow indicated in the [CONTRIBUTING.md](https://github.com/open-mmlab/mmediting/blob/master/.github/CONTRIBUTING.md) to create this PR. -- [ ] Pre-commit or linting tools indicated in [CONTRIBUTING.md](https://github.com/open-mmlab/mmediting/blob/master/.github/CONTRIBUTING.md) are used to fix the potential lint issues. +- [ ] I have read and followed the workflow indicated in the [CONTRIBUTING.md](https://github.com/open-mmlab/mmagic/blob/main/.github/CONTRIBUTING.md) to create this PR. +- [ ] Pre-commit or linting tools indicated in [CONTRIBUTING.md](https://github.com/open-mmlab/mmagic/blob/main/.github/CONTRIBUTING.md) are used to fix the potential lint issues. - [ ] Bug fixes are covered by unit tests, the case that causes the bug should be added in the unit tests. - [ ] New functionalities are covered by complete unit tests. If not, please add more unit test to ensure the correctness. - [ ] The documentation has been modified accordingly, including docstring or example tutorials. diff --git a/demo/README.md b/demo/README.md index fecee98804..2c12d53eaa 100644 --- a/demo/README.md +++ b/demo/README.md @@ -1,12 +1,12 @@ -# MMEditing Demo +# MMagic Demo -There are some mmediting demos in this folder. We provide python command line usage here to run these demos and more guidance could also be found in the [documentation](https://mmediting.readthedocs.io/en/latest/user_guides/3_inference.html) +There are some mmagic demos in this folder. We provide python command line usage here to run these demos and more guidance could also be found in the [documentation](https://mmagic.readthedocs.io/en/latest/user_guides/3_inference.html) Table of contents: [1. Download sample images or videos](#1-download-sample-images-or-videos) -[2. MMEditing inference demo](#2-mmediting-inference-demo) +[2. MMagic inference demo](#2-mmagic-inference-demo)     [2.1. Check supported tasks and models](#21-check-supported-tasks-and-models) @@ -34,12 +34,12 @@ Table of contents: ## 1. Download sample images or videos -We prepared some images and videos for you to run demo with. After MMEdit is well installed, you could use demos in this folder to infer these data. +We prepared some images and videos for you to run demo with. After MMagic is well installed, you could use demos in this folder to infer these data. Download with python script [download_inference_resources.py](./download_inference_resources.py). ```shell -# cd mmediting demo path -cd mmediting/demo +# cd mmagic demo path +cd mmagic/demo # see all resources python download_inference_resources.py --print-all @@ -55,7 +55,7 @@ python download_inference_resources.py --task 'Inpainting' python download_inference_resources.py --root-dir '../resources' ``` -## 2. MMEditing inference demo +## 2. MMagic inference demo ### 2.1 Check supported tasks and models @@ -79,7 +79,7 @@ python mmediting_inference_demo.py --print-task-supported-models 'Image2Image' ### 2.2 Perform inference with command line -You can use the following commands to perform inference with a MMEdit model. +You can use the following commands to perform inference with a MMagic model. Usage of python API can also be found in this [tutotial](./mmediting_inference_tutorial.ipynb). diff --git a/demo/mmediting_inference_demo.py b/demo/mmediting_inference_demo.py index f3a14784ad..d7646cd721 100644 --- a/demo/mmediting_inference_demo.py +++ b/demo/mmediting_inference_demo.py @@ -37,17 +37,17 @@ def parse_args(): '--model-name', type=str, default=None, - help='Pretrained editing algorithm') + help='Pretrained mmagic algorithm') parser.add_argument( '--model-setting', type=int, default=None, - help='Pretrained editing algorithm setting') + help='Pretrained mmagic algorithm setting') parser.add_argument( '--model-config', type=str, default=None, - help='Path to the custom config file of the selected editing model.') + help='Path to the custom config file of the selected mmagic model.') parser.add_argument( '--model-ckpt', type=str, diff --git a/demo/mmediting_inference_tutorial.ipynb b/demo/mmediting_inference_tutorial.ipynb index afdbdcd305..34ec5729bc 100644 --- a/demo/mmediting_inference_tutorial.ipynb +++ b/demo/mmediting_inference_tutorial.ipynb @@ -5,17 +5,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# MMEditing Inference Tutorial\n", + "# MMagic Inference Tutorial\n", "\n", - "Welcome to MMEditing! This is the official tutorial for using MMEditing inference api to predict your own image or video.\n", + "Welcome to MMagic! This is the official tutorial for using MMagic inference api to predict your own image or video.\n", "\n", "In this tutorial, you will learn how to\n", "\n", - "[1. Install MMEditing](#1-install-mmediting)\n", + "[1. Install MMagic](#1-install-mmagic)\n", "\n", "[2. Check inference supported tasks and models](#2-check-inference-supported-tasks-and-models)\n", "\n", - "[3. Perform inference using MMEdit inference API](#3-perform-inference-with-mmediting-api)\n", + "[3. Perform inference using MMagic\n", + " inference API](#3-perform-inference-with-mmagic-api)\n", "\n", "  [3.1 Prepare some images or videos for inference](#31-prepare-some-images-or-videos-for-inference)\n", "\n", @@ -52,12 +53,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 1. Install MMEditing" + "## 1. Install MMagic" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": { "vscode": { "languageId": "shellscript" @@ -68,10 +69,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "ema-pytorch 0.0.10\n", - "open-clip-torch 2.5.0\n", - "torch 1.9.0+cu111\n", - "torchvision 0.10.0+cu111\n" + "torch 1.12.1+cu113\n", + "torchvision 0.13.1+cu113\n" ] } ], @@ -82,161 +81,30 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": { "vscode": { "languageId": "shellscript" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: openmim in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (0.3.2)\n", - "Requirement already satisfied: tabulate in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from openmim) (0.9.0)\n", - "Requirement already satisfied: requests in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from openmim) (2.28.1)\n", - "Requirement already satisfied: Click in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from openmim) (8.1.3)\n", - "Requirement already satisfied: pip>=19.3 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from openmim) (22.2.2)\n", - "Requirement already satisfied: model-index in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from openmim) (0.1.11)\n", - "Requirement already satisfied: pandas in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from openmim) (1.5.1)\n", - "Requirement already satisfied: rich in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from openmim) (12.6.0)\n", - "Requirement already satisfied: colorama in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from openmim) (0.4.5)\n", - "Requirement already satisfied: ordered-set in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from model-index->openmim) (4.1.0)\n", - "Requirement already satisfied: pyyaml in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from model-index->openmim) (6.0)\n", - "Requirement already satisfied: markdown in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from model-index->openmim) (3.4.1)\n", - "Requirement already satisfied: python-dateutil>=2.8.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from pandas->openmim) (2.8.2)\n", - "Requirement already satisfied: numpy>=1.20.3 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from pandas->openmim) (1.23.4)\n", - "Requirement already satisfied: pytz>=2020.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from pandas->openmim) (2022.5)\n", - "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from requests->openmim) (1.26.12)\n", - "Requirement already satisfied: charset-normalizer<3,>=2 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from requests->openmim) (2.1.1)\n", - "Requirement already satisfied: idna<4,>=2.5 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from requests->openmim) (3.4)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from requests->openmim) (2022.9.24)\n", - "Requirement already satisfied: typing-extensions<5.0,>=4.0.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from rich->openmim) (4.4.0)\n", - "Requirement already satisfied: pygments<3.0.0,>=2.6.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from rich->openmim) (2.13.0)\n", - "Requirement already satisfied: commonmark<0.10.0,>=0.9.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from rich->openmim) (0.9.1)\n", - "Requirement already satisfied: six>=1.5 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from python-dateutil>=2.8.1->pandas->openmim) (1.16.0)\n", - "Requirement already satisfied: importlib-metadata>=4.4 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from markdown->model-index->openmim) (5.0.0)\n", - "Requirement already satisfied: zipp>=0.5 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from importlib-metadata>=4.4->markdown->model-index->openmim) (3.9.0)\n", - "Looking in links: https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", - "Requirement already satisfied: mmcv>=2.0.0rc1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (2.0.0rc1)\n", - "Requirement already satisfied: yapf in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1) (0.32.0)\n", - "Requirement already satisfied: addict in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1) (2.4.0)\n", - "Requirement already satisfied: pyyaml in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1) (6.0)\n", - "Requirement already satisfied: opencv-python>=3 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1) (4.6.0.66)\n", - "Requirement already satisfied: Pillow in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1) (9.2.0)\n", - "Requirement already satisfied: numpy in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1) (1.23.4)\n", - "Requirement already satisfied: mmengine in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1) (0.2.0)\n", - "Requirement already satisfied: packaging in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1) (21.3)\n", - "Requirement already satisfied: termcolor in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmengine->mmcv>=2.0.0rc1) (2.0.1)\n", - "Requirement already satisfied: matplotlib in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmengine->mmcv>=2.0.0rc1) (3.6.1)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from packaging->mmcv>=2.0.0rc1) (3.0.9)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmcv>=2.0.0rc1) (4.37.4)\n", - "Requirement already satisfied: python-dateutil>=2.7 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmcv>=2.0.0rc1) (2.8.2)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmcv>=2.0.0rc1) (1.0.5)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmcv>=2.0.0rc1) (1.4.4)\n", - "Requirement already satisfied: cycler>=0.10 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmcv>=2.0.0rc1) (0.11.0)\n", - "Requirement already satisfied: six>=1.5 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib->mmengine->mmcv>=2.0.0rc1) (1.16.0)\n" - ] - } - ], + "outputs": [], "source": [ "# Install mmcv dependency via openmim\n", "!pip3 install openmim\n", - "!mim install 'mmcv>=2.0.0rc1'" + "!mim install 'mmcv>=2.0.0'" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "vscode": { "languageId": "shellscript" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/mnt/petrelfs/liuwenran/develop/mmediting\n", - "Obtaining file:///mnt/petrelfs/liuwenran/develop/mmediting\n", - " Preparing metadata (setup.py) ... \u001b[?25ldone\n", - "\u001b[?25hRequirement already satisfied: av in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (10.0.0)\n", - "Requirement already satisfied: face-alignment in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.3.5)\n", - "Requirement already satisfied: facexlib in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.2.5)\n", - "Requirement already satisfied: lmdb in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.3.0)\n", - "Requirement already satisfied: lpips in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.1.4)\n", - "Requirement already satisfied: mmcv>=2.0.0rc1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (2.0.0rc2)\n", - "Requirement already satisfied: mmengine in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.2.0)\n", - "Requirement already satisfied: numpy in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.23.4)\n", - "Requirement already satisfied: opencv-python!=4.5.5.62,!=4.5.5.64 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (4.6.0.66)\n", - "Requirement already satisfied: Pillow in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (9.2.0)\n", - "Requirement already satisfied: tensorboard in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (2.10.1)\n", - "Requirement already satisfied: torch in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (1.9.0+cu111)\n", - "Requirement already satisfied: torchvision in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmagic==1.0.0rc3) (0.10.0+cu111)\n", - "Requirement already satisfied: addict in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1->mmedit==1.0.0rc3) (2.4.0)\n", - "Requirement already satisfied: packaging in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1->mmedit==1.0.0rc3) (21.3)\n", - "Requirement already satisfied: yapf in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1->mmedit==1.0.0rc3) (0.32.0)\n", - "Requirement already satisfied: pyyaml in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmcv>=2.0.0rc1->mmedit==1.0.0rc3) (6.0)\n", - "Requirement already satisfied: scikit-image in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from face-alignment->mmedit==1.0.0rc3) (0.19.3)\n", - "Requirement already satisfied: scipy>=0.17 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from face-alignment->mmedit==1.0.0rc3) (1.9.3)\n", - "Requirement already satisfied: tqdm in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from face-alignment->mmedit==1.0.0rc3) (4.64.1)\n", - "Requirement already satisfied: numba in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from face-alignment->mmedit==1.0.0rc3) (0.56.3)\n", - "Requirement already satisfied: filterpy in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from facexlib->mmedit==1.0.0rc3) (1.4.5)\n", - "Requirement already satisfied: typing-extensions in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from torch->mmedit==1.0.0rc3) (4.4.0)\n", - "Requirement already satisfied: termcolor in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmengine->mmedit==1.0.0rc3) (2.0.1)\n", - "Requirement already satisfied: matplotlib in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from mmengine->mmedit==1.0.0rc3) (3.6.1)\n", - "Requirement already satisfied: grpcio>=1.24.3 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (1.50.0)\n", - "Requirement already satisfied: absl-py>=0.4 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (1.3.0)\n", - "Requirement already satisfied: google-auth<3,>=1.6.3 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (2.13.0)\n", - "Requirement already satisfied: markdown>=2.6.8 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (3.4.1)\n", - "Requirement already satisfied: werkzeug>=1.0.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (2.2.2)\n", - "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (1.8.1)\n", - "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (0.6.1)\n", - "Requirement already satisfied: protobuf<3.20,>=3.9.2 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (3.19.6)\n", - "Requirement already satisfied: wheel>=0.26 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (0.37.1)\n", - "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (0.4.6)\n", - "Requirement already satisfied: setuptools>=41.0.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (59.5.0)\n", - "Requirement already satisfied: requests<3,>=2.21.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from tensorboard->mmedit==1.0.0rc3) (2.28.1)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->mmedit==1.0.0rc3) (0.2.8)\n", - "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->mmedit==1.0.0rc3) (5.2.0)\n", - "Requirement already satisfied: six>=1.9.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->mmedit==1.0.0rc3) (1.16.0)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->mmedit==1.0.0rc3) (4.9)\n", - "Requirement already satisfied: requests-oauthlib>=0.7.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==1.0.0rc3) (1.3.1)\n", - "Requirement already satisfied: importlib-metadata>=4.4 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from markdown>=2.6.8->tensorboard->mmedit==1.0.0rc3) (5.0.0)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->mmedit==1.0.0rc3) (2022.9.24)\n", - "Requirement already satisfied: idna<4,>=2.5 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->mmedit==1.0.0rc3) (3.4)\n", - "Requirement already satisfied: charset-normalizer<3,>=2 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->mmedit==1.0.0rc3) (2.1.1)\n", - "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->mmedit==1.0.0rc3) (1.26.12)\n", - "Requirement already satisfied: MarkupSafe>=2.1.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from werkzeug>=1.0.1->tensorboard->mmedit==1.0.0rc3) (2.1.1)\n", - "Requirement already satisfied: cycler>=0.10 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmedit==1.0.0rc3) (0.11.0)\n", - "Requirement already satisfied: python-dateutil>=2.7 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmedit==1.0.0rc3) (2.8.2)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmedit==1.0.0rc3) (1.4.4)\n", - "Requirement already satisfied: pyparsing>=2.2.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmedit==1.0.0rc3) (3.0.9)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmedit==1.0.0rc3) (1.0.5)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from matplotlib->mmengine->mmedit==1.0.0rc3) (4.37.4)\n", - "Requirement already satisfied: llvmlite<0.40,>=0.39.0dev0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from numba->face-alignment->mmedit==1.0.0rc3) (0.39.1)\n", - "Requirement already satisfied: imageio>=2.4.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from scikit-image->face-alignment->mmedit==1.0.0rc3) (2.22.2)\n", - "Requirement already satisfied: tifffile>=2019.7.26 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from scikit-image->face-alignment->mmedit==1.0.0rc3) (2022.10.10)\n", - "Requirement already satisfied: PyWavelets>=1.1.1 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from scikit-image->face-alignment->mmedit==1.0.0rc3) (1.4.1)\n", - "Requirement already satisfied: networkx>=2.2 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from scikit-image->face-alignment->mmedit==1.0.0rc3) (2.8.7)\n", - "Requirement already satisfied: zipp>=0.5 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from importlib-metadata>=4.4->markdown>=2.6.8->tensorboard->mmedit==1.0.0rc3) (3.9.0)\n", - "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard->mmedit==1.0.0rc3) (0.4.8)\n", - "Requirement already satisfied: oauthlib>=3.0.0 in /mnt/petrelfs/liuwenran/miniconda3/envs/py38pt19cu111/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==1.0.0rc3) (3.2.2)\n", - "Installing collected packages: mmedit\n", - " Attempting uninstall: mmedit\n", - " Found existing installation: mmedit 1.0.0rc3\n", - " Uninstalling mmedit-1.0.0rc3:\n", - " Successfully uninstalled mmedit-1.0.0rc3\n", - " Running setup.py develop for mmedit\n", - "Successfully installed mmedit-1.0.0rc3\n", - "/mnt/petrelfs/liuwenran/develop/mmediting/demo\n" - ] - } - ], + "outputs": [], "source": [ - "# Install mmediting from source\n", + "# Install mmagic from source\n", "%cd ..\n", "!pip3 install -e .\n", "%cd demo" @@ -244,21 +112,21 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1.0.0rc3\n" + "1.0.0rc7\n" ] } ], "source": [ - "# Check MMEditing installation\n", - "import mmedit\n", - "print(mmedit.__version__)" + "# Check MMagic installation\n", + "import mmagic\n", + "print(mmagic.__version__)" ] }, { @@ -275,19 +143,19 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "all available models:\n", - "['biggan', 'styleganv1', 'gca', 'global_local', 'aot_gan', 'pix2pix', 'esrgan', 'flavr', 'cain', 'edvr']\n", - "all available tasks:\n", - "['Matting', 'Video Interpolation', 'Image2Image Translation', 'Unconditional GANs', 'Conditional GANs', 'Video Super-Resolution', 'Inpainting', 'Image Super-Resolution']\n", + "all supported models:\n", + "['inst_colorization', 'biggan', 'sngan_proj', 'sagan', 'dcgan', 'wgan-gp', 'lsgan', 'ggan', 'pggan', 'styleganv1', 'styleganv2', 'styleganv3', 'gca', 'global_local', 'aot_gan', 'pix2pix', 'cyclegan', 'srcnn', 'srgan_resnet', 'edsr', 'esrgan', 'rdn', 'dic', 'ttsr', 'glean', 'real_esrgan', 'flavr', 'cain', 'edvr', 'tdan', 'basicvsr', 'iconvsr', 'basicvsr_pp', 'real_basicvsr', 'disco_diffusion', 'eg3d', 'controlnet_animation']\n", + "all supported tasks:\n", + "['Unconditional GANs', 'controlnet_animation', 'Video Interpolation', '3D-aware Generation', 'Conditional GANs', 'Image Super-Resolution', 'Text2Image, Image2Image', 'Colorization', 'Inpainting', 'Matting', 'Image2Image', 'Video Super-Resolution']\n", "translation models:\n", - "['pix2pix']\n" + "['pix2pix', 'cyclegan']\n" ] } ], @@ -314,11 +182,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3. Perform inference with MMEditing API\n", + "## 3. Perform inference with MMagic API\n", "\n", "Next we describe how to perform inference with python code snippets.\n", "\n", - "(We also provide command line interface for you to do inference by running mmediting_inference_demo.py. The usage of this interface could be found in [README.md](./README.md) and more guidance could be found in the [documentation](https://mmediting.readthedocs.io/en/latest/user_guides/3_inference.html#).)\n" + "(We also provide command line interface for you to do inference by running mmediting_inference_demo.py. The usage of this interface could be found in [README.md](./README.md) and more guidance could be found in the [documentation](https://mmagic.readthedocs.io/en/latest/user_guides/3_inference.html#).)\n" ] }, { @@ -1215,7 +1083,7 @@ ], "metadata": { "kernelspec": { - "display_name": "dev-sd", + "display_name": "Python 3.9.16 ('mmedit': conda)", "language": "python", "name": "python3" }, @@ -1229,12 +1097,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.15" + "version": "3.9.16" }, "orig_nbformat": 4, "vscode": { "interpreter": { - "hash": "d7e6c97a1f3313226c2da85dd83e85417c7b1e4ab07fe1dc506eecff36b257e7" + "hash": "35fd9fbe4d1b297d4be2b8092ffedf61ac9a34aef1ae0231052d90ec0a3e8f9f" } } }, diff --git a/docker/Dockerfile b/docker/Dockerfile index 72f312eb59..a3ed52a8c8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,10 +14,10 @@ RUN apt-get update && apt-get install -y git ninja-build libglib2.0-0 libsm6 lib && apt-get clean \ && rm -rf /var/lib/apt/lists/* -# Install mmediting +# Install mmagic RUN conda clean --all -RUN git clone https://github.com/open-mmlab/mmediting.git /mmediting -WORKDIR /mmediting +RUN git clone https://github.com/open-mmlab/mmagicg.git /mmagic +WORKDIR /mmagic ENV FORCE_CUDA="1" RUN pip install openmim RUN mim install mmcv==${MMCV} diff --git a/docker/README.md b/docker/README.md index 851c28b0bb..948f851a27 100644 --- a/docker/README.md +++ b/docker/README.md @@ -4,13 +4,13 @@ We provide a [Dockerfile](Dockerfile) to build an image. ```shell # build an image with PyTorch 1.6, CUDA 10.1 -docker build -t mmediting docker/ +docker build -t mmagic docker/ ``` Run it with ```shell -docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmediting/data mmediting +docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmagic/data mmagic ``` **Note**: diff --git a/mmagic/evaluation/functional/inception_utils.py b/mmagic/evaluation/functional/inception_utils.py index 009add27db..fba51fdb9b 100644 --- a/mmagic/evaluation/functional/inception_utils.py +++ b/mmagic/evaluation/functional/inception_utils.py @@ -21,7 +21,7 @@ from torch.utils.data.dataset import Dataset from torchvision.models.inception import inception_v3 -from mmagic.utils import MMEDIT_CACHE_DIR, download_from_url +from mmagic.utils import MMAGIC_CACHE_DIR, download_from_url from . import InceptionV3 ALLOWED_INCEPTION = ['StyleGAN', 'PyTorch'] @@ -132,7 +132,7 @@ def _load_inception_from_url(inception_url: str) -> nn.Module: print_log(f'Try to download Inception Model from {inception_url}...', 'current') try: - path = download_from_url(inception_url, dest_dir=MMEDIT_CACHE_DIR) + path = download_from_url(inception_url, dest_dir=MMAGIC_CACHE_DIR) print_log('Download Finished.', 'current') return _load_inception_from_path(path) except Exception as e: @@ -339,7 +339,7 @@ def prepare_inception_feat(dataloader: DataLoader, if inception_pkl is None: inception_pkl, args = get_inception_feat_cache_name_and_args( dataloader, metric, real_nums, capture_mean_cov, capture_all) - inception_pkl = osp.join(MMEDIT_CACHE_DIR, inception_pkl) + inception_pkl = osp.join(MMAGIC_CACHE_DIR, inception_pkl) else: args = dict() if osp.exists(inception_pkl): @@ -500,7 +500,7 @@ def prepare_vgg_feat(dataloader: DataLoader, # cannot load or download from file, extract manually if vgg_pkl is None: vgg_pkl, args = get_vgg_feat_cache_name_and_args(dataloader, metric) - vgg_pkl = osp.join(MMEDIT_CACHE_DIR, vgg_pkl) + vgg_pkl = osp.join(MMAGIC_CACHE_DIR, vgg_pkl) else: args = dict() if osp.exists(vgg_pkl): diff --git a/mmagic/utils/__init__.py b/mmagic/utils/__init__.py index 58ed14cc58..8ce1c26c2f 100644 --- a/mmagic/utils/__init__.py +++ b/mmagic/utils/__init__.py @@ -2,7 +2,7 @@ from .cli import modify_args from .img_utils import (all_to_tensor, can_convert_to_image, get_box_info, reorder_image, tensor2img, to_numpy) -from .io_utils import MMEDIT_CACHE_DIR, download_from_url +from .io_utils import MMAGIC_CACHE_DIR, download_from_url # TODO replace with engine's API from .logger import print_colored_log from .sampler import get_sampler @@ -15,7 +15,7 @@ __all__ = [ 'modify_args', 'print_colored_log', 'register_all_modules', 'try_import', 'ForwardInputs', 'SampleList', 'NoiseVar', 'ConfigType', 'LabelVar', - 'MMEDIT_CACHE_DIR', 'download_from_url', 'get_sampler', 'tensor2img', + 'MMAGIC_CACHE_DIR', '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', 'get_box_info', diff --git a/mmagic/utils/io_utils.py b/mmagic/utils/io_utils.py index a776134d00..f1341f2513 100644 --- a/mmagic/utils/io_utils.py +++ b/mmagic/utils/io_utils.py @@ -9,7 +9,7 @@ from mmengine.dist import get_dist_info from requests.exceptions import InvalidURL, RequestException, Timeout -MMEDIT_CACHE_DIR = os.path.expanduser('~') + '/.cache/openmmlab/mmagic/' +MMAGIC_CACHE_DIR = os.path.expanduser('~') + '/.cache/openmmlab/mmagic/' def get_content_from_url(url, timeout=15, stream=False): @@ -34,7 +34,7 @@ def get_content_from_url(url, timeout=15, stream=False): def download_from_url(url, dest_path=None, - dest_dir=MMEDIT_CACHE_DIR, + dest_dir=MMAGIC_CACHE_DIR, hash_prefix=None): """Download object at the given URL to a local path. From f2f41879019215ab2ba5ea58f8b20f8d864a5f14 Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Wed, 19 Apr 2023 21:20:22 +0800 Subject: [PATCH 24/42] [Rename] update mmagic's .dev_scripts (#1775) --- .dev_scripts/README.md | 6 +++--- .dev_scripts/download_models.py | 6 +++--- .dev_scripts/test_benchmark.py | 14 +++++++------- .dev_scripts/test_benchmark.yml | 2 +- .dev_scripts/train_benchmark.py | 14 +++++++------- .dev_scripts/train_benchmark.yml | 2 +- .dev_scripts/update_config_readme.py | 6 +++--- .dev_scripts/update_model_index.py | 14 +++++++------- .dev_scripts/update_ut.py | 8 ++++---- 9 files changed, 36 insertions(+), 36 deletions(-) diff --git a/.dev_scripts/README.md b/.dev_scripts/README.md index db0b9ac724..0742c72950 100644 --- a/.dev_scripts/README.md +++ b/.dev_scripts/README.md @@ -1,4 +1,4 @@ -# Scripts for developing MMEditing +# Scripts for developing MMagic - [1. Check UT](#1-check-ut) - [2. Test all the models](#2-test-all-the-models) @@ -20,7 +20,7 @@ Please check your UT by the following scripts: ```python -cd mmediting/ +cd mmagic/ python .dev_script/update_ut.py ``` @@ -29,7 +29,7 @@ Please create UTs according to your package code implementation. ## 2. Test all the models -Please follow these steps to test all the models in MMEditing: +Please follow these steps to test all the models in MMagic: First, you will need download all the pre-trained checkpoints by: diff --git a/.dev_scripts/download_models.py b/.dev_scripts/download_models.py index 1fff57835e..28822d2dab 100644 --- a/.dev_scripts/download_models.py +++ b/.dev_scripts/download_models.py @@ -13,8 +13,8 @@ from modelindex import load -MMEditing_ROOT = Path(__file__).absolute().parent.parent -DOWNLOAD_DIR = osp.join(MMEditing_ROOT, 'work_dirs', 'download') +MMagic_ROOT = Path(__file__).absolute().parent.parent +DOWNLOAD_DIR = osp.join(MMagic_ROOT, 'work_dirs', 'download') IS_WINDOWS = (platform.system() == 'Windows') @@ -69,7 +69,7 @@ def parse_args(): def download(args): - model_index_file = MMEditing_ROOT / 'model-index.yml' + model_index_file = MMagic_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}) diff --git a/.dev_scripts/test_benchmark.py b/.dev_scripts/test_benchmark.py index 3a52223121..fddadc60aa 100644 --- a/.dev_scripts/test_benchmark.py +++ b/.dev_scripts/test_benchmark.py @@ -17,7 +17,7 @@ from task_mapping import TASK_MAPPING console = Console() -MMEDITING_ROOT = Path(__file__).absolute().parents[1] +MMagic_ROOT = Path(__file__).absolute().parents[1] def parse_args(): @@ -82,10 +82,10 @@ def parse_args(): def create_test_job_batch(commands, model_info, args, port, script_name): - config_http_prefix_blob = ('https://github.com/open-mmlab/mmediting/' - 'blob/master/') - config_http_prefix_tree = ('https://github.com/open-mmlab/mmediting/' - 'tree/master/') + config_http_prefix_blob = ('https://github.com/open-mmlab/mmagic/' + 'blob/main/') + config_http_prefix_tree = ('https://github.com/open-mmlab/mmagic/' + 'tree/main/') fname = model_info.name config = model_info.config @@ -184,7 +184,7 @@ def create_test_job_batch(commands, model_info, args, port, script_name): def test(args): # parse model-index.yml - model_index_file = MMEDITING_ROOT / 'model-index.yml' + model_index_file = MMagic_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}) @@ -346,7 +346,7 @@ def set_color(value, expect, tolerance, rule): def summary(args): - model_index_file = MMEDITING_ROOT / 'model-index.yml' + model_index_file = MMagic_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}) diff --git a/.dev_scripts/test_benchmark.yml b/.dev_scripts/test_benchmark.yml index c8a6ddeb49..72ce31335e 100644 --- a/.dev_scripts/test_benchmark.yml +++ b/.dev_scripts/test_benchmark.yml @@ -77,7 +77,7 @@ cluster_num: '2' default_floating_range: 1.0 model_floating_ranges: {} partition: mm_lol -repo: mmediting +repo: mmagic branch: dev-1.x task_type: test third_part_libs: [] diff --git a/.dev_scripts/train_benchmark.py b/.dev_scripts/train_benchmark.py index 310ca3d5fc..0595432e8f 100644 --- a/.dev_scripts/train_benchmark.py +++ b/.dev_scripts/train_benchmark.py @@ -16,7 +16,7 @@ from utils import filter_jobs, parse_job_list_from_file console = Console() -MMEDIT_ROOT = Path(__file__).absolute().parents[1] +MMAGIC_ROOT = Path(__file__).absolute().parents[1] # key-in-metafile: key-in-results.pkl METRICS_MAP = { @@ -176,10 +176,10 @@ def parse_args(): def create_train_job_batch(commands, model_info, args, port, script_name): - config_http_prefix_blob = ('https://github.com/open-mmlab/mmediting/' - 'blob/master/') - config_http_prefix_tree = ('https://github.com/open-mmlab/mmediting/' - 'tree/master/') + config_http_prefix_blob = ('https://github.com/open-mmlab/mmagic/' + 'blob/main/') + config_http_prefix_tree = ('https://github.com/open-mmlab/mmagic/' + 'tree/main/') fname = model_info.name config = model_info.config @@ -281,7 +281,7 @@ def create_train_job_batch(commands, model_info, args, port, script_name): def train(args): # parse model-index.yml - model_index_file = MMEDIT_ROOT / 'model-index.yml' + model_index_file = MMAGIC_ROOT / 'model-index.yml' model_index = load(str(model_index_file)) model_index.build_models_with_collections() @@ -418,7 +418,7 @@ def set_color(value, expect, tolerance, rule): def summary(args): - model_index_file = MMEDIT_ROOT / 'model-index.yml' + model_index_file = MMAGIC_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}) diff --git a/.dev_scripts/train_benchmark.yml b/.dev_scripts/train_benchmark.yml index c0fdd5196b..8abe5ce433 100644 --- a/.dev_scripts/train_benchmark.yml +++ b/.dev_scripts/train_benchmark.yml @@ -77,7 +77,7 @@ cluster_num: '2' default_floating_range: 1.0 model_floating_ranges: {} partition: mm_lol -repo: mmediting +repo: mmagic branch: dev-1.x task_type: train third_part_libs: [] diff --git a/.dev_scripts/update_config_readme.py b/.dev_scripts/update_config_readme.py index c191e95d75..19c380c616 100644 --- a/.dev_scripts/update_config_readme.py +++ b/.dev_scripts/update_config_readme.py @@ -9,7 +9,7 @@ import re import sys -MMEditing_ROOT = osp.dirname(osp.dirname(osp.dirname(__file__))) +MMagic_ROOT = osp.dirname(osp.dirname(osp.dirname(__file__))) def update_md(md_file): @@ -20,7 +20,7 @@ def update_md(md_file): Returns: Bool: If the target README.md file is different from the original. """ - # See https://github.com/open-mmlab/mmediting/pull/798 for these comments + # See https://github.com/open-mmlab/mmagic/pull/798 for these comments # unique_dict = generate_unique_name(md_file) md_file = md_file.replace(os.sep, '/') @@ -63,7 +63,7 @@ def update_md(md_file): if __name__ == '__main__': if len(sys.argv) <= 1: - configs_root = osp.join(MMEditing_ROOT, 'configs') + configs_root = osp.join(MMagic_ROOT, 'configs') file_list = glob.glob( osp.join(configs_root, '**', '*README.md'), recursive=True) file_list.sort() diff --git a/.dev_scripts/update_model_index.py b/.dev_scripts/update_model_index.py index ff5291af37..7fc19808e5 100755 --- a/.dev_scripts/update_model_index.py +++ b/.dev_scripts/update_model_index.py @@ -72,7 +72,7 @@ - `Version` (str): required - `Image` (str): optional -The README.md file in MMEditing follows following convention, +The README.md file in MMagic follows following convention, - `Model`: [name_in_the_paper](path_to_config) - `Download`: [model](url_to_pre_trained_weights) | [log](url_to_log) """ @@ -90,7 +90,7 @@ from utils import (collate_metrics, dump_yaml_and_check_difference, found_table, modelindex_to_dict) -MMEditing_ROOT = osp.dirname(osp.dirname(__file__)) +MMagic_ROOT = osp.dirname(osp.dirname(__file__)) KEYWORDS = [ 'Model', 'Dataset', @@ -106,7 +106,7 @@ def parse_md(md_file): Returns: Bool: If the target YAML file is different from the original. """ - readme = osp.relpath(md_file, MMEditing_ROOT) + readme = osp.relpath(md_file, MMagic_ROOT) readme = readme.replace('\\', '/') # for windows collection = Collection() collection_meta = Metadata() @@ -232,18 +232,18 @@ def update_model_index(): Returns: Bool: If the updated model-index.yml is different from the original. """ - configs_dir = osp.join(MMEditing_ROOT, 'configs') + configs_dir = osp.join(MMagic_ROOT, 'configs') yml_files = glob.glob(osp.join(configs_dir, '**', '*.yml'), recursive=True) yml_files.sort() model_index = { 'Import': [ - osp.relpath(yml_file, MMEditing_ROOT).replace( + osp.relpath(yml_file, MMagic_ROOT).replace( '\\', '/') # force using / as path separators for yml_file in yml_files ] } - model_index_file = osp.join(MMEditing_ROOT, 'model-index.yml') + model_index_file = osp.join(MMagic_ROOT, 'model-index.yml') is_different = dump_yaml_and_check_difference(model_index, model_index_file) @@ -252,7 +252,7 @@ def update_model_index(): if __name__ == '__main__': if len(sys.argv) <= 1: - configs_root = osp.join(MMEditing_ROOT, 'configs') + configs_root = osp.join(MMagic_ROOT, 'configs') file_list = glob.glob( osp.join(configs_root, '**', '*README.md'), recursive=True) file_list.sort() diff --git a/.dev_scripts/update_ut.py b/.dev_scripts/update_ut.py index ec2e8346cc..cd087fc361 100644 --- a/.dev_scripts/update_ut.py +++ b/.dev_scripts/update_ut.py @@ -7,13 +7,13 @@ from tqdm import tqdm parser = ArgumentParser() -parser.add_argument('--src', type=str, default='mmedit') +parser.add_argument('--src', type=str, default='mmagic') parser.add_argument('--dst', type=str, default='tests') parser.add_argument( '--exclude', nargs='+', default=[ - 'mmedit/.mim', 'mmedit/registry.py', 'mmedit/version.py', + 'mmagic/.mim', 'mmagic/registry.py', 'mmagic/version.py', '__pycache__', '__init__', '**/__init__.py', '**/stylegan3_ops/*', '**/conv2d_gradfix.py', '**/grid_sample_gradfix.py', '**/misc.py', '**/upfirdn2d.py', '**/all_gather_layer.py', '**/typing.py' @@ -34,7 +34,7 @@ def update_ut(): missing_ut = [] blank_ut = [] - file_list = glob('mmedit/**/*.py', recursive=True) + file_list = glob('mmagic/**/*.py', recursive=True) for f in tqdm(file_list): if check_exclude(f): @@ -44,7 +44,7 @@ def update_ut(): dirname = osp.dirname(f) dirname = dirname.replace('__', '') - dirname = dirname.replace('mmedit', 'tests') + dirname = dirname.replace('mmagic', 'tests') dirname = dirname.replace('/', '/test_') os.makedirs(dirname, exist_ok=True) From 3e29ac19307a094101e6b2a78cbc78019b351027 Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Wed, 19 Apr 2023 21:46:04 +0800 Subject: [PATCH 25/42] [Rename] update mmagic's README and LICENSE (#1776) --- CITATION.cff | 6 +- LICENSE | 4 +- README.md | 80 ++++++++++---------- README_zh-CN.md | 80 ++++++++++---------- docs/en/_static/image/mmagic-logo.png | Bin 0 -> 160749 bytes docs/en/_static/image/mmediting-logo.png | Bin 28764 -> 0 bytes docs/zh_cn/_static/image/mmagic-logo.png | Bin 0 -> 160749 bytes docs/zh_cn/_static/image/mmediting-logo.png | Bin 28764 -> 0 bytes 8 files changed, 85 insertions(+), 85 deletions(-) create mode 100644 docs/en/_static/image/mmagic-logo.png delete mode 100644 docs/en/_static/image/mmediting-logo.png create mode 100644 docs/zh_cn/_static/image/mmagic-logo.png delete mode 100644 docs/zh_cn/_static/image/mmediting-logo.png diff --git a/CITATION.cff b/CITATION.cff index 37e21c367c..b88a1995b9 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,10 +1,10 @@ cff-version: 1.2.0 message: "If you use this software, please cite it as below." authors: - - family-names: MMEditing + - family-names: MMagic given-names: Contributors -title: "MMEditing: OpenMMLab Image and Video Editing Toolbox" +title: "MMagic: OpenMMLab Image and Video Editing Toolbox" version: 0.13.0 date-released: 2022-03-01 -url: "https://github.com/open-mmlab/mmediting" +url: "https://github.com/open-mmlab/mmagic" license: Apache-2.0 diff --git a/LICENSE b/LICENSE index 94d620d25d..d11d98549d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) MMEditing Authors. All rights reserved. +Copyright (c) MMagic Authors. All rights reserved. Apache License Version 2.0, January 2004 @@ -188,7 +188,7 @@ Copyright (c) MMEditing Authors. All rights reserved. same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2020 MMEditing Authors. All rights reserved. + Copyright 2020 MMagic Authors. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 421b567fe4..f50f94c9ed 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
    - +
     
    OpenMMLab website @@ -18,20 +18,20 @@
     
    -[![PyPI](https://badge.fury.io/py/mmedit.svg)](https://pypi.org/project/mmedit/) -[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmediting.readthedocs.io/en/latest/) -[![badge](https://github.com/open-mmlab/mmediting/workflows/build/badge.svg)](https://github.com/open-mmlab/mmediting/actions) -[![codecov](https://codecov.io/gh/open-mmlab/mmediting/branch/master/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmediting) -[![license](https://img.shields.io/github/license/open-mmlab/mmediting.svg)](https://github.com/open-mmlab/mmediting/blob/main/LICENSE) -[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmediting.svg)](https://github.com/open-mmlab/mmediting/issues) -[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmediting.svg)](https://github.com/open-mmlab/mmediting/issues) - -[📘Documentation](https://mmediting.readthedocs.io/en/latest/) | -[🛠️Installation](https://mmediting.readthedocs.io/en/latest/get_started/install.html) | -[📊Model Zoo](https://mmediting.readthedocs.io/en/latest/model_zoo/overview.html) | -[🆕Update News](https://mmediting.readthedocs.io/en/latest/changelog.html) | -[🚀Ongoing Projects](https://github.com/open-mmlab/mmediting/projects) | -[🤔Reporting Issues](https://github.com/open-mmlab/mmediting/issues) +[![PyPI](https://badge.fury.io/py/mmagic.svg)](https://pypi.org/project/mmagic/) +[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmagic.readthedocs.io/en/latest/) +[![badge](https://github.com/open-mmlab/mmagic/workflows/build/badge.svg)](https://github.com/open-mmlab/mmagic/actions) +[![codecov](https://codecov.io/gh/open-mmlab/mmagic/branch/master/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmagic) +[![license](https://img.shields.io/github/license/open-mmlab/mmagic.svg)](https://github.com/open-mmlab/mmagic/blob/main/LICENSE) +[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmagic.svg)](https://github.com/open-mmlab/mmagic/issues) +[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmagic.svg)](https://github.com/open-mmlab/mmagic/issues) + +[📘Documentation](https://mmagic.readthedocs.io/en/latest/) | +[🛠️Installation](https://mmagic.readthedocs.io/en/latest/get_started/install.html) | +[📊Model Zoo](https://mmagic.readthedocs.io/en/latest/model_zoo/overview.html) | +[🆕Update News](https://mmagic.readthedocs.io/en/latest/changelog.html) | +[🚀Ongoing Projects](https://github.com/open-mmlab/mmagic/projects) | +[🤔Reporting Issues](https://github.com/open-mmlab/mmagic/issues) English | [简体中文](README_zh-CN.md) @@ -53,17 +53,17 @@ English | [简体中文](README_zh-CN.md) ## 🚀 What's New -### New release [**MMEditing v1.0.0rc7**](https://github.com/open-mmlab/mmediting/releases/tag/v1.0.0rc7) \[07/04/2023\]: +### New release [**MMagic v1.0.0rc7**](https://github.com/open-mmlab/mmagic/releases/tag/v1.0.0rc7) \[07/04/2023\]: - Support DiffuserWrapper - Support ControlNet (training and inference). - Support PyTorch 2.0 (successfully compile 33+ models on 'inductor' backend). -**MMEditing** has supported all the tasks, models, metrics, and losses in [MMGeneration](https://github.com/open-mmlab/mmgeneration) and unifies interfaces of all components based on [MMEngine](https://github.com/open-mmlab/mmengine) 😍. +**MMagic** has supported all the tasks, models, metrics, and losses in [MMGeneration](https://github.com/open-mmlab/mmgeneration) and unifies interfaces of all components based on [MMEngine](https://github.com/open-mmlab/mmengine) 😍. Please refer to [changelog.md](docs/en/changelog.md) for details and release history. -Please refer to [migration documents](docs/en/migration/overview.md) to migrate from [old version](https://github.com/open-mmlab/mmediting/tree/master) MMEditing 0.x to our brand new 1.x version. +Please refer to [migration documents](docs/en/migration/overview.md) to migrate from [old version](https://github.com/open-mmlab/mmagic/tree/master) MMagic 0.x to our brand new 1.x version. ## 📄 Table of Contents @@ -80,9 +80,9 @@ Please refer to [migration documents](docs/en/migration/overview.md) to migrate ## 📖 Introduction -MMEditing is an open-source image and video editing&generating toolbox based on PyTorch. It is a part of the [OpenMMLab](https://openmmlab.com/) project. +MMagic is an open-source image and video editing&generating toolbox based on PyTorch. It is a part of the [OpenMMLab](https://openmmlab.com/) project. -Currently, MMEditing support multiple image and video generation/editing tasks. +Currently, MMagic support multiple image and video generation/editing tasks. https://user-images.githubusercontent.com/12782558/217152698-49169038-9872-4200-80f7-1d5f7613afd7.mp4 @@ -92,15 +92,15 @@ The best practice on our main branch works with **Python 3.8+** and **PyTorch 1. - **State of the Art** - MMEditing provides state-of-the-art generative models to process, edit and synthesize images and videos. + MMagic provides state-of-the-art generative models to process, edit and synthesize images and videos. - **Powerful and Popular Applications** - MMEditing supports popular and contemporary image restoration, text-to-image, 3D-aware generation, inpainting, matting, super-resolution and generation applications. Specifically, MMEditing supports GAN interpolation, GAN projection, GAN manipulations and many other popular GAN’s applications. It’s time to play with your GANs! + MMagic supports popular and contemporary image restoration, text-to-image, 3D-aware generation, inpainting, matting, super-resolution and generation applications. Specifically, MMagic supports GAN interpolation, GAN projection, GAN manipulations and many other popular GAN’s applications. It’s time to play with your GANs! - **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](https://mmediting.readthedocs.io/en/latest/howto/losses.html)) + 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](https://mmagic.readthedocs.io/en/latest/howto/losses.html)) - **Efficient Distributed Training** @@ -116,15 +116,15 @@ More and more community contributors are joining us to make our repo better. Som - [Restormer](configs/restormer/README.md) is contributed by @AlexZou14. - [SwinIR](configs/swinir/README.md) is contributed by @Zdafeng. -[Projects](projects/README.md) is opened to make it easier for everyone to add projects to MMEditing. +[Projects](projects/README.md) is opened to make it easier for everyone to add projects to MMagic. -We appreciate all contributions to improve MMEditing. Please refer to [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/tree/2.x/CONTRIBUTING.md) in MMCV and [CONTRIBUTING.md](https://github.com/open-mmlab/mmengine/blob/main/CONTRIBUTING.md) in MMEngine for more details about the contributing guideline. +We appreciate all contributions to improve MMagic. Please refer to [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/tree/2.x/CONTRIBUTING.md) in MMCV and [CONTRIBUTING.md](https://github.com/open-mmlab/mmengine/blob/main/CONTRIBUTING.md) in MMEngine for more details about the contributing guideline.

    🔝Back to top

    ## 🛠️ Installation -MMEditing depends on [PyTorch](https://pytorch.org/), [MMEngine](https://github.com/open-mmlab/mmengine) and [MMCV](https://github.com/open-mmlab/mmcv). +MMagic depends on [PyTorch](https://pytorch.org/), [MMEngine](https://github.com/open-mmlab/mmengine) and [MMCV](https://github.com/open-mmlab/mmcv). Below are quick steps for installation. **Step 1.** @@ -140,11 +140,11 @@ mim install 'mmcv>=2.0.0' ``` **Step 3.** -Install MMEditing from source. +Install MMagic from source. ```shell -git clone https://github.com/open-mmlab/mmediting.git -cd mmediting +git clone https://github.com/open-mmlab/mmagic.git +cd mmagic pip3 install -e . ``` @@ -152,7 +152,7 @@ Please refer to [installation](docs/en/get_started/install.md) for more detailed **Getting Started** -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. +Please see [quick run](docs/en/get_started/quick_run.md) and [inference](docs/en/user_guides/inference.md) for the basic usage of MMagic.

    🔝Back to top

    @@ -323,31 +323,31 @@ Please see [quick run](docs/en/get_started/quick_run.md) and [inference](docs/en -Please refer to [model_zoo](https://mmediting.readthedocs.io/en/latest/model_zoo/overview.html) for more details. +Please refer to [model_zoo](https://mmagic.readthedocs.io/en/latest/model_zoo/overview.html) for more details.

    🔝Back to top

    ## 🤝 Acknowledgement -MMEditing is an open source project that is contributed by researchers and engineers from various colleges and companies. We wish that the toolbox and benchmark could serve the growing research community by providing a flexible toolkit to reimplement existing methods and develop their own new methods. +MMagic is an open source project that is contributed by researchers and engineers from various colleges and companies. We wish that the toolbox and benchmark could serve the growing research community by providing a flexible toolkit to reimplement existing methods and develop their own new methods. We appreciate all the contributors who implement their methods or add new features, as well as users who give valuable feedbacks. Thank you all! - - + +

    🔝Back to top

    ## 🖊️ Citation -If MMEditing is helpful to your research, please cite it as below. +If MMagic is helpful to your research, please cite it as below. ```bibtex -@misc{mmediting2022, - title = {{MMEditing}: {OpenMMLab} Image and Video Editing Toolbox}, - author = {{MMEditing Contributors}}, - howpublished = {\url{https://github.com/open-mmlab/mmediting}}, +@misc{mmagic2022, + title = {{MMagic}: {OpenMMLab} Image and Video Editing Toolbox}, + author = {{MMagic Contributors}}, + howpublished = {\url{https://github.com/open-mmlab/mmagic}}, year = {2022} } ``` @@ -380,7 +380,7 @@ Please refer to [LICENSES](LICENSE) for the careful check, if you are using our - [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab's next-generation action understanding toolbox and benchmark. - [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab video perception toolbox and benchmark. - [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab optical flow toolbox and benchmark. -- [MMEditing](https://github.com/open-mmlab/mmediting): OpenMMLab image and video editing toolbox. +- [MMagic](https://github.com/open-mmlab/mmagic): OpenMMLab image and video editing toolbox. - [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab image and video generative models toolbox. - [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab model deployment framework. diff --git a/README_zh-CN.md b/README_zh-CN.md index 7804ac9d13..861f1fef91 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -1,5 +1,5 @@
    - +
     
    OpenMMLab 官网 @@ -18,20 +18,20 @@
     
    -[![PyPI](https://badge.fury.io/py/mmedit.svg)](https://pypi.org/project/mmedit/) -[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmediting.readthedocs.io/zh_CN/latest/) -[![badge](https://github.com/open-mmlab/mmediting/workflows/build/badge.svg)](https://github.com/open-mmlab/mmediting/actions) -[![codecov](https://codecov.io/gh/open-mmlab/mmediting/branch/master/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmediting) -[![license](https://img.shields.io/github/license/open-mmlab/mmediting.svg)](https://github.com/open-mmlab/mmediting/blob/main/LICENSE) -[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmediting.svg)](https://github.com/open-mmlab/mmediting/issues) -[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmediting.svg)](https://github.com/open-mmlab/mmediting/issues) - -[📘使用文档](https://mmediting.readthedocs.io/zh_CN/latest/) | -[🛠️安装教程](https://mmediting.readthedocs.io/zh_CN/latest/get_started/install.html) | -[📊模型库](https://mmediting.readthedocs.io/zh_CN/latest/model_zoo/overview.html) | -[🆕更新记录](https://mmediting.readthedocs.io/zh_CN/latest/changelog.html) | -[🚀进行中的项目](https://github.com/open-mmlab/mmediting/projects) | -[🤔提出问题](https://github.com/open-mmlab/mmediting/issues) +[![PyPI](https://badge.fury.io/py/mmagic.svg)](https://pypi.org/project/mmagic/) +[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmagic.readthedocs.io/zh_CN/latest/) +[![badge](https://github.com/open-mmlab/mmagic/workflows/build/badge.svg)](https://github.com/open-mmlab/mmagic/actions) +[![codecov](https://codecov.io/gh/open-mmlab/mmagic/branch/master/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmagic) +[![license](https://img.shields.io/github/license/open-mmlab/mmagic.svg)](https://github.com/open-mmlab/mmagic/blob/main/LICENSE) +[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmagic.svg)](https://github.com/open-mmlab/mmagic/issues) +[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmagic.svg)](https://github.com/open-mmlab/mmagic/issues) + +[📘使用文档](https://mmagic.readthedocs.io/zh_CN/latest/) | +[🛠️安装教程](https://mmagic.readthedocs.io/zh_CN/latest/get_started/install.html) | +[📊模型库](https://mmagic.readthedocs.io/zh_CN/latest/model_zoo/overview.html) | +[🆕更新记录](https://mmagic.readthedocs.io/zh_CN/latest/changelog.html) | +[🚀进行中的项目](https://github.com/open-mmlab/mmagic/projects) | +[🤔提出问题](https://github.com/open-mmlab/mmagic/issues) [English](README.md) | 简体中文 @@ -53,15 +53,15 @@ ## 🚀 最新进展 -### 最新的 [**MMEditing v1.0.0rc7**](https://github.com/open-mmlab/mmediting/releases/tag/v1.0.0rc7) 版本已经在 \[07/04/2023\] 发布: +### 最新的 [**MMagic v1.0.0rc7**](https://github.com/open-mmlab/mmagic/releases/tag/v1.0.0rc7) 版本已经在 \[07/04/2023\] 发布: - 支持了 DiffuserWrapper. - 支持了 ControlNet 的推理与训练. - 支持了 PyTorch 2.0 (使用 'inductor' 后端成功编译 33+ 模型). -**MMEditing** 已经支持了[MMGeneration](https://github.com/open-mmlab/mmgeneration)中的全量任务、模型、优化函数和评价指标 ,并基于[MMEngine](https://github.com/open-mmlab/mmengine)统一了各组件接口 😍。 +**MMagic** 已经支持了[MMGeneration](https://github.com/open-mmlab/mmgeneration)中的全量任务、模型、优化函数和评价指标 ,并基于[MMEngine](https://github.com/open-mmlab/mmengine)统一了各组件接口 😍。 -如果想了解更多版本更新细节和历史信息,请阅读[更新日志](docs/zh_cn/changelog.md)。如果想从[旧版本](https://github.com/open-mmlab/mmediting/tree/master) MMEditing 0.x 迁移到新版本 MMEditing 1.x,请阅读[迁移文档](docs/zh_cn/migration/overview.md)。 +如果想了解更多版本更新细节和历史信息,请阅读[更新日志](docs/zh_cn/changelog.md)。如果想从[旧版本](https://github.com/open-mmlab/mmagic/tree/master) MMagic 0.x 迁移到新版本 MMagic 1.x,请阅读[迁移文档](docs/zh_cn/migration/overview.md)。 ## 📄 目录 @@ -78,9 +78,9 @@ ## 📖 介绍 -MMEditing 是基于 PyTorch 的图像&视频编辑和生成开源工具箱。是 [OpenMMLab](https://openmmlab.com/) 项目的成员之一。 +MMagic 是基于 PyTorch 的图像&视频编辑和生成开源工具箱。是 [OpenMMLab](https://openmmlab.com/) 项目的成员之一。 -目前 MMEditing 支持多种图像和视频的生成/编辑任务。 +目前 MMagic 支持多种图像和视频的生成/编辑任务。 https://user-images.githubusercontent.com/12782558/217152698-49169038-9872-4200-80f7-1d5f7613afd7.mp4 @@ -90,15 +90,15 @@ https://user-images.githubusercontent.com/12782558/217152698-49169038-9872-4200- - **SOTA** - MMEditing 提供了处理、编辑、生成图像和视频的SOTA算法。 + MMagic 提供了处理、编辑、生成图像和视频的SOTA算法。 - **强有力且流行的应用** - MMEditing 支持了流行的图像修复、图文生成、3D生成、图像修补、抠图、超分辨率和生成等任务的应用。特别是 MMEditing 支持了 GANs 的插值,投影和编辑和其他流行的应用。请用你的 GANs 尽情尝试! + MMagic 支持了流行的图像修复、图文生成、3D生成、图像修补、抠图、超分辨率和生成等任务的应用。特别是 MMagic 支持了 GANs 的插值,投影和编辑和其他流行的应用。请用你的 GANs 尽情尝试! - **灵活组合的模块化设计** - MMEditing 将编辑框架分解为不同的组件,并且可以通过组合不同的模块轻松地构建自定义的编辑器模型。 + MMagic 将编辑框架分解为不同的组件,并且可以通过组合不同的模块轻松地构建自定义的编辑器模型。 - **高效的分布式训练** @@ -114,15 +114,15 @@ https://user-images.githubusercontent.com/12782558/217152698-49169038-9872-4200- - [Restormer](configs/restormer/README.md) 来自 @AlexZou14. - [SwinIR](configs/swinir/README.md) 来自 @Zdafeng. -为使向 MMEditing 中添加项目更加容易,我们开启了 [Projects](projects/README.md) 。 +为使向 MMagic 中添加项目更加容易,我们开启了 [Projects](projects/README.md) 。 -感谢您为改善 MMEditing 所做的所有贡献。请参阅 MMCV 中的 [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/tree/2.x/CONTRIBUTING.md) 和 MMEngine 中的 [CONTRIBUTING.md](https://github.com/open-mmlab/mmengine/blob/main/CONTRIBUTING_zh-CN.md) 以获取贡献指南。 +感谢您为改善 MMagic 所做的所有贡献。请参阅 MMCV 中的 [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/tree/2.x/CONTRIBUTING.md) 和 MMEngine 中的 [CONTRIBUTING.md](https://github.com/open-mmlab/mmengine/blob/main/CONTRIBUTING_zh-CN.md) 以获取贡献指南。

    🔝返回顶部

    ## 🛠️ 安装 -MMEditing 依赖 [PyTorch](https://pytorch.org/),[MMEngine](https://github.com/open-mmlab/mmengine) 和 [MMCV](https://github.com/open-mmlab/mmcv),以下是安装的简要步骤。 +MMagic 依赖 [PyTorch](https://pytorch.org/),[MMEngine](https://github.com/open-mmlab/mmengine) 和 [MMCV](https://github.com/open-mmlab/mmcv),以下是安装的简要步骤。 **步骤 1.** 依照[官方教程](https://pytorch.org/get-started/locally/)安装 PyTorch 。 @@ -137,11 +137,11 @@ mim install 'mmcv>=2.0.0' ``` **步骤 3.** -从源码安装 MMEditing +从源码安装 MMagic ``` -git clone https://github.com/open-mmlab/mmediting.git -cd mmediting +git clone https://github.com/open-mmlab/mmagic.git +cd mmagic pip3 install -e . ``` @@ -149,7 +149,7 @@ pip3 install -e . **开始使用** -请参考[快速运行](docs/zh_cn/get_started/quick_run.md)和[推理演示](docs/zh_cn/user_guides/inference.md)获取MMEditing的基本用法。 +请参考[快速运行](docs/zh_cn/get_started/quick_run.md)和[推理演示](docs/zh_cn/user_guides/inference.md)获取MMagic的基本用法。

    🔝Back to top

    @@ -320,29 +320,29 @@ pip3 install -e . -请参考[模型库](https://mmediting.readthedocs.io/zh_CN/latest/model_zoo/overview.html)了解详情。 +请参考[模型库](https://mmagic.readthedocs.io/zh_CN/latest/model_zoo/overview.html)了解详情。

    🔝返回顶部

    ## 🤝 致谢 -MMEditing 是一款由不同学校和公司共同贡献的开源项目。我们感谢所有为项目提供算法复现和新功能支持的贡献者,以及提供宝贵反馈的用户。我们希望该工具箱和基准测试可以为社区提供灵活的代码工具,供用户复现现有算法并开发自己的新模型,从而不断为开源社区提供贡献。 +MMagic 是一款由不同学校和公司共同贡献的开源项目。我们感谢所有为项目提供算法复现和新功能支持的贡献者,以及提供宝贵反馈的用户。我们希望该工具箱和基准测试可以为社区提供灵活的代码工具,供用户复现现有算法并开发自己的新模型,从而不断为开源社区提供贡献。 - - + +

    🔝返回顶部

    ## 🖊️ 引用 -如果 MMEditing 对您的研究有所帮助,请按照如下 bibtex 引用它。 +如果 MMagic 对您的研究有所帮助,请按照如下 bibtex 引用它。 ```bibtex -@misc{mmediting2022, - title = {{MMEditing}: {OpenMMLab} Image and Video Editing Toolbox}, - author = {{MMEditing Contributors}}, - howpublished = {\url{https://github.com/open-mmlab/mmediting}}, +@misc{mmagic2022, + title = {{MMagic}: {OpenMMLab} Image and Video Editing Toolbox}, + author = {{MMagic Contributors}}, + howpublished = {\url{https://github.com/open-mmlab/mmagic}}, year = {2022} } ``` @@ -374,7 +374,7 @@ MMEditing 是一款由不同学校和公司共同贡献的开源项目。我们 - [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab 新一代视频理解工具箱 - [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab 一体化视频目标感知平台 - [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab 光流估计工具箱与测试基准 -- [MMEditing](https://github.com/open-mmlab/mmediting): OpenMMLab 图像视频编辑工具箱 +- [MMagic](https://github.com/open-mmlab/mmagic): OpenMMLab 图像视频编辑工具箱 - [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab 图片视频生成模型工具箱 - [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab 模型部署框架 diff --git a/docs/en/_static/image/mmagic-logo.png b/docs/en/_static/image/mmagic-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..aefeff7cebf00a57d964fa00144e6ea950b14b94 GIT binary patch literal 160749 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 z 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

    fq+qt(^!Dt<1~g2WdOpY{d}kz(o4|u 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 literal 0 HcmV?d00001 diff --git a/docs/en/_static/image/mmediting-logo.png b/docs/en/_static/image/mmediting-logo.png deleted file mode 100644 index 95b851a916e73f166b886e48652008f5c6387f4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28764 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 z 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

    fq+qt(^!Dt<1~g2WdOpY{d}kz(o4|u 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 literal 0 HcmV?d00001 diff --git a/docs/zh_cn/_static/image/mmediting-logo.png b/docs/zh_cn/_static/image/mmediting-logo.png deleted file mode 100644 index 95b851a916e73f166b886e48652008f5c6387f4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28764 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 Date: Thu, 20 Apr 2023 12:33:36 +0800 Subject: [PATCH 26/42] [Fix] Rename some package name in README and revise some configs (#1777) * fix docs * fix docs * revise controlnet's readme * revise configs and readmes of diffusion and 3d-aware generation --------- Co-authored-by: zhangjingdong <1396925302@qq.com> --- configs/controlnet/README.md | 8 +- configs/controlnet_animation/README.md | 4 +- configs/disco_diffusion/README.md | 2 +- configs/eg3d/README.md | 2 +- configs/guided_diffusion/README.md | 4 +- .../adm_ddim250_8xb32_imagenet-256x256.py | 2 +- .../adm_ddim250_8xb32_imagenet-512x512.py | 2 +- .../adm_ddim250_8xb32_imagenet-64x64.py | 2 +- configs/stable_diffusion/README.md | 12 ++- .../stable-diffusion_ddim_denoisingunet.py | 94 +++++++++++-------- 10 files changed, 77 insertions(+), 55 deletions(-) diff --git a/configs/controlnet/README.md b/configs/controlnet/README.md index f08b8190cc..395a43cbf5 100644 --- a/configs/controlnet/README.md +++ b/configs/controlnet/README.md @@ -58,8 +58,8 @@ import mmcv from mmengine import Config from PIL import Image -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() @@ -109,8 +109,8 @@ import mmcv from mmengine import Config from PIL import Image -from mmedit.registry import MODELS -from mmedit.utils import register_all_modules +from mmagic.registry import MODELS +from mmagic.utils import register_all_modules register_all_modules() diff --git a/configs/controlnet_animation/README.md b/configs/controlnet_animation/README.md index 8c919c2dd4..72de190210 100644 --- a/configs/controlnet_animation/README.md +++ b/configs/controlnet_animation/README.md @@ -52,12 +52,12 @@ We use pretrained model from hugging face. There are two ways to try controlnet animation. -### 1. Use MMEdit inference API. +### 1. Use MMagic inference API. Running the following codes, you can get an generated animation video. ```python -from mmedit.edit import MMEdit +from mmagic.edit import MMEdit # Create a MMEdit instance and infer editor = MMEdit(model_name='controlnet_animation') diff --git a/configs/disco_diffusion/README.md b/configs/disco_diffusion/README.md index 90cb59e11c..61e0f549fb 100644 --- a/configs/disco_diffusion/README.md +++ b/configs/disco_diffusion/README.md @@ -81,7 +81,7 @@ from mmengine import Config, MODELS from mmengine.registry import init_default_scope from torchvision.utils import save_image -init_default_scope('mmedit') +init_default_scope('mmagic') disco = MODELS.build( Config.fromfile('configs/disco_diffusion/disco-baseline.py').model).cuda().eval() diff --git a/configs/eg3d/README.md b/configs/eg3d/README.md index 497cae08f8..97a3ae49ed 100644 --- a/configs/eg3d/README.md +++ b/configs/eg3d/README.md @@ -102,7 +102,7 @@ def main(): parser.add_argument( 'in-anno', type=str, help='Path to the official annotation file.') parser.add_argument( - 'out-anno', type=str, help='Path to MMEditing\'s annotation file.') + 'out-anno', type=str, help='Path to MMagicing\'s annotation file.') args = parser.parse_args() anno = load(args.in_anno) diff --git a/configs/guided_diffusion/README.md b/configs/guided_diffusion/README.md index c591b62e5e..078669b991 100644 --- a/configs/guided_diffusion/README.md +++ b/configs/guided_diffusion/README.md @@ -47,8 +47,8 @@ We show that diffusion models can achieve image sample quality superior to the c You can run adm as follows: ```python -from mmedit.utils import register_all_modules -from mmedit.apis import init_model +from mmagic.utils import register_all_modules +from mmagic.apis import init_model register_all_modules() diff --git a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py index 19877cda28..361211d34a 100644 --- a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py +++ b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py @@ -25,7 +25,7 @@ use_new_attention_order=False), use_scale_shift_norm=True), diffusion_scheduler=dict( - type='DDIMScheduler', + type='EditDDIMScheduler', variance_type='learned_range', beta_schedule='linear'), rgb2bgr=True, diff --git a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-512x512.py b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-512x512.py index 03795de4d9..8a804cc05a 100644 --- a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-512x512.py +++ b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-512x512.py @@ -25,7 +25,7 @@ use_new_attention_order=False), use_scale_shift_norm=True), diffusion_scheduler=dict( - type='DDIMScheduler', + type='EditDDIMScheduler', variance_type='learned_range', beta_schedule='linear'), rgb2bgr=True, diff --git a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-64x64.py b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-64x64.py index ce3c24d383..2ba79bcc23 100644 --- a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-64x64.py +++ b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-64x64.py @@ -25,7 +25,7 @@ use_new_attention_order=True), use_scale_shift_norm=True), diffusion_scheduler=dict( - type='DDIMScheduler', + type='EditDDIMScheduler', variance_type='learned_range', beta_schedule='squaredcos_cap_v2'), rgb2bgr=True, diff --git a/configs/stable_diffusion/README.md b/configs/stable_diffusion/README.md index 2337a8ee7e..769f4b69de 100644 --- a/configs/stable_diffusion/README.md +++ b/configs/stable_diffusion/README.md @@ -47,7 +47,7 @@ Stable Diffusion is a latent diffusion model conditioned on the text embeddings 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. +You may download the weights from [stable-diffusion-1.5](https://huggingface.co/runwayml/stable-diffusion-v1-5) and change the 'from_pretrained' in config to the weights dir. Download with git: @@ -66,18 +66,20 @@ from torchvision import utils from mmengine.registry import init_default_scope -init_default_scope('mmedit') +init_default_scope('mmagic') config = 'configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py' config = Config.fromfile(config).copy() -config.model.init_cfg.pretrained_model_path = '/path/to/your/stable-diffusion-v1-5' +# change the 'pretrained_model_path' if you have downloaded the weights manually +# config.model.unet.from_pretrained = '/path/to/your/stable-diffusion-v1-5' +# config.model.vae.from_pretrained = '/path/to/your/stable-diffusion-v1-5' StableDiffuser = MODELS.build(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') +image = StableDiffuser.infer(prompt)['samples'][0] +image.save('robot.png') ``` ## Comments diff --git a/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py b/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py index 2cbeca94bd..a484a470a8 100644 --- a/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py +++ b/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py @@ -1,42 +1,62 @@ -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')) +# MMEditing's implementation of Stable Diffusion +# 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( +# type='EditAutoencoderKL', +# 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', +# ]) +# Use DiffuserWrapper! +stable_diffusion_v15_url = 'runwayml/stable-diffusion-v1-5' +unet = dict( + type='UNet2DConditionModel', + subfolder='unet', + from_pretrained=stable_diffusion_v15_url) vae = dict( - type='EditAutoencoderKL', - 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' - ]) + type='AutoencoderKL', + from_pretrained=stable_diffusion_v15_url, + subfolder='vae') diffusion_scheduler = dict( type='EditDDIMScheduler', From f6aebdee18e6bd507e2d480a626148279b34342c Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Thu, 20 Apr 2023 16:08:10 +0800 Subject: [PATCH 27/42] [Rename] update mmagic's docs (#1778) * [Rename] update mmagic's docs * [Rename] update mmagic's docs --- docs/en/.dev_scripts/update_model_zoo.py | 14 ++-- docs/en/_static/css/readthedocs.css | 2 +- docs/en/_templates/404.html | 2 +- docs/en/advanced_guides/data_flow.md | 4 +- docs/en/advanced_guides/data_preprocessor.md | 2 +- docs/en/advanced_guides/evaluator.md | 2 +- docs/en/advanced_guides/structures.md | 4 +- docs/en/community/contributing.md | 20 +++--- docs/en/community/projects.md | 26 +++---- docs/en/device/npu.md | 2 +- docs/en/faq.md | 2 +- docs/en/get_started/install.md | 38 +++++------ docs/en/get_started/overview.md | 28 ++++---- docs/en/get_started/quick_run.md | 12 ++-- docs/en/howto/dataset.md | 28 ++++---- docs/en/howto/losses.md | 70 +++++++++---------- docs/en/howto/models.md | 68 +++++++++--------- docs/en/howto/transforms.md | 20 +++--- docs/en/index.rst | 16 ++--- docs/en/switch_language.md | 4 +- docs/en/user_guides/config.md | 20 +++--- docs/en/user_guides/dataset_prepare.md | 10 +-- docs/en/user_guides/deploy.md | 36 +++++----- docs/en/user_guides/inference.md | 24 +++---- docs/en/user_guides/metrics.md | 36 +++++----- docs/en/user_guides/train_test.md | 30 ++++---- docs/en/user_guides/visualization.md | 20 +++--- docs/zh_cn/.dev_scripts/update_model_zoo.py | 2 +- docs/zh_cn/_static/css/readthedocs.css | 2 +- docs/zh_cn/_templates/404.html | 2 +- docs/zh_cn/community/contributing.md | 28 ++++---- docs/zh_cn/device/npu_zh.md | 2 +- docs/zh_cn/get_started/install.md | 38 +++++------ docs/zh_cn/get_started/overview.md | 30 ++++---- docs/zh_cn/get_started/quick_run.md | 12 ++-- docs/zh_cn/howto/losses.md | 72 ++++++++++---------- docs/zh_cn/index.rst | 4 +- docs/zh_cn/switch_language.md | 4 +- docs/zh_cn/user_guides/config.md | 6 +- docs/zh_cn/user_guides/dataset_prepare.md | 10 +-- docs/zh_cn/user_guides/deploy.md | 28 ++++---- docs/zh_cn/user_guides/metrics.md | 34 ++++----- docs/zh_cn/user_guides/useful_tools.md | 28 ++++---- 43 files changed, 421 insertions(+), 421 deletions(-) diff --git a/docs/en/.dev_scripts/update_model_zoo.py b/docs/en/.dev_scripts/update_model_zoo.py index 90f8634c48..0b2483b896 100755 --- a/docs/en/.dev_scripts/update_model_zoo.py +++ b/docs/en/.dev_scripts/update_model_zoo.py @@ -7,7 +7,7 @@ from modelindex.load_model_index import load from tqdm import tqdm -MMEDIT_ROOT = Path(__file__).absolute().parents[3] +MMAGIC_ROOT = Path(__file__).absolute().parents[3] TARGET_ROOT = Path(__file__).absolute().parents[1] / 'model_zoo' @@ -20,7 +20,7 @@ def write_file(file, content): 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_file = MMAGIC_ROOT / 'model-index.yml' model_index = load(str(model_index_file)) model_index.build_models_with_collections() @@ -38,12 +38,12 @@ def update_model_zoo(): # 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 + assert len(collections) == len(os.listdir(MMAGIC_ROOT / 'configs')) - 1 - configs = set([str(MMEDIT_ROOT / m.config) for m in full_models]) + configs = set([str(MMAGIC_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) + str(MMAGIC_ROOT / 'configs/_base_/**/*.py'), recursive=True) + all_configs = glob(str(MMAGIC_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( @@ -103,7 +103,7 @@ def update_model_zoo(): for m in models: if m.readme not in readme: readme.add(m.readme) - with open(MMEDIT_ROOT / m.readme, 'r') as f: + with open(MMAGIC_ROOT / m.readme, 'r') as f: c = f.read() content += c.replace('# ', '## ') overview = (f'# {task}\n\n' diff --git a/docs/en/_static/css/readthedocs.css b/docs/en/_static/css/readthedocs.css index 4b680e8d68..1f23cd07c1 100644 --- a/docs/en/_static/css/readthedocs.css +++ b/docs/en/_static/css/readthedocs.css @@ -1,5 +1,5 @@ .header-logo { - background-image: url("../image/mmediting-logo.png"); + background-image: url("../image/mmagic-logo.png"); background-size: 142px 46px; height: 46px; width: 142px; diff --git a/docs/en/_templates/404.html b/docs/en/_templates/404.html index 1cd18b7310..f7cb45c64c 100644 --- a/docs/en/_templates/404.html +++ b/docs/en/_templates/404.html @@ -10,7 +10,7 @@

    Page Not 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! + If you cannot find documentation you want, please open an issue to tell us!

    {% endblock %} diff --git a/docs/en/advanced_guides/data_flow.md b/docs/en/advanced_guides/data_flow.md index 5fb38c7fd8..f2188c6401 100644 --- a/docs/en/advanced_guides/data_flow.md +++ b/docs/en/advanced_guides/data_flow.md @@ -1,5 +1,5 @@ -# Data flow in MMEditing \[Coming Soon!\] +# Data flow in MMagic \[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)! +[Make a pull request](https://github.com/open-mmlab/mmagic/compare) or [discuss with us](https://github.com/open-mmlab/mmagic/discussions/1429)! diff --git a/docs/en/advanced_guides/data_preprocessor.md b/docs/en/advanced_guides/data_preprocessor.md index 70431b77b1..9a24d865f1 100644 --- a/docs/en/advanced_guides/data_preprocessor.md +++ b/docs/en/advanced_guides/data_preprocessor.md @@ -2,4 +2,4 @@ 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)! +[Make a pull request](https://github.com/open-mmlab/mmagic/compare) or [discuss with us](https://github.com/open-mmlab/mmagic/discussions/1429)! diff --git a/docs/en/advanced_guides/evaluator.md b/docs/en/advanced_guides/evaluator.md index ce5e922ccf..2b04b677ae 100644 --- a/docs/en/advanced_guides/evaluator.md +++ b/docs/en/advanced_guides/evaluator.md @@ -2,4 +2,4 @@ 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)! +[Make a pull request](https://github.com/open-mmlab/mmagic/compare) or [discuss with us](https://github.com/open-mmlab/mmagic/discussions/1429)! diff --git a/docs/en/advanced_guides/structures.md b/docs/en/advanced_guides/structures.md index 1bd386f146..cafd00dc51 100644 --- a/docs/en/advanced_guides/structures.md +++ b/docs/en/advanced_guides/structures.md @@ -1,5 +1,5 @@ -# Data structure in MMEditing \[Coming Soon!\] +# Data structure in MMagic \[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)! +[Make a pull request](https://github.com/open-mmlab/mmagic/compare) or [discuss with us](https://github.com/open-mmlab/mmagic/discussions/1429)! diff --git a/docs/en/community/contributing.md b/docs/en/community/contributing.md index 7a6f5b72b8..e73b9acf82 100644 --- a/docs/en/community/contributing.md +++ b/docs/en/community/contributing.md @@ -1,6 +1,6 @@ # 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. +Welcome to the mmagic 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: @@ -54,22 +54,22 @@ If you are posting a pull request for the first time, you should fork the OpenMM Then, you can clone the repositories to local: ```shell -git clone git@github.com:{username}/mmediting.git +git clone git@github.com:{username}/mmagic.git ``` After that, you should ddd official repository as the upstream repository ```bash -git remote add upstream git@github.com:open-mmlab/mmediting +git remote add upstream git@github.com:open-mmlab/mmagic ``` 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) +origin git@github.com:{username}/mmagic.git (fetch) +origin git@github.com:{username}/mmagic.git (push) +upstream git@github.com:open-mmlab/mmagic (fetch) +upstream git@github.com:open-mmlab/mmagic (push) ``` ```{note} @@ -78,7 +78,7 @@ Here's a brief introduction to origin and upstream. When we use "git clone", we #### 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. +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 mmagic directory. ```shell pip install -U pre-commit @@ -130,7 +130,7 @@ 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). +- mmagic 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 @@ -180,7 +180,7 @@ Find more details about Pull Request description in [pull request guidelines](#p -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. +mmagic 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. diff --git a/docs/en/community/projects.md b/docs/en/community/projects.md index 544d4e5287..0c8a98add3 100644 --- a/docs/en/community/projects.md +++ b/docs/en/community/projects.md @@ -1,38 +1,38 @@ -# MMEditing projects +# MMagic projects -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. +Welcome to the MMagic community! +The MMagic 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 MMagic for image, video, 3D content generation, editing and processing. -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 are a few projects that are built upon MMagic. They are examples of how to use MMagic as a library, to make your projects more maintainable. +Please find more projects in [MMagic Ecosystem](https://openmmlab.com/ecosystem). ## Show your projects on OpenMMLab Ecosystem 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 +## Add example projects to MMagic -Here is an [example project](../../../projects/example_project) about how to add your projects to MMEditing. +Here is an [example project](../../../projects/example_project) about how to add your projects to MMagic. 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/latest/community/contributing.html) +- [Contribution Guide](https://mmagic.readthedocs.io/en/latest/community/contributing.html) - The guides for new contributors about how to add your projects to MMEditing. + The guides for new contributors about how to add your projects to MMagic. -- [New Model Guide](https://mmediting.readthedocs.io/en/latest/howto/models.html) +- [New Model Guide](https://mmagic.readthedocs.io/en/latest/howto/models.html) The documentation of adding new models. -- [Discussions](https://github.com/open-mmlab/mmediting/discussions) +- [Discussions](https://github.com/open-mmlab/mmagic/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. +- [PowerVQE](https://github.com/ryanxingql/powervqe): Open framework for quality enhancement of compressed videos based on PyTorch and MMagic. - [VR-Baseline](https://github.com/linjing7/VR-Baseline): Video Restoration Toolbox. diff --git a/docs/en/device/npu.md b/docs/en/device/npu.md index a0ad8ee5c1..fa3a8c1405 100644 --- a/docs/en/device/npu.md +++ b/docs/en/device/npu.md @@ -20,7 +20,7 @@ python tools/train.py configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py | Model | Dataset | PSNR | SSIM | Download | | :----------------------------------------------------------------------------------------: | ------- | :---: | :--- | :--------------------------------------------------------------------------------------------- | -| [edsr_x2c64b16_1x16_300k_div2k](https://github.com/open-mmlab/mmediting/blob/main/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py) | DIV2K | 35.83 | 0.94 | [log](https://download.openmmlab.com/mmediting/device/npu/edsr/edsr_x2c64b16_1xb16-300k_div2k.log) | +| [edsr_x2c64b16_1x16_300k_div2k](https://github.com/open-mmlab/mmagic/blob/main/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py) | DIV2K | 35.83 | 0.94 | [log](https://download.openmmlab.com/mmediting/device/npu/edsr/edsr_x2c64b16_1xb16-300k_div2k.log) | **Notes:** diff --git a/docs/en/faq.md b/docs/en/faq.md index 42f40788bc..088f9c28fb 100644 --- a/docs/en/faq.md +++ b/docs/en/faq.md @@ -4,7 +4,7 @@ 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 and have ways to help others to solve them. If the contents here do not cover your issue, please create an issue using the -[provided templates](https://github.com/open-mmlab/mmediting/issues/new/choose) +[provided templates](https://github.com/open-mmlab/mmagic/issues/new/choose) and make sure you fill in all required information in the template. ## FAQ diff --git a/docs/en/get_started/install.md b/docs/en/get_started/install.md index c826b47cd9..2e644a9368 100644 --- a/docs/en/get_started/install.md +++ b/docs/en/get_started/install.md @@ -6,18 +6,18 @@ In this section, you will know about: - [Prerequisites](#prerequisites) - [Best practices](#best-practices) - [Customize installation](#customize-installation) - - [Developing with multiple MMEditing versions](#developing-with-multiple-mmediting-versions) + - [Developing with multiple MMagic versions](#developing-with-multiple-mmagic-versions) ## Installation -We recommend that users follow our [Best practices](#best-practices) to install MMEditing. +We recommend that users follow our [Best practices](#best-practices) to install MMagic. However, the whole process is highly customizable. See [Customize installation](#customize-installation) section for more information. ### Prerequisites In this section, we demonstrate how to prepare an environment with PyTorch. -MMEditing works on Linux, Windows, and macOS. It requires: +MMagic works on Linux, Windows, and macOS. It requires: - Python >= 3.6 - [PyTorch](https://pytorch.org/) >= 1.5 @@ -35,8 +35,8 @@ Download and install Miniconda from [official website](https://docs.conda.io/en/ Create a [conda environment](https://docs.conda.io/projects/conda/en/latest/user-guide/concepts/environments.html#) and activate it ```shell -conda create --name mmedit python=3.8 -y -conda activate mmedit +conda create --name mmagic python=3.8 -y +conda activate mmagic ``` **Step 2.** @@ -69,12 +69,12 @@ mim install 'mmcv>=2.0.0' pip install git+https://github.com/open-mmlab/mmengine.git ``` -**Step 2.** Install MMEditing. -Install [MMEditing](https://github.com/open-mmlab/mmediting) from the source code. +**Step 2.** Install MMagic. +Install [MMagic](https://github.com/open-mmlab/mmagic) from the source code. ```shell -git clone https://github.com/open-mmlab/mmediting.git -cd mmediting +git clone https://github.com/open-mmlab/mmagic.git +cd mmagic pip3 install -e . -v ``` @@ -83,7 +83,7 @@ Verification. ```shell cd ~ -python -c "import mmedit; print(mmedit.__version__)" +python -c "import mmagic; print(mmagic.__version__)" # Example output: 1.0.0rc1 ``` @@ -94,7 +94,7 @@ You may be curious about what `-e .` means when supplied with `pip install`. Here is the description: - `-e` means [editable mode](https://pip.pypa.io/en/latest/cli/pip_install/#cmdoption-e). - When `import mmedit`, modules under the cloned directory are imported. + When `import mmagic`, modules under the cloned directory are imported. If `pip install` without `-e`, pip will copy cloned codes to somewhere like `lib/python/site-package`. Consequently, modified code under the cloned directory takes no effect unless `pip install` again. Thus, `pip install` with `-e` is particularly convenient for developers. If some codes are modified, new codes will be imported next time without reinstallation. @@ -136,33 +136,33 @@ For example, the following command install mmcv-full built for PyTorch 1.10.x an pip install 'mmcv>=2.0.0' -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.10/index.html ``` -#### Using MMEditing with Docker +#### Using MMagic with Docker -We provide a [Dockerfile](https://github.com/open-mmlab/mmediting/blob/master/docker/Dockerfile) to build an image. +We provide a [Dockerfile](https://github.com/open-mmlab/mmagic/blob/main/docker/Dockerfile) to build an image. Ensure that your [docker version](https://docs.docker.com/engine/install/) >=19.03. ```shell # build an image with PyTorch 1.8, CUDA 11.1 # If you prefer other versions, just modified the Dockerfile -docker build -t mmediting docker/ +docker build -t mmagic docker/ ``` Run it with ```shell -docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmediting/data mmediting +docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmagic/data mmagic ``` #### Trouble shooting 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. +You may [open an issue](https://github.com/open-mmlab/mmagic/issues/new/choose) on GitHub if no solution is found. -### Developing with multiple MMEditing versions +### Developing with multiple MMagic versions -The train and test scripts already modify the `PYTHONPATH` to ensure the script uses the `MMEditing` in the current directory. +The train and test scripts already modify the `PYTHONPATH` to ensure the script uses the `MMagic` in the current directory. -To use the default MMEditing installed in the environment rather than that you are working with, you can remove the following line in those scripts +To use the default MMagic installed in the environment rather than that you are working with, you can remove the following line in those scripts ```shell PYTHONPATH="$(dirname $0)/..":$PYTHONPATH diff --git a/docs/en/get_started/overview.md b/docs/en/get_started/overview.md index 62af697b74..1dd2599e8a 100644 --- a/docs/en/get_started/overview.md +++ b/docs/en/get_started/overview.md @@ -1,20 +1,20 @@ # Overview -Welcome to MMEditing! In this section, you will know about +Welcome to MMagic! In this section, you will know about -- [What is MMEditing?](#what-is-mmediting) -- [Why should I use MMEditing?](#why-should-i-use-mmediting) +- [What is MMagic?](#what-is-mmagic) +- [Why should I use MMagic?](#why-should-i-use-mmagic) - [Get started](#get-started) - [User guides](#user-guides) - [Advanced guides](#advanced-guides) -## What is MMEditing? +## What is MMagic? -MMEditing is an open-source toolbox for professional AI researchers and machine learning engineers to explore image and video processing, editing and synthesis. +MMagic is an open-source toolbox for professional AI researchers and machine learning engineers to explore image and video processing, editing and synthesis. -MMEditing allows researchers and engineers to use pre-trained state-of-the-art models, train and develop new customized models easily. +MMagic allows researchers and engineers to use pre-trained state-of-the-art models, train and develop new customized models easily. -MMEditing supports various foundamental generative models, including: +MMagic supports various foundamental generative models, including: - Unconditional Generative Adversarial Networks (GANs) - Conditional Generative Adversarial Networks (GANs) @@ -22,7 +22,7 @@ MMEditing supports various foundamental generative models, including: - Diffusion Models - And many other generative models are coming soon! -MMEditing supports various applications, including: +MMagic supports various applications, including: - Image super-resolution - Video super-resolution @@ -66,15 +66,15 @@ MMEditing supports various applications, including:
    -## Why should I use MMEditing? +## Why should I use MMagic? - **State of the Art** - MMEditing provides state-of-the-art generative models to process, edit and synthesize images and videos. + MMagic provides state-of-the-art generative models to process, edit and synthesize images and videos. - **Powerful and Popular Applications** - MMEditing supports popular and contemporary *inpainting*, *matting*, *super-resolution* and *generation* applications. Specifically, MMEditing supports GAN interpolation, GAN projection, GAN manipulations and many other popular GAN's applications. It's time to play with your GANs! + MMagic supports popular and contemporary *inpainting*, *matting*, *super-resolution* and *generation* applications. Specifically, MMagic supports GAN interpolation, GAN projection, GAN manipulations and many other popular GAN's applications. It's time to play with your GANs! - **New Modular Design for Flexible Combination:** @@ -90,12 +90,12 @@ 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/config.md). +For beginners, we suggest learning the basic usage of MMagic 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/evaluator.md). +For users who are familiar with MMagic, you may want to learn the design of MMagic, 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). +For users who want to use MMagic 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 cd223cfcac..f7a05339ed 100644 --- a/docs/en/get_started/quick_run.md +++ b/docs/en/get_started/quick_run.md @@ -1,11 +1,11 @@ # Quick run -After installing MMEditing successfully, now you are able to play with MMEditing! +After installing MMagic successfully, now you are able to play with MMagic! -To synthesize an image of a church, you only need several lines of codes by MMEditing! +To synthesize an image of a church, you only need several lines of codes by MMagic! ```python -from mmedit.apis import init_model, sample_unconditional_model +from mmagic.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. @@ -29,12 +29,12 @@ https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ch 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! +you only need several lines of codes for image super-resolution by MMagic! ```python import mmcv -from mmedit.apis import init_model, restoration_inference -from mmedit.utils import tensor2img +from mmagic.apis import init_model, restoration_inference +from mmagic.utils 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' diff --git a/docs/en/howto/dataset.md b/docs/en/howto/dataset.md index 49e4e9f646..aac580ab7e 100644 --- a/docs/en/howto/dataset.md +++ b/docs/en/howto/dataset.md @@ -1,6 +1,6 @@ # 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. +In this document, we will introduce the design of each datasets in MMagic and how users can design their own dataset. - [Prepare Your Own Datasets](#prepare-your-own-datasets) - [Supported Data Format](#supported-data-format) @@ -16,7 +16,7 @@ In this document, we will introduce the design of each datasets in MMEditing and ## Supported Data Format -In MMEditing, all datasets are inherited from `BaseDataset`. +In MMagic, all datasets are inherited from `BaseDataset`. Each dataset load the list of data info (e.g., data path) by `load_data_list`. In `__getitem__`, `prepare_data` is called to get the preprocessed data. In `prepare_data`, data loading pipeline consists of the following steps: @@ -26,7 +26,7 @@ In `prepare_data`, data loading pipeline consists of the following steps: ### BasicImageDataset -**BasicImageDataset** `mmedit.datasets.BasicImageDataset` +**BasicImageDataset** `mmagic.datasets.BasicImageDataset` General image dataset designed for low-level vision tasks with image, such as image super-resolution, inpainting and unconditional image generation. The annotation file is optional. If use annotation file, the annotation format can be shown as follows. @@ -54,8 +54,8 @@ If use annotation file, the annotation format can be shown as follows. Here we give several examples showing how to use `BasicImageDataset`. Assume the file structure as the following: ```md -mmediting (root) -├── mmedit +mmagic (root) +├── mmagic ├── tools ├── configs ├── data @@ -121,7 +121,7 @@ dataset = BasicImageDataset( ### BasicFramesDataset -**BasicFramesDataset** `mmedit.datasets.BasicFramesDataset` +**BasicFramesDataset** `mmagic.datasets.BasicFramesDataset` General frames dataset designed for low-level vision tasks with frames, such as video super-resolution and video frame interpolation. The annotation file is optional. If use annotation file, the annotation format can be shown as follows. @@ -148,8 +148,8 @@ Case 3 (Vimeo90k): Assume the file structure as the following: ```bash -mmediting (root) -├── mmedit +mmagic (root) +├── mmagic ├── tools ├── configs ├── data @@ -200,7 +200,7 @@ dataset = BasicFramesDataset( ### 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: +**BasicConditonalDataset** `mmagic.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) @@ -302,7 +302,7 @@ If the annotation file is specified, the dataset will be generated by the first ### 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. +**ImageNet Dataset**`mmagic.datasets.ImageNet` and **CIFAR10 Dataset**`mmagic.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: @@ -338,7 +338,7 @@ dataset = dict( ### AdobeComp1kDataset -**AdobeComp1kDataset** `mmedit.datasets.AdobeComp1kDataset` +**AdobeComp1kDataset** `mmagic.datasets.AdobeComp1kDataset` Adobe composition-1k dataset. The dataset loads (alpha, fg, bg) data and apply specified transforms to @@ -514,7 +514,7 @@ def prepare_test_data(self, idx): If you want to create a dataset for a new low level CV task (e.g. denoise, derain, defog, and de-reflection) or existing dataset format doesn't meet your need, you can reorganize new data formats to existing format. -Or create a new dataset in `mmedit/datasets` to load the data. +Or create a new dataset in `mmagic/datasets` to load the data. Inheriting from the base class of datasets such as `BasicImageDataset` and `BasicFramesDataset` will make it easier to create a new dataset. @@ -524,7 +524,7 @@ Here is an example of creating a dataset for video frame interpolation: ```python from .basic_frames_dataset import BasicFramesDataset -from mmedit.registry import DATASETS +from mmagic.registry import DATASETS @DATASETS.register_module() @@ -559,7 +559,7 @@ class NewVFIDataset(BasicFramesDataset): ``` -Welcome to [submit new dataset classes to MMEditing](https://github.com/open-mmlab/mmediting/compare). +Welcome to [submit new dataset classes to MMagic](https://github.com/open-mmlab/mmagic/compare). ### Repeat dataset diff --git a/docs/en/howto/losses.md b/docs/en/howto/losses.md index 7efa3e07d4..518a9ba355 100644 --- a/docs/en/howto/losses.md +++ b/docs/en/howto/losses.md @@ -1,8 +1,8 @@ # How to design your own loss functions -`losses` are registered as `LOSSES` in `MMEditing`. +`losses` are registered as `LOSSES` in `MMagic`. Customizing losses is similar to customizing any other model. -This section is mainly for clarifying the design of loss modules in MMEditing. +This section is mainly for clarifying the design of loss modules in MMagic. Importantly, when writing your own loss modules, you should follow the same design, so that the new loss module can be adopted in our framework without extra effort. @@ -55,10 +55,10 @@ def mse_loss(pred, target): class MSELoss(nn.Module): def __init__(self, loss_weight=1.0, reduction='mean', sample_wise=False): - # codes can be found in ``mmedit/models/losses/pixelwise_loss.py`` + # codes can be found in ``mmagic/models/losses/pixelwise_loss.py`` def forward(self, pred, target, weight=None, **kwargs): - # codes can be found in ``mmedit/models/losses/pixelwise_loss.py`` + # codes can be found in ``mmagic/models/losses/pixelwise_loss.py`` ``` Given the definition of the loss, we can now use the loss by simply defining it in the configuration file: @@ -67,12 +67,12 @@ Given the definition of the loss, we can now use the loss by simply defining it pixel_loss=dict(type='MSELoss', loss_weight=1.0, reduction='mean') ``` -Note that `pixel_loss` above must be defined in the model. Please refer to `customize_models` for more details. Similar to model customization, in order to use your customized loss, you need to import the loss in `mmedit/models/losses/__init__.py` after writing it. +Note that `pixel_loss` above must be defined in the model. Please refer to `customize_models` for more details. Similar to model customization, in order to use your customized loss, you need to import the loss in `mmagic/models/losses/__init__.py` after writing it. ### An example of DiscShiftLoss In general, to implement a loss module, we will write a function implementation and then wrap it with a class implementation. -However, in `MMEditing`, we provide another unified interface `data_info` for users to define the mapping between the input argument and data items. +However, in `MMagic`, we provide another unified interface `data_info` for users to define the mapping between the input argument and data items. ```python @weighted_loss @@ -84,10 +84,10 @@ class DiscShiftLoss(nn.Module): def __init__(self, loss_weight=1.0, data_info=None): super(DiscShiftLoss, self).__init__() - # codes can be found in ``mmedit/models/losses/disc_auxiliary_loss.py`` + # codes can be found in ``mmagic/models/losses/disc_auxiliary_loss.py`` def forward(self, *args, **kwargs): - # codes can be found in ``mmedit/models/losses/disc_auxiliary_loss.py`` + # codes can be found in ``mmagic/models/losses/disc_auxiliary_loss.py`` ``` The goal of this design for loss modules is to allow for using it automatically in the generative models (`MODELS`), without other complex codes to define the mapping between data and keyword arguments. Thus, different from other frameworks in `OpenMMLab`, our loss modules contain a special keyword, `data_info`, which is a dictionary defining the mapping between the input arguments and data from the generative models. Taking the `DiscShiftLoss` as an example, when writing the config file, users may use this loss as follows: @@ -250,7 +250,7 @@ We list available losses with examples in configs as follows. vanilla gan loss - mmedit.models.GANLoss + mmagic.models.GANLoss ```python @@ -268,14 +268,14 @@ loss_gan=dict( lsgan loss - mmedit.models.GANLoss + mmagic.models.GANLoss wgan loss - mmedit.models.GANLoss + mmagic.models.GANLoss ```python @@ -292,7 +292,7 @@ loss_gan=dict( hinge loss - mmedit.models.GANLoss + mmagic.models.GANLoss ```python @@ -309,7 +309,7 @@ loss_gan=dict( smgan loss - mmedit.models.GANLoss + mmagic.models.GANLoss ```python @@ -326,7 +326,7 @@ loss_gan=dict( gradient penalty - mmedit.models.GradientPenaltyLoss + mmagic.models.GradientPenaltyLoss ```python @@ -339,7 +339,7 @@ loss_gp=dict(type='GradientPenaltyLoss', loss_weight=10.) discriminator shift loss - mmedit.models.DiscShiftLoss + mmagic.models.DiscShiftLoss ```python @@ -353,25 +353,25 @@ loss_disc_shift=dict(type='DiscShiftLoss', loss_weight=0.001) clip loss - mmedit.models.CLIPLoss + mmagic.models.CLIPLoss L1 composition loss - mmedit.models.L1CompositionLoss + mmagic.models.L1CompositionLoss MSE composition loss - mmedit.models.MSECompositionLoss + mmagic.models.MSECompositionLoss charbonnier composition loss - mmedit.models.CharbonnierCompLoss + mmagic.models.CharbonnierCompLoss ```python @@ -384,13 +384,13 @@ loss_comp=dict(type='CharbonnierCompLoss', loss_weight=0.5) face id Loss - mmedit.models.FaceIdLoss + mmagic.models.FaceIdLoss light cnn feature loss - mmedit.models.LightCNNFeatureLoss + mmagic.models.LightCNNFeatureLoss ```python @@ -407,13 +407,13 @@ feature_loss=dict( gradient loss - mmedit.models.GradientLoss + mmagic.models.GradientLoss l1 Loss - mmedit.models.L1Loss + mmagic.models.L1Loss ```python @@ -426,7 +426,7 @@ pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean') mse loss - mmedit.models.MSELoss + mmagic.models.MSELoss ```python @@ -439,7 +439,7 @@ align_loss=dict(type='MSELoss', loss_weight=0.1, reduction='mean') charbonnier loss - mmedit.models.CharbonnierLoss + mmagic.models.CharbonnierLoss ```python @@ -452,7 +452,7 @@ loss_alpha=dict(type='CharbonnierLoss', loss_weight=0.5) masked total variation loss - mmedit.models.MaskedTVLoss + mmagic.models.MaskedTVLoss ```python @@ -469,7 +469,7 @@ loss_tv=dict( perceptual loss - mmedit.models.PerceptualLoss + mmagic.models.PerceptualLoss ```python @@ -495,7 +495,7 @@ perceptual_loss=dict( transferal perceptual loss - mmedit.models.TransferalPerceptualLoss + mmagic.models.TransferalPerceptualLoss ```python @@ -519,10 +519,10 @@ For `GANWithCustomizedLoss`, we provide several components to build customized l | 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 | +| clip loss component | mmagic.models.CLIPLossComps | +| discriminator shift loss component | mmagic.models. DiscShiftLossComps | +| gradient penalty loss component | mmagic.models. GradientPenaltyLossComps | +| r1 gradient penalty component | mmagic.models. R1GradientPenaltyComps | +| face Id loss component | mmagic.models. FaceIdLossComps | +| gan loss component | mmagic.models. GANLossComps | +| generator path regularizer component | mmagic.models.GeneratorPathRegularizerComps | diff --git a/docs/en/howto/models.md b/docs/en/howto/models.md index 79cd504cf7..0a285c7620 100644 --- a/docs/en/howto/models.md +++ b/docs/en/howto/models.md @@ -1,11 +1,11 @@ # 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. +MMagic 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. The structure of this guide are as follows: -- [Overview of models in MMEditing](#overview-of-models-in-mmediting) +- [Overview of models in MMagic](#overview-of-models-in-mmagic) - [An example of SRCNN](#an-example-of-srcnn) - [Define the network of SRCNN](#step-1-define-the-network-of-srcnn) - [Define the model of SRCNN](#step-2-define-the-model-of-srcnn) @@ -16,23 +16,23 @@ The structure of this guide are as follows: - [Start training DCGAN](#step-3-start-training-dcgan) - [References](#references) -## Overview of models in MMEditing +## Overview of models in MMagic -In MMEditing, one algorithm can be splited two compents: **Model** and **Module**. +In MMagic, one algorithm can be splited two compents: **Model** and **Module**. -- **Model** are topmost wrappers and always inherint from `BaseModel` provided in MMEngine. **Model** is responsible to network forward, loss calculation and backward, parameters updating, etc. In MMEditing, **Model** should be registered as `MODELS`. -- **Module** includes the neural network **architectures** to train or inference, pre-defined **loss classes**, and **data preprocessors** to preprocess the input data batch. **Module** always present as elements of **Model**. In MMEditing, **Module** should be registered as **MODULES**. +- **Model** are topmost wrappers and always inherint from `BaseModel` provided in MMEngine. **Model** is responsible to network forward, loss calculation and backward, parameters updating, etc. In MMagic, **Model** should be registered as `MODELS`. +- **Module** includes the neural network **architectures** to train or inference, pre-defined **loss classes**, and **data preprocessors** to preprocess the input data batch. **Module** always present as elements of **Model**. In MMagic, **Module** should be registered as **MODULES**. -Take DCGAN model as an example, [generator](https://github.com/open-mmlab/mmediting/blob/main/mmedit/models/editors/dcgan/dcgan_generator.py) and [discriminator](https://github.com/open-mmlab/mmediting/blob/main/mmedit/models/editors/dcgan/dcgan_discriminator.py) are the **Module**, which generate images and discriminate real or fake images. [`DCGAN`](https://github.com/open-mmlab/mmediting/blob/main/mmedit/models/editors/dcgan/dcgan.py) is the **Model**, which take data from dataloader and train generator and discriminator alternatively. +Take DCGAN model as an example, [generator](https://github.com/open-mmlab/mmagic/blob/main/mmagic/models/editors/dcgan/dcgan_generator.py) and [discriminator](https://github.com/open-mmlab/mmagic/blob/main/mmagic/models/editors/dcgan/dcgan_discriminator.py) are the **Module**, which generate images and discriminate real or fake images. [`DCGAN`](https://github.com/open-mmlab/mmagic/blob/main/mmagic/models/editors/dcgan/dcgan.py) is the **Model**, which take data from dataloader and train generator and discriminator alternatively. You can find the implementation of **Model** and **Module** by the following link. - **Model**: - - [Editors](https://github.com/open-mmlab/mmediting/tree/main/mmedit/models/editors) + - [Editors](https://github.com/open-mmlab/mmagic/tree/main/mmagic/models/editors) - **Module**: - - [Layers](https://github.com/open-mmlab/mmediting/tree/main/mmedit/models/layers) - - [Losses](https://github.com/open-mmlab/mmediting/tree/main/mmedit/models/losses) - - [Data Preprocessor](https://github.com/open-mmlab/mmediting/tree/main/mmedit/models/data_preprocessors) + - [Layers](https://github.com/open-mmlab/mmagic/tree/main/mmagic/models/layers) + - [Losses](https://github.com/open-mmlab/mmagic/tree/main/mmagic/models/losses) + - [Data Preprocessor](https://github.com/open-mmlab/mmagic/tree/main/mmagic/models/data_preprocessors) ## An example of SRCNN @@ -42,17 +42,17 @@ Here, we take the implementation of the classical image super-resolution model, SRCNN is the first deep learning method for single image super-resolution \[1\]. To implement the network architecture of SRCNN, -we need to create a new file `mmedit/models/editors/srgan/sr_resnet.py` and implement `class MSRResNet`. +we need to create a new file `mmagic/models/editors/srgan/sr_resnet.py` and implement `class MSRResNet`. In this step, we implement `class MSRResNet` by inheriting from `mmengine.models.BaseModule` and define the network architecture in `__init__` function. -In particular, we need to use `@MODELS.register_module()` to add the implementation of `class MSRResNet` into the registration of MMEditing. +In particular, we need to use `@MODELS.register_module()` to add the implementation of `class MSRResNet` into the registration of MMagic. ```python import torch.nn as nn from mmengine.model import BaseModule -from mmedit.registry import MODELS +from mmagic.registry import MODELS -from mmedit.models.utils import (PixelShufflePack, ResidualBlockNoBN, +from mmagic.models.utils import (PixelShufflePack, ResidualBlockNoBN, default_init_weights, make_layer) @@ -172,7 +172,7 @@ Then, we implement the `forward` function of `class MSRResNet`, which takes as return out ``` -After the implementation of `class MSRResNet`, we need to update the model list in `mmedit/models/editors/__init__.py`, so that we can import and use `class MSRResNet` by `mmedit.models.editors`. +After the implementation of `class MSRResNet`, we need to update the model list in `mmagic/models/editors/__init__.py`, so that we can import and use `class MSRResNet` by `mmagic.models.editors`. ```python from .srgan.sr_resnet import MSRResNet @@ -184,7 +184,7 @@ After the implementation of the network architecture, we need to define our model `class BaseEditModel` and implement the forward loop of `class BaseEditModel`. To implement `class BaseEditModel`, -we create a new file `mmedit/models/base_models/base_edit_model.py`. +we create a new file `mmagic/models/base_models/base_edit_model.py`. Specifically, `class BaseEditModel` inherits from `mmengine.model.BaseModel`. In the `__init__` function, we define the loss functions, training and testing configurations, networks of `class BaseEditModel`. @@ -194,8 +194,8 @@ from typing import List, Optional import torch from mmengine.model import BaseModel -from mmedit.registry import MODELS -from mmedit.structures import EditDataSample +from mmagic.registry import MODELS +from mmagic.structures import EditDataSample @MODELS.register_module() @@ -393,8 +393,8 @@ In `forward_train`, `class BaseEditModel` calculate the loss function and return ``` After the implementation of `class BaseEditModel`, -we need to update the model list in `mmedit/models/__init__.py`, -so that we can import and use `class BaseEditModel` by `mmedit.models`. +we need to update the model list in `mmagic/models/__init__.py`, +so that we can import and use `class BaseEditModel` by `mmagic.models`. ```python from .base_models.base_edit_model import BaseEditModel @@ -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](./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 MMagic](./losses.md) for more details of losses in MMagic. ```python # model settings @@ -438,10 +438,10 @@ Here, we take the implementation of the classical gan model, DCGAN \[2\], as an ### Step 1: Define the network of DCGAN -DCGAN is a classical image generative adversarial network \[2\]. To implement the network architecture of DCGAN, we need to create tow new files `mmedit/models/editors/dcgan/dcgan_generator.py` and `mmedit/models/editors/dcgan/dcgan_discriminator.py`, and implement generator (`class DCGANGenerator`) and discriminator (`class DCGANDiscriminator`). +DCGAN is a classical image generative adversarial network \[2\]. To implement the network architecture of DCGAN, we need to create tow new files `mmagic/models/editors/dcgan/dcgan_generator.py` and `mmagic/models/editors/dcgan/dcgan_discriminator.py`, and implement generator (`class DCGANGenerator`) and discriminator (`class DCGANDiscriminator`). In this step, we implement `class DCGANGenerator`, `class DCGANDiscriminator` and define the network architecture in `__init__` function. -In particular, we need to use `@MODULES.register_module()` to add the generator and discriminator into the registration of MMEditing. +In particular, we need to use `@MODULES.register_module()` to add the generator and discriminator into the registration of MMagic. Take the following code as example: @@ -453,7 +453,7 @@ from mmcv.utils.parrots_wrapper import _BatchNorm from mmengine.logging import MMLogger from mmengine.model.utils import normal_init -from mmedit.models.builder import MODULES +from mmagic.models.builder import MODULES from ..common import get_module_device @@ -550,9 +550,9 @@ If you want to implement specific weights initialization method for you network, f' got {type(pretrained)} instead.') ``` -After the implementation of class `DCGANGenerator`, we need to update the model list in `mmedit/models/editors/__init__.py`, so that we can import and use class `DCGANGenerator` by `mmedit.models.editors`. +After the implementation of class `DCGANGenerator`, we need to update the model list in `mmagic/models/editors/__init__.py`, so that we can import and use class `DCGANGenerator` by `mmagic.models.editors`. -Implementation of Class `DCGANDiscriminator` follows the similar logic, and you can find the implementation [here](https://github.com/open-mmlab/mmediting/blob/main/mmedit/models/editors/dcgan/dcgan_discriminator.py). +Implementation of Class `DCGANDiscriminator` follows the similar logic, and you can find the implementation [here](https://github.com/open-mmlab/mmagic/blob/main/mmagic/models/editors/dcgan/dcgan_discriminator.py). ### Step 2: Design the model of DCGAN @@ -561,14 +561,14 @@ After the implementation of the network **Module**, we need to define our **Mode Your **Model** should inherit from [`BaseModel`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/model/base_model/base_model.py#L16) provided by MMEngine and implement three functions, `train_step`, `val_step` and `test_step`. - `train_step`: This function is responsible to update the parameters of the network and called by MMEngine's Loop ([`IterBasedTrainLoop`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py#L183) or [`EpochBasedTrainLoop`](https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py#L18)). `train_step` take data batch and [`OptimWrapper`](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/optim_wrapper.md) as input and return a dict of log. -- `val_step`: This function is responsible for getting output for validation during the training process. and is called by [`GenValLoop`](https://github.com/open-mmlab/mmediting/blob/main/mmedit/engine/runner/loops.py#L12). -- `test_step`: This function is responsible for getting output in test process and is called by [`GenTestLoop`](https://github.com/open-mmlab/mmediting/blob/main/mmedit/engine/runner/loops.py#L95). +- `val_step`: This function is responsible for getting output for validation during the training process. and is called by [`GenValLoop`](https://github.com/open-mmlab/mmagic/blob/main/mmagic/engine/runner/loops.py#L12). +- `test_step`: This function is responsible for getting output in test process and is called by [`GenTestLoop`](https://github.com/open-mmlab/mmagic/blob/main/mmagic/engine/runner/loops.py#L95). -> Note that, in `train_step`, `val_step` and `test_step`, `DataPreprocessor` is called to preprocess the input data batch before feed them to the neural network. To know more about `DataPreprocessor` please refer to this [file](https://github.com/open-mmlab/mmediting/blob/main/mmedit/models/data_preprocessors/gen_preprocessor.py) and this [tutorial](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/tutorials/model.md#%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E5%99%A8datapreprocessor). +> Note that, in `train_step`, `val_step` and `test_step`, `DataPreprocessor` is called to preprocess the input data batch before feed them to the neural network. To know more about `DataPreprocessor` please refer to this [file](https://github.com/open-mmlab/mmagic/blob/main/mmagic/models/data_preprocessors/gen_preprocessor.py) and this [tutorial](https://github.com/open-mmlab/mmengine/blob/main/docs/zh_cn/tutorials/model.md#%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E5%99%A8datapreprocessor). -For simplify using, we provide [`BaseGAN`](https://github.com/open-mmlab/mmediting/blob/main/mmedit/models/base_models/base_gan.py) class in MMEditing, which implements generic `train_step`, `val_step` and `test_step` function for GAN models. With `BaseGAN` as base class, each specific GAN algorithm only need to implement `train_generator` and `train_discriminator`. +For simplify using, we provide [`BaseGAN`](https://github.com/open-mmlab/mmagic/blob/main/mmagic/models/base_models/base_gan.py) class in MMagic, which implements generic `train_step`, `val_step` and `test_step` function for GAN models. With `BaseGAN` as base class, each specific GAN algorithm only need to implement `train_generator` and `train_discriminator`. -In `train_step`, we support data preprocessing, gradient accumulation (realized by [`OptimWrapper`](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/optim_wrapper.md)) and expontial moving averate (EMA) realized by [(`ExponentialMovingAverage`)](https://github.com/open-mmlab/mmediting/blob/main/mmedit/models/base_models/average_model.py#L19). With `BaseGAN.train_step`, each specific GAN algorithm only need to implement `train_generator` and `train_discriminator`. +In `train_step`, we support data preprocessing, gradient accumulation (realized by [`OptimWrapper`](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/optim_wrapper.md)) and expontial moving averate (EMA) realized by [(`ExponentialMovingAverage`)](https://github.com/open-mmlab/mmagic/blob/main/mmagic/models/base_models/average_model.py#L19). With `BaseGAN.train_step`, each specific GAN algorithm only need to implement `train_generator` and `train_discriminator`. ```python def train_step(self, data: dict, @@ -652,7 +652,7 @@ import torch.nn.functional as F from mmengine.optim import OptimWrapper from torch import Tensor -from mmedit.registry import MODELS +from mmagic.registry import MODELS from .base_gan import BaseGAN @@ -709,7 +709,7 @@ class DCGAN(BaseGAN): return log_vars ``` -After the implementation of `class DCGAN`, we need to update the model list in `mmedit/models/__init__.py`, so that we can import and use `class DCGAN` by `mmedit.models`. +After the implementation of `class DCGAN`, we need to update the model list in `mmagic/models/__init__.py`, so that we can import and use `class DCGAN` by `mmagic.models`. ### Step 3: Start training DCGAN diff --git a/docs/en/howto/transforms.md b/docs/en/howto/transforms.md index fbcfcdc900..9e2306e83a 100644 --- a/docs/en/howto/transforms.md +++ b/docs/en/howto/transforms.md @@ -1,15 +1,15 @@ # How to design your own data transforms -In this tutorial, we introduce the design of transforms pipeline in MMEditing. +In this tutorial, we introduce the design of transforms pipeline in MMagic. The structure of this guide are as follows: - [Design Your Own Data Pipelines](#design-your-own-data-pipelines) - - [Data pipelines in MMEditing](#data-pipelines-in-mmediting) + - [Data pipelines in MMagic](#data-pipelines-in-mmagic) - [A simple example of data transform](#a-simple-example-of-data-transform) - [An example of BasicVSR](#an-example-of-basicvsr) - [An example of Pix2Pix](#an-example-of-pix2pix) - - [Supported transforms in MMEditing](#supported-transforms-in-mmediting) + - [Supported transforms in MMagic](#supported-transforms-in-mmagic) - [Data loading](#data-loading) - [Pre-processing](#pre-processing) - [Formatting](#formatting) @@ -17,7 +17,7 @@ The structure of this guide are as follows: - [A simple example of MyTransform](#a-simple-example-of-mytransform) - [An example of flipping](#an-example-of-flipping) -## Data pipelines in MMEditing +## Data pipelines in MMagic Following typical conventions, we use `Dataset` and `DataLoader` for data loading with multiple workers. `Dataset` returns a dict of data items corresponding the arguments of models' forward method. @@ -27,13 +27,13 @@ A pipeline consists of a sequence of operations. Each operation takes a dict as The operations are categorized into data loading, pre-processing, and formatting -In MMEditing, all data transformations are inherited from `BaseTransform`. +In MMagic, all data transformations are inherited from `BaseTransform`. The input and output types of transformations are both dict. ### A simple example of data transform ```python ->>> from mmedit.transforms import LoadPairedImageFromFile +>>> from mmagic.transforms import LoadPairedImageFromFile >>> transforms = LoadPairedImageFromFile( >>> key='pair', >>> domain_a='horse', @@ -112,9 +112,9 @@ pipeline = [ share_random_params=True, transforms=[ dict( - type='mmedit.Resize', scale=(286, 286), + type='mmagic.Resize', scale=(286, 286), interpolation='bicubic'), - dict(type='mmedit.FixedCrop', crop_size=(256, 256)) + dict(type='mmagic.FixedCrop', crop_size=(256, 256)) ]), dict( type='Flip', @@ -125,7 +125,7 @@ pipeline = [ keys=[f'img_{domain_a}', f'img_{domain_b}', 'pair']) ``` -## Supported transforms in MMEditing +## Supported transforms in MMagic ### Data loading @@ -549,7 +549,7 @@ pipeline = [ ```python import random from mmcv.transforms import BaseTransform -from mmedit.registry import TRANSFORMS +from mmagic.registry import TRANSFORMS @TRANSFORMS.register_module() diff --git a/docs/en/index.rst b/docs/en/index.rst index 827dc43584..040e98312f 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -1,14 +1,14 @@ -Welcome to MMEditing's documentation! +Welcome to MMagic's documentation! ===================================== Languages: -`English `_ +`English `_ | -`简体中文 `_ +`简体中文 `_ -MMEditing is an open-source toolbox for image and video processing, editing and synthesis. +MMagic is an open-source toolbox for image and video processing, editing and synthesis. -MMEditing supports various foundamental generative models, including: +MMagic supports various foundamental generative models, including: * Unconditional Generative Adversarial Networks (GANs) * Conditional Generative Adversarial Networks (GANs) @@ -17,7 +17,7 @@ MMEditing supports various foundamental generative models, including: * And many other generative models are coming soon! -MMEditing supports various applications, including: +MMagic supports various applications, including: * Image super-resolution * Video super-resolution @@ -27,8 +27,8 @@ MMEditing supports various applications, including: * Image-to-image translation * And many other applications are coming soon! -MMEditing is based on `PyTorch `_ and is a part of the `OpenMMLab project `_. -Codes are available on `GitHub `_. +MMagic is based on `PyTorch `_ and is a part of the `OpenMMLab project `_. +Codes are available on `GitHub `_. Documentation diff --git a/docs/en/switch_language.md b/docs/en/switch_language.md index 4b4ffc7c9b..1396b11ae8 100644 --- a/docs/en/switch_language.md +++ b/docs/en/switch_language.md @@ -1,3 +1,3 @@ -# English +# English -# 简体中文 +# 简体中文 diff --git a/docs/en/user_guides/config.md b/docs/en/user_guides/config.md index 43608a452d..b3c7a3e019 100644 --- a/docs/en/user_guides/config.md +++ b/docs/en/user_guides/config.md @@ -1,4 +1,4 @@ -# Tutorial 1: Learn about Configs in MMEditing +# Tutorial 1: Learn about Configs in MMagic We incorporate modular and inheritance design into our config system, which is convenient to conduct various experiments. 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. @@ -77,13 +77,13 @@ Please refer to [MMEngine](https://github.com/open-mmlab/mmengine/blob/main/docs ## An example of EDSR To help the users have a basic idea of a complete config, -we make a brief comments on the [config of the EDSR model](https://github.com/open-mmlab/mmediting/blob/main/configs/edsr/edsr_x2c64b16_g1_300k_div2k.py) we implemented as the following. +we make a brief comments on the [config of the EDSR model](https://github.com/open-mmlab/mmagic/blob/main/configs/edsr/edsr_x2c64b16_g1_300k_div2k.py) we implemented as the following. For more detailed usage and the corresponding alternative for each modules, please refer to the API documentation and the [tutorial in MMEngine](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/config.md). ### Model config -In MMEditing's config, we use model fields to set up a model. +In MMagic's config, we use model fields to set up a model. ```python model = dict( @@ -271,7 +271,7 @@ custom_hooks = [dict(type='BasicVisualizationHook', interval=1)] # Config of vis ### Runtime config ```python -default_scope = 'mmedit' # Used to set registries location +default_scope = 'mmagic' # Used to set registries location env_cfg = dict( # Parameters to setup distributed training, the port can also be set cudnn_benchmark=False, mp_cfg=dict(mp_start_method='fork', opencv_num_threads=4), @@ -285,7 +285,7 @@ resume = False # Resume checkpoints from a given path, the training will be res ## An example of StyleGAN2 -Taking [Stylegan2 at 1024x1024 scale](https://github.com/open-mmlab/mmediting/blob/main/configs//styleganv2/stylegan2_c2_8xb4-fp16-global-800kiters_quicktest-ffhq-256x256.py) as an example, +Taking [Stylegan2 at 1024x1024 scale](https://github.com/open-mmlab/mmagic/blob/main/configs//styleganv2/stylegan2_c2_8xb4-fp16-global-800kiters_quicktest-ffhq-256x256.py) as an example, we introduce each field in the config according to different function modules. ### Model config @@ -416,7 +416,7 @@ optim_wrapper = dict( `param_scheduler` is a field that configures methods of adjusting optimization hyperparameters such as learning rate and momentum. Users can combine multiple schedulers to create a desired parameter adjustment strategy. Find more in [parameter scheduler tutorial](https://mmengine.readthedocs.io/en/latest/tutorials/param_scheduler.html). -Since StyleGAN2 do not use parameter scheduler, we use config in [CycleGAN](https://github.com/open-mmlab/mmediting/blob/main/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py) as an example: +Since StyleGAN2 do not use parameter scheduler, we use config in [CycleGAN](https://github.com/open-mmlab/mmagic/blob/main/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py) as an example: ```python # parameter scheduler in CycleGAN config @@ -465,7 +465,7 @@ custom_hooks = [ ### Runtime config ```python -default_scope = 'mmedit' # The default registry scope to find modules. Refer to https://mmengine.readthedocs.io/en/latest/tutorials/registry.html +default_scope = 'mmagic' # The default registry scope to find modules. Refer to https://mmengine.readthedocs.io/en/latest/tutorials/registry.html # config for environment env_cfg = dict( @@ -626,7 +626,7 @@ optim_wrapper = dict( # Config used to build optimizer, support all the optimize type='OptimWrapper', optimizer=dict(type='Adam', lr=0.0004)), disc=dict(type='OptimWrapper', optimizer=dict(type='Adam', lr=0.0004))) -default_scope = 'mmedit' # Used to set registries location +default_scope = 'mmagic' # Used to set registries location save_dir = './work_dirs' # Directory to save the model checkpoints and logs for the current experiments exp_name = 'gl_places' # The experiment name @@ -812,7 +812,7 @@ optim_wrapper = dict( ) ) # Config used to build optimizer, support all the optimizers in PyTorch whose arguments are also the same as those in PyTorch. -default_scope = 'mmedit' # Used to set registries location +default_scope = 'mmagic' # Used to set registries location save_dir = './work_dirs' # Directory to save the model checkpoints and logs for the current experiments. default_hooks = dict( # Used to build default hooks @@ -982,7 +982,7 @@ default_hooks = dict( # Used to build default hooks sampler_seed=dict(type='DistSamplerSeedHook'), ) -default_scope = 'mmedit' # Used to set registries location +default_scope = 'mmagic' # Used to set registries location save_dir = './work_dirs' # Directory to save the model checkpoints and logs for the current experiments. env_cfg = dict( # Parameters to setup distributed training, the port can also be set diff --git a/docs/en/user_guides/dataset_prepare.md b/docs/en/user_guides/dataset_prepare.md index b33c3f6640..c6e268fb2b 100644 --- a/docs/en/user_guides/dataset_prepare.md +++ b/docs/en/user_guides/dataset_prepare.md @@ -3,7 +3,7 @@ In this section, we will detail how to prepare data and adopt the proper dataset in our repo for different methods. We support multiple datasets of different tasks. -There are two ways to use datasets for training and testing models in MMEditing: +There are two ways to use datasets for training and testing models in MMagic: 1. Using downloaded datasets directly 2. Preprocessing downloaded datasets before using them. @@ -13,7 +13,7 @@ The structure of this guide is as follows: - [Tutorial 2: Prepare Datasets](#tutorial-2-prepare-datasets) - [Download datasets](#download-datasets) - [Prepare datasets](#prepare-datasets) - - [The overview of the datasets in MMEditing](#the-overview-of-the-datasets-in-mmediting) + - [The overview of the datasets in MMagic](#the-overview-of-the-datasets-in-mmagic) ## Download datasets @@ -23,17 +23,17 @@ For example, you can simply prepare Vimeo90K-triplet datasets by downloading dat ## Prepare datasets -Some datasets need to be preprocessed before training or testing. We support many scripts to prepare datasets in [tools/dataset_converters](https://github.com/open-mmlab/mmediting/tree/main/tools/dataset_converters). And you can follow the tutorials of every dataset to run scripts. +Some datasets need to be preprocessed before training or testing. We support many scripts to prepare datasets in [tools/dataset_converters](https://github.com/open-mmlab/mmagic/tree/main/tools/dataset_converters). And you can follow the tutorials of every dataset to run scripts. For example, we recommend cropping the DIV2K images to sub-images. We provide a script to prepare cropped DIV2K dataset. You can run the following command: ```shell python tools/dataset_converters/super-resolution/div2k/preprocess_div2k_dataset.py --data-root ./data/DIV2K ``` -## The overview of the datasets in MMEditing +## The overview of the datasets in MMagic We support detailed tutorials and split them according to 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). +If you're interested in more details of datasets in MMagic, 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 1b80a5eb55..77c2f63df4 100644 --- a/docs/en/user_guides/deploy.md +++ b/docs/en/user_guides/deploy.md @@ -1,7 +1,7 @@ -# Tutorial 8: Deploy models in MMEditing +# Tutorial 8: Deploy models in MMagic -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/latest/04-supported-codebases/mmedit.html). +The deployment of OpenMMLab codebases, including MMClassification, MMDetection, MMagic and so on are supported by [MMDeploy](https://github.com/open-mmlab/mmdeploy). +The latest deployment guide for MMagic can be found from [here](https://mmdeploy.readthedocs.io/en/latest/04-supported-codebases/mmagic.html). This tutorial is organized as follows: @@ -15,7 +15,7 @@ This tutorial is organized as follows: ## 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/latest/get_started.html#installation) guide. +Please follow the [guide](../get_started/install.md) to install mmagic. And then install mmdeploy from source by following [this](https://mmdeploy.readthedocs.io/en/latest/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. @@ -23,19 +23,19 @@ If you install mmdeploy prebuilt package, please also clone its repository by 'g ## Convert model -Suppose mmediting and mmdeploy repositories are in the same directory, and the working directory is the root path of mmediting. +Suppose MMagic and mmdeploy repositories are in the same directory, and the working directory is the root path of MMagic. 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: +You can download its checkpoint from [here](https://download.openmmlab.com/MMagic/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' +work_dir = 'mmdeploy_models/mmagic/onnx' save_file = 'end2end.onnx' -deploy_cfg = '../mmdeploy/configs/mmedit/super-resolution/super-resolution_onnxruntime_dynamic.py' +deploy_cfg = '../mmdeploy/configs/mmagic/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' @@ -48,13 +48,13 @@ torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg, 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/main/configs/mmedit) of all supported backends for mmedit, under which the config file path follows the pattern: +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/main/configs/mmagic) of all supported backends for mmagic, under which the config file path follows the pattern: ``` {task}/{task}_{backend}-{precision}_{static | dynamic}_{shape}.py ``` -- **{task}:** task in mmedit. +- **{task}:** task in mmagic. - **{backend}:** inference backend, such as onnxruntime, tensorrt, pplnn, ncnn, openvino, coreml etc. @@ -67,17 +67,17 @@ It is crucial to specify the correct deployment config during model conversion.M 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" +When converting mmagic 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: +The converted model locates in the working directory like `mmdeploy_models/mmagic/onnx` in the previous example. It includes: ``` -mmdeploy_models/mmedit/onnx +mmdeploy_models/mmagic/onnx ├── deploy.json ├── detail.json ├── end2end.onnx @@ -89,7 +89,7 @@ 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. +The whole package **mmdeploy_models/mmagic/onnx** is defined as **mmdeploy SDK model**, i.e., **mmdeploy SDK model** includes both backend model and inference meta information. ## Model inference @@ -102,10 +102,10 @@ 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' +deploy_cfg = '../mmdeploy/configs/mmagic/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'] +backend_model = ['mmdeploy_models/mmagic/onnx/end2end.onnx'] image = 'tests/data/image/lq/baboon_x4.png' # read deploy_cfg and model_cfg @@ -143,7 +143,7 @@ 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) +restorer = Restorer(model_path='mmdeploy_models/mmagic/onnx', device_name='cpu', device_id=0) # perform inference result = restorer(img) @@ -155,4 +155,4 @@ Besides python API, MMDeploy SDK also provides other FFI (Foreign Function Inter ## Supported models -Please refer to [here](https://mmdeploy.readthedocs.io/en/latest/04-supported-codebases/mmedit.html#supported-models) for the supported model list. +Please refer to [here](https://mmdeploy.readthedocs.io/en/latest/04-supported-codebases/mmagic.html#supported-models) for the supported model list. diff --git a/docs/en/user_guides/inference.md b/docs/en/user_guides/inference.md index c2a87f4df1..15b4e1c9df 100644 --- a/docs/en/user_guides/inference.md +++ b/docs/en/user_guides/inference.md @@ -1,9 +1,9 @@ # 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: +MMagic provides APIs for you to easily play with state-of-the-art models on your own images or videos. +Specifically, MMagic supports various fundamental generative models, including: unconditional Generative Adversarial Networks (GANs), conditional GANs, internal learning, diffusion models, etc. -MMEditing also supports various applications, including: +MMagic also supports various applications, including: image super-resolution, video super-resolution, video frame interpolation, image inpainting, image matting, image-to-image translation, etc. In this section, we will specify how to play with our pre-trained models. @@ -22,10 +22,10 @@ In this section, we will specify how to play with our pre-trained models. ## Sample images with unconditional GANs -MMEditing provides high-level APIs for sampling images with unconditional GANs. Here is an example of building StyleGAN2-256 and obtaining the synthesized images. +MMagic provides high-level APIs for sampling images with unconditional GANs. Here is an example of building StyleGAN2-256 and obtaining the synthesized images. ```python -from mmedit.apis import init_model, sample_unconditional_model +from mmagic.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' @@ -53,10 +53,10 @@ Note that more arguments are also offered to customize your sampling procedure. ## Sample images with conditional GANs -MMEditing provides high-level APIs for sampling images with conditional GANs. Here is an example for building SAGAN-128 and obtaining the synthesized images. +MMagic provides high-level APIs for sampling images with conditional GANs. Here is an example for building SAGAN-128 and obtaining the synthesized images. ```python -from mmedit.apis import init_model, sample_conditional_model +from mmagic.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' @@ -97,10 +97,10 @@ Note that more arguments are also offered to customizing your sampling procedure ## Sample images with diffusion models -MMEditing provides high-level APIs for sampling images with diffusion models. Here is an example for building I-DDPM and obtaining the synthesized images. +MMagic provides high-level APIs for sampling images with diffusion models. Here is an example for building I-DDPM and obtaining the synthesized images. ```python -from mmedit.apis import init_model, sample_ddpm_model +from mmagic.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' @@ -113,7 +113,7 @@ model = init_model(config_file, checkpoint_file, device=device) fake_imgs = sample_ddpm_model(model, 4) ``` -Indeed, we have already provided a more friendly demo script to users. You can use [demo/ddpm_demo.py](https://github.com/open-mmlab/mmediting/blob/main/demo/ddpm_demo.py) with the following commands: +Indeed, we have already provided a more friendly demo script to users. You can use [demo/ddpm_demo.py](https://github.com/open-mmlab/mmagic/blob/main/demo/ddpm_demo.py) with the following commands: ```shell python demo/ddpm_demo.py \ @@ -324,10 +324,10 @@ python demo/video_interpolation_demo.py \ ## Run a demo of image translation models -MMEditing provides high-level APIs for translating images by using image translation models. Here is an example of building Pix2Pix and obtaining the translated images. +MMagic provides high-level APIs for translating images by using image translation models. Here is an example of building Pix2Pix and obtaining the translated images. ```python -from mmedit.apis import init_model, sample_img2img_model +from mmagic.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' diff --git a/docs/en/user_guides/metrics.md b/docs/en/user_guides/metrics.md index 5e04a8e4a8..7100e4491c 100644 --- a/docs/en/user_guides/metrics.md +++ b/docs/en/user_guides/metrics.md @@ -1,8 +1,8 @@ -# Tutorial 5: Using metrics in MMEditing +# Tutorial 5: Using metrics in MMagic -MMEditing supports **17 metrics** to assess the quality of models. +MMagic supports **17 metrics** to assess the quality of models. -Please refer to [Train and Test in MMEditing](../user_guides/train_test.md) for usages. +Please refer to [Train and Test in MMagic](../user_guides/train_test.md) for usages. Here, we will specify the details of different metrics one by one. @@ -141,11 +141,11 @@ val_evaluator = [ Fréchet Inception Distance is a measure of similarity between two datasets of images. It was shown to correlate well with the human judgment of visual quality and is most often used to evaluate the quality of samples of Generative Adversarial Networks. FID is calculated by computing the Fréchet distance between two Gaussians fitted to feature representations of the Inception network. -In `MMEditing`, we provide two versions for FID calculation. One is the commonly used PyTorch version and the other one is used in StyleGAN paper. Meanwhile, we have compared the difference between these two implementations in the StyleGAN2-FFHQ1024 model (the details can be found [here](https://github.com/open-mmlab/mmediting/blob/main/configs/styleganv2/README.md)). Fortunately, there is a marginal difference in the final results. Thus, we recommend users adopt the more convenient PyTorch version. +In `MMagic`, we provide two versions for FID calculation. One is the commonly used PyTorch version and the other one is used in StyleGAN paper. Meanwhile, we have compared the difference between these two implementations in the StyleGAN2-FFHQ1024 model (the details can be found [here](https://github.com/open-mmlab/mmagic/blob/main/configs/styleganv2/README.md)). Fortunately, there is a marginal difference in the final results. Thus, we recommend users adopt the more convenient PyTorch version. **About PyTorch version and Tero's version:** The commonly used PyTorch version adopts the modified InceptionV3 network to extract features for real and fake images. However, Tero's FID requires a [script module](https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/inception-2015-12-05.pt) for Tensorflow InceptionV3. Note that applying this script module needs `PyTorch >= 1.6.0`. -**About extracting real inception data:** For the users' convenience, the real features will be automatically extracted at test time and saved locally, and the stored features will be automatically read at the next test. Specifically, we will calculate a hash value based on the parameters used to calculate the real features, and use the hash value to mark the feature file, and when testing, if the `inception_pkl` is not set, we will look for the feature in `MMEDIT_CACHE_DIR` (~/.cache/openmmlab/mmedit/). If cached inception pkl is not found, then extracting will be performed. +**About extracting real inception data:** For the users' convenience, the real features will be automatically extracted at test time and saved locally, and the stored features will be automatically read at the next test. Specifically, we will calculate a hash value based on the parameters used to calculate the real features, and use the hash value to mark the feature file, and when testing, if the `inception_pkl` is not set, we will look for the feature in `MMAGIC_CACHE_DIR` (~/.cache/openmmlab/mmagic/). If cached inception pkl is not found, then extracting will be performed. To use the FID metric, you should add the metric in a config file like this: @@ -160,7 +160,7 @@ metrics = [ ] ``` -If you work on an new machine, then you can copy the `pkl` files in `MMEDIT_CACHE_DIR` and copy them to new machine and set `inception_pkl` field. +If you work on an new machine, then you can copy the `pkl` files in `MMAGIC_CACHE_DIR` and copy them to new machine and set `inception_pkl` field. ```python metrics = [ @@ -208,17 +208,17 @@ We also perform a survey on the influence of data loading pipeline and the versi | :-------------------------------------------------------------: | :------------------: | :-----------------: | :-------------------------: | :-------------------: | | [OpenAI (baseline)](https://github.com/openai/improved-gan) | Tensorflow | Pillow | Pillow Bicubic | **312.255 +/- 4.970** | | [StyleGAN-Ada](https://github.com/NVlabs/stylegan2-ada-pytorch) | Tero's Script Model | Pillow | Pillow Bicubic | 311.895 +/ 4.844 | -| mmedit (Ours) | Pytorch Pretrained | cv2 | cv2 Bilinear | 322.932 +/- 2.317 | -| mmedit (Ours) | Pytorch Pretrained | cv2 | cv2 Bicubic | 324.604 +/- 5.157 | -| mmedit (Ours) | Pytorch Pretrained | cv2 | Pillow Bicubic | 318.161 +/- 5.330 | -| mmedit (Ours) | Pytorch Pretrained | Pillow | Pillow Bilinear | 313.126 +/- 5.449 | -| mmedit (Ours) | Pytorch Pretrained | Pillow | cv2 Bilinear | 318.021+/-3.864 | -| mmedit (Ours) | Pytorch Pretrained | Pillow | Pillow Bicubic | 317.997 +/- 5.350 | -| mmedit (Ours) | Tero's Script Model | cv2 | cv2 Bilinear | 318.879 +/- 2.433 | -| mmedit (Ours) | Tero's Script Model | cv2 | cv2 Bicubic | 316.125 +/- 5.718 | -| mmedit (Ours) | Tero's Script Model | cv2 | Pillow Bicubic | **312.045 +/- 5.440** | -| mmedit (Ours) | Tero's Script Model | Pillow | Pillow Bilinear | 308.645 +/- 5.374 | -| mmedit (Ours) | Tero's Script Model | Pillow | Pillow Bicubic | 311.733 +/- 5.375 | +| mmagic (Ours) | Pytorch Pretrained | cv2 | cv2 Bilinear | 322.932 +/- 2.317 | +| mmagic (Ours) | Pytorch Pretrained | cv2 | cv2 Bicubic | 324.604 +/- 5.157 | +| mmagic (Ours) | Pytorch Pretrained | cv2 | Pillow Bicubic | 318.161 +/- 5.330 | +| mmagic (Ours) | Pytorch Pretrained | Pillow | Pillow Bilinear | 313.126 +/- 5.449 | +| mmagic (Ours) | Pytorch Pretrained | Pillow | cv2 Bilinear | 318.021+/-3.864 | +| mmagic (Ours) | Pytorch Pretrained | Pillow | Pillow Bicubic | 317.997 +/- 5.350 | +| mmagic (Ours) | Tero's Script Model | cv2 | cv2 Bilinear | 318.879 +/- 2.433 | +| mmagic (Ours) | Tero's Script Model | cv2 | cv2 Bicubic | 316.125 +/- 5.718 | +| mmagic (Ours) | Tero's Script Model | cv2 | Pillow Bicubic | **312.045 +/- 5.440** | +| mmagic (Ours) | Tero's Script Model | Pillow | Pillow Bilinear | 308.645 +/- 5.374 | +| mmagic (Ours) | Tero's Script Model | Pillow | Pillow Bicubic | 311.733 +/- 5.375 | @@ -227,7 +227,7 @@ to [evaluation](../user_guides/train_test.md) for details. ## Precision and Recall -Our `Precision and Recall` implementation follows the version used in StyleGAN2. In this metric, a VGG network will be adopted to extract the features for images. Unfortunately, we have not found a PyTorch VGG implementation leading to similar results with Tero's version used in StyleGAN2. (About the differences, please see this [file](https://github.com/open-mmlab/mmediting/blob/main/configs/styleganv2/README.md).) Thus, in our implementation, we adopt [Teor's VGG](https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/vgg16.pt) network by default. Importantly, applying this script module needs `PyTorch >= 1.6.0`. If with a lower PyTorch version, we will use the PyTorch official VGG network for feature extraction. +Our `Precision and Recall` implementation follows the version used in StyleGAN2. In this metric, a VGG network will be adopted to extract the features for images. Unfortunately, we have not found a PyTorch VGG implementation leading to similar results with Tero's version used in StyleGAN2. (About the differences, please see this [file](https://github.com/open-mmlab/mmagic/blob/main/configs/styleganv2/README.md).) Thus, in our implementation, we adopt [Teor's VGG](https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/vgg16.pt) network by default. Importantly, applying this script module needs `PyTorch >= 1.6.0`. If with a lower PyTorch version, we will use the PyTorch official VGG network for feature extraction. To evaluate with `P&R`, please add the following configuration in the config file: diff --git a/docs/en/user_guides/train_test.md b/docs/en/user_guides/train_test.md index 6b1d9cb55a..6a05543f87 100644 --- a/docs/en/user_guides/train_test.md +++ b/docs/en/user_guides/train_test.md @@ -1,16 +1,16 @@ -# Tutorial 4: Train and test in MMEditing +# Tutorial 4: Train and test in MMagic -In this section, we introduce how to test and train models in MMEditing. +In this section, we introduce how to test and train models in MMagic. In this section, we provide the following guides: - [Prerequisite](#prerequisite) -- [Test a model in MMEditing](#test-a-model-in-mmediting) +- [Test a model in MMagic](#test-a-model-in-mmagic) - [Test with a single GPUs](#test-with-a-single-gpus) - [Test with multiple GPUs](#test-with-multiple-gpus) - [Test with Slurm](#test-with-slurm) - [Test with specific metrics](#test-with-specific-metrics) -- [Train a model in MMEditing](#train-a-model-in-mmediting) +- [Train a model in MMagic](#train-a-model-in-mmagic) - [Train with a single GPU](#train-with-a-single-gpu) - [Train with multiple GPUs](#train-with-multiple-gpus) - [Train with multiple nodes](#train-with-multiple-nodes) @@ -19,9 +19,9 @@ In this section, we provide the following guides: ## Prerequisite -Users need to [prepare dataset](../user_guides/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 MMagic. -## Test a model in MMEditing +## Test a model in MMagic ### Test with a single GPUs @@ -39,7 +39,7 @@ python tools/test.py configs/example_config.py work_dirs/example_exp/example_mod ### Test with multiple GPUs -MMEditing supports testing with multiple GPUs, +MMagic supports testing with multiple GPUs, which can largely save your time in testing models. You can use the following commands to test a pre-trained model with multiple GPUs. @@ -55,7 +55,7 @@ For example, ### Test with Slurm -If you run MMEditing on a cluster managed with [slurm](https://slurm.schedmd.com/), you can use the script `slurm_test.sh`. (This script also supports single machine testing.) +If you run MMagic on a cluster managed with [slurm](https://slurm.schedmd.com/), you can use the script `slurm_test.sh`. (This script also supports single machine testing.) ```shell [GPUS=${GPUS}] ./tools/slurm_test.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${CHECKPOINT_FILE} @@ -71,8 +71,8 @@ You can check [slurm_test.sh](../../../tools/slurm_test.sh) for full arguments a ### Test with specific metrics -MMEditing provides various **evaluation metrics**, i.e., MS-SSIM, SWD, IS, FID, Precision&Recall, PPL, Equivarience, TransFID, TransIS, etc. -We have provided unified evaluation scripts in [tools/test.py](https://github.com/open-mmlab/mmediting/tree/main/tools/test.py) for all models. +MMagic provides various **evaluation metrics**, i.e., MS-SSIM, SWD, IS, FID, Precision&Recall, PPL, Equivarience, TransFID, TransIS, etc. +We have provided unified evaluation scripts in [tools/test.py](https://github.com/open-mmlab/mmagic/tree/main/tools/test.py) for all models. If users want to evaluate their models with some metrics, you can add the `metrics` into your config file like this: ```python @@ -102,15 +102,15 @@ Then users can test models with the command below: bash tools/dist_test.sh ${CONFIG_FILE} ${CKPT_FILE} ``` -If you are in slurm environment, please switch to the [tools/slurm_test.sh](https://github.com/open-mmlab/mmediting/tree/main/tools/slurm_test.sh) by using the following commands: +If you are in slurm environment, please switch to the [tools/slurm_test.sh](https://github.com/open-mmlab/mmagic/tree/main/tools/slurm_test.sh) by using the following commands: ```shell sh slurm_test.sh ${PLATFORM} ${JOBNAME} ${CONFIG_FILE} ${CKPT_FILE} ``` -## Train a model in MMEditing +## Train a model in MMagic -MMEditing supports multiple ways of training: +MMagic supports multiple ways of training: 1. [Train with a single GPU](#train-with-a-single-gpu) 2. [Train with multiple GPUs](#train-with-multiple-gpus) @@ -153,7 +153,7 @@ Please refer to [PyTorch docs](https://pytorch.org/docs/1.11/distributed.html#la ### Train with Slurm -If you run MMEditing on a cluster managed with [slurm](https://slurm.schedmd.com/), you can use the script `slurm_train.sh`. (This script also supports single machine training.) +If you run MMagic on a cluster managed with [slurm](https://slurm.schedmd.com/), you can use the script `slurm_train.sh`. (This script also supports single machine training.) ```shell [GPUS=${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR} @@ -165,7 +165,7 @@ Here is an example of using 8 GPUs to train an inpainting model on the dev parti GPUS=8 ./tools/slurm_train.sh dev configs/inpainting/gl_places.py /nfs/xxxx/gl_places_256 ``` -You can check [slurm_train.sh](https://github.com/open-mmlab/mmediting/blob/master/tools/slurm_train.sh) for full arguments and environment variables. +You can check [slurm_train.sh](https://github.com/open-mmlab/mmagic/blob/master/tools/slurm_train.sh) for full arguments and environment variables. ### Optional arguments diff --git a/docs/en/user_guides/visualization.md b/docs/en/user_guides/visualization.md index c3eb099daa..28a9929267 100644 --- a/docs/en/user_guides/visualization.md +++ b/docs/en/user_guides/visualization.md @@ -1,8 +1,8 @@ # 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/advanced_tutorials/visualization.md) to learn the usage of visualization. MMEditing provides a rich set of visualization functions. -In this tutorial, we introduce the usage of the visualization functions provided by MMEditing. +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/advanced_tutorials/visualization.md) to learn the usage of visualization. MMagic provides a rich set of visualization functions. +In this tutorial, we introduce the usage of the visualization functions provided by MMagic. - [Overview](#overview) - [Visualization hook](#visualization-hook) @@ -11,7 +11,7 @@ In this tutorial, we introduce the usage of the visualization functions provided ## Overview -In MMEditing, the visualization of the training or testing process requires the configuration of three components: VisualizationHook, Visualizer, and VisBackend. +In MMagic, the visualization of the training or testing process requires the configuration of three components: VisualizationHook, Visualizer, and VisBackend. **VisualizationHook** fetches the visualization results of the model output in fixed intervals during training and passes them to Visualizer. **Visualizer** is responsible for converting the original visualization results into the desired type (png, gif, etc.) and then transferring them to **VisBackend** for storage or display. @@ -35,7 +35,7 @@ vis_backends = [ dict(type='GenVisBackend'), # vis_backend for saving images to file system dict(type='WandbGenVisBackend', # vis_backend for uploading images to Wandb init_kwargs=dict( - project='MMEditing', # project name for Wandb + project='MMagic', # project name for Wandb name='GAN-Visualization-Demo' # name of the experiment for Wandb )) ] @@ -86,7 +86,7 @@ vis_backends = [ dict(type='GenVisBackend'), # vis_backend for saving images to file system dict(type='WandbGenVisBackend', # vis_backend for uploading images to Wandb init_kwargs=dict( - project='MMEditing', # project name for Wandb + project='MMagic', # project name for Wandb name='Translation-Visualization-Demo' # name of the experiment for Wandb )) ] @@ -112,7 +112,7 @@ vis_backends = [ dict(type='GenVisBackend'), # vis_backend for saving images to file system dict(type='WandbGenVisBackend', # vis_backend for uploading images to Wandb init_kwargs=dict( - project='MMEditing', # project name for Wandb + project='MMagic', # project name for Wandb name='Diffusion-Visualization-Demo' # name of the experiment for Wandb )) ] @@ -178,7 +178,7 @@ The specific configuration of the `VisualizationHook`, `Visualizer` and `VisBack ## Visualization Hook -In MMEditing, we use `BasicVisualizationHook` and `GenVisualizationHook` as `VisualizationHook`. +In MMagic, we use `BasicVisualizationHook` and `GenVisualizationHook` as `VisualizationHook`. `GenVisualizationHook` supports three following cases. (1) Modify `vis_kwargs_list` to visualize the output of the model under specific inputs , which is suitable for visualization of the generated results of GAN and translation results of Image-to-Image-Translation models under specific data input, etc. Below are two typical examples: @@ -211,7 +211,7 @@ vis_kwargs_list = [ In addition, the other fields are generic fields (e.g. `n_samples`, `n_row`, `name`, `fixed_input`, etc.). If not passed in, the default values from the GenVisHook initialization will be used. -For the convenience of users, MMEditing has pre-defined visualization parameters for **GAN**, **Translation models**, **SinGAN** and **Diffusion models**, and users can directly use the predefined visualization methods by using the following configuration: +For the convenience of users, MMagic has pre-defined visualization parameters for **GAN**, **Translation models**, **SinGAN** and **Diffusion models**, and users can directly use the predefined visualization methods by using the following configuration: ```python vis_kwargs_list = dict(type='GAN') @@ -224,7 +224,7 @@ vis_kwargs_list = dict(type='DDPMDenoising') ## Visualizer -In MMEditing, we implement `ConcatImageVisualizer` and `GenVisualizer`, which inherit from `mmengine.Visualizer`. +In MMagic, we implement `ConcatImageVisualizer` and `GenVisualizer`, which inherit from `mmengine.Visualizer`. The base class of `Visualizer` is `ManagerMixin` and this makes `Visualizer` a globally unique object. After being instantiated, `Visualizer` can be called at anywhere of the code by `Visualizer.get_current_instance()`, as shown below: @@ -251,7 +251,7 @@ Then `show` or `add_image` will be called to directly show the results or pass t ## VisBackend In general, users do not need to manipulate `VisBackend` objects, only when the current visualization storage can not meet the needs, users will want to manipulate the storage backend directly. -MMEditing supports a variety of different visualization backends, including: +MMagic supports a variety of different visualization backends, including: - Basic VisBackend of MMEngine: including LocalVisBackend, TensorboardVisBackend and WandbVisBackend. You can follow [MMEngine Documents](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/visualization.md) to learn more about them - GenVisBackend: Backend for **File System**. Save the visualization results to the corresponding position. diff --git a/docs/zh_cn/.dev_scripts/update_model_zoo.py b/docs/zh_cn/.dev_scripts/update_model_zoo.py index 7940cf4b62..7e62b0d8fe 100755 --- a/docs/zh_cn/.dev_scripts/update_model_zoo.py +++ b/docs/zh_cn/.dev_scripts/update_model_zoo.py @@ -12,7 +12,7 @@ import titlecase from tqdm import tqdm -github_link = 'https://github.com/open-mmlab/mmediting/blob/main/' +github_link = 'https://github.com/open-mmlab/mmagic/blob/main/' def anchor(name): diff --git a/docs/zh_cn/_static/css/readthedocs.css b/docs/zh_cn/_static/css/readthedocs.css index 9d5dec72d3..6905ec0805 100644 --- a/docs/zh_cn/_static/css/readthedocs.css +++ b/docs/zh_cn/_static/css/readthedocs.css @@ -1,5 +1,5 @@ .header-logo { - background-image: url("../image/mmediting-logo.png"); + background-image: url("../image/mmagic-logo.png"); background-size: 142px 46px; height: 46px; width: 142px; diff --git a/docs/zh_cn/_templates/404.html b/docs/zh_cn/_templates/404.html index 3ead60b47a..931b4c8246 100644 --- a/docs/zh_cn/_templates/404.html +++ b/docs/zh_cn/_templates/404.html @@ -10,7 +10,7 @@

    未找到页面

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

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

    {% endblock %} diff --git a/docs/zh_cn/community/contributing.md b/docs/zh_cn/community/contributing.md index 028e00a4a9..1a2e0493d4 100644 --- a/docs/zh_cn/community/contributing.md +++ b/docs/zh_cn/community/contributing.md @@ -1,6 +1,6 @@ # 贡献代码 -欢迎加入 MMEditing 社区,我们致力于打造最前沿的计算机视觉基础库,我们欢迎任何类型的贡献,包括但不限于 +欢迎加入 MMagic 社区,我们致力于打造最前沿的计算机视觉基础库,我们欢迎任何类型的贡献,包括但不限于 **修复错误** @@ -36,22 +36,22 @@ 将代码克隆到本地 ```shell -git clone git@github.com:{username}/mmediting.git +git clone git@github.com:{username}/mmagic.git ``` 添加原代码库为上游代码库 ```bash -git remote add upstream git@github.com:open-mmlab/mmediting +git remote add upstream git@github.com:open-mmlab/mmagic ``` 检查 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) +origin git@github.com:{username}/mmagic.git (fetch) +origin git@github.com:{username}/mmagic.git (push) +upstream git@github.com:open-mmlab/mmagic (fetch) +upstream git@github.com:open-mmlab/mmagic (push) ``` ```{note} @@ -60,7 +60,7 @@ upstream git@github.com:open-mmlab/mmediting (push) #### 2. 配置 pre-commit -在本地开发环境中,我们使用 [pre-commit](https://pre-commit.com/#intro) 来检查代码风格,以确保代码风格的统一。在提交代码,需要先安装 pre-commit(需要在 mmediting 目录下执行): +在本地开发环境中,我们使用 [pre-commit](https://pre-commit.com/#intro) 来检查代码风格,以确保代码风格的统一。在提交代码,需要先安装 pre-commit(需要在 mmagic 目录下执行): ```shell pip install -U pre-commit @@ -113,7 +113,7 @@ git pull upstream master #### 4. 提交代码并在本地通过单元测试 -- mmediting 引入了 mypy 来做静态类型检查,以增加代码的鲁棒性。因此我们在提交代码时,需要补充 Type Hints。具体规则可以参考[教程](https://zhuanlan.zhihu.com/p/519335398)。 +- mmagic 引入了 mypy 来做静态类型检查,以增加代码的鲁棒性。因此我们在提交代码时,需要补充 Type Hints。具体规则可以参考[教程](https://zhuanlan.zhihu.com/p/519335398)。 - 提交的代码同样需要通过单元测试 @@ -164,7 +164,7 @@ git push -u origin {branch_name} -mmediting 会在不同的平台(Linux、Window、Mac),基于不同版本的 Python、PyTorch、CUDA 对提交的代码进行单元测试,以保证代码的正确性,如果有任何一个没有通过,我们可点击上图中的 `Details` 来查看具体的测试信息,以便于我们修改代码。 +mmagic 会在不同的平台(Linux、Window、Mac),基于不同版本的 Python、PyTorch、CUDA 对提交的代码进行单元测试,以保证代码的正确性,如果有任何一个没有通过,我们可点击上图中的 `Details` 来查看具体的测试信息,以便于我们修改代码。 (3) 如果 PR 通过了 CI,那么就可以等待其他开发者的 review,并根据 reviewer 的意见,修改代码,并重复 [4](#4-提交代码并本地通过单元测试)-[5](#5-推送代码到远程) 步骤,直到 reviewer 同意合入 PR。 @@ -262,7 +262,7 @@ C++ 和 CUDA 的代码规范遵从 [Google C++ Style Guide](https://google.githu - 描述里介绍`拉取请求`的主要修改内容,结果,以及对其他部分的影响, 参考`拉取请求`模板 - 关联相关的`议题` (issue) 和其他`拉取请求` -6. 如果引入了其他三方库,或借鉴了三方库的代码,请确认他们的许可证和 mmediting 兼容,并在借鉴的代码上补充 `This code is inspired from http://` +6. 如果引入了其他三方库,或借鉴了三方库的代码,请确认他们的许可证和 mmagic 兼容,并在借鉴的代码上补充 `This code is inspired from http://` ## 代码规范 @@ -326,12 +326,12 @@ hypot2 = x * x + y * y ```python # Correct -from mmedit.cnn.bricks import (Conv2d, build_norm_layer, DropPath, MaxPool2d, +from mmagic.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, \ +from mmagic.cnn.bricks import Conv2d, build_norm_layer, DropPath, MaxPool2d, \ Linear # 使用括号进行连接,而不是反斜杠 from ...utils import is_str # 最多向上回溯一层,过多的回溯容易导致结构混乱 ``` @@ -591,7 +591,7 @@ docstring 是对一个类、一个函数功能与 API 接口的详细描述, ``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. + FileClient. See :class:`mmagic.fileio.FileClient` for details. Defaults to None. `New in version 1.3.15.` Warning: diff --git a/docs/zh_cn/device/npu_zh.md b/docs/zh_cn/device/npu_zh.md index eab6f4ca19..bebb09acaa 100644 --- a/docs/zh_cn/device/npu_zh.md +++ b/docs/zh_cn/device/npu_zh.md @@ -20,7 +20,7 @@ python tools/train.py configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py | Model | Dataset | PSNR | SSIM | Download | | :----------------------------------------------------------------------------------------: | ------- | :---: | :--- | :--------------------------------------------------------------------------------------------- | -| [edsr_x2c64b16_1x16_300k_div2k](https://github.com/open-mmlab/mmediting/blob/main/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py) | DIV2K | 35.83 | 0.94 | [log](https://download.openmmlab.com/mmediting/device/npu/edsr/edsr_x2c64b16_1xb16-300k_div2k.log) | +| [edsr_x2c64b16_1x16_300k_div2k](https://github.com/open-mmlab/mmagic/blob/main/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py) | DIV2K | 35.83 | 0.94 | [log](https://download.openmmlab.com/mmediting/device/npu/edsr/edsr_x2c64b16_1xb16-300k_div2k.log) | **注意:** diff --git a/docs/zh_cn/get_started/install.md b/docs/zh_cn/get_started/install.md index fb02528651..c34392655e 100644 --- a/docs/zh_cn/get_started/install.md +++ b/docs/zh_cn/get_started/install.md @@ -20,8 +20,8 @@ a. 创建并激活 conda 虚拟环境,如 `python 3.8`: ```shell -conda create -n mmedit python=3.8 -y -conda activate mmedit +conda create -n mmagic python=3.8 -y +conda activate mmagic ``` b. 按照 [PyTorch 官方文档](https://pytorch.org/) 安装 PyTorch 和 torchvision,然后安装对应路径下的 `mmcv-full` @@ -49,14 +49,14 @@ conda install pytorch cudatoolkit=10.1 torchvision -c pytorch conda install pytorch=1.3.1 cudatoolkit=9.2 torchvision=0.4.2 -c pytorch ``` -c. 克隆 MMEditing 仓库 +c. 克隆 MMagic 仓库 ```shell -git clone https://github.com/open-mmlab/mmediting.git -cd mmediting +git clone https://github.com/open-mmlab/mmagic.git +cd mmagic ``` -d. 安装相关依赖和 MMEditing +d. 安装相关依赖和 MMagic ```shell pip install -r requirements.txt @@ -71,14 +71,14 @@ CC=clang CXX=clang++ CFLAGS='-stdlib=libc++' pip install -e . e. 验证安装 -安装完成后,可以切换到其他目录(例如 `/home` 目录),并尝试在 python 中导入 mmedit,导入成功则证明安装成功 +安装完成后,可以切换到其他目录(例如 `/home` 目录),并尝试在 python 中导入 mmagic,导入成功则证明安装成功 ```shell $ cd ~ $ python ->>> import mmedit ->>> mmedit.__version__ +>>> import mmagic +>>> mmagic.__version__ '0.12.0' ``` @@ -86,15 +86,15 @@ $ python 1. git commit 的 id 将会被写到版本号中,如 0.6.0+2e7045c。这个版本号也会被保存到训练好的模型中。 推荐用户每次在对本地代码和 github 上的源码进行同步后,执行一次步骤 b。如果 C++/CUDA 代码被修改,就必须进行这一步骤。 - > 重要:如果你在一个新的 CUDA/PyTorch 版本下重新安装了 mmedit ,请确保删除了`./build`文件夹 + > 重要:如果你在一个新的 CUDA/PyTorch 版本下重新安装了 mmagic ,请确保删除了`./build`文件夹 ```shell - pip uninstall mmedit + pip uninstall mmagic rm -rf ./build find . -name "*.so" | xargs rm ``` -2. 根据上述步骤, MMEditing 就会以 `dev` 模式被安装,任何本地的代码修改都会立刻生效,不需要再重新安装一遍(除非用户提交了 commits,并且想更新版本号)。 +2. 根据上述步骤, MMagic 就会以 `dev` 模式被安装,任何本地的代码修改都会立刻生效,不需要再重新安装一遍(除非用户提交了 commits,并且想更新版本号)。 3. 如果用户想使用 `opencv-python-headless` 而不是 `opencv-python`,可在安装 `MMCV` 前安装 `opencv-python-headless`。 @@ -105,7 +105,7 @@ $ python ### CPU 环境下的安装步骤 -MMEditing 也可以在只有 CPU 的环境下安装(即无法使用 GPU 的环境)。 +MMagic 也可以在只有 CPU 的环境下安装(即无法使用 GPU 的环境)。 相应的,安装 CPU 版本的 PyTorch 和 MMCV @@ -120,19 +120,19 @@ pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7 因此,如果您尝试使用一些包含可变形卷积的模型进行推理,则会出现错误。 -### 利用 Docker 镜像安装 MMEditing +### 利用 Docker 镜像安装 MMagic -MMEditing 提供了一个 [Dockerfile](https://github.com/open-mmlab/mmediting/blob/master/docker/Dockerfile) 来创建 docker 镜像 +MMagic 提供了一个 [Dockerfile](https://github.com/open-mmlab/mmagic/blob/master/docker/Dockerfile) 来创建 docker 镜像 ```shell # build an image with PyTorch 1.5, CUDA 10.1 -docker build -t mmediting docker/ +docker build -t mmagic docker/ ``` 运行以下命令: ```shell -docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmediting/data mmediting +docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmagic/data mmagic ``` ### 完整的安装脚本 @@ -143,8 +143,8 @@ conda activate open-mmlab # install latest pytorch prebuilt with the default prebuilt CUDA version (usually the latest) conda install -c pytorch pytorch torchvision -y -git clone https://github.com/open-mmlab/mmediting.git -cd mmediting +git clone https://github.com/open-mmlab/mmagic.git +cd mmagic pip install -r requirements.txt pip install -v -e . ``` diff --git a/docs/zh_cn/get_started/overview.md b/docs/zh_cn/get_started/overview.md index 25ae662d32..d62a7ad812 100644 --- a/docs/zh_cn/get_started/overview.md +++ b/docs/zh_cn/get_started/overview.md @@ -2,21 +2,21 @@ # 概述 -欢迎来到 MMEditing! 在本节中,您将了解 +欢迎来到 MMagic! 在本节中,您将了解 -- [MMEditing是什么?](#mmediting-是什么) -- [为什么要使用 MMEditing?](#为什么要使用-mmediting) +- [MMagic是什么?](#mmagic-是什么) +- [为什么要使用 MMagic?](#为什么要使用-mmagic) - [新手入门](#新手入门) - [基础教程](#基础教程) - [进阶教程](#进阶教程) -## MMEditing 是什么? +## MMagic 是什么? -MMEditing 是一个供专业人工智能研究人员和机器学习工程师去处理、编辑和合成图像与视频的开源工具箱。 +MMagic 是一个供专业人工智能研究人员和机器学习工程师去处理、编辑和合成图像与视频的开源工具箱。 -MMEditing 允许研究人员和工程师使用最先进的预训练模型,并且可以轻松训练和开发新的定制模型。 +MMagic 允许研究人员和工程师使用最先进的预训练模型,并且可以轻松训练和开发新的定制模型。 -MMEditing 支持各种基础生成模型,包括: +MMagic 支持各种基础生成模型,包括: - 无条件生成对抗网络 (GANs) - 条件生成对抗网络 (GANs) @@ -24,7 +24,7 @@ MMEditing 支持各种基础生成模型,包括: - 扩散模型 - 还有许多其他生成模型即将推出! -MMEditing 支持各种应用程序,包括: +MMagic 支持各种应用程序,包括: - 图像超分辨率 - 视频超分辨率 @@ -68,19 +68,19 @@ MMEditing 支持各种应用程序,包括:
    -## 为什么要使用 MMEditing? +## 为什么要使用 MMagic? - **最先进的性能** - MMEditing 提供最先进的生成模型来处理、编辑和合成图像和视频。 + MMagic 提供最先进的生成模型来处理、编辑和合成图像和视频。 - **强大而流行的应用** - MMEditing 支持流行的*修复*、*抠图*、*超分辨率* 和*生成* 等应用。 具体来说,MMEditing 支持 GAN 插值、GAN 投影、GAN 编辑和许多其他流行的 GAN 的应用。 是时候玩转你的 GAN 了! + MMagic 支持流行的*修复*、*抠图*、*超分辨率* 和*生成* 等应用。 具体来说,MMagic 支持 GAN 插值、GAN 投影、GAN 编辑和许多其他流行的 GAN 的应用。 是时候玩转你的 GAN 了! - **全新模块化设计,灵活组合:** - 我们将 MMEditing 分解为不同的模块,通过组合不同的模块可以轻松构建定制的模型。 具体来说,提出了一种新的复杂损失模块设计,用于自定义模块之间的链接,可以实现不同模块之间的灵活组合。([损失函数](../howto/losses.md)) + 我们将 MMagic 分解为不同的模块,通过组合不同的模块可以轻松构建定制的模型。 具体来说,提出了一种新的复杂损失模块设计,用于自定义模块之间的链接,可以实现不同模块之间的灵活组合。([损失函数](../howto/losses.md)) - **高效的分布式训练:** @@ -92,12 +92,12 @@ MMEditing 支持各种应用程序,包括: ## 基础教程 -对于初学者,我们建议从 [基础教程](../user_guides/config.md) 学习 MMEditing 的基本用法。 +对于初学者,我们建议从 [基础教程](../user_guides/config.md) 学习 MMagic 的基本用法。 ## 进阶教程 -对于熟悉 MMEditing 的用户,可能想了解 MMEditing 的进阶实用,以及如何扩展算法库,如何使用多个算法库框架等高级用法,请参考[进阶教程](../advanced_guides/evaluator.md)。 +对于熟悉 MMagic 的用户,可能想了解 MMagic 的进阶实用,以及如何扩展算法库,如何使用多个算法库框架等高级用法,请参考[进阶教程](../advanced_guides/evaluator.md)。 ## 开发指南 -想要使用 MMEditing 进行深度开发的用户,可以参考[开发指南](../howto/models.md)。 +想要使用 MMagic 进行深度开发的用户,可以参考[开发指南](../howto/models.md)。 diff --git a/docs/zh_cn/get_started/quick_run.md b/docs/zh_cn/get_started/quick_run.md index 0552ef67ef..324aff15a7 100644 --- a/docs/zh_cn/get_started/quick_run.md +++ b/docs/zh_cn/get_started/quick_run.md @@ -6,7 +6,7 @@ ### 测试一个预训练模型 -MMEditing 使用 `MMDistributedDataParallel` 实现 **分布式**测试。 +MMagic 使用 `MMDistributedDataParallel` 实现 **分布式**测试。 #### 在单/多个 GPU 上进行测试 @@ -32,7 +32,7 @@ python tools/test.py configs/example_config.py work_dirs/example_exp/example_mod #### 在 slurm 上测试 -如果您在使用 [slurm](https://slurm.schedmd.com/) 管理的集群上运行 MMEditing,则可以使用脚本 `slurm_test.sh`。(此脚本也支持单机测试。) +如果您在使用 [slurm](https://slurm.schedmd.com/) 管理的集群上运行 MMagic,则可以使用脚本 `slurm_test.sh`。(此脚本也支持单机测试。) ```shell [GPUS=${GPUS}] ./tools/slurm_test.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${CHECKPOINT_FILE} @@ -44,7 +44,7 @@ python tools/test.py configs/example_config.py work_dirs/example_exp/example_mod GPUS=8 ./tools/slurm_test.sh dev test configs/example_config.py work_dirs/example_exp/example_model_20200202.pth ``` -您可以查看 [slurm_test.sh](https://github.com/open-mmlab/mmediting/blob/master/tools/slurm_test.sh) 以获取完整的参数和环境变量。 +您可以查看 [slurm_test.sh](https://github.com/open-mmlab/mmagic/blob/main/tools/slurm_test.sh) 以获取完整的参数和环境变量。 #### 可选参数 @@ -58,7 +58,7 @@ GPUS=8 ./tools/slurm_test.sh dev test configs/example_config.py work_dirs/exampl ## 训练一个模型 -MMEditing 使用 `MMDistributedDataParallel` 实现 **分布式**测试。 +MMagic 使用 `MMDistributedDataParallel` 实现 **分布式**测试。 所有输出(日志文件和模型权重文件)都将保存到工作目录中,工作目录由配置文件中的 `work_dir` 指定。 @@ -106,7 +106,7 @@ NNODES=2 NODE_RANK=1 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR tools/dist_train ### 在 slurm 上训练 -如果您在使用 [slurm](https://slurm.schedmd.com/) 管理的集群上运行 MMEditing,则可以使用脚本 `slurm_train.sh`。(此脚本也支持单机训练。) +如果您在使用 [slurm](https://slurm.schedmd.com/) 管理的集群上运行 MMagic,则可以使用脚本 `slurm_train.sh`。(此脚本也支持单机训练。) ```shell [GPUS=${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR} @@ -118,7 +118,7 @@ NNODES=2 NODE_RANK=1 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR tools/dist_train GPUS=8 ./tools/slurm_train.sh dev configs/inpainting/gl_places.py /nfs/xxxx/gl_places_256 ``` -您可以查看 [slurm_train.sh](https://github.com/open-mmlab/mmediting/blob/master/tools/slurm_train.sh) 以获取完整的参数和环境变量。 +您可以查看 [slurm_train.sh](https://github.com/open-mmlab/mmagic/blob/main/tools/slurm_train.sh) 以获取完整的参数和环境变量。 ### 在一台机器上启动多个作业 diff --git a/docs/zh_cn/howto/losses.md b/docs/zh_cn/howto/losses.md index b7f92325d1..8e226c6d88 100644 --- a/docs/zh_cn/howto/losses.md +++ b/docs/zh_cn/howto/losses.md @@ -1,8 +1,8 @@ # 如何设计自己的损失函数 -`losses` 在 `MMEditing` 中注册为 `LOSSES`。 -在 MMEditing 中设计自己的损失函数,步骤和在 MMEditing 中自定义任何其他模型类似。 -本节主要具体介绍了如何在 MMEditing 中实现自定义的损失函数。 +`losses` 在 `MMagic` 中注册为 `LOSSES`。 +在 MMagic 中设计自己的损失函数,步骤和在 MMagic 中自定义任何其他模型类似。 +本节主要具体介绍了如何在 MMagic 中实现自定义的损失函数。 本教程建议您在实现自定义的损失函数时,应该遵循本教程相同的设计,这样在我们的框架中使用您新定义的损失函数,就不需要额外的工作。 本指南包括: @@ -53,10 +53,10 @@ def mse_loss(pred,target): Class MSELoss(nn.Module): def __init__(self, loss_weight=1.0, reduction='mean', sample_wise=False): - # 代码可以在``mmedit/models/losses/pixelwise_loss.py``中找到 + # 代码可以在``mmagic/models/losses/pixelwise_loss.py``中找到 def forward(self, pred, target, weight=None, **kwargs): - # 代码可以在``mmedit/models/losses/pixelwise_loss.py``中找到 + # 代码可以在``mmagic/models/losses/pixelwise_loss.py``中找到 ``` 根据这个损失函数的定义,我们现在可以简单地通过在配置文件中定义它来使用: @@ -65,12 +65,12 @@ Class MSELoss(nn.Module): pixel_loss=dict(type='MSELoss', loss_weight=1.0, reduction='mean') ``` -请注意,上面的`pixel_loss`必须在模型中定义。 详情请参考[自定义模型](./models.md)。 与自定义模型类似,为了使用您自己实现的损失函数,您需要在编写后在`mmedit/models/losses/__init__.py`中导入该损失函数。 +请注意,上面的`pixel_loss`必须在模型中定义。 详情请参考[自定义模型](./models.md)。 与自定义模型类似,为了使用您自己实现的损失函数,您需要在编写后在`mmagic/models/losses/__init__.py`中导入该损失函数。 ### DiscShiftLoss 的一个例子 一般来说,要实现一个损失模块,我们会编写一个函数实现,然后用类实现包装它。 -但是,在 MMEditing 中,我们提供了另一个统一的接口 data_info 供用户定义输入参数和数据项之间的映射。 +但是,在 MMagic 中,我们提供了另一个统一的接口 data_info 供用户定义输入参数和数据项之间的映射。 ```python @weighted_loss @@ -82,10 +82,10 @@ Class DiscShiftLoss(nn.Module): def __init__(self, loss_weight=1.0, data_info=None): super(DiscShiftLoss,self).__init__() - # 代码可以在``mmedit/models/losses/disc_auxiliary_loss.py``中找到 + # 代码可以在``mmagic/models/losses/disc_auxiliary_loss.py``中找到 def forward(self, *args, **kwargs): - # 代码可以在``mmedit/models/losses/disc_auxiliary_loss.py``中找到 + # 代码可以在``mmagic/models/losses/disc_auxiliary_loss.py``中找到 ``` 这种损失模块设计的目标是允许在生成模型(`MODELS`)中自动使用它,而无需其他复杂代码来定义数据和关键字参数之间的映射。 因此,与 OpenMMLab 中的其他框架不同,我们的损失模块包含一个特殊的关键字 data_info,它是一个定义输入参数与生成模型数据之间映射的字典。 以`DiscShiftLoss`为例,用户在编写配置文件时,可能会用到这个loss,如下: @@ -247,7 +247,7 @@ class GANWithCustomizedLoss(BaseModel): vanilla gan loss - mmedit.models.GANLoss + mmagic.models.GANLoss ```python @@ -265,14 +265,14 @@ loss_gan=dict( lsgan loss - mmedit.models.GANLoss + mmagic.models.GANLoss wgan loss - mmedit.models.GANLoss + mmagic.models.GANLoss ```python @@ -289,7 +289,7 @@ loss_gan=dict( hinge loss - mmedit.models.GANLoss + mmagic.models.GANLoss ```python @@ -306,7 +306,7 @@ loss_gan=dict( smgan loss - mmedit.models.GANLoss + mmagic.models.GANLoss ```python @@ -323,7 +323,7 @@ loss_gan=dict( gradient penalty - mmedit.models.GradientPenaltyLoss + mmagic.models.GradientPenaltyLoss ```python @@ -336,7 +336,7 @@ loss_gp=dict(type='GradientPenaltyLoss', loss_weight=10.) discriminator shift loss - mmedit.models.DiscShiftLoss + mmagic.models.DiscShiftLoss ```python @@ -350,25 +350,25 @@ loss_disc_shift=dict(type='DiscShiftLoss', loss_weight=0.001) clip loss - mmedit.models.CLIPLoss + mmagic.models.CLIPLoss L1 composition loss - mmedit.models.L1CompositionLoss + mmagic.models.L1CompositionLoss MSE composition loss - mmedit.models.MSECompositionLoss + mmagic.models.MSECompositionLoss charbonnier composition loss - mmedit.models.CharbonnierCompLoss + mmagic.models.CharbonnierCompLoss ```python @@ -381,13 +381,13 @@ loss_comp=dict(type='CharbonnierCompLoss', loss_weight=0.5) face id Loss - mmedit.models.FaceIdLoss + mmagic.models.FaceIdLoss light cnn feature loss - mmedit.models.LightCNNFeatureLoss + mmagic.models.LightCNNFeatureLoss ```python @@ -404,13 +404,13 @@ feature_loss=dict( gradient loss - mmedit.models.GradientLoss + mmagic.models.GradientLoss l1 Loss - mmedit.models.L1Loss + mmagic.models.L1Loss ```python @@ -423,7 +423,7 @@ pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean') mse loss - mmedit.models.MSELoss + mmagic.models.MSELoss ```python @@ -436,7 +436,7 @@ align_loss=dict(type='MSELoss', loss_weight=0.1, reduction='mean') charbonnier loss - mmedit.models.CharbonnierLoss + mmagic.models.CharbonnierLoss ```python @@ -449,7 +449,7 @@ loss_alpha=dict(type='CharbonnierLoss', loss_weight=0.5) masked total variation loss - mmedit.models.MaskedTVLoss + mmagic.models.MaskedTVLoss ```python @@ -466,7 +466,7 @@ loss_tv=dict( perceptual loss - mmedit.models.PerceptualLoss + mmagic.models.PerceptualLoss ```python @@ -492,7 +492,7 @@ perceptual_loss=dict( transferal perceptual loss - mmedit.models.TransferalPerceptualLoss + mmagic.models.TransferalPerceptualLoss ```python @@ -516,10 +516,10 @@ transferal_perceptual_loss=dict( | 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 | +| clip loss component | mmagic.models.CLIPLossComps | +| discriminator shift loss component | mmagic.models. DiscShiftLossComps | +| gradient penalty loss component | mmagic.models. GradientPenaltyLossComps | +| r1 gradient penalty component | mmagic.models. R1GradientPenaltyComps | +| face Id loss component | mmagic.models. FaceIdLossComps | +| gan loss component | mmagic.models. GANLossComps | +| generator path regularizer component | mmagic.models.GeneratorPathRegularizerComps | diff --git a/docs/zh_cn/index.rst b/docs/zh_cn/index.rst index e3ab303dc8..bd8c0bb105 100644 --- a/docs/zh_cn/index.rst +++ b/docs/zh_cn/index.rst @@ -1,4 +1,4 @@ -欢迎来到 MMEditing 的中文文档! +欢迎来到 MMagic 的中文文档! ===================================== 您可以在页面左下角切换中英文文档。 @@ -10,7 +10,7 @@ .. toctree:: :maxdepth: 1 - :caption: MMEditing 社区 + :caption: MMagic 社区 community/contributing.md community/projects.md diff --git a/docs/zh_cn/switch_language.md b/docs/zh_cn/switch_language.md index 5f17de764a..145360f0ac 100644 --- a/docs/zh_cn/switch_language.md +++ b/docs/zh_cn/switch_language.md @@ -1,3 +1,3 @@ -## English +## English -## 简体中文 +## 简体中文 diff --git a/docs/zh_cn/user_guides/config.md b/docs/zh_cn/user_guides/config.md index d147aa5c29..61fb30602c 100644 --- a/docs/zh_cn/user_guides/config.md +++ b/docs/zh_cn/user_guides/config.md @@ -1,6 +1,6 @@ # 教程 1: 了解配置文件(待更新) -mmedit 采用基于 python 文件的配置系统,您可以在 `$MMEditing/configs` 下查看预置的配置文件。 +mmagic 采用基于 python 文件的配置系统,您可以在 `$MMagic/configs` 下查看预置的配置文件。 ## 配置文件命名风格 @@ -318,7 +318,7 @@ log_config = dict( # 配置注册记录器钩子 hooks=[ dict(type='TextLoggerHook', by_epoch=False), # dict(type='TensorboardLoggerHook'), # 支持 Tensorboard 记录器 - # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit')) + # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmagic')) ]) # 用于记录训练过程的记录器 visual_config = dict( # 构建可视化钩子的配置 @@ -515,7 +515,7 @@ workflow = [('train', 1)] # runner 的工作流程。 [('train', 1)] 表示只 ## 示例-EDSR -为了帮助用户理解 mmediting 的配置文件结构,这里以 EDSR 为例,给出其配置文件的注释。对于每个模块的详细用法以及对应参数的选择,请参照 API 文档。 +为了帮助用户理解 mmagic 的配置文件结构,这里以 EDSR 为例,给出其配置文件的注释。对于每个模块的详细用法以及对应参数的选择,请参照 API 文档。 ```python exp_name = 'edsr_x2c64b16_1x16_300k_div2k' # 实验名称 diff --git a/docs/zh_cn/user_guides/dataset_prepare.md b/docs/zh_cn/user_guides/dataset_prepare.md index 234378b0ad..2e6dba4f0d 100644 --- a/docs/zh_cn/user_guides/dataset_prepare.md +++ b/docs/zh_cn/user_guides/dataset_prepare.md @@ -3,7 +3,7 @@ 在本节中,我们将详细介绍如何准备数据并在本仓库的不同任务中采用适当的数据集。 我们支持不同任务的多个数据集。 -在MMEditing中,有两种方法可以将数据集用于训练和测试模型: +在MMagic中,有两种方法可以将数据集用于训练和测试模型: 1. 直接使用下载的数据集 2. 在使用下载的数据集之前对其进行预处理 @@ -13,7 +13,7 @@ - \[教程 2:准备数据集\](#教程 2:准备数据集) - [下载数据集](#下载数据集) - [准备数据集](#准备数据集) - - [MMEditing中的数据集概述](#MMEditing中的数据集概述) + - [MMagic中的数据集概述](#MMagic中的数据集概述) ## 下载数据集 @@ -24,17 +24,17 @@ ## 准备数据集 一些数据集需要在训练或测试之前进行预处理。我们在 -[tools/dataset_converters](https://github.com/open-mmlab/mmediting/tree/main/tools/dataset_converters)中支持许多用来准备数据集的脚本。 +[tools/dataset_converters](https://github.com/open-mmlab/mmagic/tree/main/tools/dataset_converters)中支持许多用来准备数据集的脚本。 您可以遵循每个数据集的教程来运行脚本。例如,我们建议将DIV2K图像裁剪为子图像。我们提供了一个脚本来准备裁剪的DIV2K数据集。可以运行以下命令: ```shell python tools/dataset_converters/super-resolution/div2k/preprocess_div2k_dataset.py --data-root ./data/DIV2K ``` -## MMEditing中的数据集概述 +## MMagic中的数据集概述 我们支持详细的教程,并根据不同的任务进行拆分。 请查看我们的数据集概览,了解不同任务的数据准备。 -如果您对MMEditing中数据集的更多细节感兴趣,请查看[进阶教程](../howto/dataset.md)。 +如果您对MMagic中数据集的更多细节感兴趣,请查看[进阶教程](../howto/dataset.md)。 diff --git a/docs/zh_cn/user_guides/deploy.md b/docs/zh_cn/user_guides/deploy.md index 77be5c0fe0..29786af787 100644 --- a/docs/zh_cn/user_guides/deploy.md +++ b/docs/zh_cn/user_guides/deploy.md @@ -1,7 +1,7 @@ # 教程 8:模型部署指南 -[MMDeploy](https://github.com/open-mmlab/mmdeploy) 是 OpenMMLab 的部署仓库,负责包括 MMClassification、MMDetection、MMEditing 等在内的各算法库的部署工作。 -你可以从[这里](https://mmdeploy.readthedocs.io/zh_CN/latest/04-supported-codebases/mmedit.html)获取 MMDeploy 对 MMClassification 部署支持的最新文档。 +[MMDeploy](https://github.com/open-mmlab/mmdeploy) 是 OpenMMLab 的部署仓库,负责包括 MMClassification、MMDetection、MMagic 等在内的各算法库的部署工作。 +你可以从[这里](https://mmdeploy.readthedocs.io/zh_CN/latest/04-supported-codebases/mmagic.html)获取 MMDeploy 对 MMClassification 部署支持的最新文档。 本文的结构如下: @@ -15,7 +15,7 @@ ## 安装 -请参考[此处](../get_started/install.md)安装 mmedit。然后,按照[说明](https://mmdeploy.readthedocs.io/zh_CN/latest/get_started.html#mmdeploy)安装 mmdeploy。 +请参考[此处](../get_started/install.md)安装 mmagic。然后,按照[说明](https://mmdeploy.readthedocs.io/zh_CN/latest/get_started.html#mmdeploy)安装 mmdeploy。 ```{note} 如果安装的是 mmdeploy 预编译包,那么也请通过 'git clone https://github.com/open-mmlab/mmdeploy.git --depth=1' 下载 mmdeploy 源码。因为它包含了部署时要用到的配置文件 @@ -23,16 +23,16 @@ ## 模型转换 -假设在安装步骤中,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 模型: +假设在安装步骤中,mmagic 和 mmdeploy 代码库在同级目录下,并且当前的工作目录为 mmagic 的根目录,那么以 [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' +work_dir = 'mmdeploy_models/mmagic/onnx' save_file = 'end2end.onnx' -deploy_cfg = '../mmdeploy/configs/mmedit/super-resolution/super-resolution_onnxruntime_dynamic.py' +deploy_cfg = '../mmdeploy/configs/mmagic/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' @@ -45,7 +45,7 @@ torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg, export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint, device=device) ``` -转换的关键之一是使用正确的配置文件。项目中已内置了各后端部署[配置文件](https://github.com/open-mmlab/mmdeploy/tree/main/configs/mmedit)。 +转换的关键之一是使用正确的配置文件。项目中已内置了各后端部署[配置文件](https://github.com/open-mmlab/mmdeploy/tree/main/configs/mmagic)。 文件的命名模式是: ``` @@ -54,7 +54,7 @@ export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint, device=device) 其中: -- **{task}:** mmedit 中的任务 +- **{task}:** mmagic 中的任务 - **{backend}:** 推理后端名称。比如,onnxruntime、tensorrt、pplnn、ncnn、openvino、coreml 等等 - **{precision}:** 推理精度。比如,fp16、int8。不填表示 fp32 - **{static | dynamic}:** 动态、静态 shape @@ -70,10 +70,10 @@ export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint, device=device) 在使用转换后的模型进行推理之前,有必要了解转换结果的结构。 它存放在 `--work-dir` 指定的路路径下。 -上例中的`mmdeploy_models/mmedit/onnx`,结构如下: +上例中的`mmdeploy_models/mmagic/onnx`,结构如下: ``` -mmdeploy_models/mmedit/onnx +mmdeploy_models/mmagic/onnx ├── deploy.json ├── detail.json ├── end2end.onnx @@ -98,10 +98,10 @@ 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' +deploy_cfg = '../mmdeploy/configs/mmagic/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'] +backend_model = ['mmdeploy_models/mmagic/onnx/end2end.onnx'] image = 'tests/data/image/lq/baboon_x4.png' # read deploy_cfg and model_cfg @@ -139,7 +139,7 @@ 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) +restorer = Restorer(model_path='mmdeploy_models/mmagic/onnx', device_name='cpu', device_id=0) # perform inference result = restorer(img) @@ -152,4 +152,4 @@ cv2.imwrite('output_restorer.bmp', result) ## 模型支持列表 -请参考[这里](https://mmdeploy.readthedocs.io/zh_CN/latest/04-supported-codebases/mmedit.html#id7) +请参考[这里](https://mmdeploy.readthedocs.io/zh_CN/latest/04-supported-codebases/mmagic.html#id7) diff --git a/docs/zh_cn/user_guides/metrics.md b/docs/zh_cn/user_guides/metrics.md index 30b1ce5eb0..fe1630e3ec 100644 --- a/docs/zh_cn/user_guides/metrics.md +++ b/docs/zh_cn/user_guides/metrics.md @@ -1,8 +1,8 @@ # 教程 5:使用评价指标 -MMEditing支持**17个指标**以评估模型质量。 +MMagic支持**17个指标**以评估模型质量。 -有关用法,请参阅[MMEditing中的训练与测试](../user_guides/train_test.md)。 +有关用法,请参阅[MMagic中的训练与测试](../user_guides/train_test.md)。 在这里,我们将逐个介绍不同指标的详细信息。 @@ -140,11 +140,11 @@ val_evaluator = [ Fréchet初始距离是两个图像数据集之间相似度的度量。它被证明与人类对视觉质量的判断有很好的相关性,最常用于评估生成对抗网络样本的质量。FID是通过计算两个高斯函数之间的Fréchet距离来计算的,这些高斯函数适合于Inception网络的特征表示。 -在`MMEditing`中,我们提供了两个版本的FID计算。一个是常用的PyTorch版本,另一个用于StyleGAN。同时,我们在StyleGAN2-FFHQ1024模型中比较了这两种实现之间的差异(详细信息可以在这里找到\[https://github.com/open-mmlab/mmediting/blob/main/configs/styleganv2/README.md\])。幸运的是,最终结果只是略有不同。因此,我们建议用户采用更方便的PyTorch版本。 +在`MMagic`中,我们提供了两个版本的FID计算。一个是常用的PyTorch版本,另一个用于StyleGAN。同时,我们在StyleGAN2-FFHQ1024模型中比较了这两种实现之间的差异(详细信息可以在这里找到\[https://github.com/open-mmlab/mmagic/blob/main/configs/styleganv2/README.md\])。幸运的是,最终结果只是略有不同。因此,我们建议用户采用更方便的PyTorch版本。 **关于PyTorch版本和Tero版本:** 常用的PyTorch版本采用修改后的InceptionV3网络提取真假图像特征。然而,Tero的FID需要Tensorflow InceptionV3的[脚本模块](https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/inception-2015-12-05.pt)。注意,应用此脚本模块需要' PyTorch >= 1.6.0 '。 -**关于提取真实的初始数据:** 为了方便用户,在测试时自动提取真实的特征并保存在本地,存储的特征在下次测试时自动读取。具体来说,我们将根据用于计算实际特性的参数计算一个哈希值,并使用哈希值来标记特性文件,在测试时,如果' inception_pkl '没有设置,我们将在' MMEDIT_CACHE_DIR ' (~/.cache/openmmlab/mmedit/)中寻找该特性。如果未找到缓存的初始pkl,则将执行提取。 +**关于提取真实的初始数据:** 为了方便用户,在测试时自动提取真实的特征并保存在本地,存储的特征在下次测试时自动读取。具体来说,我们将根据用于计算实际特性的参数计算一个哈希值,并使用哈希值来标记特性文件,在测试时,如果' inception_pkl '没有设置,我们将在' MMAGIC_CACHE_DIR ' (~/.cache/openmmlab/mmagic/)中寻找该特性。如果未找到缓存的初始pkl,则将执行提取。 要使用FID指标,请在配置文件中添加以下配置: @@ -159,7 +159,7 @@ metrics = [ ] ``` -如果您在一台新机器上工作,那么您可以复制'MMEDIT_CACHE_DIR'中的'pkl'文件,将它们复制到新机器并设置'inception_pkl'字段。 +如果您在一台新机器上工作,那么您可以复制'MMAGIC_CACHE_DIR'中的'pkl'文件,将它们复制到新机器并设置'inception_pkl'字段。 ```python metrics = [ @@ -206,17 +206,17 @@ metrics = [ | :-------------------------------------------------------------: | :------------------: | :-----------------: | :-------------------------: | :-------------------: | | [OpenAI (baseline)](https://github.com/openai/improved-gan) | Tensorflow | Pillow | Pillow Bicubic | **312.255 +/- 4.970** | | [StyleGAN-Ada](https://github.com/NVlabs/stylegan2-ada-pytorch) | Tero's Script Model | Pillow | Pillow Bicubic | 311.895 +/ 4.844 | -| mmedit (Ours) | Pytorch Pretrained | cv2 | cv2 Bilinear | 322.932 +/- 2.317 | -| mmedit (Ours) | Pytorch Pretrained | cv2 | cv2 Bicubic | 324.604 +/- 5.157 | -| mmedit (Ours) | Pytorch Pretrained | cv2 | Pillow Bicubic | 318.161 +/- 5.330 | -| mmedit (Ours) | Pytorch Pretrained | Pillow | Pillow Bilinear | 313.126 +/- 5.449 | -| mmedit (Ours) | Pytorch Pretrained | Pillow | cv2 Bilinear | 318.021+/-3.864 | -| mmedit (Ours) | Pytorch Pretrained | Pillow | Pillow Bicubic | 317.997 +/- 5.350 | -| mmedit (Ours) | Tero's Script Model | cv2 | cv2 Bilinear | 318.879 +/- 2.433 | -| mmedit (Ours) | Tero's Script Model | cv2 | cv2 Bicubic | 316.125 +/- 5.718 | -| mmedit (Ours) | Tero's Script Model | cv2 | Pillow Bicubic | **312.045 +/- 5.440** | -| mmedit (Ours) | Tero's Script Model | Pillow | Pillow Bilinear | 308.645 +/- 5.374 | -| mmedit (Ours) | Tero's Script Model | Pillow | Pillow Bicubic | 311.733 +/- 5.375 | +| mmagic (Ours) | Pytorch Pretrained | cv2 | cv2 Bilinear | 322.932 +/- 2.317 | +| mmagic (Ours) | Pytorch Pretrained | cv2 | cv2 Bicubic | 324.604 +/- 5.157 | +| mmagic (Ours) | Pytorch Pretrained | cv2 | Pillow Bicubic | 318.161 +/- 5.330 | +| mmagic (Ours) | Pytorch Pretrained | Pillow | Pillow Bilinear | 313.126 +/- 5.449 | +| mmagic (Ours) | Pytorch Pretrained | Pillow | cv2 Bilinear | 318.021+/-3.864 | +| mmagic (Ours) | Pytorch Pretrained | Pillow | Pillow Bicubic | 317.997 +/- 5.350 | +| mmagic (Ours) | Tero's Script Model | cv2 | cv2 Bilinear | 318.879 +/- 2.433 | +| mmagic (Ours) | Tero's Script Model | cv2 | cv2 Bicubic | 316.125 +/- 5.718 | +| mmagic (Ours) | Tero's Script Model | cv2 | Pillow Bicubic | **312.045 +/- 5.440** | +| mmagic (Ours) | Tero's Script Model | Pillow | Pillow Bilinear | 308.645 +/- 5.374 | +| mmagic (Ours) | Tero's Script Model | Pillow | Pillow Bicubic | 311.733 +/- 5.375 | @@ -224,7 +224,7 @@ metrics = [ ## Precision and Recall -我们的'Precision and Recall'实现遵循StyleGAN2中使用的版本。在该度量中,采用VGG网络对图像进行特征提取。不幸的是,我们还没有发现PyTorch VGG实现与StyleGAN2中使用的Tero版本产生类似的结果。(关于差异,请参阅这个[文件](https://github.com/open-mmlab/mmediting/blob/main/configs/styleganv2/README.md)。)因此,在我们的实现中,我们默认采用[Teor's VGG](https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/vgg16.pt)网络。需要注意的是,应用这个脚本模块需要'PyTorch >= 1.6.0'。如果使用较低的PyTorch版本,我们将使用PyTorch官方VGG网络进行特征提取。 +我们的'Precision and Recall'实现遵循StyleGAN2中使用的版本。在该度量中,采用VGG网络对图像进行特征提取。不幸的是,我们还没有发现PyTorch VGG实现与StyleGAN2中使用的Tero版本产生类似的结果。(关于差异,请参阅这个[文件](https://github.com/open-mmlab/mmagicing/blob/main/configs/styleganv2/README.md)。)因此,在我们的实现中,我们默认采用[Teor's VGG](https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/vgg16.pt)网络。需要注意的是,应用这个脚本模块需要'PyTorch >= 1.6.0'。如果使用较低的PyTorch版本,我们将使用PyTorch官方VGG网络进行特征提取。 要使用' P&R '进行评估,请在配置文件中添加以下配置: ```python diff --git a/docs/zh_cn/user_guides/useful_tools.md b/docs/zh_cn/user_guides/useful_tools.md index 429e2a6f77..c68ea68eae 100644 --- a/docs/zh_cn/user_guides/useful_tools.md +++ b/docs/zh_cn/user_guides/useful_tools.md @@ -86,20 +86,20 @@ python tools/pytorch2onnx.py 下表列出了保证可导出到 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 | | +| 模型 | 配置 | 动态形状 | 批量推理 | 备注 | +| :------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------: | :------: | :--: | +| ESRGAN | [esrgan_x4c64b23g32_g1_400k_div2k.py](https://github.com/open-mmlab/mmagic/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/mmagic/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/mmagic/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/mmagic/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/mmagic/blob/master/configs/gca/gca_r34_4x10_200k_comp1k.py) | N | Y | | +| IndexNet | [indexnet_mobv2_1x16_78k_comp1k.py](https://github.com/open-mmlab/mmagic/blob/master/configs/indexnet/indexnet_mobv2_1x16_78k_comp1k.py) | Y | Y | | **注**: - *以上所有模型均使用 Pytorch==1.6.0 和 onnxruntime==1.5.1* - 如果您遇到上面列出的模型的任何问题,请创建一个 issue,我们会尽快处理。对于列表中未包含的型号,请尝试自行解决。 -- 由于此功能是实验性的并且可能会快速更改,请始终尝试使用最新的 `mmcv` 和 `mmedit`。 +- 由于此功能是实验性的并且可能会快速更改,请始终尝试使用最新的 `mmcv` 和 `mmagic`。 ### 将 ONNX 转换为 TensorRT(实验性) @@ -136,7 +136,7 @@ python tools/onnx2tensorrt.py - `--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%。 +**注**:此工具仍处于试验阶段。 目前不支持某些自定义运算符。 我们现在只支持 `restorer`。 在生成 SRCNN 的 ONNX 文件时,将 SCRNN 模型中的 'bicubic' 替换为 'bilinear' \[此处\](https://github.com/open-mmlab/mmagic/blob/764e6065e315b7d0033762038fcbf0bb1c570d4d/mmagic.bones/modelsrnn py#L40)。 因为 TensorRT 目前不支持 bicubic 插值,最终性能将下降约 4%。 #### 支持导出到 TensorRT 的模型列表 @@ -144,15 +144,15 @@ python tools/onnx2tensorrt.py | 模型 | 配置 | 动态形状 | 批量推理 | 备注 | | :----: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :------: | :------: | :-----------------------------------: | -| 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' | +| ESRGAN | [esrgan_x4c64b23g32_g1_400k_div2k.py](https://github.com/open-mmlab/mmagic/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/mmagic/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/mmagic/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`。 +- 由于此功能是实验性的并且可能会快速更改,因此请始终尝试使用最新的 `mmcv` 和 `mmagic`。 ### 评估 ONNX 和 TensorRT 模型(实验性) From 439f906c585f22e721fa266db70f6355427558e4 Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Thu, 20 Apr 2023 19:15:29 +0800 Subject: [PATCH 28/42] [Rename] update mmagic's configs (#1780) * [Rename] update mmagic's configs * [Rename] update mmagic's configs --- README.md | 2 +- README_zh-CN.md | 2 +- configs/aot_gan/README.md | 4 ++-- configs/basicvsr/README.md | 4 ++-- configs/basicvsr_pp/README.md | 8 ++++---- configs/basicvsr_pp/README_zh-CN.md | 2 +- configs/cain/README.md | 4 ++-- configs/cyclegan/README.md | 2 +- configs/deepfillv1/README.md | 4 ++-- configs/deepfillv2/README.md | 4 ++-- configs/dic/README.md | 4 ++-- configs/dim/README.md | 4 ++-- configs/disco_diffusion/README.md | 2 +- configs/disco_diffusion/README_zh-CN.md | 4 ++-- configs/disco_diffusion/tutorials.ipynb | 16 ++++++++-------- configs/edsr/README.md | 4 ++-- configs/edvr/README.md | 4 ++-- configs/esrgan/README.md | 4 ++-- configs/flavr/README.md | 4 ++-- configs/gca/README.md | 4 ++-- configs/glean/README.md | 4 ++-- configs/global_local/README.md | 4 ++-- configs/guided_diffusion/README.md | 2 +- configs/iconvsr/README.md | 4 ++-- configs/indexnet/README.md | 4 ++-- configs/inst_colorization/README.md | 2 +- configs/liif/README.md | 4 ++-- configs/nafnet/README.md | 2 +- configs/nafnet/README_zh-CN.md | 2 +- configs/partial_conv/README.md | 4 ++-- configs/pix2pix/README.md | 2 +- configs/rdn/README.md | 4 ++-- configs/real_basicvsr/README.md | 4 ++-- configs/real_esrgan/README.md | 4 ++-- configs/restormer/README.md | 4 ++-- configs/srcnn/README.md | 4 ++-- configs/srgan_resnet/README.md | 4 ++-- .../stable-diffusion_ddim_denoisingunet.py | 2 +- configs/styleganv1/README.md | 2 +- configs/styleganv2/README.md | 2 +- configs/styleganv3/README.md | 2 +- configs/swinir/README.md | 4 ++-- configs/tdan/README.md | 4 ++-- configs/tof/README.md | 4 ++-- configs/ttsr/README.md | 4 ++-- 45 files changed, 84 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index f50f94c9ed..3956107d70 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ MMagic is an open-source image and video editing&generating toolbox based on PyT Currently, MMagic support multiple image and video generation/editing tasks. -https://user-images.githubusercontent.com/12782558/217152698-49169038-9872-4200-80f7-1d5f7613afd7.mp4 +https://user-images.githubusercontent.com/49083766/233324087-04542ec1-97cb-45d9-a096-c5337c3e5c75.mp4 The best practice on our main branch works with **Python 3.8+** and **PyTorch 1.9+**. diff --git a/README_zh-CN.md b/README_zh-CN.md index 861f1fef91..e3bb2fc825 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -82,7 +82,7 @@ MMagic 是基于 PyTorch 的图像&视频编辑和生成开源工具箱。是 [O 目前 MMagic 支持多种图像和视频的生成/编辑任务。 -https://user-images.githubusercontent.com/12782558/217152698-49169038-9872-4200-80f7-1d5f7613afd7.mp4 +https://user-images.githubusercontent.com/49083766/233324087-04542ec1-97cb-45d9-a096-c5337c3e5c75.mp4 主分支代码的最佳实践基于 **Python 3.8+** 和 **PyTorch 1.9+** 。 diff --git a/configs/aot_gan/README.md b/configs/aot_gan/README.md index c7c7d0bc40..8694331945 100644 --- a/configs/aot_gan/README.md +++ b/configs/aot_gan/README.md @@ -69,7 +69,7 @@ python tools/train.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py ./tools/dist_train.sh configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.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#Train-a-model-in-MMagic). @@ -91,7 +91,7 @@ python tools/test.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https ./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). +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-MMagic). diff --git a/configs/basicvsr/README.md b/configs/basicvsr/README.md index 84cd699c36..3e443b302f 100644 --- a/configs/basicvsr/README.md +++ b/configs/basicvsr/README.md @@ -64,7 +64,7 @@ python tools/train.py configs/basicvsr/basicvsr_2xb4_reds4.py ./tools/dist_train.sh configs/basicvsr/basicvsr_2xb4_reds4.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#Train-a-model-in-MMagic). @@ -86,7 +86,7 @@ python tools/test.py configs/basicvsr/basicvsr_2xb4_reds4.py https://download.op ./tools/dist_test.sh configs/basicvsr/basicvsr_2xb4_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.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). +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-MMagic). diff --git a/configs/basicvsr_pp/README.md b/configs/basicvsr_pp/README.md index 75e3c6e7f4..0f3ec7ca3c 100644 --- a/configs/basicvsr_pp/README.md +++ b/configs/basicvsr_pp/README.md @@ -10,7 +10,7 @@ -A recurrent structure is a popular framework choice for the task of video super-resolution. The state-of-the-art method BasicVSR adopts bidirectional propagation with feature alignment to effectively exploit information from the entire input video. In this study, we redesign BasicVSR by proposing second-order grid propagation and flow-guided deformable alignment. We show that by empowering the recurrent framework with the enhanced propagation and alignment, one can exploit spatiotemporal information across misaligned video frames more effectively. The new components lead to an improved performance under a similar computational constraint. In particular, our model BasicVSR++ surpasses BasicVSR by 0.82 dB in PSNR with similar number of parameters. In addition to video super-resolution, BasicVSR++ generalizes well to other video restoration tasks such as compressed video enhancement. In NTIRE 2021, BasicVSR++ obtains three champions and one runner-up in the Video Super-Resolution and Compressed Video Enhancement Challenges. Codes and models will be released to MMEditing. +A recurrent structure is a popular framework choice for the task of video super-resolution. The state-of-the-art method BasicVSR adopts bidirectional propagation with feature alignment to effectively exploit information from the entire input video. In this study, we redesign BasicVSR by proposing second-order grid propagation and flow-guided deformable alignment. We show that by empowering the recurrent framework with the enhanced propagation and alignment, one can exploit spatiotemporal information across misaligned video frames more effectively. The new components lead to an improved performance under a similar computational constraint. In particular, our model BasicVSR++ surpasses BasicVSR by 0.82 dB in PSNR with similar number of parameters. In addition to video super-resolution, BasicVSR++ generalizes well to other video restoration tasks such as compressed video enhancement. In NTIRE 2021, BasicVSR++ obtains three champions and one runner-up in the Video Super-Resolution and Compressed Video Enhancement Challenges. Codes and models will be released to MMagic. @@ -45,7 +45,7 @@ The pretrained weights of SPyNet can be found [here](https://download.openmmlab. **NTIRE 2021 checkpoints** -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. +Note that the following models are finetuned from smaller models. The training schemes of these models will be released when MMagic reaches 5k stars. We provide the pre-trained models here. | Model | Dataset | Download | | :------------------------------------------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------------------: | @@ -76,7 +76,7 @@ python tools/train.py configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py ./tools/dist_train.sh configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.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#Train-a-model-in-MMagic). @@ -98,7 +98,7 @@ python tools/test.py configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py ht ./tools/dist_test.sh configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217-db622b2f.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). +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-MMagic). diff --git a/configs/basicvsr_pp/README_zh-CN.md b/configs/basicvsr_pp/README_zh-CN.md index 3048631f78..6ed8983012 100644 --- a/configs/basicvsr_pp/README_zh-CN.md +++ b/configs/basicvsr_pp/README_zh-CN.md @@ -29,7 +29,7 @@ SPyNet 的 预训练权重在[这里](https://download.openmmlab.com/mmediting/r
    NTIRE 2021 模型权重文件 -请注意,以下模型是从较小的模型中微调而来的。 这些模型的训练方案将在 MMEditing 达到 5k star 时发布。 我们在这里提供预训练的模型。 +请注意,以下模型是从较小的模型中微调而来的。 这些模型的训练方案将在 MMagic 达到 5k star 时发布。 我们在这里提供预训练的模型。 | 算法 | 模型 | 赛道 | | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------ | diff --git a/configs/cain/README.md b/configs/cain/README.md index 608462b9ea..2876d18b9d 100644 --- a/configs/cain/README.md +++ b/configs/cain/README.md @@ -48,7 +48,7 @@ python tools/train.py configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py ./tools/dist_train.sh configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.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#Train-a-model-in-MMagic).
    @@ -70,7 +70,7 @@ python tools/test.py configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py https://do ./tools/dist_test.sh configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_g1b32_vimeo90k_triplet_20220530-3520b00c.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). +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-MMagic). diff --git a/configs/cyclegan/README.md b/configs/cyclegan/README.md index 928e5d1373..a3ae07a01c 100644 --- a/configs/cyclegan/README.md +++ b/configs/cyclegan/README.md @@ -21,7 +21,7 @@ Image-to-image translation is a class of vision and graphics problems where the ## Results and Models
    - Results from CycleGAN trained by mmediting + Results from CycleGAN trained by mmagic
    diff --git a/configs/deepfillv1/README.md b/configs/deepfillv1/README.md index 2015986b11..f1f956abee 100644 --- a/configs/deepfillv1/README.md +++ b/configs/deepfillv1/README.md @@ -52,7 +52,7 @@ python tools/train.py configs/deepfillv1/deepfillv1_8xb2_places-256x256.py ./tools/dist_train.sh configs/deepfillv1/deepfillv1_8xb2_places-256x256.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#Train-a-model-in-MMagic). @@ -74,7 +74,7 @@ python tools/test.py configs/deepfillv1/deepfillv1_8xb2_places-256x256.py https: ./tools/dist_test.sh configs/deepfillv1/deepfillv1_8xb2_places-256x256.py https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_8x2_places_20200619-c00a0e21.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). +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-MMagic). diff --git a/configs/deepfillv2/README.md b/configs/deepfillv2/README.md index c0ab474195..f7998466cf 100644 --- a/configs/deepfillv2/README.md +++ b/configs/deepfillv2/README.md @@ -52,7 +52,7 @@ python tools/train.py configs/deepfillv2/deepfillv2_8xb2_places-256x256.py ./tools/dist_train.sh configs/deepfillv2/deepfillv2_8xb2_places-256x256.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#Train-a-model-in-MMagic). @@ -74,7 +74,7 @@ python tools/test.py configs/deepfillv2/deepfillv2_8xb2_places-256x256.py https: ./tools/dist_test.sh configs/deepfillv2/deepfillv2_8xb2_places-256x256.py https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_places_20200619-10d15793.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). +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-MMagic). diff --git a/configs/dic/README.md b/configs/dic/README.md index 4d087c7dea..b33213fc06 100644 --- a/configs/dic/README.md +++ b/configs/dic/README.md @@ -52,7 +52,7 @@ python tools/train.py configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py ./tools/dist_train.sh configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.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#Train-a-model-in-MMagic). @@ -74,7 +74,7 @@ python tools/test.py configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py https:// ./tools/dist_test.sh configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.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). +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-MMagic). diff --git a/configs/dim/README.md b/configs/dim/README.md index 411d001e2c..5d4164dce9 100644 --- a/configs/dim/README.md +++ b/configs/dim/README.md @@ -90,7 +90,7 @@ python tools/train.py configs/dim/dim_stage3-v16-pln_1xb1-1000k_comp1k.py ./tools/dist_train.sh configs/dim/dim_stage3-v16-pln_1xb1-1000k_comp1k.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#Train-a-model-in-MMagic). @@ -112,7 +112,7 @@ python tools/test.py configs/dim/dim_stage3-v16-pln_1xb1-1000k_comp1k.py https:/ ./tools/dist_test.sh configs/dim/dim_stage3-v16-pln_1xb1-1000k_comp1k.py https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.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). +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-MMagic). diff --git a/configs/disco_diffusion/README.md b/configs/disco_diffusion/README.md index 61e0f549fb..cafa749b3e 100644 --- a/configs/disco_diffusion/README.md +++ b/configs/disco_diffusion/README.md @@ -104,7 +104,7 @@ save_image(image, "image.png") ## Tutorials -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/main/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/mmagic/blob/main/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/README_zh-CN.md b/configs/disco_diffusion/README_zh-CN.md index 51a7f9d99f..c906a7fd58 100644 --- a/configs/disco_diffusion/README_zh-CN.md +++ b/configs/disco_diffusion/README_zh-CN.md @@ -78,7 +78,7 @@ Disco Diffusion(DD)是一个 Google Colab 笔记本,它利用一种叫做 CLIP ```python from mmengine import Config, MODELS -from mmedit.utils import register_all_modules +from mmagic.utils import register_all_modules from torchvision.utils import save_image register_all_modules() @@ -104,7 +104,7 @@ save_image(image, "image.png") ## 教程 -考虑到`disco-diffusion`包含许多可调整的参数,我们为用户提供了一个[jupyter-notebook](./tutorials.ipynb)/[colab](https://githubtocolab.com/open-mmlab/mmediting/blob/main/configs/disco_diffusion/tutorials.ipynb)的教程,展示了不同参数的含义,并给出相应的调整结果。 +考虑到`disco-diffusion`包含许多可调整的参数,我们为用户提供了一个[jupyter-notebook](./tutorials.ipynb)/[colab](https://githubtocolab.com/open-mmlab/mmagic/blob/main/configs/disco_diffusion/tutorials.ipynb)的教程,展示了不同参数的含义,并给出相应的调整结果。 请参考[Disco Sheet](https://docs.google.com/document/d/1l8s7uS2dGqjztYSjPpzlmXLjl5PM3IGkRWI3IiCuK7g/edit)。 ## 鸣谢 diff --git a/configs/disco_diffusion/tutorials.ipynb b/configs/disco_diffusion/tutorials.ipynb index 0f3409f4f3..157e83c276 100644 --- a/configs/disco_diffusion/tutorials.ipynb +++ b/configs/disco_diffusion/tutorials.ipynb @@ -42,7 +42,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Install MMEditing" + "## Install MMagic" ] }, { @@ -73,11 +73,11 @@ "metadata": {}, "outputs": [], "source": [ - "# Install mmediting from source\n", + "# Install mmagic from source\n", "%cd /content/\n", - "!rm -rf mmediting\n", - "!git clone https://github.com/open-mmlab/mmediting.git \n", - "%cd mmediting\n", + "!rm -rf mmagic\n", + "!git clone https://github.com/open-mmlab/mmagic.git \n", + "%cd mmagic\n", "!pip install -r requirements.txt\n", "!pip install -e ." ] @@ -98,14 +98,14 @@ "import torch\n", "from mmengine import Config, MODELS\n", "from mmengine.registry import init_default_scope\n", - "from mmedit.registry import MODULES\n", + "from mmagic.registry import MODULES\n", "from mmcv import tensor2imgs\n", "from matplotlib import pyplot as plt\n", "\n", "from torchvision.transforms import ToPILImage, Normalize, Compose\n", "from IPython.display import Image\n", "\n", - "init_default_scope('mmedit')\n", + "init_default_scope('mmagic')\n", "\n", "\n", "def show_tensor(image_tensor, index=0):\n", @@ -290,7 +290,7 @@ "metadata": {}, "outputs": [], "source": [ - "from mmedit.models.editors.disco_diffusion.guider import ImageTextGuider\n", + "from mmagic.models.editors.disco_diffusion.guider import ImageTextGuider\n", "\n", "\n", "config = 'configs/disco_diffusion/disco-diffusion_adm-u-finetuned_imagenet-512x512.py'\n", diff --git a/configs/edsr/README.md b/configs/edsr/README.md index 731f8f0828..74a24e47ba 100644 --- a/configs/edsr/README.md +++ b/configs/edsr/README.md @@ -55,7 +55,7 @@ python tools/train.py configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py ./tools/dist_train.sh configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.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#Train-a-model-in-MMagic). @@ -77,7 +77,7 @@ python tools/test.py configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py https://down ./tools/dist_test.sh configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x4c64b16_1x16_300k_div2k_20200608-3c2af8a3.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). +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-MMagic). diff --git a/configs/edvr/README.md b/configs/edvr/README.md index 347b459ff0..e13e975559 100644 --- a/configs/edvr/README.md +++ b/configs/edvr/README.md @@ -50,7 +50,7 @@ python tools/train.py configs/edvr/edvrm_8xb4-600k_reds.py ./tools/dist_train.sh configs/edvr/edvrm_8xb4-600k_reds.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#Train-a-model-in-MMagic). @@ -72,7 +72,7 @@ python tools/test.py configs/edvr/edvrm_8xb4-600k_reds.py https://download.openm ./tools/dist_test.sh configs/edvr/edvrm_8xb4-600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20210625-e29b71b5.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). +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-MMagic). diff --git a/configs/esrgan/README.md b/configs/esrgan/README.md index 61284cf94e..0fe678474d 100644 --- a/configs/esrgan/README.md +++ b/configs/esrgan/README.md @@ -52,7 +52,7 @@ python tools/train.py configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py ./tools/dist_train.sh configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.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#Train-a-model-in-MMagic). @@ -74,7 +74,7 @@ python tools/test.py configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py https ./tools/dist_test.sh configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.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). +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-MMagic). diff --git a/configs/flavr/README.md b/configs/flavr/README.md index f3d6bf1bc4..94d887c5d2 100644 --- a/configs/flavr/README.md +++ b/configs/flavr/README.md @@ -49,7 +49,7 @@ python tools/train.py configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py ./tools/dist_train.sh configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.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#Train-a-model-in-MMagic). @@ -71,7 +71,7 @@ python tools/test.py configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py http ./tools/dist_test.sh configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py https://download.openmmlab.com/mmediting/video_interpolators/flavr/flavr_in4out1_g8b4_vimeo90k_septuplet_20220509-c2468995.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). +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-MMagic). diff --git a/configs/gca/README.md b/configs/gca/README.md index 0bdbd3dff2..5efc0ddadc 100644 --- a/configs/gca/README.md +++ b/configs/gca/README.md @@ -50,7 +50,7 @@ python tools/train.py configs/gca/gca_r34_4xb10-200k_comp1k.py ./tools/dist_train.sh configs/gca/gca_r34_4xb10-200k_comp1k.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#Train-a-model-in-MMagic). @@ -72,7 +72,7 @@ python tools/test.py configs/gca/gca_r34_4xb10-200k_comp1k.py https://download.o ./tools/dist_test.sh configs/gca/gca_r34_4xb10-200k_comp1k.py https://download.openmmlab.com/mmediting/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-33.38_20220615-65595f39.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). +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-MMagic). diff --git a/configs/glean/README.md b/configs/glean/README.md index 24bbd7fd31..2866434de4 100644 --- a/configs/glean/README.md +++ b/configs/glean/README.md @@ -52,7 +52,7 @@ python tools/train.py configs/glean/glean_x8_2xb8_cat.py ./tools/dist_train.sh configs/glean/glean_x8_2xb8_cat.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#Train-a-model-in-MMagic). @@ -74,7 +74,7 @@ python tools/test.py configs/glean/glean_x8_2xb8_cat.py https://download.openmml ./tools/dist_test.sh configs/glean/glean_x8_2xb8_cat.py https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_8x_20210614-d3ac8683.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). +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-MMagic). diff --git a/configs/global_local/README.md b/configs/global_local/README.md index 6568cef73d..5dbde254fc 100644 --- a/configs/global_local/README.md +++ b/configs/global_local/README.md @@ -47,7 +47,7 @@ python tools/train.py configs/global_local/gl_8xb12_places-256x256.py ./tools/dist_train.sh configs/global_local/gl_8xb12_places-256x256.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#Train-a-model-in-MMagic). @@ -69,7 +69,7 @@ python tools/test.py configs/global_local/gl_8xb12_places-256x256.py https://dow ./tools/dist_test.sh configs/global_local/gl_8xb12_places-256x256.py https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_places_20200619-52a040a8.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). +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-MMagic). diff --git a/configs/guided_diffusion/README.md b/configs/guided_diffusion/README.md index 078669b991..c981e33888 100644 --- a/configs/guided_diffusion/README.md +++ b/configs/guided_diffusion/README.md @@ -95,7 +95,7 @@ python tools/test.py configs/guided_diffusion/adm-u_ddim250_8xb32_imagenet-64x64 ./tools/dist_test.sh configs/guided_diffusion/adm-u_ddim250_8xb32_imagenet-64x64.py https://download.openmmlab.com/mmgen/guided_diffusion/adm-u-cvt-rgb_8xb32_imagenet-64x64-7ff0080b.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). +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-MMagic). diff --git a/configs/iconvsr/README.md b/configs/iconvsr/README.md index 1f84ab5b78..91b70a04f4 100644 --- a/configs/iconvsr/README.md +++ b/configs/iconvsr/README.md @@ -64,7 +64,7 @@ python tools/train.py configs/iconvsr/iconvsr_2xb4_reds4.py ./tools/dist_train.sh configs/iconvsr/iconvsr_2xb4_reds4.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#Train-a-model-in-MMagic). @@ -86,7 +86,7 @@ python tools/test.py configs/iconvsr/iconvsr_2xb4_reds4.py https://download.open ./tools/dist_test.sh configs/iconvsr/iconvsr_2xb4_reds4.py https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413-9e09d621.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). +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-MMagic). diff --git a/configs/indexnet/README.md b/configs/indexnet/README.md index 49e0cf65df..3bb1290e37 100644 --- a/configs/indexnet/README.md +++ b/configs/indexnet/README.md @@ -49,7 +49,7 @@ python tools/train.py configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py ./tools/dist_train.sh configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.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#Train-a-model-in-MMagic). @@ -71,7 +71,7 @@ python tools/test.py configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py https:/ ./tools/dist_test.sh configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.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). +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-MMagic). diff --git a/configs/inst_colorization/README.md b/configs/inst_colorization/README.md index 691d14c7a6..ad3610b4ba 100644 --- a/configs/inst_colorization/README.md +++ b/configs/inst_colorization/README.md @@ -36,7 +36,7 @@ You can use the following commands to colorize an image. 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/latest/user_guides/3_inference.html). +For more demos, you can refer to [Tutorial 3: inference with pre-trained models](https://mmagic.readthedocs.io/en/latest/user_guides/3_inference.html). diff --git a/configs/liif/README.md b/configs/liif/README.md index 487dc3c0b5..b21db83d86 100644 --- a/configs/liif/README.md +++ b/configs/liif/README.md @@ -84,7 +84,7 @@ python tools/train.py configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.py ./tools/dist_train.sh configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.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#Train-a-model-in-MMagic). @@ -106,7 +106,7 @@ python tools/test.py configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.py htt ./tools/dist_test.sh configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/liif/liif_edsr_norm_c64b16_g1_1000k_div2k_20210715-ab7ce3fc.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). +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-MMagic). diff --git a/configs/nafnet/README.md b/configs/nafnet/README.md index 00e52c9fb1..5c0476b012 100644 --- a/configs/nafnet/README.md +++ b/configs/nafnet/README.md @@ -27,7 +27,7 @@ Although there have been significant advances in the field of image restoration Note: -- a(b) where a denotes the value run by MMEditing, b denotes the value copied from the original paper. +- a(b) where a denotes the value run by MMagic, b denotes the value copied from the original paper. - PSNR is evaluated on RGB channels. - SSIM is evaluated by averaging SSIMs on RGB channels, however the original paper uses the 3D SSIM kernel. diff --git a/configs/nafnet/README_zh-CN.md b/configs/nafnet/README_zh-CN.md index 4c337a8864..8b1299d16e 100644 --- a/configs/nafnet/README_zh-CN.md +++ b/configs/nafnet/README_zh-CN.md @@ -25,7 +25,7 @@ Note: -- 评估结果a(b)中,a代表由MMEditing测量,b代表由原论文提供。 +- 评估结果a(b)中,a代表由MMagic测量,b代表由原论文提供。 - PSNR是在RGB通道评估。 - SSIM是平均的分别在RGB通道评估的SSIM, 而原论文使用了3D的SSIM卷积核做统一评估。 diff --git a/configs/partial_conv/README.md b/configs/partial_conv/README.md index 20db832efe..f988299129 100644 --- a/configs/partial_conv/README.md +++ b/configs/partial_conv/README.md @@ -47,7 +47,7 @@ python tools/train.py configs/partial_conv/pconv_stage2_4xb2_places-256x256.py ./tools/dist_train.sh configs/partial_conv/pconv_stage2_4xb2_places-256x256.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#Train-a-model-in-MMagic). @@ -69,7 +69,7 @@ python tools/test.py configs/partial_conv/pconv_stage2_4xb2_places-256x256.py ht ./tools/dist_test.sh configs/partial_conv/pconv_stage2_4xb2_places-256x256.py https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_places_20200619-1ffed0e8.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). +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-MMagic). diff --git a/configs/pix2pix/README.md b/configs/pix2pix/README.md index 302fb41cfc..2bbd1fb930 100644 --- a/configs/pix2pix/README.md +++ b/configs/pix2pix/README.md @@ -21,7 +21,7 @@ We investigate conditional adversarial networks as a general-purpose solution to ## Results and Models
    - Results from Pix2Pix trained by mmediting + Results from Pix2Pix trained by mmagic
    diff --git a/configs/rdn/README.md b/configs/rdn/README.md index 7e759fc0a3..6df501845d 100644 --- a/configs/rdn/README.md +++ b/configs/rdn/README.md @@ -55,7 +55,7 @@ python tools/train.py configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py ./tools/dist_train.sh configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.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#Train-a-model-in-MMagic). @@ -77,7 +77,7 @@ python tools/test.py configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py https://downl ./tools/dist_test.sh configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x4c64b16_g1_1000k_div2k_20210419-3577d44f.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). +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-MMagic). diff --git a/configs/real_basicvsr/README.md b/configs/real_basicvsr/README.md index 4ec1d1a17c..86d3abbfba 100644 --- a/configs/real_basicvsr/README.md +++ b/configs/real_basicvsr/README.md @@ -47,7 +47,7 @@ python tools/train.py configs/real_basicvsr/realbasicvsr_c64b20-1x30x8_8xb1-lr5e ./tools/dist_train.sh configs/real_basicvsr/realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.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#Train-a-model-in-MMagic). @@ -69,7 +69,7 @@ python tools/test.py python tools/test.py configs/real_basicvsr/realbasicvsr_c64 ./tools/dist_test.sh configs/real_basicvsr/realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds_20211104-52f77c2c.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). +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-MMagic). diff --git a/configs/real_esrgan/README.md b/configs/real_esrgan/README.md index bc66871e5c..969672cf37 100644 --- a/configs/real_esrgan/README.md +++ b/configs/real_esrgan/README.md @@ -47,7 +47,7 @@ python tools/train.py configs/real_esrgan/realesrgan_c64b23g32_4xb12-lr1e-4-400k ./tools/dist_train.sh configs/real_esrgan/realesrgan_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.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#Train-a-model-in-MMagic). @@ -69,7 +69,7 @@ python tools/test.py configs/real_esrgan/realesrgan_c64b23g32_4xb12-lr1e-4-400k_ ./tools/dist_test.sh configs/real_esrgan/realesrgan_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.py https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost_20211010-34798885.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). +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-MMagic). diff --git a/configs/restormer/README.md b/configs/restormer/README.md index 56d8771750..739bb625d1 100644 --- a/configs/restormer/README.md +++ b/configs/restormer/README.md @@ -139,7 +139,7 @@ Evaluated on RGB channels. The metrics are `PSNR` / `SSIM` . **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). +You can refer to **Train a model** part in [train_test.md](/docs/en/user_guides/train_test.md#Train-a-model-in-MMagic). @@ -292,7 +292,7 @@ python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py ``` -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#Test-a-pre-trained-model-in-MMagic). diff --git a/configs/srcnn/README.md b/configs/srcnn/README.md index 50dce2a1b9..4e9764cd9b 100644 --- a/configs/srcnn/README.md +++ b/configs/srcnn/README.md @@ -49,7 +49,7 @@ python tools/train.py configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py ./tools/dist_train.sh configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.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#Train-a-model-in-MMagic). @@ -71,7 +71,7 @@ python tools/test.py configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py https://dow ./tools/dist_test.sh configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.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). +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-MMagic). diff --git a/configs/srgan_resnet/README.md b/configs/srgan_resnet/README.md index 352deff1ec..0e0d3498c2 100644 --- a/configs/srgan_resnet/README.md +++ b/configs/srgan_resnet/README.md @@ -53,7 +53,7 @@ python tools/train.py configs/srgan_resnet/srgan_x4c64b16_1xb16-1000k_div2k.py ./tools/dist_train.sh configs/srgan_resnet/srgan_x4c64b16_1xb16-1000k_div2k.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#Train-a-model-in-MMagic). @@ -75,7 +75,7 @@ python tools/test.py configs/srgan_resnet/srgan_x4c64b16_1xb16-1000k_div2k.py ht ./tools/dist_test.sh configs/srgan_resnet/srgan_x4c64b16_1xb16-1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/srgan_x4c64b16_1x16_1000k_div2k_20200606-a1f0810e.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). +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-MMagic). diff --git a/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py b/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py index a484a470a8..139ab49c8a 100644 --- a/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py +++ b/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py @@ -1,4 +1,4 @@ -# MMEditing's implementation of Stable Diffusion +# MMagic's implementation of Stable Diffusion # unet = dict( # type='DenoisingUnet', # image_size=512, diff --git a/configs/styleganv1/README.md b/configs/styleganv1/README.md index 589e67ee5f..a636db5c80 100644 --- a/configs/styleganv1/README.md +++ b/configs/styleganv1/README.md @@ -21,7 +21,7 @@ We propose an alternative generator architecture for generative adversarial netw ## Results and Models
    - Results (compressed) from StyleGANv1 trained by mmediting + Results (compressed) from StyleGANv1 trained by mmagic
    diff --git a/configs/styleganv2/README.md b/configs/styleganv2/README.md index c70cd5a88c..b5f160990c 100644 --- a/configs/styleganv2/README.md +++ b/configs/styleganv2/README.md @@ -21,7 +21,7 @@ The style-based GAN architecture (StyleGAN) yields state-of-the-art results in d ## Results and Models
    - Results (compressed) from StyleGAN2 config-f trained by mmediting + Results (compressed) from StyleGAN2 config-f trained by mmagic
    diff --git a/configs/styleganv3/README.md b/configs/styleganv3/README.md index f9c314d342..41962e7ede 100644 --- a/configs/styleganv3/README.md +++ b/configs/styleganv3/README.md @@ -28,7 +28,7 @@ results pave the way for generative models better suited for video and animation ## Results and Models
    - Results (compressed) from StyleGAN3 config-T converted by mmediting + Results (compressed) from StyleGAN3 config-T converted by mmagic
    diff --git a/configs/swinir/README.md b/configs/swinir/README.md index 12be0700f5..dbac350170 100644 --- a/configs/swinir/README.md +++ b/configs/swinir/README.md @@ -303,7 +303,7 @@ python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb- ./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). +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-MMagic). @@ -536,7 +536,7 @@ python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-c ``` -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#Test-a-pre-trained-model-in-MMagic). diff --git a/configs/tdan/README.md b/configs/tdan/README.md index d8ba86ba41..1a65e8b9cc 100644 --- a/configs/tdan/README.md +++ b/configs/tdan/README.md @@ -73,7 +73,7 @@ python tools/train.py configs/tdan/tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi.py ./tools/dist_train.sh configs/tdan/tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi.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#Train-a-model-in-MMagic). @@ -95,7 +95,7 @@ python tools/test.py configs/tdan/tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi.py htt ./tools/dist_test.sh configs/tdan/tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi.py https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.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). +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-MMagic). diff --git a/configs/tof/README.md b/configs/tof/README.md index 677d4e6cef..c5e1fb416d 100644 --- a/configs/tof/README.md +++ b/configs/tof/README.md @@ -70,7 +70,7 @@ python tools/train.py configs/tof/tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py ./tools/dist_train.sh configs/tof/tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.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#Train-a-model-in-MMagic). @@ -109,7 +109,7 @@ python tools/test.py configs/tof/tof_x4_official_vimeo90k.py https://download.op ./tools/dist_test.sh configs/tof/tof_x4_official_vimeo90k.py https://download.openmmlab.com/mmediting/restorers/tof/tof_x4_vimeo90k_official-a569ff50.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). +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-MMagic). diff --git a/configs/ttsr/README.md b/configs/ttsr/README.md index 6a2ca38c5d..1b93644b51 100644 --- a/configs/ttsr/README.md +++ b/configs/ttsr/README.md @@ -48,7 +48,7 @@ python tools/train.py configs/ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.py ./tools/dist_train.sh configs/ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.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#Train-a-model-in-MMagic). @@ -70,7 +70,7 @@ python tools/test.py configs/ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.py https://d ./tools/dist_test.sh configs/ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.py https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.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). +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-MMagic). From 31198a9e0f9d61544b4921db09b0f3dfc7624dd6 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Fri, 21 Apr 2023 15:22:36 +0800 Subject: [PATCH 29/42] [Enhancment] Rename class names for MMagic (#1784) * rename EditIterTimeHook -> IterTimeHook * rename EditLogProcessor -> LogProcessor * rename EditDataSample -> DataSample * rename GenVisualizer -> Visualizer * rename GenVisualizationHook -> VisualizationHook * revise registry scope of IterTimeHook * revise registry scope of LogProcessor --- .dev_scripts/create_ceph_configs.py | 16 ++-- configs/_base_/default_runtime.py | 4 +- configs/_base_/gen_default_runtime.py | 8 +- .../biggan_2xb25-500kiters_cifar10-32x32.py | 2 +- ...-sn_8xb32-1500kiters_imagenet1k-128x128.py | 2 +- configs/controlnet/controlnet-1xb1-fill50k.py | 2 +- ...-resnet-in_1xb1-250kiters_summer2winter.py | 2 +- ...d0-resnet-in_1xb1-270kiters_horse2zebra.py | 2 +- ...gan-id0-resnet-in_1xb1-80kiters_facades.py | 2 +- ...-resnet-in_1xb1-250kiters_summer2winter.py | 2 +- ...an-resnet-in_1xb1-270kiters_horse2zebra.py | 2 +- ...n_lsgan-resnet-in_1xb1-80kiters_facades.py | 2 +- ...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 | 2 +- .../dreambooth-finetune_text_encoder.py | 2 +- configs/dreambooth/dreambooth-lora.py | 2 +- configs/dreambooth/dreambooth.py | 2 +- .../eg3d_cvt-official-rgb_afhq-512x512.py | 2 +- .../eg3d_cvt-official-rgb_ffhq-512x512.py | 2 +- .../eg3d_cvt-official-rgb_shapenet-128x128.py | 2 +- ...e-3-1xb128-12Mimgs_celeba-cropped-64x64.py | 2 +- ...-4-1xb64-10Mimgs_celeba-cropped-128x128.py | 2 +- ...r1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py | 2 +- .../adm_ddim250_8xb32_imagenet-256x256.py | 2 +- ...e-3-1xb128-12Mimgs_celeba-cropped-64x64.py | 2 +- .../pggan_8xb4-12Mimg_celeba-hq-1024x1024.py | 2 +- ...gan_8xb4-12Mimgs_celeba-cropped-128x128.py | 2 +- ...illa-unet-bn_1xb1-220kiters_aerial2maps.py | 2 +- ...illa-unet-bn_1xb1-220kiters_maps2aerial.py | 2 +- ...x_vanilla-unet-bn_1xb1-80kiters_facades.py | 2 +- ...-jitter-flip-1xb4-190kiters_edges2shoes.py | 2 +- ...onfig-c_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-d_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-e_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...nfig-f_c1_8xb2-1600kiters_ffhq-256-1024.py | 2 +- ...onfig-f_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-f_c2_8xb3-1100kiters_ffhq-256-896.py | 2 +- ...onfig-g_c1_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-h_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-i_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-j_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-k_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...ylegan2_c2_8xb3-1100kiters_ffhq-256x256.py | 2 +- ...ylegan2_c2_8xb3-1100kiters_ffhq-512x512.py | 2 +- ...place_lr2e-4-ndisc5-1xb64_cifar10-32x32.py | 2 +- ...sc1-8xb32-bigGAN-sch_imagenet1k-128x128.py | 2 +- ...Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py | 2 +- ...place_lr2e-4-ndisc5-1xb64_cifar10-32x32.py | 2 +- configs/singan/singan_balloons.py | 2 +- configs/singan/singan_bohemian.py | 2 +- configs/singan/singan_fish.py | 2 +- ...lr5e-5_ndisc5-2xb128_imagenet1k-128x128.py | 2 +- ...place_lr2e-4-ndisc5-1xb64_cifar10-32x32.py | 2 +- ...lr5e-5_ndisc5-2xb128_imagenet1k-128x128.py | 2 +- ...place_lr2e-4-ndisc5-1xb64_cifar10-32x32.py | 2 +- .../styleganv1_ffhq-1024x1024_8xb4-25Mimgs.py | 2 +- .../styleganv1_ffhq-256x256_8xb4-25Mimgs.py | 2 +- ...tylegan2_c2_8xb4-800kiters_ffhq-256x256.py | 2 +- ...gan2_c2_8xb4-800kiters_lsun-cat-256x256.py | 2 +- ...2_c2_8xb4-800kiters_lsun-church-256x256.py | 2 +- ...n2_c2_8xb4-800kiters_lsun-horse-256x256.py | 2 +- .../stylegan2_c2_8xb4_ffhq-1024x1024.py | 2 +- .../stylegan2_c2_8xb4_lsun-car-384x512.py | 2 +- ...a-gamma3.3_8xb4-fp16_metfaces-1024x1024.py | 2 +- ...a-gamma6.6_8xb4-fp16_metfaces-1024x1024.py | 2 +- ...t_gamma2.0_8xb4-fp16-noaug_ffhq-256x256.py | 2 +- ...amma32.8_8xb4-fp16-noaug_ffhq-1024x1024.py | 2 +- ..._1xb64-160kiters_celeba-cropped-128x128.py | 2 +- docs/en/howto/models.md | 8 +- docs/en/howto/transforms.md | 2 +- docs/en/migration/visualization.md | 2 +- docs/en/user_guides/config.md | 6 +- docs/en/user_guides/visualization.md | 56 ++++++------- .../inferencers/colorization_inferencer.py | 4 +- .../inferencers/conditional_inferencer.py | 6 +- mmagic/apis/inferencers/eg3d_inferencer.py | 6 +- .../apis/inferencers/inference_functions.py | 8 +- .../apis/inferencers/inpainting_inferencer.py | 4 +- mmagic/apis/inferencers/matting_inferencer.py | 8 +- .../inferencers/unconditional_inferencer.py | 6 +- mmagic/datasets/transforms/formatting.py | 10 +-- mmagic/engine/hooks/__init__.py | 8 +- mmagic/engine/hooks/iter_time_hook.py | 19 ++--- mmagic/engine/hooks/visualization_hook.py | 18 ++--- mmagic/engine/runner/__init__.py | 4 +- mmagic/engine/runner/log_processor.py | 17 ++-- mmagic/evaluation/evaluator.py | 8 +- mmagic/evaluation/metrics/base_gen_metric.py | 6 +- .../base_models/base_conditional_gan.py | 27 +++---- mmagic/models/base_models/base_edit_model.py | 30 +++---- mmagic/models/base_models/base_gan.py | 23 +++--- mmagic/models/base_models/base_mattor.py | 35 ++++---- mmagic/models/base_models/one_stage.py | 18 ++--- .../edit_data_preprocessor.py | 69 ++++++++-------- .../data_preprocessors/mattor_preprocessor.py | 10 +-- mmagic/models/editors/basicvsr/basicvsr.py | 6 +- mmagic/models/editors/biggan/biggan.py | 10 +-- mmagic/models/editors/cain/cain.py | 2 +- .../models/editors/controlnet/controlnet.py | 6 +- mmagic/models/editors/cyclegan/cyclegan.py | 10 +-- mmagic/models/editors/dcgan/dcgan.py | 10 +-- mmagic/models/editors/dic/dic.py | 2 +- mmagic/models/editors/dim/dim.py | 2 +- .../models/editors/dreambooth/dreambooth.py | 12 ++- mmagic/models/editors/eg3d/eg3d.py | 31 ++++--- mmagic/models/editors/ggan/ggan.py | 11 ++- mmagic/models/editors/guided_diffusion/adm.py | 10 +-- .../inst_colorization/inst_colorization.py | 12 +-- mmagic/models/editors/liif/liif.py | 6 +- mmagic/models/editors/lsgan/lsgan.py | 10 +-- .../models/editors/mspie/mspie_stylegan2.py | 10 +-- mmagic/models/editors/pggan/pggan.py | 21 +++-- mmagic/models/editors/pix2pix/pix2pix.py | 10 +-- .../editors/real_basicvsr/real_basicvsr.py | 4 +- .../models/editors/real_esrgan/real_esrgan.py | 2 +- mmagic/models/editors/sagan/sagan.py | 10 +-- mmagic/models/editors/singan/singan.py | 29 ++++--- mmagic/models/editors/srgan/srgan.py | 2 +- .../stable_diffusion/stable_diffusion.py | 8 +- mmagic/models/editors/stylegan2/stylegan2.py | 10 +-- mmagic/models/editors/stylegan3/stylegan3.py | 23 +++--- mmagic/models/editors/ttsr/ttsr.py | 4 +- mmagic/models/editors/wgan_gp/wgan_gp.py | 10 +-- mmagic/models/utils/model_utils.py | 4 +- mmagic/structures/__init__.py | 4 +- .../{edit_data_sample.py => data_sample.py} | 65 ++++++++++----- mmagic/visualization/__init__.py | 10 +-- mmagic/visualization/concat_visualizer.py | 8 +- mmagic/visualization/vis_backend.py | 32 ++++---- .../{gen_visualizer.py => visualizer.py} | 18 ++--- projects/glide/models/glide.py | 14 ++-- .../test_transforms/test_formatting.py | 4 +- .../test_hooks/test_iter_time_hook.py | 4 +- .../test_hooks/test_visualization_hook.py | 71 ++++++++-------- .../test_runner/test_log_processor.py | 2 +- tests/test_evaluation/test_evaluator.py | 4 +- .../test_evaluation/test_metrics/test_fid.py | 11 ++- .../test_metrics/test_inception_score.py | 17 ++-- .../test_metrics/test_ms_ssim.py | 15 ++-- .../test_evaluation/test_metrics/test_swd.py | 8 +- .../test_base_conditional_gan.py | 12 +-- .../test_base_models/test_base_edit_model.py | 4 +- .../test_base_models/test_base_gan.py | 10 +-- .../test_base_models/test_base_mattor.py | 10 +-- .../test_base_models/test_one_stage.py | 6 +- .../test_base_models/test_two_stage.py | 4 +- .../test_edit_data_preprocessor.py | 81 +++++++++---------- .../test_mattor_preprocessor.py | 12 +-- .../test_aotgan/test_aot_inpaintor.py | 4 +- .../test_basicvsr/test_basicvsr.py | 4 +- .../test_editors/test_biggan/test_biggan.py | 4 +- .../test_editors/test_cain/test_cain.py | 4 +- .../test_controlnet/test_controlnet.py | 11 +-- .../test_cyclegan/test_cyclegan.py | 4 +- .../test_editors/test_dcgan/test_dcgan.py | 4 +- .../test_deepfillv1/test_deepfillv1.py | 4 +- .../test_two_stage_encoder_decoder.py | 4 +- .../test_editors/test_dic/test_dic.py | 5 +- .../test_editors/test_dim/test_dim.py | 12 +-- .../test_dreambooth/test_dreambooth.py | 11 +-- .../test_editors/test_edvr/test_edvr.py | 4 +- .../test_editors/test_eg3d/test_eg3d.py | 6 +- .../test_editors/test_esrgan/test_esrgan.py | 4 +- .../test_editors/test_gca/test_gca.py | 10 +-- .../test_editors/test_ggan/test_ggan.py | 4 +- .../test_glean/test_glean_styleganv2.py | 4 +- .../test_global_local/test_gl_inpaintor.py | 4 +- .../test_indexnet/test_indexnet.py | 8 +- .../test_inst_colorization.py | 6 +- .../test_editors/test_liif/test_liif.py | 10 +-- .../test_editors/test_lsgan/test_lsgan.py | 4 +- .../test_mspie/test_mspie_stylegan2.py | 4 +- .../test_pconv/test_pconv_inpaintor.py | 4 +- .../test_editors/test_pggan/test_pggan.py | 11 ++- .../test_real_basicvsr/test_real_basicvsr.py | 4 +- .../test_real_esrgan/test_real_esrgan.py | 4 +- .../test_editors/test_sagan/test_sagan.py | 4 +- .../test_editors/test_srgan/test_srgan.py | 4 +- .../test_stylegan1/test_stylegan1.py | 11 ++- .../test_stylegan2/test_stylegan2.py | 4 +- .../test_stylegan3/test_stylegan3.py | 4 +- .../test_editors/test_tdan/test_tdan.py | 4 +- .../test_editors/test_ttsr/test_ttsr.py | 6 +- .../test_editors/test_wgan_gp/test_wgan_gp.py | 4 +- .../test_structures/test_edit_data_sample.py | 37 +++++---- .../test_concat_visualizer.py | 4 +- tests/test_visualization/test_vis_backend.py | 18 ++--- ...t_gen_visualizer.py => test_visualizer.py} | 16 ++-- .../unconditional_gans/README.md | 4 +- 190 files changed, 777 insertions(+), 796 deletions(-) rename mmagic/structures/{edit_data_sample.py => data_sample.py} (84%) rename mmagic/visualization/{gen_visualizer.py => visualizer.py} (96%) rename tests/test_visualization/{test_gen_visualizer.py => test_visualizer.py} (84%) diff --git a/.dev_scripts/create_ceph_configs.py b/.dev_scripts/create_ceph_configs.py index 3c68d988d3..a968d4c52d 100644 --- a/.dev_scripts/create_ceph_configs.py +++ b/.dev_scripts/create_ceph_configs.py @@ -188,7 +188,7 @@ def update_ceph_config(filename, args, dry_run=False): if hasattr(config, 'vis_backends'): # TODO: support upload to ceph # for vis_cfg in config['vis_backends']: - # if vis_cfg['type'] == 'GenVisBackend': + # if vis_cfg['type'] == 'VisBackend': # vis_cfg['ceph_path'] = work_dir # add pavi config @@ -198,7 +198,7 @@ def update_ceph_config(filename, args, dry_run=False): # check if pavi config is inheritance from _base_ find_inherit = False for vis_cfg in config['vis_backends']: - if vis_cfg['type'] == 'PaviGenVisBackend': + if vis_cfg['type'] == 'PaviVisBackend': vis_cfg['exp_name'] = name vis_cfg['project'] = project find_inherit = True @@ -206,9 +206,7 @@ def update_ceph_config(filename, args, dry_run=False): if not find_inherit: pavi_cfg = dict( - type='PaviGenVisBackend', - exp_name=name, - project=project) + type='PaviVisBackend', exp_name=name, project=project) config['vis_backends'].append(pavi_cfg) # add wandb config @@ -218,7 +216,7 @@ def update_ceph_config(filename, args, dry_run=False): # check if wandb config is inheritance from _base_ find_inherit = False for vis_cfg in config['vis_backends']: - if vis_cfg['type'] == 'WandbGenVisBackend': + if vis_cfg['type'] == 'WandbVisBackend': vis_cfg['name'] = name # name of config vis_cfg['project'] = project # name of model find_inherit = True @@ -226,7 +224,7 @@ def update_ceph_config(filename, args, dry_run=False): if not find_inherit: pavi_cfg = dict( - type='WandbGenVisBackend', + type='WandbVisBackend', init_kwargs=dict(name=name, project=project)) config['vis_backends'].append(pavi_cfg) @@ -234,12 +232,12 @@ def update_ceph_config(filename, args, dry_run=False): if args.add_tensorboard: find_inherit = False for vis_cfg in config['vis_backends']: - if vis_cfg['type'] == 'TensorboardGenVisBackend': + if vis_cfg['type'] == 'TensorboardVisBackend': find_inherit = True break if not find_inherit: - tensorboard_cfg = dict(type='TensorboardGenVisBackend') + tensorboard_cfg = dict(type='TensorboardVisBackend') config['vis_backends'].append(tensorboard_cfg) config['visualizer']['vis_backends'] = config['vis_backends'] diff --git a/configs/_base_/default_runtime.py b/configs/_base_/default_runtime.py index 6fcb39779e..c430bef14c 100644 --- a/configs/_base_/default_runtime.py +++ b/configs/_base_/default_runtime.py @@ -2,7 +2,7 @@ save_dir = './work_dirs' default_hooks = dict( - timer=dict(type='EditIterTimerHook'), + timer=dict(type='IterTimerHook'), logger=dict(type='LoggerHook', interval=100), param_scheduler=dict(type='ParamSchedulerHook'), checkpoint=dict( @@ -24,7 +24,7 @@ ) log_level = 'INFO' -log_processor = dict(type='EditLogProcessor', window_size=100, by_epoch=False) +log_processor = dict(type='LogProcessor', window_size=100, by_epoch=False) load_from = None resume = False diff --git a/configs/_base_/gen_default_runtime.py b/configs/_base_/gen_default_runtime.py index c4cd3ded17..03ad5da182 100644 --- a/configs/_base_/gen_default_runtime.py +++ b/configs/_base_/gen_default_runtime.py @@ -11,7 +11,7 @@ # configure for default hooks default_hooks = dict( # record time of every iteration. - timer=dict(type='EditIterTimerHook'), + timer=dict(type='IterTimerHook'), # print log every 100 iterations. logger=dict(type='LoggerHook', interval=100, log_metric_by_epoch=False), # save checkpoint per 10000 iterations @@ -35,7 +35,7 @@ # set log level log_level = 'INFO' -log_processor = dict(type='EditLogProcessor', by_epoch=False) +log_processor = dict(type='LogProcessor', by_epoch=False) # load from which checkpoint load_from = None @@ -50,8 +50,8 @@ find_unused_parameters=False) # set visualizer -vis_backends = [dict(type='GenVisBackend')] -visualizer = dict(type='GenVisualizer', vis_backends=vis_backends) +vis_backends = [dict(type='VisBackend')] +visualizer = dict(type='Visualizer', vis_backends=vis_backends) # config for training train_cfg = dict(by_epoch=False, val_begin=1, val_interval=10000) diff --git a/configs/biggan/biggan_2xb25-500kiters_cifar10-32x32.py b/configs/biggan/biggan_2xb25-500kiters_cifar10-32x32.py index 1b0373f7d4..fccd5d09f6 100644 --- a/configs/biggan/biggan_2xb25-500kiters_cifar10-32x32.py +++ b/configs/biggan/biggan_2xb25-500kiters_cifar10-32x32.py @@ -48,7 +48,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, # vis ema and orig at the same time diff --git a/configs/biggan/biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py b/configs/biggan/biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py index 05d5e775b4..9d50a5131e 100644 --- a/configs/biggan/biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py +++ b/configs/biggan/biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py @@ -31,7 +31,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=10000, fixed_input=True, # vis ema and orig at the same time diff --git a/configs/controlnet/controlnet-1xb1-fill50k.py b/configs/controlnet/controlnet-1xb1-fill50k.py index b3bc93d2d6..fc79680c1c 100644 --- a/configs/controlnet/controlnet-1xb1-fill50k.py +++ b/configs/controlnet/controlnet-1xb1-fill50k.py @@ -70,7 +70,7 @@ # hooks custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=300, fixed_input=True, # visualize train dataset diff --git a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py index 71ff2368dc..ba39bd8fb8 100644 --- a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py +++ b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py @@ -60,7 +60,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ diff --git a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py index d181df168a..c9990d0b10 100644 --- a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py +++ b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py @@ -60,7 +60,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ diff --git a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py index f45653a18a..824d100839 100644 --- a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py +++ b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py @@ -59,7 +59,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ diff --git a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py index 55a0dc1001..e6fb4aeede 100644 --- a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py +++ b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py @@ -60,7 +60,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ diff --git a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py index eb78225d4a..3bdcf09c56 100644 --- a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py +++ b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py @@ -60,7 +60,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ diff --git a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py index bf0646e999..a57a5b2fc1 100644 --- a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py +++ b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py @@ -59,7 +59,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ diff --git a/configs/dcgan/dcgan_1xb128-300kiters_celeba-cropped-64.py b/configs/dcgan/dcgan_1xb128-300kiters_celeba-cropped-64.py index 2f1ab816e6..672679f833 100644 --- a/configs/dcgan/dcgan_1xb128-300kiters_celeba-cropped-64.py +++ b/configs/dcgan/dcgan_1xb128-300kiters_celeba-cropped-64.py @@ -24,7 +24,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=10000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/dcgan/dcgan_1xb128-5epoches_lsun-bedroom-64x64.py b/configs/dcgan/dcgan_1xb128-5epoches_lsun-bedroom-64x64.py index e4396a3462..4096b536f0 100644 --- a/configs/dcgan/dcgan_1xb128-5epoches_lsun-bedroom-64x64.py +++ b/configs/dcgan/dcgan_1xb128-5epoches_lsun-bedroom-64x64.py @@ -26,7 +26,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=10000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) 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 9d0079d77b..8bc5e690e5 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 @@ -36,7 +36,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=500, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/dreambooth/dreambooth-finetune_text_encoder.py b/configs/dreambooth/dreambooth-finetune_text_encoder.py index ab0f0be344..54d1b5bdad 100644 --- a/configs/dreambooth/dreambooth-finetune_text_encoder.py +++ b/configs/dreambooth/dreambooth-finetune_text_encoder.py @@ -68,7 +68,7 @@ default_hooks = dict(logger=dict(interval=10)) custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=50, fixed_input=True, # visualize train dataset diff --git a/configs/dreambooth/dreambooth-lora.py b/configs/dreambooth/dreambooth-lora.py index 109d79335e..2b180655ae 100644 --- a/configs/dreambooth/dreambooth-lora.py +++ b/configs/dreambooth/dreambooth-lora.py @@ -73,7 +73,7 @@ default_hooks = dict(logger=dict(interval=10)) custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=50, fixed_input=True, # visualize train dataset diff --git a/configs/dreambooth/dreambooth.py b/configs/dreambooth/dreambooth.py index 8552f0ae3d..cd8d277781 100644 --- a/configs/dreambooth/dreambooth.py +++ b/configs/dreambooth/dreambooth.py @@ -67,7 +67,7 @@ default_hooks = dict(logger=dict(interval=10)) custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=50, fixed_input=True, # visualize train dataset diff --git a/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py b/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py index 28e96c5d4d..5d58852ad7 100644 --- a/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py +++ b/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py @@ -74,7 +74,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py b/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py index dba364568d..174c0f5bad 100644 --- a/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py +++ b/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py @@ -77,7 +77,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py b/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py index d3e022810e..6648af6927 100644 --- a/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py +++ b/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py @@ -77,7 +77,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, # save_at_test=False, diff --git a/configs/ggan/ggan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py b/configs/ggan/ggan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py index a42716a2d9..653ee6c9d9 100644 --- a/configs/ggan/ggan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py +++ b/configs/ggan/ggan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py @@ -25,7 +25,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/ggan/ggan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py b/configs/ggan/ggan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py index 4173260d8b..a1c899979a 100644 --- a/configs/ggan/ggan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py +++ b/configs/ggan/ggan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py @@ -31,7 +31,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py b/configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py index d2a9af532b..ea71e5e8b3 100644 --- a/configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py +++ b/configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py @@ -35,7 +35,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py index 361211d34a..55dff5f0a4 100644 --- a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py +++ b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py @@ -49,5 +49,5 @@ # VIS_HOOK custom_hooks = [ - dict(type='GenVisualizationHook', interval=5000, fixed_input=True) + dict(type='VisualizationHook', interval=5000, fixed_input=True) ] diff --git a/configs/lsgan/lsgan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py b/configs/lsgan/lsgan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py index 4e5267d641..ffea1e1b8b 100644 --- a/configs/lsgan/lsgan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py +++ b/configs/lsgan/lsgan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py @@ -27,7 +27,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py b/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py index 063ec9d6d1..ee75c071c8 100644 --- a/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py +++ b/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py @@ -92,7 +92,7 @@ # VIS_HOOK + DATAFETCH custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, # vis ema and orig at the same time diff --git a/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py b/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py index 04298033c4..57a1148d1d 100644 --- a/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py +++ b/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py @@ -79,7 +79,7 @@ # VIS_HOOK + DATAFETCH custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, # vis ema and orig at the same time diff --git a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py index 9e62944945..f7adb1e04c 100644 --- a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py +++ b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py @@ -59,7 +59,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ diff --git a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py index af49d7017c..ed86774850 100644 --- a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py +++ b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py @@ -59,7 +59,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ diff --git a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py index b43ea1de59..79315c3166 100644 --- a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py +++ b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py @@ -57,7 +57,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ diff --git a/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py b/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py index 779000f860..30b09cc073 100644 --- a/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py +++ b/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py @@ -74,7 +74,7 @@ custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py index 5a27509bd5..4792cbb211 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py @@ -71,7 +71,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py index f91db6daf3..2a0cc07d4b 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py @@ -70,7 +70,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py index 03e781d44e..df0c6e3b00 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py @@ -76,7 +76,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py index 7d66e6e8c2..2c8ba539fc 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py @@ -74,7 +74,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py index a7b488d39f..bdb84f4fd2 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py @@ -74,7 +74,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py index 9ac2f04c48..42eb586f6e 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py @@ -74,7 +74,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py index 232caaedee..7ed42ffa15 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py @@ -78,7 +78,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py index e252e66d31..bfdba277da 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py @@ -73,7 +73,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py index b008cc8abd..deb51fd3a7 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py @@ -72,7 +72,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py index 6d3ef87b3d..90e0ff94c8 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py @@ -78,7 +78,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py index 98c328d706..18a30b12be 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py @@ -77,7 +77,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-256x256.py b/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-256x256.py index 4d2dc4b539..ba6ef74ff7 100644 --- a/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-256x256.py +++ b/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-256x256.py @@ -48,7 +48,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-512x512.py b/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-512x512.py index b0a27694bb..001ee197e2 100644 --- a/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-512x512.py +++ b/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-512x512.py @@ -48,7 +48,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py b/configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py index ace519af9a..e532fb1514 100644 --- a/configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +++ b/configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py @@ -26,7 +26,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py b/configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py index c8078342e7..33983575d8 100644 --- a/configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py +++ b/configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py @@ -42,7 +42,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, # vis ema and orig at the same time diff --git a/configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py b/configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py index e21dc904fc..418c54c72f 100644 --- a/configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py +++ b/configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py @@ -24,7 +24,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py b/configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py index b923b88b0b..ef1ab75d04 100644 --- a/configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +++ b/configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py @@ -25,7 +25,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/singan/singan_balloons.py b/configs/singan/singan_balloons.py index 56d08cb093..0e1b6ff3c9 100644 --- a/configs/singan/singan_balloons.py +++ b/configs/singan/singan_balloons.py @@ -34,7 +34,7 @@ after_run=True, data_name_list=['noise_weights', 'fixed_noises', 'curr_stage']), dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='SinGAN', name='balloons')) diff --git a/configs/singan/singan_bohemian.py b/configs/singan/singan_bohemian.py index 0a9e58e8e1..50cd78b232 100644 --- a/configs/singan/singan_bohemian.py +++ b/configs/singan/singan_bohemian.py @@ -15,7 +15,7 @@ after_run=True, data_name_list=['noise_weights', 'fixed_noises', 'curr_stage']), dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='SinGAN', name='bohemian')) diff --git a/configs/singan/singan_fish.py b/configs/singan/singan_fish.py index 783afb1e34..eeb0c7aa5e 100644 --- a/configs/singan/singan_fish.py +++ b/configs/singan/singan_fish.py @@ -80,7 +80,7 @@ after_run=True, data_name_list=['noise_weights', 'fixed_noises', 'curr_stage']), dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='SinGAN', name='fish')) diff --git a/configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py b/configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py index 575db5be03..f5c73d964d 100644 --- a/configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py +++ b/configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py @@ -35,7 +35,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py b/configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py index c14ebbf1a0..bc93dfbf29 100644 --- a/configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +++ b/configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py @@ -35,7 +35,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py b/configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py index 159e394265..00cf220214 100644 --- a/configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py +++ b/configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py @@ -29,7 +29,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py b/configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py index c915062057..5230b5a730 100644 --- a/configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +++ b/configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py @@ -29,7 +29,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/styleganv1/styleganv1_ffhq-1024x1024_8xb4-25Mimgs.py b/configs/styleganv1/styleganv1_ffhq-1024x1024_8xb4-25Mimgs.py index 9a15f25201..38e1f4cdd1 100644 --- a/configs/styleganv1/styleganv1_ffhq-1024x1024_8xb4-25Mimgs.py +++ b/configs/styleganv1/styleganv1_ffhq-1024x1024_8xb4-25Mimgs.py @@ -49,7 +49,7 @@ # VIS_HOOK + DATAFETCH custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')), diff --git a/configs/styleganv1/styleganv1_ffhq-256x256_8xb4-25Mimgs.py b/configs/styleganv1/styleganv1_ffhq-256x256_8xb4-25Mimgs.py index 64ee3894b4..4faa0355e4 100644 --- a/configs/styleganv1/styleganv1_ffhq-256x256_8xb4-25Mimgs.py +++ b/configs/styleganv1/styleganv1_ffhq-256x256_8xb4-25Mimgs.py @@ -43,7 +43,7 @@ # VIS_HOOK + DATAFETCH custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')), diff --git a/configs/styleganv2/stylegan2_c2_8xb4-800kiters_ffhq-256x256.py b/configs/styleganv2/stylegan2_c2_8xb4-800kiters_ffhq-256x256.py index e0b6679938..c38f208289 100644 --- a/configs/styleganv2/stylegan2_c2_8xb4-800kiters_ffhq-256x256.py +++ b/configs/styleganv2/stylegan2_c2_8xb4-800kiters_ffhq-256x256.py @@ -55,7 +55,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-cat-256x256.py b/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-cat-256x256.py index 1a90a3586f..107c8a1e9f 100644 --- a/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-cat-256x256.py +++ b/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-cat-256x256.py @@ -55,7 +55,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-church-256x256.py b/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-church-256x256.py index fa6b62d896..b58845e108 100644 --- a/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-church-256x256.py +++ b/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-church-256x256.py @@ -55,7 +55,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-horse-256x256.py b/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-horse-256x256.py index 31459dcf67..229c34773c 100644 --- a/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-horse-256x256.py +++ b/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-horse-256x256.py @@ -55,7 +55,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py b/configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py index f9cb6a238b..f19330961c 100644 --- a/configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py +++ b/configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py @@ -55,7 +55,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py b/configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py index 58d50ca7f4..dfec6ba6b5 100644 --- a/configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py +++ b/configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py @@ -88,7 +88,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) 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 094fa6edae..d054590bd5 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 @@ -91,7 +91,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) 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 56ced90640..bfb2324d93 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 @@ -86,7 +86,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/styleganv3/stylegan3-t_gamma2.0_8xb4-fp16-noaug_ffhq-256x256.py b/configs/styleganv3/stylegan3-t_gamma2.0_8xb4-fp16-noaug_ffhq-256x256.py index bbc2cd3bbd..3530cd458d 100644 --- a/configs/styleganv3/stylegan3-t_gamma2.0_8xb4-fp16-noaug_ffhq-256x256.py +++ b/configs/styleganv3/stylegan3-t_gamma2.0_8xb4-fp16-noaug_ffhq-256x256.py @@ -59,7 +59,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/styleganv3/stylegan3-t_gamma32.8_8xb4-fp16-noaug_ffhq-1024x1024.py b/configs/styleganv3/stylegan3-t_gamma32.8_8xb4-fp16-noaug_ffhq-1024x1024.py index 5cefcdce5b..1e9779ab76 100644 --- a/configs/styleganv3/stylegan3-t_gamma32.8_8xb4-fp16-noaug_ffhq-1024x1024.py +++ b/configs/styleganv3/stylegan3-t_gamma32.8_8xb4-fp16-noaug_ffhq-1024x1024.py @@ -61,7 +61,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py b/configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py index 45cfe9673c..85038bfcab 100644 --- a/configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py +++ b/configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py @@ -46,7 +46,7 @@ # VIS_HOOK custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) diff --git a/docs/en/howto/models.md b/docs/en/howto/models.md index 0a285c7620..1ffff12b9d 100644 --- a/docs/en/howto/models.md +++ b/docs/en/howto/models.md @@ -195,7 +195,7 @@ import torch from mmengine.model import BaseModel from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @MODELS.register_module() @@ -253,7 +253,7 @@ Specifically, the implemented `forward` function of `class BaseEditModel` takes ```python def forward(self, batch_inputs: torch.Tensor, - data_samples: Optional[List[EditDataSample]] = None, + data_samples: Optional[List[DataSample]] = None, mode: str = 'tensor', **kwargs): """Returns losses or predictions of training, validation, testing, and @@ -350,7 +350,7 @@ In `forward_inference` function, `class BaseEditModel` first converts the forwar data samples collated by :attr:`data_preprocessor`. Returns: - List[EditDataSample]: predictions. + List[DataSample]: predictions. """ feats = self.forward_tensor(batch_inputs, data_samples, **kwargs) @@ -358,7 +358,7 @@ In `forward_inference` function, `class BaseEditModel` first converts the forwar predictions = [] for idx in range(feats.shape[0]): predictions.append( - EditDataSample( + DataSample( pred_img=feats[idx].to('cpu'), metainfo=data_samples[idx].metainfo)) diff --git a/docs/en/howto/transforms.md b/docs/en/howto/transforms.md index 9e2306e83a..18245508f5 100644 --- a/docs/en/howto/transforms.md +++ b/docs/en/howto/transforms.md @@ -48,7 +48,7 @@ dict_keys(['pair_path', 'pair', 'pair_ori_shape', 'img_mask', 'img_photo', 'img_ Generally, the last step of the transforms pipeline must be `PackEditInputs`. `PackEditInputs` will pack the processed data into a dict containing two fields: `inputs` and `data_samples`. `inputs` is the variable you want to use as the model's input, which can be the type of `torch.Tensor`, dict of `torch.Tensor`, or any type you want. -`data_samples` is a list of `EditDataSample`. Each `EditDataSample` contains groundtruth and necessary information for corresponding input. +`data_samples` is a list of `DataSample`. Each `DataSample` contains groundtruth and necessary information for corresponding input. ### An example of BasicVSR diff --git a/docs/en/migration/visualization.md b/docs/en/migration/visualization.md index 6c9e3329c8..325dabbab4 100644 --- a/docs/en/migration/visualization.md +++ b/docs/en/migration/visualization.md @@ -1,6 +1,6 @@ # Migration of Visualization -In 0.x, MMEditing use `VisualizationHook` to visualize results in training process. In 1.x version, we unify the function of those hooks into `BasicVisualizationHook` / `GenVisualizationHook`. Additionally, follow the design of MMEngine, we implement `ConcatImageVisualizer` / `GenVisualizer` and a group of `VisBackend` to draw and save the visualization results. +In 0.x, MMEditing use `VisualizationHook` to visualize results in training process. In 1.x version, we unify the function of those hooks into `BasicVisualizationHook` / `VisualizationHook`. Additionally, follow the design of MMEngine, we implement `ConcatImageVisualizer` / `Visualizer` and a group of `VisBackend` to draw and save the visualization results. diff --git a/docs/en/user_guides/config.md b/docs/en/user_guides/config.md index b3c7a3e019..1a00652c75 100644 --- a/docs/en/user_guides/config.md +++ b/docs/en/user_guides/config.md @@ -438,7 +438,7 @@ Users can attach hooks to training, validation, and testing loops to insert some ```python default_hooks = dict( - timer=dict(type='EditIterTimerHook'), + timer=dict(type='IterTimerHook'), logger=dict(type='LoggerHook', interval=100, log_metric_by_epoch=False), checkpoint=dict( type='CheckpointHook', @@ -455,7 +455,7 @@ default_hooks = dict( ```python custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) @@ -476,7 +476,7 @@ env_cfg = dict( log_level = 'INFO' # The level of logging log_processor = dict( - type='EditLogProcessor', # log processor to process runtime logs + type='LogProcessor', # log processor to process runtime logs by_epoch=False) # print log by iteration load_from = None # load model checkpoint as a pre-trained model for a given path resume = False # Whether to resume from the checkpoint define in `load_from`. If `load_from` is `None`, it will resume the latest checkpoint in `work_dir` diff --git a/docs/en/user_guides/visualization.md b/docs/en/user_guides/visualization.md index 28a9929267..7427993eec 100644 --- a/docs/en/user_guides/visualization.md +++ b/docs/en/user_guides/visualization.md @@ -24,7 +24,7 @@ For GAN models, such as StyleGAN and SAGAN, a usual configuration is shown below # VisualizationHook custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, # visualization interval fixed_input=True, # whether use fixed noise input to generate images vis_kwargs_list=dict(type='GAN', name='fake_img') # pre-defined visualization arguments for GAN models @@ -32,15 +32,15 @@ custom_hooks = [ ] # VisBackend vis_backends = [ - dict(type='GenVisBackend'), # vis_backend for saving images to file system - dict(type='WandbGenVisBackend', # vis_backend for uploading images to Wandb + dict(type='VisBackend'), # vis_backend for saving images to file system + dict(type='WandbVisBackend', # vis_backend for uploading images to Wandb init_kwargs=dict( project='MMagic', # project name for Wandb name='GAN-Visualization-Demo' # name of the experiment for Wandb )) ] # Visualizer -visualizer = dict(type='GenVisualizer', vis_backends=vis_backends) +visualizer = dict(type='Visualizer', vis_backends=vis_backends) ``` If you apply Exponential Moving Average (EMA) to a generator and want to visualize the EMA model, you can modify config of `VisualizationHook` as below: @@ -48,7 +48,7 @@ If you apply Exponential Moving Average (EMA) to a generator and want to visuali ```python custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, # vis ema and orig in `fake_img` at the same time @@ -69,7 +69,7 @@ For Translation models, such as CycleGAN and Pix2Pix, visualization configs can # VisualizationHook custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=[ @@ -83,15 +83,15 @@ custom_hooks = [ ] # VisBackend vis_backends = [ - dict(type='GenVisBackend'), # vis_backend for saving images to file system - dict(type='WandbGenVisBackend', # vis_backend for uploading images to Wandb + dict(type='VisBackend'), # vis_backend for saving images to file system + dict(type='WandbVisBackend', # vis_backend for uploading images to Wandb init_kwargs=dict( project='MMagic', # project name for Wandb name='Translation-Visualization-Demo' # name of the experiment for Wandb )) ] # Visualizer -visualizer = dict(type='GenVisualizer', vis_backends=vis_backends) +visualizer = dict(type='Visualizer', vis_backends=vis_backends) ``` ### Visualization configuration of diffusion models @@ -102,22 +102,22 @@ For Diffusion models, such as Improved-DDPM, we can use the following configurat # VisualizationHook custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, vis_kwargs_list=dict(type='DDPMDenoising')) # pre-defined visualization argument for DDPM models ] # VisBackend vis_backends = [ - dict(type='GenVisBackend'), # vis_backend for saving images to file system - dict(type='WandbGenVisBackend', # vis_backend for uploading images to Wandb + dict(type='VisBackend'), # vis_backend for saving images to file system + dict(type='WandbVisBackend', # vis_backend for uploading images to Wandb init_kwargs=dict( project='MMagic', # project name for Wandb name='Diffusion-Visualization-Demo' # name of the experiment for Wandb )) ] # Visualizer -visualizer = dict(type='GenVisualizer', vis_backends=vis_backends) +visualizer = dict(type='Visualizer', vis_backends=vis_backends) ``` ### Visualization configuration of inpainting models @@ -178,8 +178,8 @@ The specific configuration of the `VisualizationHook`, `Visualizer` and `VisBack ## Visualization Hook -In MMagic, we use `BasicVisualizationHook` and `GenVisualizationHook` as `VisualizationHook`. -`GenVisualizationHook` supports three following cases. +In MMagic, we use `BasicVisualizationHook` and `VisualizationHook` as `VisualizationHook`. +`VisualizationHook` supports three following cases. (1) Modify `vis_kwargs_list` to visualize the output of the model under specific inputs , which is suitable for visualization of the generated results of GAN and translation results of Image-to-Image-Translation models under specific data input, etc. Below are two typical examples: @@ -224,15 +224,15 @@ vis_kwargs_list = dict(type='DDPMDenoising') ## Visualizer -In MMagic, we implement `ConcatImageVisualizer` and `GenVisualizer`, which inherit from `mmengine.Visualizer`. +In MMagic, we implement `ConcatImageVisualizer` and `Visualizer`, which inherit from `mmengine.Visualizer`. The base class of `Visualizer` is `ManagerMixin` and this makes `Visualizer` a globally unique object. After being instantiated, `Visualizer` can be called at anywhere of the code by `Visualizer.get_current_instance()`, as shown below: ```python # configs -vis_backends = [dict(type='GenVisBackend')] +vis_backends = [dict(type='VisBackend')] visualizer = dict( - type='GenVisualizer', vis_backends=vis_backends, name='visualizer') + type='Visualizer', vis_backends=vis_backends, name='visualizer') ``` ```python @@ -254,18 +254,18 @@ In general, users do not need to manipulate `VisBackend` objects, only when the MMagic supports a variety of different visualization backends, including: - Basic VisBackend of MMEngine: including LocalVisBackend, TensorboardVisBackend and WandbVisBackend. You can follow [MMEngine Documents](https://github.com/open-mmlab/mmengine/blob/main/docs/en/advanced_tutorials/visualization.md) to learn more about them -- GenVisBackend: Backend for **File System**. Save the visualization results to the corresponding position. -- TensorboardGenVisBackend: Backend for **Tensorboard**. Send the visualization results to Tensorboard. -- PaviGenVisBackend: Backend for **Pavi**. Send the visualization results to Tensorboard. -- WandbGenVisBackend: Backend for **Wandb**. Send the visualization results to Tensorboard. +- VisBackend: Backend for **File System**. Save the visualization results to the corresponding position. +- TensorboardVisBackend: Backend for **Tensorboard**. Send the visualization results to Tensorboard. +- PaviVisBackend: Backend for **Pavi**. Send the visualization results to Tensorboard. +- WandbVisBackend: Backend for **Wandb**. Send the visualization results to Tensorboard. One `Visualizer` object can have access to any number of VisBackends and users can access to the backend by their class name in their code. ```python # configs -vis_backends = [dict(type='GenVisualizer'), dict(type='WandbVisBackend')] +vis_backends = [dict(type='Visualizer'), dict(type='WandbVisBackend')] visualizer = dict( - type='GenVisualizer', vis_backends=vis_backends, name='visualizer') + type='Visualizer', vis_backends=vis_backends, name='visualizer') ``` ```python @@ -274,7 +274,7 @@ VISUALIZERS.build(cfg.visualizer) visualizer = Visualizer.get_current_instance() # access to the backend by class name -gen_vis_backend = visualizer.get_backend('GenVisBackend') +gen_vis_backend = visualizer.get_backend('VisBackend') gen_wandb_vis_backend = visualizer.get_backend('GenWandbVisBackend') ``` @@ -283,11 +283,11 @@ When there are multiply VisBackend with the same class name, user must specific ```python # configs vis_backends = [ - dict(type='GenVisBackend', name='gen_vis_backend_1'), - dict(type='GenVisBackend', name='gen_vis_backend_2') + dict(type='VisBackend', name='gen_vis_backend_1'), + dict(type='VisBackend', name='gen_vis_backend_2') ] visualizer = dict( - type='GenVisualizer', vis_backends=vis_backends, name='visualizer') + type='Visualizer', vis_backends=vis_backends, name='visualizer') ``` ```python diff --git a/mmagic/apis/inferencers/colorization_inferencer.py b/mmagic/apis/inferencers/colorization_inferencer.py index 5bd06ffaa9..073d10a41c 100644 --- a/mmagic/apis/inferencers/colorization_inferencer.py +++ b/mmagic/apis/inferencers/colorization_inferencer.py @@ -9,7 +9,7 @@ from mmengine.dataset import Compose from mmengine.dataset.utils import default_collate as collate -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import tensor2img from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType @@ -49,7 +49,7 @@ def preprocess(self, img: InputsType) -> Dict: if 'cuda' in str(self.device): data['inputs'] = data['inputs'].cuda() data['data_samples'][0] = data['data_samples'][0].cuda() - data['data_samples'] = EditDataSample.stack(data['data_samples']) + data['data_samples'] = DataSample.stack(data['data_samples']) return data def forward(self, inputs: InputsType) -> PredType: diff --git a/mmagic/apis/inferencers/conditional_inferencer.py b/mmagic/apis/inferencers/conditional_inferencer.py index f0c9a0a4d5..46d6d7aff9 100644 --- a/mmagic/apis/inferencers/conditional_inferencer.py +++ b/mmagic/apis/inferencers/conditional_inferencer.py @@ -7,7 +7,7 @@ from mmengine import mkdir_or_exist from torchvision import utils -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType @@ -70,13 +70,13 @@ def visualize(self, return results - def _pred2dict(self, data_sample: EditDataSample) -> Dict: + def _pred2dict(self, data_sample: DataSample) -> Dict: """Extract elements necessary to represent a prediction into a dictionary. It's better to contain only basic data elements such as strings and numbers in order to guarantee it's json-serializable. Args: - data_sample (EditDataSample): The data sample to be converted. + data_sample (DataSample): The data sample to be converted. Returns: dict: The output dictionary. diff --git a/mmagic/apis/inferencers/eg3d_inferencer.py b/mmagic/apis/inferencers/eg3d_inferencer.py index d5e59a18e3..bdf182b1f4 100644 --- a/mmagic/apis/inferencers/eg3d_inferencer.py +++ b/mmagic/apis/inferencers/eg3d_inferencer.py @@ -13,7 +13,7 @@ from torch.nn import functional as F from torchvision.utils import make_grid -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import ForwardInputs, try_import from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType from .inference_functions import calculate_grid_size @@ -60,7 +60,7 @@ def preprocess(self, inputs: InputsType = None) -> ForwardInputs: data_sample_list = [] for lab in inputs: - data_sample = EditDataSample() + data_sample = DataSample() data_sample.set_gt_label(lab) data_sample_list.append(data_sample.to(self.device)) self.extra_parameters['num_batches'] = len(inputs) @@ -78,7 +78,7 @@ def preprocess(self, inputs: InputsType = None) -> ForwardInputs: if data_sample_list is None: data_samples = None else: - data_samples = EditDataSample.stack(data_sample_list) + data_samples = DataSample.stack(data_sample_list) return inputs, data_samples diff --git a/mmagic/apis/inferencers/inference_functions.py b/mmagic/apis/inferencers/inference_functions.py index 97a595968b..639f7efe37 100644 --- a/mmagic/apis/inferencers/inference_functions.py +++ b/mmagic/apis/inferencers/inference_functions.py @@ -21,7 +21,7 @@ from mmagic.models.base_models import BaseTranslationModel from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample VIDEO_EXTENSIONS = ('.mp4', '.mov', '.avi') FILE_CLIENT = get_file_backend(backend_args={'backend': 'local'}) @@ -258,7 +258,7 @@ def inpainting_inference(model, masked_img, mask): data = dict() data['inputs'] = _data['inputs'] / 255.0 data = collate([data]) - data['data_samples'] = EditDataSample.stack([_data['data_samples']]) + data['data_samples'] = DataSample.stack([_data['data_samples']]) if 'cuda' in str(device): data = scatter(data, [device])[0] data['data_samples'].mask.data = scatter( @@ -310,7 +310,7 @@ def matting_inference(model, img, trimap): data = dict() data['inputs'] = torch.cat([_data['inputs'], trimap], dim=0).float() data = collate([data]) - data['data_samples'] = EditDataSample.stack([_data['data_samples']]) + data['data_samples'] = DataSample.stack([_data['data_samples']]) if 'cuda' in str(device): data = scatter(data, [device])[0] # forward the model @@ -860,7 +860,7 @@ def colorization_inference(model, img): data['data_samples'][0].box_info_8x.data = scatter( data['data_samples'][0].box_info_8x.data, [device])[0] - data['data_samples'] = EditDataSample.stack(data['data_samples']) + data['data_samples'] = DataSample.stack(data['data_samples']) # forward the model with torch.no_grad(): diff --git a/mmagic/apis/inferencers/inpainting_inferencer.py b/mmagic/apis/inferencers/inpainting_inferencer.py index 97c1189aa7..469de568cf 100644 --- a/mmagic/apis/inferencers/inpainting_inferencer.py +++ b/mmagic/apis/inferencers/inpainting_inferencer.py @@ -10,7 +10,7 @@ from mmengine.dataset.utils import default_collate as collate from torch.nn.parallel import scatter -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import tensor2img from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType @@ -65,7 +65,7 @@ def preprocess(self, img: InputsType, mask: InputsType) -> Dict: self.masks = data['data_samples'][0].mask.data * 255 self.masked_imgs = data['inputs'][0] - data['data_samples'] = EditDataSample.stack(data['data_samples']) + data['data_samples'] = DataSample.stack(data['data_samples']) return data def forward(self, inputs: InputsType) -> PredType: diff --git a/mmagic/apis/inferencers/matting_inferencer.py b/mmagic/apis/inferencers/matting_inferencer.py index e2679590c6..0a105a76a4 100644 --- a/mmagic/apis/inferencers/matting_inferencer.py +++ b/mmagic/apis/inferencers/matting_inferencer.py @@ -10,7 +10,7 @@ from mmengine.dataset.utils import default_collate as collate from torch.nn.parallel import scatter -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType @@ -56,7 +56,7 @@ def preprocess(self, img: InputsType, trimap: InputsType) -> Dict: preprocess_res['inputs'] = torch.cat([_data['inputs'], trimap], dim=0).float() preprocess_res = collate([preprocess_res]) - preprocess_res['data_samples'] = EditDataSample.stack( + preprocess_res['data_samples'] = DataSample.stack( [_data['data_samples']]) preprocess_res['mode'] = 'predict' if 'cuda' in str(self.device): @@ -94,13 +94,13 @@ def visualize(self, return result - def _pred2dict(self, data_sample: EditDataSample) -> Dict: + def _pred2dict(self, data_sample: DataSample) -> Dict: """Extract elements necessary to represent a prediction into a dictionary. It's better to contain only basic data elements such as strings and numbers in order to guarantee it's json-serializable. Args: - data_sample (EditDataSample): The data sample to be converted. + data_sample (DataSample): The data sample to be converted. Returns: dict: The output dictionary. diff --git a/mmagic/apis/inferencers/unconditional_inferencer.py b/mmagic/apis/inferencers/unconditional_inferencer.py index 0510f2a037..8b6ebead9b 100644 --- a/mmagic/apis/inferencers/unconditional_inferencer.py +++ b/mmagic/apis/inferencers/unconditional_inferencer.py @@ -7,7 +7,7 @@ from mmengine import mkdir_or_exist from torchvision import utils -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType @@ -69,13 +69,13 @@ def visualize(self, return results - def _pred2dict(self, data_sample: EditDataSample) -> Dict: + def _pred2dict(self, data_sample: DataSample) -> Dict: """Extract elements necessary to represent a prediction into a dictionary. It's better to contain only basic data elements such as strings and numbers in order to guarantee it's json-serializable. Args: - data_sample (EditDataSample): The data sample to be converted. + data_sample (DataSample): The data sample to be converted. Returns: dict: The output dictionary. diff --git a/mmagic/datasets/transforms/formatting.py b/mmagic/datasets/transforms/formatting.py index e9a6423f90..0e82918f2f 100644 --- a/mmagic/datasets/transforms/formatting.py +++ b/mmagic/datasets/transforms/formatting.py @@ -4,16 +4,16 @@ from mmcv.transforms.base import BaseTransform from mmagic.registry import TRANSFORMS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import all_to_tensor @TRANSFORMS.register_module() class PackEditInputs(BaseTransform): - """Pack data into EditDataSample for training, evaluation and testing. + """Pack data into DataSample for training, evaluation and testing. MMagic follows the design of data structure from MMEngine. - Data from the loader will be packed into data field of EditDataSample. + Data from the loader will be packed into data field of DataSample. More details of DataSample refer to the documentation of MMEngine: https://mmengine.readthedocs.io/en/latest/advanced_tutorials/data_element.html @@ -61,7 +61,7 @@ def transform(self, results: dict) -> dict: According to different tasks, the `inputs` may contain images, videos, labels, text, etc. - - 'data_samples' (obj:`EditDataSample`): The annotation info of the + - 'data_samples' (obj:`DataSample`): The annotation info of the sample. """ @@ -76,7 +76,7 @@ def transform(self, results: dict) -> dict: if len(inputs.values()) == 1: inputs = list(inputs.values())[0] - data_sample = EditDataSample() + data_sample = DataSample() # prepare metainfo and data in DataSample according to predefined keys predefined_data = { k: v diff --git a/mmagic/engine/hooks/__init__.py b/mmagic/engine/hooks/__init__.py index 6e75a92028..8435afa9a5 100644 --- a/mmagic/engine/hooks/__init__.py +++ b/mmagic/engine/hooks/__init__.py @@ -1,13 +1,13 @@ # Copyright (c) OpenMMLab. All rights reserved. from .ema import ExponentialMovingAverageHook -from .iter_time_hook import EditIterTimerHook +from .iter_time_hook import IterTimerHook from .pggan_fetch_data_hook import PGGANFetchDataHook from .pickle_data_hook import PickleDataHook from .reduce_lr_scheduler_hook import ReduceLRSchedulerHook -from .visualization_hook import BasicVisualizationHook, GenVisualizationHook +from .visualization_hook import BasicVisualizationHook, VisualizationHook __all__ = [ - 'ReduceLRSchedulerHook', 'BasicVisualizationHook', 'GenVisualizationHook', - 'ExponentialMovingAverageHook', 'EditIterTimerHook', 'PGGANFetchDataHook', + 'ReduceLRSchedulerHook', 'BasicVisualizationHook', 'VisualizationHook', + 'ExponentialMovingAverageHook', 'IterTimerHook', 'PGGANFetchDataHook', 'PickleDataHook' ] diff --git a/mmagic/engine/hooks/iter_time_hook.py b/mmagic/engine/hooks/iter_time_hook.py index b3945eacc7..0f66a4e3ce 100644 --- a/mmagic/engine/hooks/iter_time_hook.py +++ b/mmagic/engine/hooks/iter_time_hook.py @@ -2,21 +2,22 @@ import time from typing import Optional, Sequence, Union -from mmengine.hooks import IterTimerHook -from mmengine.registry import HOOKS +from mmengine.hooks import IterTimerHook as BaseIterTimerHook from mmengine.structures import BaseDataElement +from mmagic.registry import HOOKS + DATA_BATCH = Optional[Sequence[dict]] @HOOKS.register_module() -class EditIterTimerHook(IterTimerHook): - """EditIterTimerHooks inherits from :class:`mmengine.hooks.IterTimerHook` - and overwrites :meth:`self._after_iter`. +class IterTimerHook(BaseIterTimerHook): + """IterTimerHooks inherits from :class:`mmengine.hooks.IterTimerHook` and + overwrites :meth:`self._after_iter`. This hooks should be used along with - :class:`mmagic.engine.runner.GenValLoop` and - :class:`mmagic.engine.runner.GenTestLoop`. + :class:`mmagic.engine.runner.MultiValLoop` and + :class:`mmagic.engine.runner.MultiTestLoop`. """ def _after_iter(self, @@ -33,8 +34,8 @@ def _after_iter(self, `runner.val_loop.total_length` or `runner.test_loop.total_length` as total number of iterations. If you want to know how `total_length` is calculated, please refers to - :meth:`mmagic.engine.runner.GenValLoop.run` and - :meth:`mmagic.engine.runner.GenTestLoop.run`. + :meth:`mmagic.engine.runner.MultiValLoop.run` and + :meth:`mmagic.engine.runner.MultiTestLoop.run`. Args: runner (Runner): The runner of the training validation and diff --git a/mmagic/engine/hooks/visualization_hook.py b/mmagic/engine/hooks/visualization_hook.py index b9f153de43..6ba61766fe 100644 --- a/mmagic/engine/hooks/visualization_hook.py +++ b/mmagic/engine/hooks/visualization_hook.py @@ -15,7 +15,7 @@ from mmengine.utils import is_list_of from mmengine.visualization import Visualizer -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import get_sampler @@ -79,9 +79,9 @@ def _after_iter( @HOOKS.register_module() -class GenVisualizationHook(Hook): - """Generation Visualization Hook. Used to visual output samples in - training, validation and testing. In this hook, we use a list called +class VisualizationHook(Hook): + """MMagic Visualization Hook. Used to visual output samples in training, + validation and testing. In this hook, we use a list called `sample_kwargs_list` to control how to generate samples and how to visualize them. Each element in `sample_kwargs_list`, called `sample_kwargs`, may contains the following keywords: @@ -110,14 +110,14 @@ class GenVisualizationHook(Hook): >>> # for GAN models >>> custom_hooks = [ >>> dict( - >>> type='GenVisualizationHook', + >>> type='VisualizationHook', >>> interval=1000, >>> fixed_input=True, >>> vis_kwargs_list=dict(type='GAN', name='fake_img'))] >>> # for Translation models >>> custom_hooks = [ >>> dict( - >>> type='GenVisualizationHook', + >>> type='VisualizationHook', >>> interval=10, >>> fixed_input=False, >>> vis_kwargs_list=[dict(type='Translation', @@ -215,7 +215,7 @@ def __init__(self, @master_only def after_val_iter(self, runner: Runner, batch_idx: int, data_batch: dict, outputs) -> None: - """:class:`GenVisualizationHook` do not support visualize during + """:class:`VisualizationHook` do not support visualize during validation. Args: @@ -437,12 +437,12 @@ def vis_from_message_hub(self, batch_idx: int): 'message_hub.runtime_info[\'vis_results\'].') value = vis_results[key] - # pack to list of EditDataSample + # pack to list of DataSample if isinstance(value, torch.Tensor): gen_samples = [] num_batches = value.shape[0] for idx in range(num_batches): - gen_sample = EditDataSample() + gen_sample = DataSample() setattr(gen_sample, key, value[idx]) gen_samples.append(gen_sample) elif is_list_of(value, BaseDataElement): diff --git a/mmagic/engine/runner/__init__.py b/mmagic/engine/runner/__init__.py index 4455b27ad3..eab02a27df 100644 --- a/mmagic/engine/runner/__init__.py +++ b/mmagic/engine/runner/__init__.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. from .edit_loops import EditTestLoop, EditValLoop -from .log_processor import EditLogProcessor +from .log_processor import LogProcessor -__all__ = ['EditTestLoop', 'EditValLoop', 'EditLogProcessor'] +__all__ = ['EditTestLoop', 'EditValLoop', 'LogProcessor'] diff --git a/mmagic/engine/runner/log_processor.py b/mmagic/engine/runner/log_processor.py index b1f4f76636..e72204d81c 100644 --- a/mmagic/engine/runner/log_processor.py +++ b/mmagic/engine/runner/log_processor.py @@ -1,21 +1,22 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmengine.registry import LOG_PROCESSORS -from mmengine.runner import LogProcessor +from mmengine.runner import LogProcessor as BaseLogProcessor + +from mmagic.registry import LOG_PROCESSORS @LOG_PROCESSORS.register_module() # type: ignore -class EditLogProcessor(LogProcessor): - """EditLogProcessor inherits from :class:`mmengine.runner.LogProcessor` and +class LogProcessor(BaseLogProcessor): + """LogProcessor inherits from :class:`mmengine.runner.LogProcessor` and overwrites :meth:`self.get_log_after_iter`. This log processor should be used along with - :class:`mmagic.engine.runner.EditValLoop` and - :class:`mmagic.engine.runner.EditTestLoop`. + :class:`mmagic.engine.runner.MultiValLoop` and + :class:`mmagic.engine.runner.MultiTestLoop`. """ def _get_dataloader_size(self, runner, mode) -> int: - """Get dataloader size of current loop. In `EditValLoop` and - `EditTestLoop`, we use `total_length` instead of `len(dataloader)` to + """Get dataloader size of current loop. In `MultiValLoop` and + `MultiTestLoop`, we use `total_length` instead of `len(dataloader)` to denote the total number of iterations. Args: diff --git a/mmagic/evaluation/evaluator.py b/mmagic/evaluation/evaluator.py index dc98ef0775..e8bb9fd53d 100644 --- a/mmagic/evaluation/evaluator.py +++ b/mmagic/evaluation/evaluator.py @@ -8,7 +8,7 @@ from torch.utils.data.dataloader import DataLoader from mmagic.registry import EVALUATORS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from .metrics.base_gen_metric import GenMetric @@ -134,14 +134,14 @@ def prepare_samplers(self, module: BaseModel, dataloader: DataLoader return metrics_sampler_list - def process(self, data_samples: Sequence[EditDataSample], + def process(self, data_samples: Sequence[DataSample], data_batch: Optional[Any], metrics: Sequence[BaseMetric]) -> None: """Pass `data_batch` from dataloader and `predictions` (generated results) to corresponding `metrics`. Args: - data_samples (Sequence[EditDataSample]): A batch of generated + data_samples (Sequence[DataSample]): A batch of generated results from model. data_batch (Optional[Any]): A batch of data from the metrics specific sampler or the dataloader. @@ -152,7 +152,7 @@ def process(self, data_samples: Sequence[EditDataSample], _data_samples = [] for data_sample in data_samples: - if isinstance(data_sample, EditDataSample): + if isinstance(data_sample, DataSample): _data_samples.append(data_sample.to_dict()) else: _data_samples.append(data_sample) diff --git a/mmagic/evaluation/metrics/base_gen_metric.py b/mmagic/evaluation/metrics/base_gen_metric.py index 1ee6dfcec0..4cfa7bdbcb 100644 --- a/mmagic/evaluation/metrics/base_gen_metric.py +++ b/mmagic/evaluation/metrics/base_gen_metric.py @@ -15,7 +15,7 @@ from torch import Tensor from torch.utils.data.dataloader import DataLoader -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample class GenMetric(BaseMetric): @@ -291,11 +291,11 @@ def __iter__(self) -> Iterator: def __len__(self) -> int: return math.ceil(self.max_length / self.batch_size) - def get_cond(self) -> List[EditDataSample]: + def get_cond(self) -> List[DataSample]: data_sample_list = [] for _ in range(self.batch_size): - data_sample = EditDataSample() + data_sample = DataSample() cond = self.dataset.get_data_info( np.random.randint(len(self.dataset)))['gt_label'] data_sample.set_gt_label(torch.Tensor(cond)) diff --git a/mmagic/models/base_models/base_conditional_gan.py b/mmagic/models/base_models/base_conditional_gan.py index 83e2f251a0..21bec7edfa 100644 --- a/mmagic/models/base_models/base_conditional_gan.py +++ b/mmagic/models/base_models/base_conditional_gan.py @@ -8,7 +8,7 @@ from mmengine.optim import OptimWrapper from torch import Tensor -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import ForwardInputs, LabelVar from ..utils import get_valid_num_batches, label_sample_fn from .base_gan import BaseGAN @@ -85,14 +85,14 @@ def label_fn(self, label: LabelVar = None, num_batches: int = 1) -> Tensor: num_classes=self.num_classes, device=self.device) - def data_sample_to_label(self, data_sample: EditDataSample + def data_sample_to_label(self, data_sample: DataSample ) -> Optional[torch.Tensor]: """Get labels from input `data_sample` and pack to `torch.Tensor`. If no label is found in the passed `data_sample`, `None` would be returned. Args: - data_sample (EditDataSample): Input data samples. + data_sample (DataSample): Input data samples. Returns: Optional[torch.Tensor]: Packed label tensor. @@ -153,7 +153,7 @@ def _get_valid_num_classes(num_classes: Optional[int], def forward(self, inputs: ForwardInputs, data_samples: Optional[list] = None, - mode: Optional[str] = None) -> List[EditDataSample]: + mode: Optional[str] = None) -> List[DataSample]: """Sample images with the given inputs. If forward mode is 'ema' or 'orig', the image generated by corresponding generator will be returned. If forward mode is 'ema/orig', images generated by original @@ -168,7 +168,7 @@ def forward(self, :class:`BaseConditionalGAN`. Defaults to None. Returns: - List[EditDataSample]: Generated images or image dict. + List[DataSample]: Generated images or image dict. """ if isinstance(inputs, Tensor): noise = inputs @@ -194,7 +194,7 @@ def forward(self, outputs = generator(noise, label=labels, return_noise=False) outputs = self.data_preprocessor.destruct(outputs, data_samples) - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples) if isinstance(inputs, dict) and 'img' in inputs: @@ -216,13 +216,13 @@ def forward(self, outputs_ema = self.data_preprocessor.destruct( outputs_ema, data_samples) - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples) if isinstance(inputs, dict) and 'img' in inputs: gen_sample.gt_img = inputs['img'] - gen_sample.ema = EditDataSample(fake_img=outputs_ema) - gen_sample.orig = EditDataSample(fake_img=outputs_orig) + gen_sample.ema = DataSample(fake_img=outputs_ema) + gen_sample.orig = DataSample(fake_img=outputs_orig) gen_sample.noise = noise gen_sample.set_gt_label(labels) gen_sample.sample_kwargs = deepcopy(sample_kwargs) @@ -231,14 +231,14 @@ def forward(self, return batch_sample_list - def train_generator(self, inputs: dict, data_samples: List[EditDataSample], + def train_generator(self, inputs: dict, data_samples: List[DataSample], optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Training function for discriminator. All GANs should implement this function by themselves. Args: inputs (dict): Inputs from dataloader. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. @@ -268,8 +268,7 @@ def train_generator(self, inputs: dict, data_samples: List[EditDataSample], optimizer_wrapper.update_params(parsed_loss) return log_vars - def train_discriminator(self, inputs: dict, - data_samples: List[EditDataSample], + def train_discriminator(self, inputs: dict, data_samples: List[DataSample], optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Training function for discriminator. All GANs should implement this @@ -277,7 +276,7 @@ def train_discriminator(self, inputs: dict, Args: inputs (dict): Inputs from dataloader. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. diff --git a/mmagic/models/base_models/base_edit_model.py b/mmagic/models/base_models/base_edit_model.py index 4c7720d2a5..7d8941eea9 100644 --- a/mmagic/models/base_models/base_edit_model.py +++ b/mmagic/models/base_models/base_edit_model.py @@ -5,7 +5,7 @@ from mmengine.model import BaseModel from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @MODELS.register_module() @@ -53,9 +53,9 @@ def __init__(self, def forward(self, inputs: torch.Tensor, - data_samples: Optional[List[EditDataSample]] = None, + data_samples: Optional[List[DataSample]] = None, mode: str = 'tensor', - **kwargs) -> Union[torch.Tensor, List[EditDataSample], dict]: + **kwargs) -> Union[torch.Tensor, List[DataSample], dict]: """Returns losses or predictions of training, validation, testing, and simple inference process. @@ -118,21 +118,21 @@ def forward(self, elif mode == 'loss': return self.forward_train(inputs, data_samples, **kwargs) - def convert_to_datasample(self, predictions: EditDataSample, - data_samples: EditDataSample, + def convert_to_datasample(self, predictions: DataSample, + data_samples: DataSample, inputs: Optional[torch.Tensor] - ) -> List[EditDataSample]: + ) -> List[DataSample]: """Add predictions and destructed inputs (if passed) to data samples. Args: - predictions (EditDataSample): The predictions of the model. - data_samples (EditDataSample): The data samples loaded from + predictions (DataSample): The predictions of the model. + data_samples (DataSample): The data samples loaded from dataloader. inputs (Optional[torch.Tensor]): The input of model. Defaults to None. Returns: - List[EditDataSample]: Modified data samples. + List[DataSample]: Modified data samples. """ if inputs is not None: @@ -150,7 +150,7 @@ def convert_to_datasample(self, predictions: EditDataSample, def forward_tensor(self, inputs: torch.Tensor, - data_samples: Optional[List[EditDataSample]] = None, + data_samples: Optional[List[DataSample]] = None, **kwargs) -> torch.Tensor: """Forward tensor. Returns result of simple forward. @@ -170,8 +170,8 @@ def forward_tensor(self, def forward_inference(self, inputs: torch.Tensor, - data_samples: Optional[List[EditDataSample]] = None, - **kwargs) -> EditDataSample: + data_samples: Optional[List[DataSample]] = None, + **kwargs) -> DataSample: """Forward inference. Returns predictions of validation, testing, and simple inference. @@ -182,20 +182,20 @@ def forward_inference(self, data samples collated by :attr:`data_preprocessor`. Returns: - EditDataSample: predictions. + DataSample: predictions. """ feats = self.forward_tensor(inputs, data_samples, **kwargs) feats = self.data_preprocessor.destruct(feats, data_samples) # create a stacked data sample here - predictions = EditDataSample(pred_img=feats.cpu()) + predictions = DataSample(pred_img=feats.cpu()) return predictions def forward_train(self, inputs: torch.Tensor, - data_samples: Optional[List[EditDataSample]] = None, + data_samples: Optional[List[DataSample]] = None, **kwargs) -> Dict[str, torch.Tensor]: """Forward training. Returns dict of losses of training. diff --git a/mmagic/models/base_models/base_gan.py b/mmagic/models/base_models/base_gan.py index 66126d75d2..285078ea20 100644 --- a/mmagic/models/base_models/base_gan.py +++ b/mmagic/models/base_models/base_gan.py @@ -11,7 +11,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import ForwardInputs, NoiseVar, SampleList from ..utils import (get_valid_noise_size, get_valid_num_batches, noise_sample_fn, set_requires_grad) @@ -330,7 +330,7 @@ def forward(self, Defaults to None. Returns: - SampleList: A list of ``EditDataSample`` contain generated results. + SampleList: A list of ``DataSample`` contain generated results. """ if isinstance(inputs, Tensor): noise = inputs @@ -352,7 +352,7 @@ def forward(self, outputs = generator(noise, return_noise=False, **sample_kwargs) outputs = self.data_preprocessor.destruct(outputs, data_samples) - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples) if isinstance(inputs, dict) and 'img' in inputs: @@ -373,13 +373,13 @@ def forward(self, outputs_ema = self.data_preprocessor.destruct( outputs_ema, data_samples) - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples) if isinstance(inputs, dict) and 'img' in inputs: gen_sample.gt_img = inputs['img'] - gen_sample.ema = EditDataSample(fake_img=outputs_ema) - gen_sample.orig = EditDataSample(fake_img=outputs_orig) + gen_sample.ema = DataSample(fake_img=outputs_ema) + gen_sample.orig = DataSample(fake_img=outputs_orig) gen_sample.noise = noise gen_sample.sample_kwargs = deepcopy(sample_kwargs) gen_sample.sample_model = 'ema/orig' @@ -413,7 +413,7 @@ def test_step(self, data: dict) -> SampleList: sampler. More detials in `Metrics` and `Evaluator`. Returns: - List[EditDataSample]: Generated image or image dict. + List[DataSample]: Generated image or image dict. """ data = self.data_preprocessor(data) outputs = self(**data) @@ -547,14 +547,14 @@ def _get_disc_loss(self, out_dict): return loss, log_var - def train_generator(self, inputs: dict, data_samples: List[EditDataSample], + def train_generator(self, inputs: dict, data_samples: List[DataSample], optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Training function for discriminator. All GANs should implement this function by themselves. Args: inputs (dict): Inputs from dataloader. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. @@ -580,8 +580,7 @@ def train_generator(self, inputs: dict, data_samples: List[EditDataSample], optimizer_wrapper.update_params(loss) return log_vars - def train_discriminator(self, inputs: dict, - data_samples: List[EditDataSample], + def train_discriminator(self, inputs: dict, data_samples: List[DataSample], optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Training function for discriminator. All GANs should implement this @@ -589,7 +588,7 @@ def train_discriminator(self, inputs: dict, Args: inputs (dict): Inputs from dataloader. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. diff --git a/mmagic/models/base_models/base_mattor.py b/mmagic/models/base_models/base_mattor.py index 35bbd4bfd8..0ddfacb11a 100644 --- a/mmagic/models/base_models/base_mattor.py +++ b/mmagic/models/base_models/base_mattor.py @@ -8,10 +8,10 @@ from mmengine.model import BaseModel from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample DataSamples = Optional[Union[list, torch.Tensor]] -ForwardResults = Union[Dict[str, torch.Tensor], List[EditDataSample], +ForwardResults = Union[Dict[str, torch.Tensor], List[DataSample], Tuple[torch.Tensor], torch.Tensor] @@ -127,7 +127,7 @@ def resize_inputs(self, batch_inputs: torch.Tensor) -> torch.Tensor: return torch.cat((batch_images, batch_trimaps), dim=1) def restore_size(self, pred_alpha: torch.Tensor, - data_sample: EditDataSample) -> torch.Tensor: + data_sample: DataSample) -> 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 @@ -137,7 +137,7 @@ def restore_size(self, pred_alpha: torch.Tensor, Args: pred_alpha (torch.Tensor): A single predicted alpha of shape (1, H, W). - data_sample (EditDataSample): Data sample containing + data_sample (DataSample): Data sample containing original shape as meta data. Returns: @@ -159,8 +159,8 @@ def restore_size(self, pred_alpha: torch.Tensor, def postprocess( self, batch_pred_alpha: torch.Tensor, # N, 1, H, W, float32 - data_samples: EditDataSample, - ) -> List[EditDataSample]: + data_samples: DataSample, + ) -> List[DataSample]: """Post-process alpha predictions. This function contains the following steps: @@ -168,17 +168,17 @@ def postprocess( 2. Mask alpha prediction with trimap 3. Clamp alpha prediction to 0-1 4. Convert alpha prediction to uint8 - 5. Pack alpha prediction into EditDataSample + 5. Pack alpha prediction into DataSample Currently only batch_size 1 is actually supported. Args: batch_pred_alpha (torch.Tensor): A batch of predicted alpha of shape (N, 1, H, W). - data_samples (List[EditDataSample]): List of data samples. + data_samples (List[DataSample]): List of data samples. Returns: - List[EditDataSample]: A list of predictions. + List[DataSample]: A list of predictions. Each data sample contains a pred_alpha, which is a torch.Tensor with dtype=uint8, device=cuda:0 """ @@ -204,7 +204,7 @@ def postprocess( pa.round_() pa = pa.to(dtype=torch.uint8) # pa = pa.cpu().numpy() - pa_sample = EditDataSample(pred_alpha=pa) + pa_sample = DataSample(pred_alpha=pa) predictions.append(pa_sample) return predictions @@ -212,13 +212,13 @@ def postprocess( def forward(self, inputs: torch.Tensor, data_samples: DataSamples = None, - mode: str = 'tensor') -> List[EditDataSample]: + mode: str = 'tensor') -> List[DataSample]: """General forward function. Args: inputs (torch.Tensor): A batch of inputs. with image and trimap concatenated alone channel dimension. - data_samples (List[EditDataSample], optional): + data_samples (List[DataSample], optional): A list of data samples, containing: - Ground-truth alpha / foreground / background to compute loss - other meta information @@ -253,18 +253,17 @@ def forward(self, else: raise ValueError('Invalid forward mode.') - def convert_to_datasample(self, predictions: List[EditDataSample], - data_samples: EditDataSample - ) -> List[EditDataSample]: + def convert_to_datasample(self, predictions: List[DataSample], + data_samples: DataSample) -> List[DataSample]: """Add predictions to data samples. Args: - predictions (List[EditDataSample]): The predictions of the model. - data_samples (EditDataSample): The data samples loaded from + predictions (List[DataSample]): The predictions of the model. + data_samples (DataSample): The data samples loaded from dataloader. Returns: - List[EditDataSample]: Modified data samples. + List[DataSample]: Modified data samples. """ data_samples = data_samples.split() for data_sample, pred in zip(data_samples, predictions): diff --git a/mmagic/models/base_models/one_stage.py b/mmagic/models/base_models/one_stage.py index c925694be3..155e55293c 100644 --- a/mmagic/models/base_models/one_stage.py +++ b/mmagic/models/base_models/one_stage.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapperDict from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import SampleList from ..utils import set_requires_grad @@ -383,7 +383,7 @@ def forward_tensor(self, inputs: torch.Tensor, data_samples: SampleList return fake_reses, fake_imgs def forward_test(self, inputs: torch.Tensor, - data_samples: SampleList) -> EditDataSample: + data_samples: SampleList) -> DataSample: """Forward function for testing. Args: @@ -401,26 +401,26 @@ def forward_test(self, inputs: torch.Tensor, fake_imgs = self.data_preprocessor.destruct(fake_imgs, data_samples) # create a stacked data sample here - predictions = EditDataSample( + predictions = DataSample( fake_res=fake_reses, fake_img=fake_imgs, pred_img=fake_imgs) return predictions - def convert_to_datasample(self, predictions: EditDataSample, - data_samples: EditDataSample, + def convert_to_datasample(self, predictions: DataSample, + data_samples: DataSample, inputs: Optional[torch.Tensor] - ) -> List[EditDataSample]: + ) -> List[DataSample]: """Add predictions and destructed inputs (if passed) to data samples. Args: - predictions (EditDataSample): The predictions of the model. - data_samples (EditDataSample): The data samples loaded from + predictions (DataSample): The predictions of the model. + data_samples (DataSample): The data samples loaded from dataloader. inputs (Optional[torch.Tensor]): The input of model. Defaults to None. Returns: - List[EditDataSample]: Modified data samples. + List[DataSample]: Modified data samples. """ if inputs is not None: destructed_input = self.data_preprocessor.destruct( diff --git a/mmagic/models/data_preprocessors/edit_data_preprocessor.py b/mmagic/models/data_preprocessors/edit_data_preprocessor.py index cc98fe43b3..88d75de8cb 100644 --- a/mmagic/models/data_preprocessors/edit_data_preprocessor.py +++ b/mmagic/models/data_preprocessors/edit_data_preprocessor.py @@ -11,10 +11,10 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import SampleList -CastData = Union[tuple, dict, EditDataSample, Tensor, list] +CastData = Union[tuple, dict, DataSample, Tensor, list] @MODELS.register_module() @@ -66,7 +66,7 @@ class EditDataPreprocessor(ImgDataPreprocessor): argument maybe deleted in the future. Defaults to None. stack_data_sample (bool): Whether stack a list of data samples to one data sample. Only support with input data samples are - `EditDataSamples`. Defaults to True. + `DataSamples`. Defaults to True. """ _NON_IMAGE_KEYS = ['noise'] _NON_CONCATENATE_KEYS = ['num_batches', 'mode', 'sample_kwargs', 'eq_cfg'] @@ -153,8 +153,7 @@ def _parse_channel_index(inputs) -> int: def _parse_channel_order(self, key: str, inputs: Tensor, - data_sample: Optional[EditDataSample] = None - ) -> str: + data_sample: Optional[DataSample] = None) -> str: channel_index = self._parse_channel_index(inputs) num_color_channels = inputs.shape[channel_index] @@ -177,7 +176,7 @@ def _parse_channel_order(self, color_flag = data_sample.metainfo.get(color_type_key, None) channel_order = data_sample.metainfo.get(channel_order_key, None) - # handle stacked data sample, refers to `EditDataSample.stack` + # handle stacked data sample, refers to `DataSample.stack` if isinstance(color_flag, list): assert all([c == color_flag[0] for c in color_flag]) color_flag = color_flag[0] @@ -200,9 +199,9 @@ def _parse_channel_order(self, # no channel order, infer from num channels return 'single' if num_color_channels == 1 else 'BGR' - def _parse_batch_channel_order( - self, key: str, inputs: Sequence, - data_samples: Optional[Sequence[EditDataSample]]) -> str: + def _parse_batch_channel_order(self, key: str, inputs: Sequence, + data_samples: Optional[Sequence[DataSample]] + ) -> str: """Parse channel order of inputs in batch.""" assert len(inputs) == len(data_samples) @@ -241,16 +240,16 @@ def _update_metainfo(self, channel_order (dict, Optional): The channel order of target field. Key and value are field name and corresponding channel order respectively. - data_samples (List[EditDataSample], optional): The data samples to + data_samples (List[DataSample], optional): The data samples to be updated. If not passed, will initialize a list of empty data samples. Defaults to None. Returns: - List[EditDataSample]: The updated data samples. + List[DataSample]: The updated data samples. """ n_samples = padding_info.shape[0] if data_samples is None: - data_samples = [EditDataSample() for _ in range(n_samples)] + data_samples = [DataSample() for _ in range(n_samples)] else: assert len(data_samples) == n_samples, ( f'The length of \'data_samples\'({len(data_samples)}) and ' @@ -356,18 +355,18 @@ def _preprocess_image_tensor(self, Args: inputs (Tensor): Image tensor with shape (C, H, W), (N, C, H, W) or (N, t, C, H, W) to preprocess. - data_samples (List[EditDataSample], optional): The data samples + data_samples (List[DataSample], optional): The data samples of corresponding inputs. If not passed, a list of empty data samples will be initialized to save metainfo. Defaults to None. key (str): The key of image tensor in data samples. Defaults to 'img'. Returns: - Tuple[Tensor, List[EditDataSample]]: The preprocessed image tensor + Tuple[Tensor, List[DataSample]]: The preprocessed image tensor and updated data samples. """ if not data_samples: # none or empty list - data_samples = [EditDataSample() for _ in range(inputs.shape[0])] + data_samples = [DataSample() for _ in range(inputs.shape[0])] assert inputs.dim() in [ 3, 4, 5 @@ -403,18 +402,18 @@ def _preprocess_image_list(self, Args: tensor_list (List[Tensor]): Image tensor list to be preprocess. - data_samples (List[EditDataSample], optional): The data samples + data_samples (List[DataSample], optional): The data samples of corresponding inputs. If not passed, a list of empty data samples will be initialized to save metainfo. Defaults to None. key (str): The key of tensor list in data samples. Defaults to 'img'. Returns: - Tuple[Tensor, List[EditDataSample]]: The preprocessed image tensor + Tuple[Tensor, List[DataSample]]: The preprocessed image tensor and updated data samples. """ if not data_samples: # none or empty list - data_samples = [EditDataSample() for _ in range(len(tensor_list))] + data_samples = [DataSample() for _ in range(len(tensor_list))] channel_order = self._parse_batch_channel_order( key, tensor_list, data_samples) @@ -474,12 +473,12 @@ def _preprocess_dict_inputs(self, Args: batch_inputs (dict): Input dict. - data_samples (List[EditDataSample], optional): The data samples + data_samples (List[DataSample], optional): The data samples of corresponding inputs. If not passed, a list of empty data samples will be initialized to save metainfo. Defaults to None. Returns: - Tuple[dict, List[EditDataSample]]: The preprocessed dict and + Tuple[dict, List[DataSample]]: The preprocessed dict and updated data samples. """ pad_size_dict = dict() @@ -537,7 +536,7 @@ def _preprocess_dict_inputs(self, return batch_inputs, data_samples def _preprocess_data_sample(self, data_samples: SampleList, - training: bool) -> EditDataSample: + training: bool) -> DataSample: """Preprocess data samples. When `training` is True, fields belong to :attr:`self.data_keys` will be converted to :attr:`self.output_channel_order` and then normalized by `self.mean` @@ -547,7 +546,7 @@ def _preprocess_data_sample(self, data_samples: SampleList, channel order conversion will be updated to data sample as well. Args: - data_samples (List[EditDataSample]): A list of data samples to + data_samples (List[DataSample]): A list of data samples to preprocess. training (bool): Whether in training mode. @@ -587,10 +586,10 @@ def _preprocess_data_sample(self, data_samples: SampleList, data_sample.set_metainfo(data_process_meta) if self.stack_data_sample: - assert is_seq_of(data_samples, EditDataSample), ( - 'Only support \'stack_data_sample\' for EditDataSample ' - 'object. Please refer to \'EditDataSample.stack\'.') - return EditDataSample.stack(data_samples) + assert is_seq_of(data_samples, DataSample), ( + 'Only support \'stack_data_sample\' for DataSample ' + 'object. Please refer to \'DataSample.stack\'.') + return DataSample.stack(data_samples) return data_samples def forward(self, data: dict, training: bool = False) -> dict: @@ -645,12 +644,12 @@ def forward(self, data: dict, training: bool = False) -> dict: def destruct(self, outputs: Tensor, - data_samples: Union[SampleList, EditDataSample, None] = None, + data_samples: Union[SampleList, DataSample, None] = None, key: str = 'img') -> Union[list, Tensor]: """Destruct padding, normalization and convert channel order to BGR if could. If `data_samples` is a list, outputs will be destructed as a - batch of tensor. If `data_samples` is a `EditDataSample`, `outputs` - will be destructed as a single tensor. + batch of tensor. If `data_samples` is a `DataSample`, `outputs` will be + destructed as a single tensor. Before feed model outputs to visualizer and evaluator, users should call this function for model outputs and inputs. @@ -671,7 +670,7 @@ def destruct(self, Args: outputs (Tensor): Tensor to destruct. - data_samples (Union[SampleList, EditDataSample], optional): Data + data_samples (Union[SampleList, DataSample], optional): Data samples (or data sample) corresponding to `outputs`. Defaults to None key (str): The key of field in data sample. Defaults to 'img'. @@ -690,8 +689,7 @@ def destruct(self, def _destruct_norm_and_conversion(self, batch_tensor: Tensor, data_samples: Union[SampleList, - EditDataSample, - None], + DataSample, None], key: str) -> Tensor: """De-norm and de-convert channel order. Noted that, we de-norm first, and then de-conversion, since mean and std used in normalization is @@ -699,7 +697,7 @@ def _destruct_norm_and_conversion(self, batch_tensor: Tensor, Args: batch_tensor (Tensor): Tensor to destruct. - data_samples (Union[SampleList, EditDataSample], optional): Data + data_samples (Union[SampleList, DataSample], optional): Data samples (or data sample) corresponding to `outputs`. key (str): The key of field in data sample. @@ -736,14 +734,13 @@ def _destruct_norm_and_conversion(self, batch_tensor: Tensor, def _destruct_padding(self, batch_tensor: Tensor, - data_samples: Union[SampleList, EditDataSample, - None], + data_samples: Union[SampleList, DataSample, None], same_padding: bool = True) -> Union[list, Tensor]: """Destruct padding of the input tensor. Args: batch_tensor (Tensor): Tensor to destruct. - data_samples (Union[SampleList, EditDataSample], optional): Data + data_samples (Union[SampleList, DataSample], optional): Data samples (or data sample) corresponding to `outputs`. If same_padding (bool): Whether all samples will un-padded with the padding info of the first sample, and return a stacked diff --git a/mmagic/models/data_preprocessors/mattor_preprocessor.py b/mmagic/models/data_preprocessors/mattor_preprocessor.py index b07d9198ff..bb7fc8571e 100644 --- a/mmagic/models/data_preprocessors/mattor_preprocessor.py +++ b/mmagic/models/data_preprocessors/mattor_preprocessor.py @@ -7,12 +7,12 @@ from mmengine import print_log from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import SampleList from .edit_data_preprocessor import EditDataPreprocessor DataSamples = Optional[Union[list, torch.Tensor]] -ForwardResults = Union[Dict[str, torch.Tensor], List[EditDataSample], +ForwardResults = Union[Dict[str, torch.Tensor], List[DataSample], Tuple[torch.Tensor], torch.Tensor] MEAN_STD_TYPE = Union[Sequence[Union[float, int]], float, int] @@ -44,7 +44,7 @@ class MattorPreprocessor(EditDataPreprocessor): Available options are ``rescale_to_zero_one`` and ``as-is``. stack_data_sample (bool): Whether stack a list of data samples to one data sample. Only support with input data samples are - `EditDataSamples`. Defaults to True. + `DataSamples`. Defaults to True. """ def __init__(self, @@ -88,7 +88,7 @@ def _preprocess_data_sample(self, data_samples: SampleList, data sample as well. Args: - data_samples (List[EditDataSample]): A list of data samples to + data_samples (List[DataSample]): A list of data samples to preprocess. training (bool): Whether in training mode. @@ -130,7 +130,7 @@ def _preprocess_data_sample(self, data_samples: SampleList, data_sample.set_metainfo(data_process_meta) if self.stack_data_sample: - return EditDataSample.stack(data_samples) + return DataSample.stack(data_samples) return data_samples diff --git a/mmagic/models/editors/basicvsr/basicvsr.py b/mmagic/models/editors/basicvsr/basicvsr.py index 80b9cc10f0..d3d4eba083 100644 --- a/mmagic/models/editors/basicvsr/basicvsr.py +++ b/mmagic/models/editors/basicvsr/basicvsr.py @@ -3,7 +3,7 @@ from mmagic.models import BaseEditModel from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @MODELS.register_module() @@ -124,7 +124,7 @@ def forward_inference(self, inputs, data_samples=None, **kwargs): data samples collated by :attr:`data_preprocessor`. Returns: - EditDataSample: predictions. + DataSample: predictions. """ feats = self.forward_tensor(inputs, data_samples, **kwargs) @@ -144,7 +144,7 @@ def forward_inference(self, inputs, data_samples=None, **kwargs): feats = feats[:, t // 2] # create a stacked data sample - predictions = EditDataSample( + predictions = DataSample( pred_img=feats.cpu(), metainfo=data_samples.metainfo) return predictions diff --git a/mmagic/models/editors/biggan/biggan.py b/mmagic/models/editors/biggan/biggan.py index 0d1301d7d1..56c65a15db 100644 --- a/mmagic/models/editors/biggan/biggan.py +++ b/mmagic/models/editors/biggan/biggan.py @@ -9,7 +9,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from ...base_models import BaseConditionalGAN ModelType = Union[Dict, nn.Module] @@ -104,14 +104,14 @@ def gen_loss(self, disc_pred_fake): loss, log_var = self.parse_losses(losses_dict) return loss, log_var - def train_discriminator(self, inputs: dict, data_samples: EditDataSample, + def train_discriminator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. Returns: @@ -138,13 +138,13 @@ def train_discriminator(self, inputs: dict, data_samples: EditDataSample, optimizer_wrapper.update_params(parsed_losses) return log_vars - def train_generator(self, inputs: dict, data_samples: EditDataSample, + def train_generator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. diff --git a/mmagic/models/editors/cain/cain.py b/mmagic/models/editors/cain/cain.py index 06ee7b827e..5e124ab817 100644 --- a/mmagic/models/editors/cain/cain.py +++ b/mmagic/models/editors/cain/cain.py @@ -40,7 +40,7 @@ def forward_inference(self, inputs, data_samples=None): data samples collated by :attr:`data_preprocessor`. Returns: - List[EditDataSample]: predictions. + List[DataSample]: predictions. """ predictions = super().forward_inference( diff --git a/mmagic/models/editors/controlnet/controlnet.py b/mmagic/models/editors/controlnet/controlnet.py index 5fc7ae5577..1ce03d7cd5 100644 --- a/mmagic/models/editors/controlnet/controlnet.py +++ b/mmagic/models/editors/controlnet/controlnet.py @@ -15,7 +15,7 @@ from mmagic.models.utils import build_module from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import SampleList from ..stable_diffusion import StableDiffusion from .controlnet_utils import change_base_model @@ -259,7 +259,7 @@ def val_step(self, data: dict) -> SampleList: control = self.data_preprocessor.destruct( control, data['data_samples'], key='source') - data_sample = EditDataSample( + data_sample = DataSample( fake_img=samples, control=control, prompt=data['data_samples'].prompt) @@ -289,7 +289,7 @@ def test_step(self, data: dict) -> SampleList: control = self.data_preprocessor.destruct( control, data['data_samples'], key='source') - data_sample = EditDataSample( + data_sample = DataSample( fake_img=samples, control=control, prompt=data['data_samples'].prompt) diff --git a/mmagic/models/editors/cyclegan/cyclegan.py b/mmagic/models/editors/cyclegan/cyclegan.py index ce80e00b96..99c7596cf9 100644 --- a/mmagic/models/editors/cyclegan/cyclegan.py +++ b/mmagic/models/editors/cyclegan/cyclegan.py @@ -5,7 +5,7 @@ from mmengine.optim import OptimWrapperDict from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import SampleList from ...base_models import BaseTranslationModel from ...utils import set_requires_grad @@ -220,7 +220,7 @@ def test_step(self, data: dict) -> SampleList: sampler. More detials in `Metrics` and `Evaluator`. Returns: - SampleList: A list of ``EditDataSample`` contain generated results. + SampleList: A list of ``DataSample`` contain generated results. """ data = self.data_preprocessor(data) inputs_dict, data_samples = data['inputs'], data['data_samples'] @@ -238,7 +238,7 @@ def test_step(self, data: dict) -> SampleList: num_batches = next(iter(outputs.values())).shape[0] data_samples = data_samples.split() for idx in range(num_batches): - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples[idx]) @@ -260,7 +260,7 @@ def val_step(self, data: dict) -> SampleList: sampler. More detials in `Metrics` and `Evaluator`. Returns: - SampleList: A list of ``EditDataSample`` contain generated results. + SampleList: A list of ``DataSample`` contain generated results. """ data = self.data_preprocessor(data) inputs_dict, data_samples = data['inputs'], data['data_samples'] @@ -278,7 +278,7 @@ def val_step(self, data: dict) -> SampleList: num_batches = next(iter(outputs.values())).shape[0] data_samples = data_samples.split() for idx in range(num_batches): - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples[idx]) diff --git a/mmagic/models/editors/dcgan/dcgan.py b/mmagic/models/editors/dcgan/dcgan.py index b412f7b57b..9791934b2b 100644 --- a/mmagic/models/editors/dcgan/dcgan.py +++ b/mmagic/models/editors/dcgan/dcgan.py @@ -7,7 +7,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from ...base_models import BaseGAN @@ -64,14 +64,14 @@ def gen_loss(self, disc_pred_fake: Tensor) -> Tuple: loss, log_var = self.parse_losses(losses_dict) return loss, log_var - def train_discriminator(self, inputs: dict, data_samples: EditDataSample, + def train_discriminator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. Returns: @@ -92,13 +92,13 @@ def train_discriminator(self, inputs: dict, data_samples: EditDataSample, optimizer_wrapper.update_params(parsed_losses) return log_vars - def train_generator(self, inputs: dict, data_samples: EditDataSample, + def train_generator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. diff --git a/mmagic/models/editors/dic/dic.py b/mmagic/models/editors/dic/dic.py index 1d256c5088..c3400fd0d0 100644 --- a/mmagic/models/editors/dic/dic.py +++ b/mmagic/models/editors/dic/dic.py @@ -191,7 +191,7 @@ def extract_gt_data(data_samples): """extract gt data from data samples. Args: - data_samples (list): List of EditDataSample. + data_samples (list): List of DataSample. Returns: Tensor: Extract gt data. diff --git a/mmagic/models/editors/dim/dim.py b/mmagic/models/editors/dim/dim.py index 725a1650a7..6bd4a9c922 100644 --- a/mmagic/models/editors/dim/dim.py +++ b/mmagic/models/editors/dim/dim.py @@ -160,7 +160,7 @@ def _forward_train(self, inputs, data_samples): Args: inputs (torch.Tensor): Concatenation of normalized image and trimap shape (N, 4, H, W) - data_samples (list[EditDataSample]): Data samples containing: + data_samples (list[DataSample]): Data samples containing: - gt_alpha (Tensor): Ground-truth of alpha shape (N, 1, H, W), normalized to 0 to 1. - gt_fg (Tensor): Ground-truth of foreground diff --git a/mmagic/models/editors/dreambooth/dreambooth.py b/mmagic/models/editors/dreambooth/dreambooth.py index 42cb936ac4..e508cbf48f 100644 --- a/mmagic/models/editors/dreambooth/dreambooth.py +++ b/mmagic/models/editors/dreambooth/dreambooth.py @@ -10,7 +10,7 @@ from mmagic.models.base_archs import set_lora from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import SampleList from ..stable_diffusion.stable_diffusion import StableDiffusion @@ -183,8 +183,7 @@ def val_step(self, data: dict) -> SampleList: prompt = self.val_prompts # construct a fake data_sample for destruct data_samples.split() * len(prompt) - data_samples = EditDataSample.stack(data_samples.split() * - len(prompt)) + data_samples = DataSample.stack(data_samples.split() * len(prompt)) unet_dtype = next(self.unet.parameters()).dtype self.unet.to(self.dtype) @@ -196,7 +195,7 @@ def val_step(self, data: dict) -> SampleList: samples = self.data_preprocessor.destruct(samples, data_samples) - out_data_sample = EditDataSample(fake_img=samples, prompt=prompt) + out_data_sample = DataSample(fake_img=samples, prompt=prompt) data_sample_list = out_data_sample.split() return data_sample_list @@ -219,8 +218,7 @@ def test_step(self, data: dict) -> SampleList: else: prompt = self.val_prompts # construct a fake data_sample for destruct - data_samples = EditDataSample.stack(data['data_samples'] * - len(prompt)) + data_samples = DataSample.stack(data['data_samples'] * len(prompt)) unet_dtype = next(self.unet.parameters()).dtype self.unet.to(self.dtype) @@ -232,7 +230,7 @@ def test_step(self, data: dict) -> SampleList: samples = self.data_preprocessor.destruct(samples, data_samples) - out_data_sample = EditDataSample(fake_img=samples, prompt=prompt) + out_data_sample = DataSample(fake_img=samples, prompt=prompt) data_sample_list = out_data_sample.split() return data_sample_list diff --git a/mmagic/models/editors/eg3d/eg3d.py b/mmagic/models/editors/eg3d/eg3d.py index d1f9243a6d..afbddc8112 100644 --- a/mmagic/models/editors/eg3d/eg3d.py +++ b/mmagic/models/editors/eg3d/eg3d.py @@ -9,7 +9,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import ForwardInputs, SampleList from ...base_models import BaseConditionalGAN from ...utils import get_valid_num_batches @@ -106,7 +106,7 @@ def data_sample_to_label(self, data_sample: SampleList returned. Args: - data_sample (List[EditDataSample]): Input data samples. + data_sample (List[DataSample]): Input data samples. Returns: Optional[torch.Tensor]: Packed label tensor. @@ -117,29 +117,28 @@ def data_sample_to_label(self, data_sample: SampleList return data_sample.gt_label.label def pack_to_data_sample( - self, - output: Dict[str, Tensor], - # index: int, - data_sample: Optional[EditDataSample] = None - ) -> EditDataSample: + self, + output: Dict[str, Tensor], + # index: int, + data_sample: Optional[DataSample] = None) -> DataSample: """Pack output to data sample. If :attr:`data_sample` is not passed, a - new EditDataSample will be instantiated. Otherwise, outputs will be - added to the passed datasample. + new DataSample will be instantiated. Otherwise, outputs will be added + to the passed datasample. Args: output (Dict[Tensor]): Output of the model. index (int): The index to save. - data_sample (EditDataSample, optional): Data sample to save + data_sample (DataSample, optional): Data sample to save outputs. Defaults to None. Returns: - EditDataSample: Data sample with packed outputs. + DataSample: Data sample with packed outputs. """ assert isinstance(output, dict), ('Output of EG3D generator should be a dict.') - data_sample = EditDataSample() if data_sample is None else data_sample + data_sample = DataSample() if data_sample is None else data_sample for k, v in output.items(): assert isinstance(v, torch.Tensor), ( f'Output must be tensor. But \'{k}\' is type of ' @@ -152,7 +151,7 @@ def pack_to_data_sample( def forward(self, inputs: ForwardInputs, data_samples: Optional[list] = None, - mode: Optional[str] = None) -> List[EditDataSample]: + mode: Optional[str] = None) -> List[DataSample]: """Sample images with the given inputs. If forward mode is 'ema' or 'orig', the image generated by corresponding generator will be returned. If forward mode is 'ema/orig', images generated by original @@ -167,7 +166,7 @@ def forward(self, :class:`BaseConditionalGAN`. Defaults to None. Returns: - List[EditDataSample]: Generated images or image dict. + List[DataSample]: Generated images or image dict. """ if isinstance(inputs, Tensor): noise = inputs @@ -195,7 +194,7 @@ def forward(self, outputs['fake_img'] = self.data_preprocessor.destruct( outputs['fake_img'], data_samples) - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples) if isinstance(inputs, dict) and 'img' in inputs: @@ -214,7 +213,7 @@ def forward(self, outputs_ema['fake_img'] = self.data_preprocessor.destruct( outputs_ema['fake_img'], data_samples) - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples) if isinstance(inputs, dict) and 'img' in inputs: diff --git a/mmagic/models/editors/ggan/ggan.py b/mmagic/models/editors/ggan/ggan.py index 811dd5d448..4cb8768c2d 100644 --- a/mmagic/models/editors/ggan/ggan.py +++ b/mmagic/models/editors/ggan/ggan.py @@ -7,7 +7,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from ...base_models import BaseGAN @@ -65,15 +65,14 @@ def gen_loss(self, disc_pred_fake): loss, log_var = self.parse_losses(losses_dict) return loss, log_var - def train_discriminator(self, inputs: dict, - data_samples: List[EditDataSample], + def train_discriminator(self, inputs: dict, data_samples: List[DataSample], optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (dict): Inputs from dataloader. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. Returns: @@ -95,13 +94,13 @@ def train_discriminator(self, inputs: dict, optimizer_wrapper.update_params(parsed_losses) return log_vars - def train_generator(self, inputs: dict, data_samples: List[EditDataSample], + def train_generator(self, inputs: dict, data_samples: List[DataSample], optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (dict): Inputs from dataloader. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. diff --git a/mmagic/models/editors/guided_diffusion/adm.py b/mmagic/models/editors/guided_diffusion/adm.py index 724cd9d527..aa0ba20372 100644 --- a/mmagic/models/editors/guided_diffusion/adm.py +++ b/mmagic/models/editors/guided_diffusion/adm.py @@ -13,7 +13,7 @@ from tqdm import tqdm from mmagic.registry import DIFFUSION_SCHEDULERS, MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import ForwardInputs, SampleList @@ -190,7 +190,7 @@ def infer(self, def forward(self, inputs: ForwardInputs, data_samples: Optional[list] = None, - mode: Optional[str] = None) -> List[EditDataSample]: + mode: Optional[str] = None) -> List[DataSample]: """_summary_ Args: @@ -200,7 +200,7 @@ def forward(self, mode (Optional[str], optional): _description_. Defaults to None. Returns: - List[EditDataSample]: _description_ + List[DataSample]: _description_ """ init_image = inputs.get('init_image', None) batch_size = inputs.get('num_batches', 1) @@ -223,7 +223,7 @@ def forward(self, batch_sample_list = [] for idx in range(batch_size): - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples[idx]) if isinstance(outputs, dict): @@ -264,7 +264,7 @@ def test_step(self, data: dict) -> SampleList: sampler. More detials in `Metrics` and `Evaluator`. Returns: - List[EditDataSample]: Generated image or image dict. + List[DataSample]: Generated image or image dict. """ data = self.data_preprocessor(data) outputs = self(**data) diff --git a/mmagic/models/editors/inst_colorization/inst_colorization.py b/mmagic/models/editors/inst_colorization/inst_colorization.py index 78a33d9a4b..6d6f10b0aa 100644 --- a/mmagic/models/editors/inst_colorization/inst_colorization.py +++ b/mmagic/models/editors/inst_colorization/inst_colorization.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapperDict from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from .color_utils import get_colorization_data, lab2rgb @@ -69,7 +69,7 @@ def __init__(self, def forward(self, inputs: torch.Tensor, - data_samples: Optional[List[EditDataSample]] = None, + data_samples: Optional[List[DataSample]] = None, mode: str = 'tensor', **kwargs): """Returns losses or predictions of training, validation, testing, and @@ -138,11 +138,11 @@ def convert_to_datasample(self, inputs, data_samples): Args: inputs (Optional[torch.Tensor]): The input of model. Defaults to None. - data_samples (List[EditDataSample]): The data samples loaded from + data_samples (List[DataSample]): The data samples loaded from dataloader. Returns: - List[EditDataSample]: Modified data samples. + List[DataSample]: Modified data samples. """ for data_sample, output in zip(inputs, data_samples): @@ -179,7 +179,7 @@ def forward_inference(self, inputs, data_samples=None, **kwargs): data samples collated by :attr:`data_preprocessor`. Returns: - List[EditDataSample]: predictions. + List[DataSample]: predictions. """ feats = self.forward_tensor(inputs, data_samples, **kwargs) feats = self.data_preprocessor.destruct(feats, data_samples) @@ -187,7 +187,7 @@ def forward_inference(self, inputs, data_samples=None, **kwargs): for idx in range(feats.shape[0]): pred_img = feats[idx].to('cpu') predictions.append( - EditDataSample( + DataSample( pred_img=pred_img, metainfo=data_samples[idx].metainfo)) return predictions diff --git a/mmagic/models/editors/liif/liif.py b/mmagic/models/editors/liif/liif.py index 8e7bda5c1e..aa8aaba290 100644 --- a/mmagic/models/editors/liif/liif.py +++ b/mmagic/models/editors/liif/liif.py @@ -5,7 +5,7 @@ from mmagic.models.base_models import BaseEditModel from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @MODELS.register_module() @@ -54,7 +54,7 @@ def forward_inference(self, inputs, data_samples=None, **kwargs): data samples collated by :attr:`data_preprocessor`. Returns: - List[EditDataSample]: predictions. + List[DataSample]: predictions. """ # NOTE: feats: shape [bz, N, 3] feats = self.forward_tensor(inputs, data_samples, test_mode=True) @@ -69,6 +69,6 @@ def forward_inference(self, inputs, data_samples=None, **kwargs): feats = self.data_preprocessor.destruct(feats, data_samples) - predictions = EditDataSample(pred_img=feats.cpu()) + predictions = DataSample(pred_img=feats.cpu()) return predictions diff --git a/mmagic/models/editors/lsgan/lsgan.py b/mmagic/models/editors/lsgan/lsgan.py index f879ed52e8..8c9f2fcaa2 100644 --- a/mmagic/models/editors/lsgan/lsgan.py +++ b/mmagic/models/editors/lsgan/lsgan.py @@ -7,7 +7,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from ...base_models import BaseGAN @@ -71,14 +71,14 @@ def gen_loss(self, disc_pred_fake: Tensor) -> Tuple: loss, log_var = self.parse_losses(losses_dict) return loss, log_var - def train_discriminator(self, inputs: dict, data_samples: EditDataSample, + def train_discriminator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. Returns: @@ -100,13 +100,13 @@ def train_discriminator(self, inputs: dict, data_samples: EditDataSample, optimizer_wrapper.update_params(parsed_losses) return log_vars - def train_generator(self, inputs: dict, data_samples: List[EditDataSample], + def train_generator(self, inputs: dict, data_samples: List[DataSample], optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (dict): Inputs from dataloader. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. diff --git a/mmagic/models/editors/mspie/mspie_stylegan2.py b/mmagic/models/editors/mspie/mspie_stylegan2.py index 6e5e5aac1c..822998d66a 100644 --- a/mmagic/models/editors/mspie/mspie_stylegan2.py +++ b/mmagic/models/editors/mspie/mspie_stylegan2.py @@ -14,7 +14,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from ...utils import set_requires_grad from ..stylegan2 import StyleGAN2 @@ -125,13 +125,13 @@ def train_step(self, data: dict, return log_vars - def train_generator(self, inputs: dict, data_samples: EditDataSample, + def train_generator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (TrainInput): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. @@ -151,14 +151,14 @@ def train_generator(self, inputs: dict, data_samples: EditDataSample, optimizer_wrapper.update_params(parsed_loss) return log_vars - def train_discriminator(self, inputs: dict, data_samples: EditDataSample, + def train_discriminator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (TrainInput): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. Returns: diff --git a/mmagic/models/editors/pggan/pggan.py b/mmagic/models/editors/pggan/pggan.py index c38075d29c..390f4bbe18 100644 --- a/mmagic/models/editors/pggan/pggan.py +++ b/mmagic/models/editors/pggan/pggan.py @@ -15,7 +15,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import ForwardInputs, SampleList from ...base_models import BaseGAN from ...utils import get_valid_num_batches, set_requires_grad @@ -125,7 +125,7 @@ def forward(self, :class:`ProgressiveGrowingGAN`. Defaults to None. Returns: - SampleList: A list of ``EditDataSample`` contain generated results. + SampleList: A list of ``DataSample`` contain generated results. """ if isinstance(inputs, Tensor): noise = inputs @@ -165,7 +165,7 @@ def forward(self, transition_weight=transition_weight) outputs = self.data_preprocessor.destruct(outputs, data_samples) - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples) if isinstance(inputs, dict) and 'img' in inputs: @@ -189,13 +189,13 @@ def forward(self, outputs_ema = self.data_preprocessor.destruct( outputs_ema, data_samples) - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples) if isinstance(inputs, dict) and 'img' in inputs: gen_sample.gt_img = inputs['img'] - gen_sample.ema = EditDataSample(fake_img=outputs_ema) - gen_sample.orig = EditDataSample(fake_img=outputs_orig) + gen_sample.ema = DataSample(fake_img=outputs_ema) + gen_sample.orig = DataSample(fake_img=outputs_orig) gen_sample.noise = noise gen_sample.sample_model = 'ema/orig' batch_sample_list = gen_sample.split(allow_nonseq_value=True) @@ -203,14 +203,14 @@ def forward(self, return batch_sample_list def train_discriminator(self, inputs: Tensor, - data_samples: List[EditDataSample], + data_samples: List[DataSample], optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (Tensor): Inputs from current resolution training. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. @@ -303,14 +303,13 @@ def disc_loss(self, disc_pred_fake: Tensor, disc_pred_real: Tensor, parsed_loss, log_vars = self.parse_losses(losses_dict) return parsed_loss, log_vars - def train_generator(self, inputs: Tensor, - data_samples: List[EditDataSample], + def train_generator(self, inputs: Tensor, data_samples: List[DataSample], optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (Tensor): Inputs from current resolution training. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. diff --git a/mmagic/models/editors/pix2pix/pix2pix.py b/mmagic/models/editors/pix2pix/pix2pix.py index 88c0ec64d5..73c66479e2 100644 --- a/mmagic/models/editors/pix2pix/pix2pix.py +++ b/mmagic/models/editors/pix2pix/pix2pix.py @@ -4,7 +4,7 @@ from mmengine import MessageHub from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import SampleList from ...base_models import BaseTranslationModel from ...utils import set_requires_grad @@ -173,7 +173,7 @@ def test_step(self, data: dict) -> SampleList: sampler. More detials in `Metrics` and `Evaluator`. Returns: - List[EditDataSample]: Generated image or image dict. + List[DataSample]: Generated image or image dict. """ data = self.data_preprocessor(data) inputs_dict, data_samples = data['inputs'], data['data_samples'] @@ -185,7 +185,7 @@ def test_step(self, data: dict) -> SampleList: batch_sample_list = [] num_batches = next(iter(outputs.values())).shape[0] for idx in range(num_batches): - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples[idx]) target = outputs['target'][idx] @@ -203,7 +203,7 @@ def val_step(self, data: dict) -> SampleList: sampler. More detials in `Metrics` and `Evaluator`. Returns: - List[EditDataSample]: Generated image or image dict. + List[DataSampleenerated image or image dict. """ data = self.data_preprocessor(data) inputs_dict, data_samples = data['inputs'], data['data_samples'] @@ -217,7 +217,7 @@ def val_step(self, data: dict) -> SampleList: data_samples = data_samples.split() num_batches = next(iter(outputs.values())).shape[0] for idx in range(num_batches): - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples[idx]) target = outputs['target'][idx] diff --git a/mmagic/models/editors/real_basicvsr/real_basicvsr.py b/mmagic/models/editors/real_basicvsr/real_basicvsr.py index c5aa23bd2f..119e8a62a5 100644 --- a/mmagic/models/editors/real_basicvsr/real_basicvsr.py +++ b/mmagic/models/editors/real_basicvsr/real_basicvsr.py @@ -89,7 +89,7 @@ def extract_gt_data(self, data_samples): """extract gt data from data samples. Args: - data_samples (list): List of EditDataSample. + data_samples (list): List of DataSample. Returns: Tensor: Extract gt data. @@ -203,7 +203,7 @@ def forward_train(self, batch_inputs, data_samples=None): Args: batch_inputs (Tensor): Batch inputs. - data_samples (List[EditDataSample]): Data samples of Editing. + data_samples (List[DataSample]): Data samples of Editing. Default:None Returns: diff --git a/mmagic/models/editors/real_esrgan/real_esrgan.py b/mmagic/models/editors/real_esrgan/real_esrgan.py index f22e0069fa..0772a7d1f0 100644 --- a/mmagic/models/editors/real_esrgan/real_esrgan.py +++ b/mmagic/models/editors/real_esrgan/real_esrgan.py @@ -190,7 +190,7 @@ def extract_gt_data(self, data_samples): """extract gt data from data samples. Args: - data_samples (list): List of EditDataSample. + data_samples (list): List of DataSample. Returns: Tensor: Extract gt data. diff --git a/mmagic/models/editors/sagan/sagan.py b/mmagic/models/editors/sagan/sagan.py index 20e9d419ea..ebdc8d2db3 100644 --- a/mmagic/models/editors/sagan/sagan.py +++ b/mmagic/models/editors/sagan/sagan.py @@ -9,7 +9,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from ...base_models import BaseConditionalGAN ModelType = Union[Dict, nn.Module] @@ -109,14 +109,14 @@ def gen_loss(self, disc_pred_fake: Tensor) -> Tuple[Tensor, dict]: loss, log_var = self.parse_losses(losses_dict) return loss, log_var - def train_discriminator(self, inputs: dict, data_samples: EditDataSample, + def train_discriminator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. Returns: @@ -143,13 +143,13 @@ def train_discriminator(self, inputs: dict, data_samples: EditDataSample, optimizer_wrapper.update_params(parsed_losses) return log_vars - def train_generator(self, inputs: dict, data_samples: EditDataSample, + def train_generator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. diff --git a/mmagic/models/editors/singan/singan.py b/mmagic/models/editors/singan/singan.py index 4f1c5abfac..ed0801e398 100644 --- a/mmagic/models/editors/singan/singan.py +++ b/mmagic/models/editors/singan/singan.py @@ -15,7 +15,7 @@ from mmagic.models.utils import get_module_device from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import ForwardInputs, SampleList from ...base_models import BaseGAN from ...utils import set_requires_grad @@ -173,7 +173,7 @@ def construct_fixed_noises(self): def forward(self, inputs: ForwardInputs, data_samples: Optional[list] = None, - mode=None) -> List[EditDataSample]: + mode=None) -> List[DataSample]: """Forward function for SinGAN. For SinGAN, `inputs` should be a dict contains 'num_batches', 'mode' and other input arguments for the generator. @@ -222,7 +222,7 @@ def forward(self, curr_scale=curr_scale, **gen_kwargs) - gen_sample = EditDataSample() + gen_sample = DataSample() # destruct if isinstance(outputs, dict): outputs['fake_img'] = self.data_preprocessor.destruct( @@ -241,7 +241,7 @@ def forward(self, # save to data sample for idx in range(num_batches): - gen_sample = EditDataSample() + gen_sample = DataSample() # save inputs to data sample if data_samples: gen_sample.update(data_samples[idx]) @@ -297,9 +297,9 @@ def forward(self, # save to data sample for idx in range(num_batches): - gen_sample = EditDataSample() - gen_sample.ema = EditDataSample() - gen_sample.orig = EditDataSample() + gen_sample = DataSample() + gen_sample.ema = DataSample() + gen_sample.orig = DataSample() # save inputs to data sample if data_samples: gen_sample.update(data_samples[idx]) @@ -399,13 +399,13 @@ def disc_loss(self, disc_pred_fake: Tensor, disc_pred_real: Tensor, parsed_loss, log_vars = self.parse_losses(losses_dict) return parsed_loss, log_vars - def train_generator(self, inputs: dict, data_samples: List[EditDataSample], + def train_generator(self, inputs: dict, data_samples: List[DataSample], optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (dict): Inputs from dataloader. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. @@ -433,15 +433,14 @@ def train_generator(self, inputs: dict, data_samples: List[EditDataSample], optimizer_wrapper.update_params(parsed_loss) return log_vars - def train_discriminator(self, inputs: dict, - data_samples: List[EditDataSample], + def train_discriminator(self, inputs: dict, data_samples: List[DataSample], optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (dict): Inputs from dataloader. - data_samples (List[EditDataSample]): Data samples from dataloader. + data_samples (List[DataSample]): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. Returns: @@ -465,7 +464,7 @@ def train_discriminator(self, inputs: dict, optimizer_wrapper.update_params(parsed_loss) return log_vars - def train_gan(self, inputs_dict: dict, data_sample: List[EditDataSample], + def train_gan(self, inputs_dict: dict, data_sample: List[DataSample], optim_wrapper: OptimWrapperDict) -> Dict[str, torch.Tensor]: """Train GAN model. In the training of GAN models, generator and discriminator are updated alternatively. In MMagic's design, @@ -477,7 +476,7 @@ def train_gan(self, inputs_dict: dict, data_sample: List[EditDataSample], Args: data (dict): Data sampled from dataloader. - data_sample (List[EditDataSample]): List of data sample contains GT + data_sample (List[DataSample]): List of data sample contains GT and meta information. optim_wrapper (OptimWrapperDict): OptimWrapperDict instance contains OptimWrapper of generator and discriminator. @@ -648,7 +647,7 @@ def test_step(self, data: dict) -> SampleList: sampler. More detials in `Metrics` and `Evaluator`. Returns: - SampleList: A list of ``EditDataSample`` contain generated results. + SampleList: A list of ``DataSample`` contain generated results. """ if not self.loaded_test_pkl: self.load_test_pkl() diff --git a/mmagic/models/editors/srgan/srgan.py b/mmagic/models/editors/srgan/srgan.py index 42ee3c7750..88fdd03e63 100644 --- a/mmagic/models/editors/srgan/srgan.py +++ b/mmagic/models/editors/srgan/srgan.py @@ -259,7 +259,7 @@ def extract_gt_data(self, data_samples): """extract gt data from data samples. Args: - data_samples (list): List of EditDataSample. + data_samples (list): List of DataSample. Returns: Tensor: Extract gt data. diff --git a/mmagic/models/editors/stable_diffusion/stable_diffusion.py b/mmagic/models/editors/stable_diffusion/stable_diffusion.py index f92a6ef212..0104fffc9a 100644 --- a/mmagic/models/editors/stable_diffusion/stable_diffusion.py +++ b/mmagic/models/editors/stable_diffusion/stable_diffusion.py @@ -15,7 +15,7 @@ from mmagic.models.utils import build_module, set_xformers from mmagic.registry import DIFFUSION_SCHEDULERS, MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import SampleList logger = MMLogger.get_current_instance() @@ -538,10 +538,10 @@ def val_step(self, data: dict) -> SampleList: samples = self.data_preprocessor.destruct(samples, data_samples) gt_img = self.data_preprocessor.destruct(data['inputs'], data_samples) - out_data_sample = EditDataSample( + out_data_sample = DataSample( fake_img=samples, gt_img=gt_img, prompt=prompt) - # out_data_sample = EditDataSample(fake_img=samples, prompt=prompt) + # out_data_sample = DataSample(fake_img=samples, prompt=prompt) data_sample_list = out_data_sample.split() return data_sample_list @@ -557,7 +557,7 @@ def test_step(self, data: dict) -> SampleList: samples = self.data_preprocessor.destruct(samples, data_samples) gt_img = self.data_preprocessor.destruct(data['inputs'], data_samples) - out_data_sample = EditDataSample( + out_data_sample = DataSample( fake_img=samples, gt_img=gt_img, prompt=prompt) data_sample_list = out_data_sample.split() return data_sample_list diff --git a/mmagic/models/editors/stylegan2/stylegan2.py b/mmagic/models/editors/stylegan2/stylegan2.py index 4224ffd7f8..ea79e093b6 100644 --- a/mmagic/models/editors/stylegan2/stylegan2.py +++ b/mmagic/models/editors/stylegan2/stylegan2.py @@ -11,7 +11,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from ...base_models import BaseGAN from ...losses import gen_path_regularizer, r1_gradient_penalty_loss from ...utils import set_requires_grad @@ -166,14 +166,14 @@ def gen_loss(self, disc_pred_fake: Tensor, batch_size: int) -> Tuple: loss, log_var = self.parse_losses(losses_dict) return loss, log_var - def train_discriminator(self, inputs: dict, data_samples: EditDataSample, + def train_discriminator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. Returns: @@ -198,13 +198,13 @@ def train_discriminator(self, inputs: dict, data_samples: EditDataSample, message_hub.update_info('disc_pred_real', disc_pred_real) return log_vars - def train_generator(self, inputs: dict, data_samples: EditDataSample, + def train_generator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. diff --git a/mmagic/models/editors/stylegan3/stylegan3.py b/mmagic/models/editors/stylegan3/stylegan3.py index 255a4f7b3c..d563754559 100644 --- a/mmagic/models/editors/stylegan3/stylegan3.py +++ b/mmagic/models/editors/stylegan3/stylegan3.py @@ -9,7 +9,7 @@ from torch import Tensor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import SampleList from ...utils import get_module_device, get_valid_num_batches from ..stylegan2 import StyleGAN2 @@ -63,7 +63,7 @@ def test_step(self, data: dict) -> SampleList: sampler. More detials in `Metrics` and `Evaluator`. Returns: - SampleList: A list of ``EditDataSample`` contain generated results. + SampleList: A list of ``DataSample`` contain generated results. """ data = self.data_preprocessor(data) inputs_dict, data_samples = data['inputs'], data['data_samples'] @@ -87,7 +87,7 @@ def val_step(self, data: dict) -> SampleList: sampler. More detials in `Metrics` and `Evaluator`. Returns: - SampleList: A list of ``EditDataSample`` contain generated results. + SampleList: A list of ``DataSample`` contain generated results. """ data = self.data_preprocessor(data) inputs_dict, data_samples = data['inputs'], data['data_samples'] @@ -103,14 +103,14 @@ def val_step(self, data: dict) -> SampleList: outputs = self(inputs_dict, data_samples) return outputs - def train_discriminator(self, inputs: dict, data_samples: EditDataSample, + def train_discriminator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. Returns: @@ -136,13 +136,13 @@ def train_discriminator(self, inputs: dict, data_samples: EditDataSample, message_hub.update_info('disc_pred_real', disc_pred_real) return log_vars - def train_generator(self, inputs: dict, data_samples: EditDataSample, + def train_generator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. @@ -191,7 +191,7 @@ def sample_equivarience_pairs(self, transform_matrix[:] = identity_matrix orig = generator.synthesis(ws=ws, **sample_kwargs) - batch_sample = [EditDataSample() for _ in range(batch_size)] + batch_sample = [DataSample() for _ in range(batch_size)] # Integer translation (EQ-T). if eq_cfg['compute_eqt_int']: t = (torch.rand(2, device=device) * 2 - @@ -206,7 +206,7 @@ def sample_equivarience_pairs(self, for idx in range(batch_size): data_sample = batch_sample[idx] setattr(data_sample, 'eqt_int', - EditDataSample(diff=diff, mask=mask)) + DataSample(diff=diff, mask=mask)) # Fractional translation (EQ-T_frac). if eq_cfg['compute_eqt_frac']: @@ -221,7 +221,7 @@ def sample_equivarience_pairs(self, for idx in range(batch_size): data_sample = batch_sample[idx] setattr(data_sample, 'eqt_frac', - EditDataSample(diff=diff, mask=mask)) + DataSample(diff=diff, mask=mask)) # Rotation (EQ-R). if eq_cfg['compute_eqr']: @@ -236,7 +236,6 @@ def sample_equivarience_pairs(self, diff = (ref - pseudo).square() * mask for idx in range(batch_size): data_sample = batch_sample[idx] - setattr(data_sample, 'eqr', - EditDataSample(diff=diff, mask=mask)) + setattr(data_sample, 'eqr', DataSample(diff=diff, mask=mask)) return batch_sample diff --git a/mmagic/models/editors/ttsr/ttsr.py b/mmagic/models/editors/ttsr/ttsr.py index 4389015de3..52ea3fb7c4 100644 --- a/mmagic/models/editors/ttsr/ttsr.py +++ b/mmagic/models/editors/ttsr/ttsr.py @@ -6,7 +6,7 @@ from mmagic.models.utils import set_requires_grad from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from ..srgan import SRGAN @@ -119,7 +119,7 @@ def if_run_d(self): return self.step_counter >= self.pixel_init and super().if_run_d() - def g_step(self, batch_outputs, batch_gt_data: EditDataSample): + def g_step(self, batch_outputs, batch_gt_data: DataSample): """G step of GAN: Calculate losses of generator. Args: diff --git a/mmagic/models/editors/wgan_gp/wgan_gp.py b/mmagic/models/editors/wgan_gp/wgan_gp.py index 49903388a7..af19d1557d 100644 --- a/mmagic/models/editors/wgan_gp/wgan_gp.py +++ b/mmagic/models/editors/wgan_gp/wgan_gp.py @@ -8,7 +8,7 @@ from mmagic.models.base_models import BaseGAN from mmagic.models.losses import gradient_penalty_loss from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @MODELS.register_module() @@ -73,14 +73,14 @@ def gen_loss(self, disc_pred_fake: Tensor) -> Tuple: loss, log_var = self.parse_losses(losses_dict) return loss, log_var - def train_discriminator(self, inputs: dict, data_samples: EditDataSample, + def train_discriminator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper ) -> Dict[str, Tensor]: """Train discriminator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. Returns: @@ -103,13 +103,13 @@ def train_discriminator(self, inputs: dict, data_samples: EditDataSample, optimizer_wrapper.update_params(parsed_losses) return log_vars - def train_generator(self, inputs: dict, data_samples: EditDataSample, + def train_generator(self, inputs: dict, data_samples: DataSample, optimizer_wrapper: OptimWrapper) -> Dict[str, Tensor]: """Train generator. Args: inputs (dict): Inputs from dataloader. - data_samples (EditDataSample): Data samples from dataloader. + data_samples (DataSample): Data samples from dataloader. Do not used in generator's training. optim_wrapper (OptimWrapper): OptimWrapper instance used to update model parameters. diff --git a/mmagic/models/utils/model_utils.py b/mmagic/models/utils/model_utils.py index bd6441d9a4..a7f5192661 100644 --- a/mmagic/models/utils/model_utils.py +++ b/mmagic/models/utils/model_utils.py @@ -12,7 +12,7 @@ from torch import Tensor from torch.nn import init -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import ForwardInputs @@ -166,7 +166,7 @@ def get_valid_noise_size(noise_size: Optional[int], def get_valid_num_batches(batch_inputs: Optional[ForwardInputs] = None, - data_samples: List[EditDataSample] = None) -> int: + data_samples: List[DataSample] = None) -> int: """Try get the valid batch size from inputs. - If some values in `batch_inputs` are `Tensor` and 'num_batches' is in diff --git a/mmagic/structures/__init__.py b/mmagic/structures/__init__.py index 562e558244..326eced828 100644 --- a/mmagic/structures/__init__.py +++ b/mmagic/structures/__init__.py @@ -1,4 +1,4 @@ # Copyright (c) OpenMMLab. All rights reserved. -from .edit_data_sample import EditDataSample +from .data_sample import DataSample -__all__ = ['EditDataSample'] +__all__ = ['DataSample'] diff --git a/mmagic/structures/edit_data_sample.py b/mmagic/structures/data_sample.py similarity index 84% rename from mmagic/structures/edit_data_sample.py rename to mmagic/structures/data_sample.py index ddbd71ebef..db5e4635c2 100644 --- a/mmagic/structures/edit_data_sample.py +++ b/mmagic/structures/data_sample.py @@ -60,7 +60,7 @@ def is_splitable_var(var: Any) -> bool: Returns: bool: Whether input variable is a splitable variable. """ - if isinstance(var, EditDataSample): + if isinstance(var, DataSample): return True if isinstance(var, torch.Tensor): return True @@ -71,20 +71,20 @@ def is_splitable_var(var: Any) -> bool: return False -class EditDataSample(BaseDataElement): +class DataSample(BaseDataElement): """A data structure interface of MMagic. They are used as interfaces between different components, e.g., model, visualizer, evaluator, etc. - Typically, EditDataSample contains all the information and data from - ground-truth and predictions. + Typically, DataSample contains all the information and data from ground- + truth and predictions. - `EditDataSample` inherits from `BaseDataElement`. See more details in: + `DataSample` inherits from `BaseDataElement`. See more details in: https://mmengine.readthedocs.io/en/latest/advanced_tutorials/data_element.html Specifically, an instance of BaseDataElement consists of two components, - ``metainfo``, which contains some meta information, - e.g., `img_shape`, `img_id`, etc. + e.g., `img_shape`, `img_id`, `color_order`, etc. - ``data``, which contains the data used in the loop. - The attributes in ``EditDataSample`` are divided into several parts: + The attributes in ``DataSample`` are divided into several parts: - ``gt_img``: Ground truth image(s). - ``pred_img``: Image(s) of model predictions. @@ -103,12 +103,13 @@ class EditDataSample(BaseDataElement): >>> import torch >>> import numpy as np - >>> from mmagic.structures import EditDataSample + >>> from mmagic.structures import DataSample >>> img_meta = dict(img_shape=(800, 1196, 3)) >>> img = torch.rand((3, 800, 1196)) - >>> data_sample = EditDataSample(gt_img=img, metainfo=img_meta) + >>> data_sample = DataSample(gt_img=img, metainfo=img_meta) >>> assert 'img_shape' in data_sample.metainfo_keys() - >> data_sample + + + We also support `stack` and `split` operation to handle a batch of data + samples: + >>> import torch + >>> import numpy as np + >>> from mmagic.structures import DataSample + >>> img_meta1 = img_meta2 = dict(img_shape=(800, 1196, 3)) + >>> img1 = torch.rand((3, 800, 1196)) + >>> img2 = torch.rand((3, 800, 1196)) + >>> data_sample1 = DataSample(gt_img=img1, metainfo=img_meta1) + >>> data_sample2 = DataSample(gt_img=img2, metainfo=img_meta1) + + >>> # stack them and then use as batched-tensor! + >>> data_sample = DataSample.stack([data_sample1, data_sample2]) + >>> print(data_sample.gt_img.shape) + torch.Size([2, 3, 800, 1196]) + >>> print(data_sample.metainfo) + {'img_shape': [(800, 1196, 3), (800, 1196, 3)]} + + >>> # split them if you want + >>> data_sample1_, data_sample2_ = data_sample.split() + >>> assert (data_sample1_.gt_img == img1).all() + >>> assert (data_sample2_.gt_img == img2).all() """ # source_key_in_results: target_key_in_metainfo @@ -211,7 +235,7 @@ def set_tensor_data(self, data: dict) -> None: def set_gt_label( self, value: Union[np.ndarray, torch.Tensor, Sequence[Number], Number] - ) -> 'EditDataSample': + ) -> 'DataSample': """Set label of ``gt_label``.""" label = format_label(value, self.get('num_classes')) if 'gt_label' in self: @@ -244,18 +268,17 @@ def gt_label(self): del self._gt_label @classmethod - def stack(cls, - data_samples: Sequence['EditDataSample']) -> 'EditDataSample': + def stack(cls, data_samples: Sequence['DataSample']) -> 'DataSample': """Stack a list of data samples to one. All tensor fields will be stacked at first dimension. Otherwise the values will be saved in a list. Args: - data_samples (Sequence['EditDataSample']): A sequence of - `EditDataSample` to stack. + data_samples (Sequence['DataSample']): A sequence of + `DataSample` to stack. Returns: - EditDataSample: The stacked data sample. + DataSample: The stacked data sample. """ # 1. check key consistency keys = data_samples[0].keys() @@ -266,7 +289,7 @@ def stack(cls, [data.metainfo_keys() == meta_keys for data in data_samples]) # 2. stack data - stacked_data_sample = EditDataSample() + stacked_data_sample = DataSample() for k in keys: values = [getattr(data, k) for data in data_samples] # 3. check type consistent @@ -292,7 +315,7 @@ def stack(cls, return stacked_data_sample def split(self, - allow_nonseq_value: bool = False) -> Sequence['EditDataSample']: + allow_nonseq_value: bool = False) -> Sequence['DataSample']: """Split a sequence of data sample in the first dimension. Args: @@ -302,10 +325,10 @@ def split(self, raised. Defaults to False. Returns: - Sequence[EditDataSample]: The list of data samples after splitting. + Sequence[DataSample]: The list of data samples after splitting. """ # 1. split - data_sample_list = [EditDataSample() for _ in range(len(self))] + data_sample_list = [DataSample() for _ in range(len(self))] for k in self.all_keys(): stacked_value = self.get(k) if isinstance(stacked_value, torch.Tensor): @@ -315,7 +338,7 @@ def split(self, # split tensor shape like (N, *shape) to N (*shape) tensors labels = [l_ for l_ in stacked_value.label] values = [LabelData(label=l_) for l_ in labels] - elif isinstance(stacked_value, EditDataSample): + elif isinstance(stacked_value, DataSample): values = stacked_value.split() else: if is_splitable_var(stacked_value): diff --git a/mmagic/visualization/__init__.py b/mmagic/visualization/__init__.py index c73cb15286..678fca1001 100644 --- a/mmagic/visualization/__init__.py +++ b/mmagic/visualization/__init__.py @@ -1,10 +1,10 @@ # Copyright (c) OpenMMLab. All rights reserved. from .concat_visualizer import ConcatImageVisualizer -from .gen_visualizer import GenVisualizer -from .vis_backend import (GenVisBackend, PaviGenVisBackend, - TensorboardGenVisBackend, WandbGenVisBackend) +from .vis_backend import (PaviVisBackend, TensorboardVisBackend, VisBackend, + WandbVisBackend) +from .visualizer import Visualizer __all__ = [ - 'ConcatImageVisualizer', 'GenVisualizer', 'GenVisBackend', - 'PaviGenVisBackend', 'TensorboardGenVisBackend', 'WandbGenVisBackend' + 'ConcatImageVisualizer', 'Visualizer', 'VisBackend', 'PaviVisBackend', + 'TensorboardVisBackend', 'WandbVisBackend' ] diff --git a/mmagic/visualization/concat_visualizer.py b/mmagic/visualization/concat_visualizer.py index d24d04d2ec..f91255d11b 100644 --- a/mmagic/visualization/concat_visualizer.py +++ b/mmagic/visualization/concat_visualizer.py @@ -8,7 +8,7 @@ from mmengine.visualization import Visualizer from mmagic.registry import VISUALIZERS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import print_colored_log @@ -53,13 +53,13 @@ def __init__(self, self.pixel_range = pixel_range self.bgr2rgb = bgr2rgb - def add_datasample(self, data_sample: EditDataSample, step=0) -> None: + def add_datasample(self, data_sample: DataSample, step=0) -> None: """Concatenate image and draw. Args: input (torch.Tensor): Single input tensor from data_batch. - data_sample (EditDataSample): Single data_sample from data_batch. - output (EditDataSample): Single prediction output by model. + data_sample (DataSample): Single data_sample from data_batch. + output (DataSample): Single prediction output by model. step (int): Global step value to record. Default: 0. """ # Note: diff --git a/mmagic/visualization/vis_backend.py b/mmagic/visualization/vis_backend.py index 13de0a6c1f..c8f7136e59 100644 --- a/mmagic/visualization/vis_backend.py +++ b/mmagic/visualization/vis_backend.py @@ -10,24 +10,26 @@ from mmengine import MessageHub from mmengine.config import Config from mmengine.fileio import dump, get_file_backend -from mmengine.visualization import (BaseVisBackend, TensorboardVisBackend, - WandbVisBackend) +from mmengine.visualization import BaseVisBackend +from mmengine.visualization import \ + TensorboardVisBackend as BaseTensorboardVisBackend +from mmengine.visualization import WandbVisBackend as BaseWandbVisBackend from mmengine.visualization.vis_backend import force_init_env from mmagic.registry import VISBACKENDS @VISBACKENDS.register_module() -class GenVisBackend(BaseVisBackend): - """Generation visualization backend class. It can write image, config, - scalars, etc. to the local hard disk and ceph path. You can get the drawing - backend through the experiment property for custom drawing. +class VisBackend(BaseVisBackend): + """MMagic visualization backend class. It can write image, config, scalars, + etc. to the local hard disk and ceph path. You can get the drawing backend + through the experiment property for custom drawing. Examples: - >>> from mmagic.visualization import GenVisBackend + >>> from mmagic.visualization import VisBackend >>> import numpy as np - >>> vis_backend = GenVisBackend(save_dir='temp_dir', - >>> ceph_path='s3://temp-bucket') + >>> vis_backend = VisBackend(save_dir='temp_dir', + >>> ceph_path='s3://temp-bucket') >>> img = np.random.randint(0, 256, size=(10, 10, 3)) >>> vis_backend.add_image('img', img) >>> vis_backend.add_scalar('mAP', 0.6) @@ -113,7 +115,7 @@ def _init_env(self): @property # type: ignore @force_init_env - def experiment(self) -> 'GenVisBackend': + def experiment(self) -> 'VisBackend': """Return the experiment object associated with this visualization backend.""" return self @@ -258,7 +260,7 @@ def _upload(self, path: str, delete_local=False) -> None: @VISBACKENDS.register_module() -class TensorboardGenVisBackend(TensorboardVisBackend): +class TensorboardVisBackend(BaseTensorboardVisBackend): @force_init_env def add_image(self, name: str, image: np.array, step: int = 0, **kwargs): @@ -294,7 +296,7 @@ def add_image(self, name: str, image: np.array, step: int = 0, **kwargs): @VISBACKENDS.register_module() -class PaviGenVisBackend(BaseVisBackend): +class PaviVisBackend(BaseVisBackend): """Visualization backend for Pavi.""" def __init__(self, @@ -318,7 +320,7 @@ def _init_env(self): import pavi except ImportError: raise ImportError( - 'To use \'PaviGenVisBackend\' Pavi must be installed.') + 'To use \'PaviVisBackend\' Pavi must be installed.') self._pavi = pavi.SummaryWriter( name=self._name, labels=self._labels, @@ -329,7 +331,7 @@ def _init_env(self): @property # type: ignore @force_init_env - def experiment(self) -> 'GenVisBackend': + def experiment(self) -> 'VisBackend': """Return the experiment object associated with this visualization backend.""" return self._pavi @@ -396,7 +398,7 @@ def add_scalars(self, @VISBACKENDS.register_module() -class WandbGenVisBackend(WandbVisBackend): +class WandbVisBackend(BaseWandbVisBackend): """Wandb visualization backend for MMagic.""" def _init_env(self): diff --git a/mmagic/visualization/gen_visualizer.py b/mmagic/visualization/visualizer.py similarity index 96% rename from mmagic/visualization/gen_visualizer.py rename to mmagic/visualization/visualizer.py index 6554652db2..4ed7853d9e 100644 --- a/mmagic/visualization/gen_visualizer.py +++ b/mmagic/visualization/visualizer.py @@ -5,19 +5,19 @@ import numpy as np import torch from mmengine.dist import master_only -from mmengine.visualization import Visualizer +from mmengine.visualization import Visualizer as BaseVisualizer from torch import Tensor from torchvision.utils import make_grid from mmagic.registry import VISUALIZERS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import SampleList mean_std_type = Optional[Sequence[Union[float, int]]] @VISUALIZERS.register_module() -class GenVisualizer(Visualizer): +class Visualizer(BaseVisualizer): """MMagic Visualizer. Args: @@ -30,7 +30,7 @@ class GenVisualizer(Visualizer): Examples:: >>> # Draw image - >>> vis = GenVisualizer() + >>> vis = Visualizer() >>> vis.add_datasample( >>> 'random_noise', >>> gen_samples=torch.rand(2, 3, 10, 10), @@ -223,11 +223,11 @@ def _vis_image_sample(self, gen_samples: SampleList, vis_results = vis_results.numpy().astype(np.uint8) return vis_results - def _get_vis_data_by_key(self, sample: EditDataSample, key: str) -> Tensor: - """Get tensor in ``EditDataSample`` by the given key. + def _get_vis_data_by_key(self, sample: DataSample, key: str) -> Tensor: + """Get tensor in ``DataSample`` by the given key. Args: - sample (EditDataSample): Input data sample. + sample (DataSample): Input data sample. key (str): Name of the target tensor. Returns: @@ -264,7 +264,7 @@ def _get_vis_data_by_key(self, sample: EditDataSample, key: str) -> Tensor: def add_datasample(self, name: str, *, - gen_samples: Sequence[EditDataSample], + gen_samples: Sequence[DataSample], target_keys: Optional[Tuple[str, List[str]]] = None, vis_mode: Optional[str] = None, n_row: Optional[int] = None, @@ -283,7 +283,7 @@ def add_datasample(self, Args: name (str): The image identifier. - gen_samples (List[EditDataSample]): Data samples to visualize. + gen_samples (List[DataSample]): Data samples to visualize. vis_mode (str, optional): Visualization mode. If not passed, will visualize results as image. Defaults to None. n_rows (int, optional): Number of images in one row. diff --git a/projects/glide/models/glide.py b/projects/glide/models/glide.py index 34a7694b07..0317364edb 100644 --- a/projects/glide/models/glide.py +++ b/projects/glide/models/glide.py @@ -13,7 +13,7 @@ from tqdm import tqdm from mmagic.registry import DIFFUSION_SCHEDULERS, MODELS, MODULES -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils.typing import ForwardInputs, SampleList # from .guider import ImageTextGuider @@ -196,7 +196,7 @@ def infer(self, def forward(self, inputs: ForwardInputs, data_samples: Optional[list] = None, - mode: Optional[str] = None) -> List[EditDataSample]: + mode: Optional[str] = None) -> List[DataSample]: """_summary_ Args: @@ -206,7 +206,7 @@ def forward(self, mode (Optional[str], optional): _description_. Defaults to None. Returns: - List[EditDataSample]: _description_ + List[DataSample]: _description_ """ init_image = inputs.get('init_image', None) batch_size = inputs.get('batch_size', 1) @@ -229,13 +229,13 @@ def forward(self, batch_sample_list = [] for idx in range(batch_size): - gen_sample = EditDataSample() + gen_sample = DataSample() if data_samples: gen_sample.update(data_samples[idx]) if isinstance(outputs, dict): - gen_sample.ema = EditDataSample( + gen_sample.ema = DataSample( fake_img=outputs['ema'][idx], sample_model='ema') - gen_sample.orig = EditDataSample( + gen_sample.orig = DataSample( fake_img=outputs['orig'][idx], sample_model='orig') gen_sample.sample_model = 'ema/orig' gen_sample.set_gt_label(labels[idx]) @@ -279,7 +279,7 @@ def test_step(self, data: dict) -> SampleList: sampler. More detials in `Metrics` and `Evaluator`. Returns: - List[EditDataSample]: Generated image or image dict. + List[DataSample]: Generated image or image dict. """ data = self.data_preprocessor(data) outputs = self(**data) diff --git a/tests/test_datasets/test_transforms/test_formatting.py b/tests/test_datasets/test_transforms/test_formatting.py index 8b00bed1ce..b4afc08632 100644 --- a/tests/test_datasets/test_transforms/test_formatting.py +++ b/tests/test_datasets/test_transforms/test_formatting.py @@ -4,7 +4,7 @@ from mmcv.transforms import to_tensor from mmagic.datasets.transforms import PackEditInputs -from mmagic.structures.edit_data_sample import EditDataSample +from mmagic.structures.data_sample import DataSample def assert_tensor_equal(img, ref_img, ratio_thr=0.999): @@ -48,7 +48,7 @@ def test_pack_edit_inputs(): assert set(target_keys).issubset(set(packed_results.keys())) data_sample = packed_results['data_samples'] - assert isinstance(data_sample, EditDataSample) + assert isinstance(data_sample, DataSample) assert data_sample.img_shape == (64, 64) assert data_sample.a == 'b' diff --git a/tests/test_engine/test_hooks/test_iter_time_hook.py b/tests/test_engine/test_hooks/test_iter_time_hook.py index 4d32ccabff..cdc7cf9d35 100644 --- a/tests/test_engine/test_hooks/test_iter_time_hook.py +++ b/tests/test_engine/test_hooks/test_iter_time_hook.py @@ -4,7 +4,7 @@ from mmengine.logging import MessageHub -from mmagic.engine import EditIterTimerHook +from mmagic.engine import IterTimerHook def time_patch(): @@ -18,7 +18,7 @@ def time_patch(): class TestIterTimerHook(TestCase): def setUp(self) -> None: - self.hook = EditIterTimerHook() + self.hook = IterTimerHook() def test_init(self): assert self.hook.time_sec_tot == 0 diff --git a/tests/test_engine/test_hooks/test_visualization_hook.py b/tests/test_engine/test_hooks/test_visualization_hook.py index 61a918a8bf..b17c85efad 100644 --- a/tests/test_engine/test_hooks/test_visualization_hook.py +++ b/tests/test_engine/test_hooks/test_visualization_hook.py @@ -11,9 +11,9 @@ from mmengine.visualization import Visualizer from torch.utils.data.dataset import Dataset -from mmagic.engine import GenVisualizationHook +from mmagic.engine import VisualizationHook from mmagic.engine.hooks import BasicVisualizationHook -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules from mmagic.visualization import ConcatImageVisualizer @@ -22,11 +22,11 @@ register_all_modules() -class TestVisualizationHook(TestCase): +class TestBasicVisualizationHook(TestCase): def setUp(self) -> None: input = torch.rand(2, 3, 32, 32) - data_sample = EditDataSample( + data_sample = DataSample( path_rgb='rgb.png', tensor3d=torch.ones(3, 32, 32) * torch.tensor([[[0.1]], [[0.2]], [[0.3]]]), @@ -83,26 +83,26 @@ def test_after_iter(self): assert runner.visualizer.assert_not_called -class TestGenVisualizationHook(TestCase): +class TestVisualizationHook(TestCase): Visualizer.get_instance('test-gen-visualizer') MessageHub.get_instance('test-gen-visualizer') def test_init(self): - hook = GenVisualizationHook( + hook = VisualizationHook( interval=10, vis_kwargs_list=dict(type='Noise')) self.assertEqual(hook.interval, 10) self.assertEqual(hook.vis_kwargs_list, [dict(type='Noise')]) self.assertEqual(hook.n_samples, 64) self.assertFalse(hook.show) - hook = GenVisualizationHook( + hook = VisualizationHook( interval=10, vis_kwargs_list=[dict(type='Noise'), dict(type='Translation')]) self.assertEqual(len(hook.vis_kwargs_list), 2) - hook = GenVisualizationHook( + hook = VisualizationHook( interval=10, vis_kwargs_list=dict(type='GAN'), show=True) self.assertEqual(hook._visualizer._vis_backends, {}) @@ -119,7 +119,7 @@ def test_vis_sample_with_gan_alias(self): runner.train_dataloader = MagicMock() runner.train_dataloader.batch_size = 10 - hook = GenVisualizationHook( + hook = VisualizationHook( interval=10, vis_kwargs_list=dict(type='GAN'), n_samples=9) mock_visualuzer = MagicMock() mock_visualuzer.add_datasample = MagicMock() @@ -127,8 +127,7 @@ def test_vis_sample_with_gan_alias(self): # build a empty data sample data_batch = [ - dict(inputs=None, data_samples=EditDataSample()) - for idx in range(10) + dict(inputs=None, data_samples=DataSample()) for idx in range(10) ] hook.vis_sample(runner, 0, data_batch, None) _, called_kwargs = mock_visualuzer.add_datasample.call_args @@ -195,7 +194,7 @@ def __getitem__(self, index): img_mask = torch.ones(3, 32, 32) * (weight + 1) return dict( inputs=dict(img_photo=img_photo, img_mask=img_mask), - data_samples=EditDataSample( + data_samples=DataSample( img_photo=img_photo, img_mask=img_mask)) train_dataloader = MagicMock() @@ -211,7 +210,7 @@ def __getitem__(self, index): runner.val_loop = MagicMock() runner.val_loop.dataloader = val_dataloader - hook = GenVisualizationHook( + hook = VisualizationHook( interval=10, vis_kwargs_list=[ dict(type='Translation'), @@ -224,8 +223,7 @@ def __getitem__(self, index): # build a empty data sample data_batch = [ - dict(inputs=None, data_samples=EditDataSample()) - for idx in range(4) + dict(inputs=None, data_samples=DataSample()) for idx in range(4) ] hook.vis_sample(runner, 0, data_batch, None) called_kwargs_list = mock_visualuzer.add_datasample.call_args_list @@ -292,7 +290,7 @@ def __getitem__(self, index): # runner.train_dataloader = MagicMock() # runner.train_dataloader.batch_size = 10 - # hook = GenVisualizationHook( + # hook = VisualizationHook( # interval=10, # n_samples=2, # vis_kwargs_list=dict( @@ -304,7 +302,7 @@ def __getitem__(self, index): # # build a empty data sample # data_batch = [ - # dict(inputs=None, data_sample=EditDataSample()) + # dict(inputs=None, data_sample=DataSample()) # for idx in range(10) # ] # hook.vis_sample(runner, 0, data_batch, None) @@ -333,7 +331,7 @@ def __getitem__(self, index): # # build a empty data sample # data_batch = [ - # dict(inputs=None, data_sample=EditDataSample()) + # dict(inputs=None, data_sample=DataSample()) # for idx in range(10) # ] # hook.vis_sample(runner, 0, data_batch, None) @@ -344,7 +342,7 @@ def __getitem__(self, index): def test_after_val_iter(self): model = MagicMock() - hook = GenVisualizationHook( + hook = VisualizationHook( interval=10, n_samples=2, vis_kwargs_list=dict(type='GAN')) mock_visualuzer = MagicMock() mock_visualuzer.add_datasample = MagicMock() @@ -353,7 +351,7 @@ def test_after_val_iter(self): runner = MagicMock() runner.model = model - hook.after_val_iter(runner, 0, [dict()], [EditDataSample()]) + hook.after_val_iter(runner, 0, [dict()], [DataSample()]) mock_visualuzer.assert_not_called() def test_after_train_iter(self): @@ -369,7 +367,7 @@ def test_after_train_iter(self): runner.train_dataloader = MagicMock() runner.train_dataloader.batch_size = 10 - hook = GenVisualizationHook( + hook = VisualizationHook( interval=2, vis_kwargs_list=dict(type='GAN'), n_samples=9) mock_visualuzer = MagicMock() mock_visualuzer.add_datasample = MagicMock() @@ -377,8 +375,7 @@ def test_after_train_iter(self): # build a empty data sample data_batch = [ - dict(inputs=None, data_samples=EditDataSample()) - for idx in range(10) + dict(inputs=None, data_samples=DataSample()) for idx in range(10) ] for idx in range(3): hook.after_train_iter(runner, idx, data_batch, None) @@ -435,7 +432,7 @@ def test_after_train_iter(self): mock_visualuzer.add_datasample.reset_mock() feat_map = torch.randn(4, 16, 4, 4) - x_t = [EditDataSample(info='x_t')] + x_t = [DataSample(info='x_t')] vis_results = dict(feat_map=feat_map, x_t=x_t) message_hub.update_info('vis_results', vis_results) @@ -487,7 +484,7 @@ def noise_fn(self, *args, **kwargs): return torch.randn(2, 2) def val_step(self, *args, **kwargs): - return [EditDataSample() for _ in range(self.n_samples)] + return [DataSample() for _ in range(self.n_samples)] def eval(self): return self @@ -500,7 +497,7 @@ def train(self): runner.train_dataloader = MagicMock() runner.train_dataloader.batch_size = 2 - hook = GenVisualizationHook( + hook = VisualizationHook( interval=2, vis_kwargs_list=dict(type='GAN'), n_samples=3, n_row=8) mock_visualuzer = MagicMock() mock_visualuzer.add_datasample = MagicMock() @@ -508,8 +505,7 @@ def train(self): # build a empty data sample data_batch = [ - dict(inputs=None, data_samples=EditDataSample()) - for idx in range(10) + dict(inputs=None, data_samples=DataSample()) for idx in range(10) ] for idx in range(3): @@ -520,7 +516,7 @@ def train(self): def test_after_test_iter(self): model = MagicMock() - hook = GenVisualizationHook( + hook = VisualizationHook( interval=10, n_samples=2, max_save_at_test=None, @@ -540,11 +536,11 @@ def test_after_test_iter(self): outputs = [] for gt, ema, orig, x_t in zip(gt_list, ema_list, orig_list, x_t_list): - gen_sample = EditDataSample( + gen_sample = DataSample( gt_img=gt, - ema=EditDataSample(fake_img=ema), - orig=EditDataSample(fake_img=orig), - new_model=EditDataSample(x_t=x_t)) + ema=DataSample(fake_img=ema), + orig=DataSample(fake_img=orig), + new_model=DataSample(x_t=x_t)) outputs.append(gen_sample) hook.after_test_iter(runner, 42, [], outputs) @@ -593,14 +589,12 @@ def test_after_test_iter(self): self.assertTrue(all([kwargs['target_keys'] for kwargs in kwargs_list])) # test get target key automatically with error - outputs = [ - EditDataSample(ema=EditDataSample(fake_img=torch.randn(3, 6, 6))) - ] + outputs = [DataSample(ema=DataSample(fake_img=torch.randn(3, 6, 6)))] with self.assertRaises(AssertionError): hook.after_test_iter(runner, 42, [], outputs) # test max save time - hook = GenVisualizationHook( + hook = VisualizationHook( interval=10, n_samples=2, test_vis_keys='ema', @@ -616,8 +610,7 @@ def test_after_test_iter(self): ema_list = [torch.randn(3, 6, 6) for _ in range(4)] outputs = [ - EditDataSample(ema=EditDataSample(fake_img=ema)) - for ema in ema_list + DataSample(ema=DataSample(fake_img=ema)) for ema in ema_list ] hook.after_test_iter(runner, 42, [], outputs) mock_visualuzer.add_datasample.assert_not_called() diff --git a/tests/test_engine/test_runner/test_log_processor.py b/tests/test_engine/test_runner/test_log_processor.py index 48dd736708..90db3b494a 100644 --- a/tests/test_engine/test_runner/test_log_processor.py +++ b/tests/test_engine/test_runner/test_log_processor.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. from unittest.mock import MagicMock -from mmagic.engine import EditLogProcessor as LogProcessor +from mmagic.engine import LogProcessor as LogProcessor class TestLogProcessor: diff --git a/tests/test_evaluation/test_evaluator.py b/tests/test_evaluation/test_evaluator.py index 137627cc41..b1072a4d49 100644 --- a/tests/test_evaluation/test_evaluator.py +++ b/tests/test_evaluation/test_evaluator.py @@ -5,7 +5,7 @@ from mmagic.evaluation import (EditEvaluator, FrechetInceptionDistance, InceptionScore) -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -146,7 +146,7 @@ def test_process(self): evaluator = EditEvaluator(self.metrics) metrics_mock = [MagicMock(), MagicMock()] - data_samples = [EditDataSample(a=1, b=2), dict(c=3, d=4)] + data_samples = [DataSample(a=1, b=2), dict(c=3, d=4)] # NOTE: data_batch is not used in evaluation evaluator.process( diff --git a/tests/test_evaluation/test_metrics/test_fid.py b/tests/test_evaluation/test_metrics/test_fid.py index 722f78eccb..2b2b67dae0 100644 --- a/tests/test_evaluation/test_metrics/test_fid.py +++ b/tests/test_evaluation/test_metrics/test_fid.py @@ -14,7 +14,7 @@ from mmagic.datasets import PairedImageDataset from mmagic.evaluation import FrechetInceptionDistance, TransFID from mmagic.models import EditDataPreprocessor, Pix2Pix -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -128,19 +128,18 @@ def test_process_and_compute(self): inception_pkl=self.inception_pkl) gen_images = torch.randn(4, 3, 2, 2) gen_samples = [ - EditDataSample(fake=(gen_images[i])).to_dict() for i in range(4) + DataSample(fake=(gen_images[i])).to_dict() for i in range(4) ] fid.process(None, gen_samples) fid.process(None, gen_samples) fid.fake_results.clear() gen_sample = [ - EditDataSample(orig=EditDataSample( - fake=torch.randn(3, 2, 2))).to_dict() + DataSample(orig=DataSample(fake=torch.randn(3, 2, 2))).to_dict() ] fid.process(None, gen_sample) gen_sample = [ - EditDataSample(orig=EditDataSample( + DataSample(orig=DataSample( fake_img=torch.randn(3, 2, 2))).to_dict() ] fid.process(None, gen_sample) @@ -160,7 +159,7 @@ def test_process_and_compute(self): dataloader = MagicMock() fid.prepare(module, dataloader) gen_samples = [ - EditDataSample(fake_img=torch.randn(3, 2, 2)).to_dict() + DataSample(fake_img=torch.randn(3, 2, 2)).to_dict() for _ in range(4) ] fid.process(None, gen_samples) diff --git a/tests/test_evaluation/test_metrics/test_inception_score.py b/tests/test_evaluation/test_metrics/test_inception_score.py index afae09a2b4..100db8fa60 100644 --- a/tests/test_evaluation/test_metrics/test_inception_score.py +++ b/tests/test_evaluation/test_metrics/test_inception_score.py @@ -11,7 +11,7 @@ from mmagic.datasets import PairedImageDataset from mmagic.evaluation import InceptionScore, TransIS from mmagic.models import EditDataPreprocessor, Pix2Pix -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -80,7 +80,7 @@ def test_process_and_compute(self): IS = InceptionScore(fake_nums=2, fake_key='fake') gen_images = torch.randn(4, 3, 2, 2) gen_samples = [ - EditDataSample(fake_img=img).to_dict() for img in gen_images + DataSample(fake_img=img).to_dict() for img in gen_images ] IS.process(None, gen_samples) IS.process(None, gen_samples) @@ -91,7 +91,7 @@ def test_process_and_compute(self): fake_nums=2, fake_key='fake', inception_style='PyTorch') gen_images = torch.randn(4, 3, 2, 2) gen_samples = [ - EditDataSample(fake_img=img).to_dict() for img in gen_images + DataSample(fake_img=img).to_dict() for img in gen_images ] IS.process(None, gen_samples) @@ -100,14 +100,13 @@ def test_process_and_compute(self): IS = InceptionScore( fake_nums=2, fake_key='fake', sample_model='orig') gen_samples = [ - EditDataSample( - ema=EditDataSample(fake_img=torch.randn(3, 2, 2)), - orig=EditDataSample(fake_img=torch.randn(3, 2, 2))).to_dict() + DataSample( + ema=DataSample(fake_img=torch.randn(3, 2, 2)), + orig=DataSample(fake_img=torch.randn(3, 2, 2))).to_dict() ] IS.process(None, gen_samples) gen_samples = [ - EditDataSample(orig=EditDataSample( - fake=torch.randn(3, 2, 2))).to_dict() + DataSample(orig=DataSample(fake=torch.randn(3, 2, 2))).to_dict() ] IS.process(None, gen_samples) @@ -116,7 +115,7 @@ def test_process_and_compute(self): IS = InceptionScore( fake_nums=2, fake_key='fake', sample_model='orig') gen_samples = [ - EditDataSample(fake_img=torch.randn(3, 2, 2)).to_dict() + DataSample(fake_img=torch.randn(3, 2, 2)).to_dict() for _ in range(4) ] IS.process(None, gen_samples) diff --git a/tests/test_evaluation/test_metrics/test_ms_ssim.py b/tests/test_evaluation/test_metrics/test_ms_ssim.py index 4177dca191..c3278a5028 100644 --- a/tests/test_evaluation/test_metrics/test_ms_ssim.py +++ b/tests/test_evaluation/test_metrics/test_ms_ssim.py @@ -4,7 +4,7 @@ import torch from mmagic.evaluation import MultiScaleStructureSimilarity -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -28,7 +28,7 @@ def test_process_and_evaluate(self): input_pairs = 6 // 2 gen_images = torch.randint(0, 255, (input_batch_size, 3, 32, 32)) gen_samples = [ - EditDataSample(fake_img=img).to_dict() for img in gen_images + DataSample(fake_img=img).to_dict() for img in gen_images ] MS_SSIM.process(None, gen_samples) @@ -45,17 +45,16 @@ def test_process_and_evaluate(self): MS_SSIM.fake_results.clear() gen_samples = [ - EditDataSample( - ema=EditDataSample( - fake_img=torch.randint(0, 255, (3, 32, 32))), - orig=EditDataSample( + DataSample( + ema=DataSample(fake_img=torch.randint(0, 255, (3, 32, 32))), + orig=DataSample( fake_img=torch.randint(0, 255, (3, 32, 32)))).to_dict() ] * 2 MS_SSIM.process(None, gen_samples) gen_samples = [ - EditDataSample( - ema=EditDataSample( + DataSample( + ema=DataSample( fake=torch.randint(0, 255, (3, 32, 32)))).to_dict() ] * 2 MS_SSIM.process(None, gen_samples) diff --git a/tests/test_evaluation/test_metrics/test_swd.py b/tests/test_evaluation/test_metrics/test_swd.py index f96d316ad1..fafa870726 100644 --- a/tests/test_evaluation/test_metrics/test_swd.py +++ b/tests/test_evaluation/test_metrics/test_swd.py @@ -7,7 +7,7 @@ from mmagic.evaluation import SlicedWassersteinDistance from mmagic.models import EditDataPreprocessor -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample class TestSWD(TestCase): @@ -27,7 +27,7 @@ def test_prosess(self): dict(inputs=torch.rand(3, 32, 32) * 255.) for _ in range(100) ] fake_samples = [ - EditDataSample( + DataSample( fake_img=(torch.rand(3, 32, 32) * 255), gt_img=(torch.rand(3, 32, 32) * 255)).to_dict() for _ in range(100) @@ -61,7 +61,7 @@ def test_prosess(self): dict(inputs=torch.rand(1, 32, 32) * 255.) for _ in range(100) ] fake_samples = [ - EditDataSample( + DataSample( fake_img=torch.rand(1, 32, 32) * 255, gt_img=torch.rand(1, 32, 32) * 255).to_dict() for _ in range(100) @@ -76,7 +76,7 @@ def test_prosess(self): sample_model='orig', image_shape=(3, 32, 32)) fake_samples = [ - EditDataSample( + DataSample( fake_img=torch.rand(3, 32, 32) * 255, gt_img=torch.rand(3, 32, 32) * 255).to_dict() for _ in range(10) diff --git a/tests/test_models/test_base_models/test_base_conditional_gan.py b/tests/test_models/test_base_models/test_base_conditional_gan.py index 50972856a0..9924f00d46 100644 --- a/tests/test_models/test_base_models/test_base_conditional_gan.py +++ b/tests/test_models/test_base_models/test_base_conditional_gan.py @@ -13,7 +13,7 @@ from mmagic.models.losses import (DiscShiftLossComps, GANLossComps, GeneratorPathRegularizerComps, GradientPenaltyLossComps) -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample generator = dict( type='SAGANGenerator', @@ -85,7 +85,7 @@ def test_val_step_and_test_step(self): gt_label = torch.randint(0, 10, (1, )) inputs = dict( inputs=dict(noise=torch.randn(1, 10)), - data_samples=[EditDataSample(gt_label=LabelData(label=gt_label))]) + data_samples=[DataSample(gt_label=LabelData(label=gt_label))]) outputs_val = gan.val_step(inputs) outputs_test = gan.test_step(inputs) self.assertEqual(len(outputs_val), 1) @@ -159,11 +159,11 @@ def test_forward(self): # inputs = dict(inputs=dict(noise=torch.randn(3, 10))) inputs = dict(noise=torch.randn(3, 10)) label = [torch.randint(0, 10, (1, )) for _ in range(3)] - data_sample = [EditDataSample() for _ in range(3)] + data_sample = [DataSample() for _ in range(3)] for idx, sample in enumerate(data_sample): sample.set_gt_label(label[idx]) - print(EditDataSample.stack(data_sample)) - outputs = gan(inputs, EditDataSample.stack(data_sample)) + print(DataSample.stack(data_sample)) + outputs = gan(inputs, DataSample.stack(data_sample)) self.assertEqual(len(outputs), 3) for idx, output in enumerate(outputs): self.assertEqual(output.gt_label.label, label[idx]) @@ -258,7 +258,7 @@ def test_custom_loss(self): inputs = dict(img=torch.randn(3, 3, 32, 32)) label = [torch.randint(0, 10, (1, )) for _ in range(3)] - data_sample = [EditDataSample() for _ in range(3)] + data_sample = [DataSample() for _ in range(3)] for idx, sample in enumerate(data_sample): sample.set_gt_label(label[idx]) data = dict(inputs=inputs, data_samples=data_sample) diff --git a/tests/test_models/test_base_models/test_base_edit_model.py b/tests/test_models/test_base_models/test_base_edit_model.py index 1323a5000a..72c65609a5 100644 --- a/tests/test_models/test_base_models/test_base_edit_model.py +++ b/tests/test_models/test_base_models/test_base_edit_model.py @@ -7,7 +7,7 @@ from mmagic.models import BaseEditModel, EditDataPreprocessor from mmagic.models.losses import L1Loss from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -45,7 +45,7 @@ def test_base_edit_model(): # prepare data inputs = torch.rand(1, 3, 20, 20) target = torch.rand(3, 20, 20) - data_sample = EditDataSample(gt_img=target) + data_sample = DataSample(gt_img=target) data = dict(inputs=inputs, data_samples=[data_sample]) # train diff --git a/tests/test_models/test_base_models/test_base_gan.py b/tests/test_models/test_base_models/test_base_gan.py index 0f506c0edd..6b6b90aa51 100644 --- a/tests/test_models/test_base_models/test_base_gan.py +++ b/tests/test_models/test_base_models/test_base_gan.py @@ -15,7 +15,7 @@ GeneratorPathRegularizerComps, GradientPenaltyLossComps) from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample generator = dict(type='DCGANGenerator', output_scale=8, base_channels=8) discriminator = dict( @@ -280,12 +280,8 @@ def test_forward(self): # test when data samples is not None inputs = dict(num_batches=3, sample_model='ema/orig') - data_samples = [ - EditDataSample(id=1), - EditDataSample(id=2), - EditDataSample(id=3) - ] - outputs = gan(inputs, EditDataSample.stack(data_samples)) + data_samples = [DataSample(id=1), DataSample(id=2), DataSample(id=3)] + outputs = gan(inputs, DataSample.stack(data_samples)) self.assertEqual(len(outputs), 3) for idx, output in enumerate(outputs): self.assertEqual(output.id, idx + 1) diff --git a/tests/test_models/test_base_models/test_base_mattor.py b/tests/test_models/test_base_models/test_base_mattor.py index 8034530cb8..f08deaa259 100644 --- a/tests/test_models/test_base_models/test_base_mattor.py +++ b/tests/test_models/test_base_models/test_base_mattor.py @@ -11,7 +11,7 @@ from mmagic.models.base_models import BaseMattor from mmagic.models.editors import DIM from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -66,7 +66,7 @@ def _demo_input_train(img_shape, batch_size=1, cuda=False, meta={}): ds = ds.cuda() data_samples.append(ds) - data_samples = EditDataSample.stack(data_samples) + data_samples = DataSample.stack(data_samples) return inputs, data_samples @@ -102,13 +102,13 @@ def _demo_input_test(img_shape, batch_size=1, cuda=False, meta={}): if cuda: ds = ds.cuda() data_samples.append(ds) - data_samples = EditDataSample.stack(data_samples) + data_samples = DataSample.stack(data_samples) return inputs, data_samples def assert_pred_alpha(predictions, batch_size): assert isinstance(predictions, list) - assert isinstance(predictions[0], EditDataSample) + assert isinstance(predictions[0], DataSample) pred_alpha = predictions[0].output.pred_alpha.data assert isinstance(pred_alpha, torch.Tensor) assert pred_alpha.dtype == torch.uint8 @@ -263,7 +263,7 @@ def test_dim(): input_test = _demo_input_test((48, 48)) output_test = model(*input_test, mode='predict') assert isinstance(output_test, list) - assert isinstance(output_test[0], EditDataSample) + assert isinstance(output_test[0], DataSample) pred_alpha = output_test[0].output.pred_alpha.data assert isinstance(pred_alpha, torch.Tensor) assert pred_alpha.dtype == torch.uint8 diff --git a/tests/test_models/test_base_models/test_one_stage.py b/tests/test_models/test_base_models/test_one_stage.py index 8a174454ea..b71ae1d976 100644 --- a/tests/test_models/test_base_models/test_one_stage.py +++ b/tests/test_models/test_base_models/test_one_stage.py @@ -9,7 +9,7 @@ from mmagic.models import GLEncoderDecoder from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -60,12 +60,12 @@ def test_one_stage_inpaintor(): masked_img = gt_img * (1. - mask) mask_bbox = [100, 100, 110, 110] inputs = masked_img.unsqueeze(0) - data_sample = EditDataSample( + data_sample = DataSample( mask=mask, mask_bbox=mask_bbox, gt_img=gt_img, ) - data_samples = EditDataSample.stack([data_sample]) + data_samples = DataSample.stack([data_sample]) data_batch = {'inputs': inputs, 'data_samples': [data_sample]} # test forward_tensor diff --git a/tests/test_models/test_base_models/test_two_stage.py b/tests/test_models/test_base_models/test_two_stage.py index 271caacebb..bf04c52b6c 100644 --- a/tests/test_models/test_base_models/test_two_stage.py +++ b/tests/test_models/test_base_models/test_two_stage.py @@ -10,7 +10,7 @@ from mmengine.optim import OptimWrapper from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -55,7 +55,7 @@ def test_two_stage_inpaintor(): 'inputs': masked_img, 'data_samples': - [EditDataSample( + [DataSample( mask=mask, mask_bbox=mask_bbox, gt_img=gt_img, diff --git a/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py b/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py index 360efe8c5a..f101bedd08 100644 --- a/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py +++ b/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py @@ -6,7 +6,7 @@ from mmengine.testing import assert_allclose from mmagic.models.data_preprocessors import EditDataPreprocessor -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample class TestBaseDataPreprocessor(TestCase): @@ -64,7 +64,7 @@ def test_parse_channel_order(self): self.assertEqual(parse_fn('img', torch.rand(1, 1, 3, 4)), 'single') # test data sample is not None - data_sample = EditDataSample() + data_sample = DataSample() # test gt_img key # - RGB in channel order --> RGB @@ -122,7 +122,7 @@ def test_parse_channel_order(self): parse_fn('dk', torch.rand(3, 5, 5), data_sample), 'BGR') # test parse channel order for a stacked data sample - stacked_data_sample = EditDataSample.stack([data_sample, data_sample]) + stacked_data_sample = DataSample.stack([data_sample, data_sample]) self.assertEqual( parse_fn('mm_img', torch.rand(1, 5, 5), stacked_data_sample), 'single') @@ -134,18 +134,18 @@ def test_parse_batch_channel_order(self): parse_fn = data_preprocessor._parse_batch_channel_order with self.assertRaises(AssertionError): - parse_fn('img', torch.rand(1, 3, 5, 5), [EditDataSample()] * 2) + parse_fn('img', torch.rand(1, 3, 5, 5), [DataSample()] * 2) inputs_batch = torch.randn(2, 3, 5, 5) data_sample_batch = [ - EditDataSample(metainfo=dict(gt_channel_order='RGB')), - EditDataSample(metainfo=dict(gt_channel_order='RGB')) + DataSample(metainfo=dict(gt_channel_order='RGB')), + DataSample(metainfo=dict(gt_channel_order='RGB')) ] self.assertTrue(parse_fn('gt', inputs_batch, data_sample_batch)) data_sample_batch = [ - EditDataSample(metainfo=dict(mm_img_channel_order='RGB')), - EditDataSample(metainfo=dict(mm_img_channel_order='BGR')) + DataSample(metainfo=dict(mm_img_channel_order='RGB')), + DataSample(metainfo=dict(mm_img_channel_order='BGR')) ] with self.assertRaises(AssertionError): parse_fn(parse_fn('mm_img', inputs_batch, data_sample_batch)) @@ -216,7 +216,7 @@ def test_update_metainfo(self): with self.assertRaises(AssertionError): padding_info = torch.randint(0, 10, (3, 2)) - data_samples = [EditDataSample() for _ in range(2)] + data_samples = [DataSample() for _ in range(2)] update_fn(padding_info, None, data_samples) padding_info = torch.randint(0, 10, (3, 2)) @@ -264,7 +264,7 @@ def test_preprocess_image_tensor(self): inputs = torch.randint(0, 255, (4, 3, 5, 5)) targets = (inputs - 127.5) / 127.5 data_samples = [ - EditDataSample(metainfo=dict(mm_img_channel_order='RGB')) + DataSample(metainfo=dict(mm_img_channel_order='RGB')) for _ in range(4) ] outputs, data_samples = process_fn(inputs, data_samples) @@ -280,7 +280,7 @@ def test_preprocess_image_tensor(self): process_fn = data_preprocessor._preprocess_image_tensor inputs = torch.randint(0, 255, (4, 3, 5, 5)) targets = ((inputs - 127.5) / 127.5)[:, [2, 1, 0]] - data_samples = [EditDataSample() for _ in range(4)] + data_samples = [DataSample() for _ in range(4)] outputs, data_samples = process_fn(inputs, data_samples) assert_allclose(outputs, targets) for data in data_samples: @@ -295,8 +295,7 @@ def test_preprocess_image_tensor(self): inputs = torch.randint(0, 255, (4, 3, 5, 5)) targets = ((inputs - 127.5) / 127.5)[:, [2, 1, 0]] data_samples = [ - EditDataSample(metainfo=dict(gt_channel_order='BGR')) - for _ in range(4) + DataSample(metainfo=dict(gt_channel_order='BGR')) for _ in range(4) ] outputs, data_samples = process_fn(inputs, data_samples, 'gt_img') assert_allclose(outputs, targets) @@ -313,7 +312,7 @@ def test_preprocess_image_tensor(self): inputs = torch.randint(0, 255, (4, 1, 5, 5)) targets = ((inputs - 127.5) / 127.5) data_samples = [ - EditDataSample(metainfo=dict(sin_channel_order='single')) + DataSample(metainfo=dict(sin_channel_order='single')) for _ in range(4) ] outputs, data_samples = process_fn(inputs, data_samples, 'sin') @@ -352,7 +351,7 @@ def test_preprocess_image_list(self): input1 = torch.randint(0, 255, (3, 3, 5)) input2 = torch.randint(0, 255, (3, 3, 5)) inputs = [input1, input2] - data_samples = [EditDataSample() for _ in range(2)] + data_samples = [DataSample() for _ in range(2)] target = torch.stack([(input1 - 127.5) / 127.5, (input2 - 127.5) / 127.5], dim=0) @@ -371,7 +370,7 @@ def test_preprocess_image_list(self): input1 = torch.randint(0, 255, (3, 3, 5)) input2 = torch.randint(0, 255, (3, 5, 5)) inputs = [input1, input2] - data_samples = [EditDataSample() for _ in range(2)] + data_samples = [DataSample() for _ in range(2)] target1 = F.pad(input1.clone(), (0, 0, 0, 2), value=42) # pad H target2 = input2.clone() target = torch.stack([target1, target2], dim=0)[:, [2, 1, 0]] @@ -394,8 +393,7 @@ def test_preprocess_image_list(self): input2 = torch.randint(0, 255, (3, 5, 3)) inputs = [input1, input2] data_samples = [ - EditDataSample(metainfo=dict(gt_channel_order='RGB')) - for _ in range(2) + DataSample(metainfo=dict(gt_channel_order='RGB')) for _ in range(2) ] target1 = F.pad(input1.clone(), (0, 0, 0, 2), value=42) # pad H target2 = F.pad(input2.clone(), (0, 2, 0, 0), value=42) # pad W @@ -420,7 +418,7 @@ def test_preprocess_image_list(self): input2 = torch.randint(0, 255, (1, 5, 3)) inputs = [input1, input2] data_samples = [ - EditDataSample(metainfo=dict(AA_channel_order='single')) + DataSample(metainfo=dict(AA_channel_order='single')) for _ in range(2) ] target1 = F.pad(input1.clone(), (0, 0, 0, 2), value=42) # pad H @@ -476,7 +474,7 @@ def test_preprocess_dict_inputs(self): mode=['ema', 'ema', 'ema'], ) data_samples = [ - EditDataSample( + DataSample( metainfo=dict( img_A_channel_order='RGB', img_B_channel_order='BGR')) for _ in range(3) @@ -503,7 +501,7 @@ def test_preprocess_dict_inputs(self): self.assertEqual(outputs['num_batches'], 3) # test error in padding checking - data_samples = [EditDataSample() for _ in range(2)] + data_samples = [DataSample() for _ in range(2)] inputs = dict( img_A=[ torch.randint(0, 255, (3, 3, 5)), @@ -526,7 +524,7 @@ def test_prerprocess_data_sample(self): # test training is True metainfo = dict(gt_channel_order='RGB', tar_channel_order='BGR') data_samples = [ - EditDataSample( + DataSample( gt_img=torch.randint(0, 255, (3, 5, 5)), AA=torch.randint(0, 255, (3, 5, 5)), metainfo=metainfo, @@ -542,7 +540,7 @@ def test_prerprocess_data_sample(self): # test training is False data_samples = [ - EditDataSample( + DataSample( gt_img=torch.randint(0, 255, (3, 5, 5)), AA=torch.randint(0, 255, (3, 5, 5)), metainfo=metainfo, @@ -559,7 +557,7 @@ def test_prerprocess_data_sample(self): # test no stack data_preprocessor.stack_data_sample = False data_samples = [ - EditDataSample( + DataSample( gt_img=torch.randint(0, 255, (3, 5, 5)), AA=torch.randint(0, 255, (3, 5, 5)), metainfo=metainfo, @@ -591,7 +589,7 @@ def test_destruct_tensor_norm_and_conversion(self): aaa = torch.randn([3, 1, 5, 5]) bbb = torch.randn([3, 3, 5, 5]) ccc = torch.randn([3, 3, 5, 5]) - data_samples = [EditDataSample(metainfo=metainfo) for _ in range(3)] + data_samples = [DataSample(metainfo=metainfo) for _ in range(3)] tar_img = ((img * 127.5) + 127.5)[:, [2, 1, 0]] tar_aaa = (aaa * 127.5) + 127.5 tar_bbb = (bbb * 127.5) + 127.5 @@ -606,7 +604,7 @@ def test_destruct_tensor_norm_and_conversion(self): aaa = torch.randn([1, 5, 5]) bbb = torch.randn([3, 5, 5]) ccc = torch.randn([3, 5, 5]) - data_samples = EditDataSample(metainfo=metainfo) + data_samples = DataSample(metainfo=metainfo) tar_img = ((img * 127.5) + 127.5)[[2, 1, 0], ...] tar_aaa = (aaa * 127.5) + 127.5 tar_bbb = (bbb * 127.5) + 127.5 @@ -620,7 +618,7 @@ def test_destruct_tensor_norm_and_conversion(self): data_preprocessor._enable_normalize = False metainfo = dict(img_output_channel_order='RGB', ) img = torch.randn([3, 3, 5, 5]) - data_samples = [EditDataSample(metainfo=metainfo) for _ in range(3)] + data_samples = [DataSample(metainfo=metainfo) for _ in range(3)] tar_img = img[:, [2, 1, 0]] assert_allclose(cov_fn(img, data_samples, 'img'), tar_img) @@ -652,8 +650,8 @@ def test_destruct_tensor_padding(self): metainfo_1 = dict(padding_size=torch.FloatTensor([2, 0])) metainfo_2 = dict(padding_size=torch.FloatTensor([0, 2])) data_samples = [ - EditDataSample(metainfo=metainfo_1), - EditDataSample(metainfo=metainfo_2) + DataSample(metainfo=metainfo_1), + DataSample(metainfo=metainfo_2) ] output = cov_fn(batch_tensor, data_samples) self.assertEqual(output.shape, (2, 3, 3, 5)) @@ -663,8 +661,8 @@ def test_destruct_tensor_padding(self): metainfo_1 = dict(padding_size=torch.FloatTensor([2, 0])) metainfo_2 = dict(padding_size=torch.FloatTensor([0, 2])) data_samples = [ - EditDataSample(metainfo=metainfo_1), - EditDataSample(metainfo=metainfo_2) + DataSample(metainfo=metainfo_1), + DataSample(metainfo=metainfo_2) ] output = cov_fn(batch_tensor, data_samples, False) self.assertIsInstance(output, list) @@ -673,31 +671,31 @@ def test_destruct_tensor_padding(self): # single inputs batch_tensor = torch.randint(0, 255, (3, 5, 5)) - data_samples = EditDataSample(metainfo=metainfo_1) + data_samples = DataSample(metainfo=metainfo_1) output = cov_fn(batch_tensor, data_samples, False) self.assertEqual(output.shape, (3, 3, 5)) # single data sample + test metainfo not found batch_tensor = torch.randint(0, 255, (3, 5, 5)) data_preprocessor._done_padding = False - output = cov_fn(batch_tensor, EditDataSample(), False) + output = cov_fn(batch_tensor, DataSample(), False) assert_allclose(output, batch_tensor) # list of data sample + test metainfo not found batch_tensor = torch.randint(0, 255, (2, 3, 5, 5)) - output = cov_fn(batch_tensor, [EditDataSample()] * 2, False) + output = cov_fn(batch_tensor, [DataSample()] * 2, False) assert_allclose(output, batch_tensor) data_preprocessor._done_padding = True - output = cov_fn(batch_tensor, EditDataSample(), False) + output = cov_fn(batch_tensor, DataSample(), False) assert_allclose(output, batch_tensor) # test stacked data sample data_samples = [ - EditDataSample(metainfo=metainfo_1), - EditDataSample(metainfo=metainfo_2) + DataSample(metainfo=metainfo_1), + DataSample(metainfo=metainfo_2) ] - stacked_data_sample = EditDataSample.stack(data_samples) + stacked_data_sample = DataSample.stack(data_samples) batch_tensor = torch.randint(0, 255, (2, 3, 5, 5)) output = cov_fn(batch_tensor, stacked_data_sample, False) self.assertIsInstance(output, list) @@ -705,7 +703,7 @@ def test_destruct_tensor_padding(self): self.assertEqual(output[1].shape, (3, 5, 3)) # test stacked data sample + metainfo is None - stacked_data_sample = EditDataSample() + stacked_data_sample = DataSample() batch_tensor = torch.randint(0, 255, (2, 3, 5, 5)) output = cov_fn(batch_tensor, stacked_data_sample, True) self.assertEqual(output.shape, (2, 3, 5, 5)) @@ -809,10 +807,7 @@ def test_forward(self): gt_inp1 = torch.randint(0, 255, (3, 5, 5)) gt_inp2 = torch.randint(0, 255, (3, 5, 5)) - data_samples = [ - EditDataSample(gt_img=gt_inp1), - EditDataSample(gt_img=gt_inp2) - ] + data_samples = [DataSample(gt_img=gt_inp1), DataSample(gt_img=gt_inp2)] data = dict(inputs=[input1, input2], data_samples=data_samples) data = data_preprocessor(data, training=False) assert_allclose(data['data_samples'].gt_img, diff --git a/tests/test_models/test_data_preprocessors/test_mattor_preprocessor.py b/tests/test_models/test_data_preprocessors/test_mattor_preprocessor.py index e52c7493f1..2a197277f8 100644 --- a/tests/test_models/test_data_preprocessors/test_mattor_preprocessor.py +++ b/tests/test_models/test_data_preprocessors/test_mattor_preprocessor.py @@ -4,7 +4,7 @@ from mmengine.testing import assert_allclose from mmagic.models.data_preprocessors import MattorPreprocessor -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample def test_mattor_preprocessor(): @@ -15,27 +15,27 @@ def test_mattor_preprocessor(): target = torch.rand(3, 20, 20) gt_fg = torch.rand(3, 20, 20) gt_bg = torch.rand(3, 20, 20) - data_sample = EditDataSample(trimap=target, gt_fg=gt_fg, gt_bg=gt_bg) + data_sample = DataSample(trimap=target, gt_fg=gt_fg, gt_bg=gt_bg) data = dict(inputs=inputs, data_samples=[data_sample]) # process data = processor(data, True) batch_inputs, batch_data_samples = data['inputs'], data['data_samples'] assert isinstance(batch_inputs, torch.Tensor) assert batch_inputs.shape == (1, 6, 20, 20) - assert isinstance(batch_data_samples, EditDataSample) + assert isinstance(batch_data_samples, DataSample) assert batch_data_samples.trimap.shape == (1, 3, 20, 20) # test proc_batch_trimap processor = MattorPreprocessor(proc_trimap='as_is') inputs = torch.rand(1, 3, 20, 20) target = torch.rand(3, 20, 20) - data_sample = EditDataSample(trimap=target) + data_sample = DataSample(trimap=target) data = dict(inputs=inputs, data_samples=[data_sample]) data = processor(data, True) batch_inputs, batch_data_samples = data['inputs'], data['data_samples'] assert isinstance(batch_inputs, torch.Tensor) assert batch_inputs.shape == (1, 6, 20, 20) - assert isinstance(batch_data_samples, EditDataSample) + assert isinstance(batch_data_samples, DataSample) assert batch_data_samples.trimap.shape == (1, 3, 20, 20) assert_allclose(batch_data_samples.trimap[0], target) @@ -50,7 +50,7 @@ def test_mattor_preprocessor(): target = torch.rand(3, 20, 20) gt_fg = torch.rand(3, 20, 20) gt_bg = torch.rand(3, 20, 20) - data_sample = EditDataSample(trimap=target) + data_sample = DataSample(trimap=target) data = dict(inputs=inputs, data_samples=[data_sample]) data = processor(data, training=False) diff --git a/tests/test_models/test_editors/test_aotgan/test_aot_inpaintor.py b/tests/test_models/test_editors/test_aotgan/test_aot_inpaintor.py index 21976897bc..d26462d3c1 100644 --- a/tests/test_models/test_editors/test_aotgan/test_aot_inpaintor.py +++ b/tests/test_models/test_editors/test_aotgan/test_aot_inpaintor.py @@ -7,7 +7,7 @@ from mmagic.models import AOTEncoderDecoder from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -49,7 +49,7 @@ def test_aot_inpaintor(): 'inputs': masked_img, 'data_samples': - [EditDataSample( + [DataSample( mask=mask, mask_bbox=mask_bbox, gt_img=gt_img, diff --git a/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py b/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py index ec22050a23..def5c69218 100644 --- a/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py +++ b/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py @@ -6,7 +6,7 @@ from mmagic.models import BasicVSR, BasicVSRNet, EditDataPreprocessor from mmagic.models.losses import CharbonnierLoss -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample def test_basicvsr(): @@ -33,7 +33,7 @@ def test_basicvsr(): # prepare data inputs = torch.rand(5, 3, 16, 16) target = torch.rand(5, 3, 64, 64) - data_sample = EditDataSample(gt_img=target) + data_sample = DataSample(gt_img=target) data = dict(inputs=[inputs], data_samples=[data_sample]) # train diff --git a/tests/test_models/test_editors/test_biggan/test_biggan.py b/tests/test_models/test_editors/test_biggan/test_biggan.py index 85482a306d..7b41eb4601 100644 --- a/tests/test_models/test_editors/test_biggan/test_biggan.py +++ b/tests/test_models/test_editors/test_biggan/test_biggan.py @@ -9,7 +9,7 @@ from mmagic.models import BigGAN, EditDataPreprocessor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample generator = dict( type='BigGANGenerator', @@ -107,7 +107,7 @@ def test_train_step(self): img = torch.randn(3, 16, 16) label = torch.randint(0, 10, (3, 1)) - data_sample = EditDataSample(gt_img=img) + data_sample = DataSample(gt_img=img) data_sample.set_gt_label(label) data = dict(inputs=dict(), data_samples=[data_sample]) diff --git a/tests/test_models/test_editors/test_cain/test_cain.py b/tests/test_models/test_editors/test_cain/test_cain.py index 4645830a65..e3ba615262 100644 --- a/tests/test_models/test_editors/test_cain/test_cain.py +++ b/tests/test_models/test_editors/test_cain/test_cain.py @@ -10,7 +10,7 @@ from mmagic.models.editors import CAIN, CAINNet from mmagic.models.losses import L1Loss from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @pytest.mark.skipif( @@ -112,7 +112,7 @@ def test_cain(): # prepare data inputs = torch.rand(2, 3, 32, 32) target = torch.rand(3, 32, 32) - data_sample = EditDataSample(gt_img=target) + data_sample = DataSample(gt_img=target) data = dict(inputs=[inputs], data_samples=[data_sample]) # train diff --git a/tests/test_models/test_editors/test_controlnet/test_controlnet.py b/tests/test_models/test_editors/test_controlnet/test_controlnet.py index 6e7eb7d972..3f9251fc7d 100644 --- a/tests/test_models/test_editors/test_controlnet/test_controlnet.py +++ b/tests/test_models/test_editors/test_controlnet/test_controlnet.py @@ -12,7 +12,7 @@ from mmengine.utils.dl_utils import TORCH_VERSION from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules test_dir = osp.join(osp.dirname(__file__), '../../../..', 'tests') @@ -120,8 +120,7 @@ def test_val_step(self): source=torch.ones([3, 64, 64])) ], data_samples=[ - EditDataSample( - prompt='an insect robot preparing a delicious meal') + DataSample(prompt='an insect robot preparing a delicious meal') ]) def mock_encode_prompt(*args, **kwargs): @@ -144,8 +143,7 @@ def test_test_step(self): source=torch.ones([3, 64, 64])) ], data_samples=[ - EditDataSample( - prompt='an insect robot preparing a delicious meal') + DataSample(prompt='an insect robot preparing a delicious meal') ]) def mock_encode_prompt(*args, **kwargs): @@ -168,8 +166,7 @@ def test_train_step(self): source=torch.ones([3, 64, 64])) ], data_samples=[ - EditDataSample( - prompt='an insect robot preparing a delicious meal') + DataSample(prompt='an insect robot preparing a delicious meal') ]) optimizer = MagicMock() diff --git a/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py b/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py index 0bbb29aa57..ccfab725a6 100644 --- a/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py +++ b/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py @@ -9,7 +9,7 @@ from mmagic.models import CycleGAN, EditDataPreprocessor from mmagic.models.base_archs import PatchDiscriminator from mmagic.models.editors.cyclegan import ResnetGenerator -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample def obj_from_dict(info: dict, parent=None, default_args=None): @@ -313,7 +313,7 @@ def test_cyclegan(): inputs=dict( img_photo=torch.randn(1, 3, 64, 64), img_mask=torch.randn(1, 3, 64, 64)), - data_samples=[EditDataSample(mode='test')]) + data_samples=[DataSample(mode='test')]) out = synthesizer.test_step(data) assert len(out) == 1 assert out[0].fake_photo.data.shape == (3, 64, 64) diff --git a/tests/test_models/test_editors/test_dcgan/test_dcgan.py b/tests/test_models/test_editors/test_dcgan/test_dcgan.py index f90d3cf4e5..d0077f2a30 100644 --- a/tests/test_models/test_editors/test_dcgan/test_dcgan.py +++ b/tests/test_models/test_editors/test_dcgan/test_dcgan.py @@ -9,7 +9,7 @@ from mmagic.models import DCGAN, EditDataPreprocessor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample generator = dict( type='DCGANGenerator', noise_size=10, output_scale=16, base_channels=16) @@ -77,7 +77,7 @@ def test_train_step(self): disc_optim, accumulative_counts=accu_iter)) # prepare inputs img = torch.randn(3, 16, 16) - data = dict(inputs=dict(), data_samples=[EditDataSample(gt_img=img)]) + data = dict(inputs=dict(), data_samples=[DataSample(gt_img=img)]) # simulate train_loop here for idx in range(n_disc * accu_iter): diff --git a/tests/test_models/test_editors/test_deepfillv1/test_deepfillv1.py b/tests/test_models/test_editors/test_deepfillv1/test_deepfillv1.py index b4b29c48a6..67b4dc031e 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_deepfillv1.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_deepfillv1.py @@ -8,7 +8,7 @@ from mmagic.models.editors import (DeepFillEncoderDecoder, DeepFillRefiner, GLEncoderDecoder) from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -66,7 +66,7 @@ def test_deepfillv1_inpaintor(): 'inputs': masked_img, 'data_samples': [ - EditDataSample( + DataSample( metainfo=dict(mask_bbox=mask_bbox), mask=mask, gt_img=gt_img, diff --git a/tests/test_models/test_editors/test_deepfillv2/test_two_stage_encoder_decoder.py b/tests/test_models/test_editors/test_deepfillv2/test_two_stage_encoder_decoder.py index 045c5d6fda..ca8d05cd50 100644 --- a/tests/test_models/test_editors/test_deepfillv2/test_two_stage_encoder_decoder.py +++ b/tests/test_models/test_editors/test_deepfillv2/test_two_stage_encoder_decoder.py @@ -9,7 +9,7 @@ from mmengine.optim import OptimWrapper from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -51,7 +51,7 @@ def test_two_stage_inpaintor(): 'inputs': masked_img, 'data_samples': - [EditDataSample( + [DataSample( mask=mask, mask_bbox=mask_bbox, gt_img=gt_img, diff --git a/tests/test_models/test_editors/test_dic/test_dic.py b/tests/test_models/test_editors/test_dic/test_dic.py index ee764339b6..84127f274c 100644 --- a/tests/test_models/test_editors/test_dic/test_dic.py +++ b/tests/test_models/test_editors/test_dic/test_dic.py @@ -8,7 +8,7 @@ from mmagic.models import DIC, DICNet, EditDataPreprocessor, LightCNN from mmagic.models.losses import (GANLoss, L1Loss, LightCNNFeatureLoss, PerceptualVGG) -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @patch.object(PerceptualVGG, 'init_weights') @@ -56,8 +56,7 @@ def test_dic(init_weights): # prepare data inputs = torch.rand(1, 3, 16, 16) target = torch.rand(3, 128, 128) - data_sample = EditDataSample( - gt_img=target, gt_heatmap=torch.rand(68, 32, 32)) + data_sample = DataSample(gt_img=target, gt_heatmap=torch.rand(68, 32, 32)) data = dict(inputs=inputs, data_samples=[data_sample]) # train diff --git a/tests/test_models/test_editors/test_dim/test_dim.py b/tests/test_models/test_editors/test_dim/test_dim.py index e253174099..a273f6e6bd 100644 --- a/tests/test_models/test_editors/test_dim/test_dim.py +++ b/tests/test_models/test_editors/test_dim/test_dim.py @@ -9,7 +9,7 @@ from mmagic.datasets.transforms import PackEditInputs from mmagic.models.editors import DIM from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -47,7 +47,7 @@ def _demo_input_train(img_shape, batch_size=1, cuda=False, meta={}): inputs = torch.cat((merged, trimap), dim=1) data_samples = [] for a, m, f, b in zip(alpha, ori_merged, fg, bg): - ds = EditDataSample() + ds = DataSample() ds.gt_alpha = a ds.gt_merged = m @@ -58,7 +58,7 @@ def _demo_input_train(img_shape, batch_size=1, cuda=False, meta={}): data_samples.append(ds) - data_samples = EditDataSample.stack(data_samples) + data_samples = DataSample.stack(data_samples) return inputs, data_samples @@ -100,13 +100,13 @@ def _demo_input_test(img_shape, batch_size=1, cuda=False, meta={}): if cuda: inputs = inputs.cuda() - data_samples = EditDataSample.stack(data_samples) + data_samples = DataSample.stack(data_samples) return inputs, data_samples def assert_pred_alpha(predictions, batch_size): assert isinstance(predictions, list) - assert isinstance(predictions[0], EditDataSample) + assert isinstance(predictions[0], DataSample) pred_alpha = predictions[0].output.pred_alpha.data assert isinstance(pred_alpha, torch.Tensor) assert pred_alpha.dtype == torch.uint8 @@ -231,7 +231,7 @@ def test_dim(): inputs, data_samples = _demo_input_test((48, 48)) output_test = model(inputs, data_samples, mode='predict') assert isinstance(output_test, list) - assert isinstance(output_test[0], EditDataSample) + assert isinstance(output_test[0], DataSample) pred_alpha = output_test[0].output.pred_alpha.data assert isinstance(pred_alpha, torch.Tensor) assert pred_alpha.dtype == torch.uint8 diff --git a/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py b/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py index 9adea52883..e7c2216e66 100644 --- a/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py +++ b/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py @@ -11,7 +11,7 @@ from mmengine.utils.dl_utils import TORCH_VERSION from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules test_dir = osp.join(osp.dirname(__file__), '../../../..', 'tests') @@ -76,8 +76,7 @@ def test_val_step(self): data = dict( inputs=[torch.ones([3, 64, 64])], data_samples=[ - EditDataSample( - prompt='an insect robot preparing a delicious meal') + DataSample(prompt='an insect robot preparing a delicious meal') ]) def mock_encode_prompt(*args, **kwargs): @@ -102,8 +101,7 @@ def test_test_step(self): data = dict( inputs=[torch.ones([3, 64, 64])], data_samples=[ - EditDataSample( - prompt='an insect robot preparing a delicious meal') + DataSample(prompt='an insect robot preparing a delicious meal') ]) def mock_encode_prompt(*args, **kwargs): @@ -129,8 +127,7 @@ def test_train_step(self): data = dict( inputs=[torch.ones([3, 64, 64])], data_samples=[ - EditDataSample( - prompt='an insect robot preparing a delicious meal') + DataSample(prompt='an insect robot preparing a delicious meal') ]) optimizer = MagicMock() diff --git a/tests/test_models/test_editors/test_edvr/test_edvr.py b/tests/test_models/test_editors/test_edvr/test_edvr.py index 8dea415d34..e9f02422b7 100644 --- a/tests/test_models/test_editors/test_edvr/test_edvr.py +++ b/tests/test_models/test_editors/test_edvr/test_edvr.py @@ -6,7 +6,7 @@ from mmagic.models import EDVR, EDVRNet from mmagic.models.losses import CharbonnierLoss -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -41,7 +41,7 @@ def test_edvr(): # prepare data inputs = torch.rand(1, 5, 3, 20, 20) target = torch.rand(5, 3, 80, 80) - data_sample = EditDataSample(gt_img=target) + data_sample = DataSample(gt_img=target) data = dict(inputs=inputs, data_samples=[data_sample]) log_vars = model.train_step(data, optim_wrapper) diff --git a/tests/test_models/test_editors/test_eg3d/test_eg3d.py b/tests/test_models/test_editors/test_eg3d/test_eg3d.py index e05d464ca9..f26e068a96 100644 --- a/tests/test_models/test_editors/test_eg3d/test_eg3d.py +++ b/tests/test_models/test_editors/test_eg3d/test_eg3d.py @@ -7,7 +7,7 @@ import torch.nn as nn from mmagic.models.editors.eg3d.eg3d import EG3D -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -116,10 +116,10 @@ def test_forward(self): # test label is passed data_samples = [] for _ in range(4): - data_sample = EditDataSample() + data_sample = DataSample() data_sample.set_gt_label(torch.randn(25)) data_samples.append(data_sample) - data_samples = EditDataSample.stack(data_samples) + data_samples = DataSample.stack(data_samples) outputs = model(dict(num_batches=4), data_samples) self.assertEqual(len(outputs), 4) self._check_datasample_output(outputs, 32, 5) diff --git a/tests/test_models/test_editors/test_esrgan/test_esrgan.py b/tests/test_models/test_editors/test_esrgan/test_esrgan.py index e6a7434313..f5e450ec44 100644 --- a/tests/test_models/test_editors/test_esrgan/test_esrgan.py +++ b/tests/test_models/test_editors/test_esrgan/test_esrgan.py @@ -7,7 +7,7 @@ from mmagic.models import ESRGAN, EditDataPreprocessor, ModifiedVGG, RRDBNet from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @patch.object(PerceptualVGG, 'init_weights') @@ -59,7 +59,7 @@ def test_esrgan(init_weights): # prepare data inputs = torch.rand(1, 3, 32, 32) target = torch.rand(3, 128, 128) - data_sample = EditDataSample(gt_img=target) + data_sample = DataSample(gt_img=target) data = dict(inputs=inputs, data_samples=[data_sample]) # train diff --git a/tests/test_models/test_editors/test_gca/test_gca.py b/tests/test_models/test_editors/test_gca/test_gca.py index 34e099b533..c0ba7d591e 100644 --- a/tests/test_models/test_editors/test_gca/test_gca.py +++ b/tests/test_models/test_editors/test_gca/test_gca.py @@ -6,7 +6,7 @@ from mmagic.datasets.transforms import PackEditInputs from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -41,7 +41,7 @@ def _demo_input_train(img_shape, batch_size=1, cuda=False, meta={}): inputs = torch.cat((merged, trimap), dim=1) data_samples = [] for a, m, f, b in zip(alpha, ori_merged, fg, bg): - ds = EditDataSample() + ds = DataSample() ds.gt_alpha = a ds.gt_merged = m @@ -52,7 +52,7 @@ def _demo_input_train(img_shape, batch_size=1, cuda=False, meta={}): data_samples.append(ds) - data_samples = EditDataSample.stack(data_samples) + data_samples = DataSample.stack(data_samples) return inputs, data_samples @@ -90,13 +90,13 @@ def _demo_input_test(img_shape, batch_size=1, cuda=False, meta={}): ds = ds.cuda() data_samples.append(ds) - data_samples = EditDataSample.stack(data_samples) + data_samples = DataSample.stack(data_samples) return inputs, data_samples def assert_pred_alpha(predictions, batch_size): assert isinstance(predictions, list) - assert isinstance(predictions[0], EditDataSample) + assert isinstance(predictions[0], DataSample) pred_alpha = predictions[0].output.pred_alpha.data assert isinstance(pred_alpha, torch.Tensor) assert pred_alpha.dtype == torch.uint8 diff --git a/tests/test_models/test_editors/test_ggan/test_ggan.py b/tests/test_models/test_editors/test_ggan/test_ggan.py index 89ed6f2c91..b3006c32ab 100644 --- a/tests/test_models/test_editors/test_ggan/test_ggan.py +++ b/tests/test_models/test_editors/test_ggan/test_ggan.py @@ -9,7 +9,7 @@ from mmagic.models import GGAN, EditDataPreprocessor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample generator = dict( type='DCGANGenerator', noise_size=10, output_scale=16, base_channels=16) @@ -77,7 +77,7 @@ def test_train_step(self): disc_optim, accumulative_counts=accu_iter)) # prepare inputs img = torch.randn(3, 16, 16) - data = dict(inputs=dict(), data_samples=[EditDataSample(gt_img=img)]) + data = dict(inputs=dict(), data_samples=[DataSample(gt_img=img)]) # simulate train_loop here for idx in range(n_disc * accu_iter): diff --git a/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py b/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py index 905b703a51..880e9f7e0b 100644 --- a/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py +++ b/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py @@ -11,7 +11,7 @@ from mmagic.models.editors.stylegan2 import StyleGAN2Discriminator from mmagic.models.losses import (GANLoss, MSELoss, PerceptualLoss, PerceptualVGG) -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @pytest.mark.skipif( @@ -62,7 +62,7 @@ def test_glean(init_weights): # prepare data inputs = torch.rand(1, 3, 16, 16) target = torch.rand(3, 64, 64) - data_sample = EditDataSample(gt_img=target) + data_sample = DataSample(gt_img=target) data = dict(inputs=inputs, data_samples=[data_sample]) # train diff --git a/tests/test_models/test_editors/test_global_local/test_gl_inpaintor.py b/tests/test_models/test_editors/test_global_local/test_gl_inpaintor.py index 3b546cf91a..b0fadfc30f 100644 --- a/tests/test_models/test_editors/test_global_local/test_gl_inpaintor.py +++ b/tests/test_models/test_editors/test_global_local/test_gl_inpaintor.py @@ -6,7 +6,7 @@ from mmengine.optim import OptimWrapper from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -31,7 +31,7 @@ def test_gl_inpaintor(): 'inputs': masked_img, 'data_samples': [ - EditDataSample( + DataSample( metainfo=dict(mask_bbox=mask_bbox), mask=mask, gt_img=gt_img, diff --git a/tests/test_models/test_editors/test_indexnet/test_indexnet.py b/tests/test_models/test_editors/test_indexnet/test_indexnet.py index 91da073134..ad364e03d5 100644 --- a/tests/test_models/test_editors/test_indexnet/test_indexnet.py +++ b/tests/test_models/test_editors/test_indexnet/test_indexnet.py @@ -6,7 +6,7 @@ from mmagic.datasets.transforms import PackEditInputs from mmagic.models.editors import IndexedUpsample from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -47,7 +47,7 @@ def _demo_input_train(img_shape, batch_size=1, cuda=False, meta={}): ds = ds.cuda() data_samples.append(ds) - data_samples = EditDataSample.stack(data_samples) + data_samples = DataSample.stack(data_samples) return inputs, data_samples @@ -84,13 +84,13 @@ def _demo_input_test(img_shape, batch_size=1, cuda=False, meta={}): ds = ds.cuda() data_samples.append(ds) - data_samples = EditDataSample.stack(data_samples) + data_samples = DataSample.stack(data_samples) return inputs, data_samples def assert_pred_alpha(predictions, batch_size): assert isinstance(predictions, list) - assert isinstance(predictions[0], EditDataSample) + assert isinstance(predictions[0], DataSample) pred_alpha = predictions[0].output.pred_alpha.data assert isinstance(pred_alpha, torch.Tensor) assert pred_alpha.dtype == torch.uint8 diff --git a/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py b/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py index cabca5a074..d92b04bccd 100644 --- a/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py +++ b/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py @@ -6,7 +6,7 @@ import torch from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -72,7 +72,7 @@ def test_inst_colorization(self): inputs = torch.rand(1, 3, 256, 256) target_shape = (1, 3, 256, 256) - data_sample = EditDataSample(gt_img=inputs) + data_sample = DataSample(gt_img=inputs) metainfo = dict( cropped_img=torch.rand(9, 3, 256, 256), box_info=torch.tensor([[175, 29, 96, 54, 52, 106], @@ -115,7 +115,7 @@ def test_inst_colorization(self): data_sample.set_metainfo(metainfo=metainfo) data = dict( - inputs=inputs, data_samples=EditDataSample.stack([data_sample])) + inputs=inputs, data_samples=DataSample.stack([data_sample])) res = model(mode='tensor', **data) diff --git a/tests/test_models/test_editors/test_liif/test_liif.py b/tests/test_models/test_editors/test_liif/test_liif.py index 8e7c8a652d..b759922047 100644 --- a/tests/test_models/test_editors/test_liif/test_liif.py +++ b/tests/test_models/test_editors/test_liif/test_liif.py @@ -6,7 +6,7 @@ from torch.optim import Adam from mmagic.models import LIIF, EditDataPreprocessor -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample def test_liif(): @@ -42,7 +42,7 @@ def test_liif(): # prepare data inputs = torch.rand(1, 3, 8, 8) - data_sample = EditDataSample( + data_sample = DataSample( metainfo=dict(coord=torch.rand(256, 2), cell=torch.rand(256, 2))) data_sample.gt_img = torch.rand(256, 3) data = dict(inputs=inputs, data_samples=[data_sample]) @@ -63,13 +63,11 @@ def test_liif(): # predictions = predictions.split() assert isinstance(predictions, List) assert len(predictions) == 1 - assert isinstance(predictions[0], EditDataSample) + assert isinstance(predictions[0], DataSample) assert isinstance(predictions[0].output.pred_img.data, torch.Tensor) assert predictions[0].output.pred_img.shape == (3, 16, 16) # feat output = model( - torch.rand(1, 3, 8, 8), - EditDataSample.stack([data_sample]), - mode='tensor') + torch.rand(1, 3, 8, 8), DataSample.stack([data_sample]), mode='tensor') assert output.shape == (1, 256, 3) diff --git a/tests/test_models/test_editors/test_lsgan/test_lsgan.py b/tests/test_models/test_editors/test_lsgan/test_lsgan.py index 3e22c84f06..bd0cdde221 100644 --- a/tests/test_models/test_editors/test_lsgan/test_lsgan.py +++ b/tests/test_models/test_editors/test_lsgan/test_lsgan.py @@ -9,7 +9,7 @@ from mmagic.models import LSGAN, EditDataPreprocessor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample generator = dict( type='DCGANGenerator', noise_size=10, output_scale=16, base_channels=16) @@ -77,7 +77,7 @@ def test_train_step(self): disc_optim, accumulative_counts=accu_iter)) # prepare inputs img = torch.randn(3, 16, 16) - data = dict(inputs=dict(), data_samples=[EditDataSample(gt_img=img)]) + data = dict(inputs=dict(), data_samples=[DataSample(gt_img=img)]) # simulate train_loop here for idx in range(n_disc * accu_iter): diff --git a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py index 4057012580..d249fb7866 100644 --- a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py +++ b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py @@ -8,7 +8,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from mmagic.models import EditDataPreprocessor, MSPIEStyleGAN2 -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -65,7 +65,7 @@ def test_stylegan2_cpu(self): # prepare inputs img = torch.randn(3, 32, 32) - data = dict(inputs=dict(), data_samples=[EditDataSample(gt_img=img)]) + data = dict(inputs=dict(), data_samples=[DataSample(gt_img=img)]) # simulate train_loop here message_hub.update_info('iter', 0) diff --git a/tests/test_models/test_editors/test_pconv/test_pconv_inpaintor.py b/tests/test_models/test_editors/test_pconv/test_pconv_inpaintor.py index c76c1995af..ad835d2bd2 100644 --- a/tests/test_models/test_editors/test_pconv/test_pconv_inpaintor.py +++ b/tests/test_models/test_editors/test_pconv/test_pconv_inpaintor.py @@ -8,7 +8,7 @@ from mmengine.optim import OptimWrapper from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -37,7 +37,7 @@ def test_pconv_inpaintor(): data_batch = { 'inputs': [masked_img], 'data_samples': - [EditDataSample( + [DataSample( mask=mask, mask_bbox=mask_bbox, gt_img=gt_img, diff --git a/tests/test_models/test_editors/test_pggan/test_pggan.py b/tests/test_models/test_editors/test_pggan/test_pggan.py index fad4d0f633..b7cdcb255c 100644 --- a/tests/test_models/test_editors/test_pggan/test_pggan.py +++ b/tests/test_models/test_editors/test_pggan/test_pggan.py @@ -8,7 +8,7 @@ from mmagic.engine import PGGANOptimWrapperConstructor from mmagic.models import ProgressiveGrowingGAN -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -56,7 +56,7 @@ def test_pggan_cpu(self): data_batch = dict( inputs=dict(), data_samples=[ - EditDataSample(gt_img=torch.randn(3, 16, 16)) for _ in range(3) + DataSample(gt_img=torch.randn(3, 16, 16)) for _ in range(3) ]) for iter_num in range(6): @@ -120,8 +120,7 @@ def test_pggan_cpu(self): data_batch = dict( inputs=dict(), data_samples=[ - EditDataSample(gt_img=torch.randn(3, 4, 32)) - for _ in range(3) + DataSample(gt_img=torch.randn(3, 4, 32)) for _ in range(3) ]) _ = pggan.train_step(data_batch, optim_wrapper_dict) @@ -135,7 +134,7 @@ def test_pggan_cpu(self): data_batch = dict( inputs=dict(), data_samples=[ - EditDataSample(gt_img=torch.randn(3, 16, 16)) for _ in range(3) + DataSample(gt_img=torch.randn(3, 16, 16)) for _ in range(3) ]) pggan.train_step(data_batch, optim_wrapper_dict) @@ -167,7 +166,7 @@ def test_pggan_cuda(self): data_batch = dict( inputs=dict(), data_samples=[ - EditDataSample(gt_img=torch.randn(3, 16, 16)) for _ in range(3) + DataSample(gt_img=torch.randn(3, 16, 16)) for _ in range(3) ]) for iter_num in range(6): diff --git a/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py b/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py index 263dfa6693..54f35b2760 100644 --- a/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py +++ b/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py @@ -11,7 +11,7 @@ from mmagic.models.editors import (RealBasicVSR, RealBasicVSRNet, UNetDiscriminatorWithSpectralNorm) from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @patch.object(PerceptualVGG, 'init_weights') @@ -80,7 +80,7 @@ def test_real_basicvsr(init_weights): # prepare data inputs = torch.rand(5, 3, 64, 64) target = torch.rand(5, 3, 256, 256) - data_sample = EditDataSample(gt_img=target, gt_unsharp=target) + data_sample = DataSample(gt_img=target, gt_unsharp=target) data = dict(inputs=[inputs], data_samples=[data_sample]) # train diff --git a/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py b/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py index c625796a9e..549995265f 100644 --- a/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py +++ b/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py @@ -8,7 +8,7 @@ from mmagic.models import (EditDataPreprocessor, RealESRGAN, RRDBNet, UNetDiscriminatorWithSpectralNorm) from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @patch.object(PerceptualVGG, 'init_weights') @@ -74,7 +74,7 @@ def test_real_esrgan(init_weights): # prepare data inputs = torch.rand(1, 3, 32, 32) target = torch.rand(3, 128, 128) - data_sample = EditDataSample(gt_img=target, gt_unsharp=target) + data_sample = DataSample(gt_img=target, gt_unsharp=target) data = dict(inputs=inputs, data_samples=[data_sample]) # train diff --git a/tests/test_models/test_editors/test_sagan/test_sagan.py b/tests/test_models/test_editors/test_sagan/test_sagan.py index be84667e2b..13592a4f67 100644 --- a/tests/test_models/test_editors/test_sagan/test_sagan.py +++ b/tests/test_models/test_editors/test_sagan/test_sagan.py @@ -9,7 +9,7 @@ from mmagic.models import SAGAN, EditDataPreprocessor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample generator = dict( type='SAGANGenerator', @@ -109,7 +109,7 @@ def test_train_step(self): img = torch.randn(3, 16, 16) label = torch.randint(0, 10, (1, )) - data_sample = EditDataSample(gt_img=img) + data_sample = DataSample(gt_img=img) data_sample.set_gt_label(label) data = dict(inputs=dict(), data_samples=[data_sample]) diff --git a/tests/test_models/test_editors/test_srgan/test_srgan.py b/tests/test_models/test_editors/test_srgan/test_srgan.py index 539ba51c2f..18519760aa 100644 --- a/tests/test_models/test_editors/test_srgan/test_srgan.py +++ b/tests/test_models/test_editors/test_srgan/test_srgan.py @@ -7,7 +7,7 @@ from mmagic.models import SRGAN, EditDataPreprocessor, ModifiedVGG, MSRResNet from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @patch.object(PerceptualVGG, 'init_weights') @@ -58,7 +58,7 @@ def test_srgan_resnet(init_weights): # prepare data inputs = torch.rand(1, 3, 32, 32) target = torch.rand(3, 128, 128) - data_sample = EditDataSample(gt_img=target) + data_sample = DataSample(gt_img=target) data = dict(inputs=inputs, data_samples=[data_sample]) # train 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 5131c0bd16..55f5c696ab 100644 --- a/tests/test_models/test_editors/test_stylegan1/test_stylegan1.py +++ b/tests/test_models/test_editors/test_stylegan1/test_stylegan1.py @@ -9,7 +9,7 @@ from mmagic.engine import PGGANOptimWrapperConstructor from mmagic.models import StyleGAN1 -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -55,7 +55,7 @@ def test_stylegan_cpu(self): data_batch = dict( inputs=dict(), data_samples=[ - EditDataSample(gt_img=torch.randn(3, 64, 64)) for _ in range(3) + DataSample(gt_img=torch.randn(3, 64, 64)) for _ in range(3) ]) for iter_num in range(6): @@ -125,8 +125,7 @@ def test_stylegan_cpu(self): data_batch = dict( inputs=dict(), data_samples=[ - EditDataSample(gt_img=torch.randn(3, 4, 32)) - for _ in range(3) + DataSample(gt_img=torch.randn(3, 4, 32)) for _ in range(3) ]) _ = stylegan.train_step(data_batch, optim_wrapper_dict) @@ -142,7 +141,7 @@ def test_stylegan_cpu(self): data_batch = dict( inputs=dict(), data_samples=[ - EditDataSample(gt_img=torch.randn(3, 64, 64)) for _ in range(3) + DataSample(gt_img=torch.randn(3, 64, 64)) for _ in range(3) ]) stylegan.train_step(data_batch, optim_wrapper_dict) @@ -176,7 +175,7 @@ def test_stylegan_cuda(self): data_batch = dict( inputs=dict(), data_samples=[ - EditDataSample(gt_img=torch.randn(3, 64, 64)) for _ in range(3) + DataSample(gt_img=torch.randn(3, 64, 64)) for _ in range(3) ]) for iter_num in range(6): 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 541c500ddf..4a44391f46 100644 --- a/tests/test_models/test_editors/test_stylegan2/test_stylegan2.py +++ b/tests/test_models/test_editors/test_stylegan2/test_stylegan2.py @@ -8,7 +8,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from mmagic.models import EditDataPreprocessor, StyleGAN2 -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample class TestStyleGAN2(TestCase): @@ -62,7 +62,7 @@ def test_stylegan2_cpu(self): # prepare inputs img = torch.randn(3, 32, 32) - data = dict(inputs=dict(), data_samples=[EditDataSample(gt_img=img)]) + data = dict(inputs=dict(), data_samples=[DataSample(gt_img=img)]) # simulate train_loop here message_hub.update_info('iter', 0) diff --git a/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py b/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py index 4de049e73e..3151f66829 100644 --- a/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py +++ b/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py @@ -9,7 +9,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from mmagic.models import StyleGAN3 -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules register_all_modules() @@ -90,6 +90,6 @@ def test_train_step(self): discriminator=OptimWrapper(optimizer_d, accumulative_counts=1)) img = torch.randn(3, 16, 16) - data = dict(inputs=dict(), data_samples=[EditDataSample(gt_img=img)]) + data = dict(inputs=dict(), data_samples=[DataSample(gt_img=img)]) message_hub.update_info('iter', 0) _ = stylegan.train_step(data, optim_wrapper_dict) diff --git a/tests/test_models/test_editors/test_tdan/test_tdan.py b/tests/test_models/test_editors/test_tdan/test_tdan.py index c3da040c96..f2e52e85ed 100644 --- a/tests/test_models/test_editors/test_tdan/test_tdan.py +++ b/tests/test_models/test_editors/test_tdan/test_tdan.py @@ -6,7 +6,7 @@ from mmagic.models.data_preprocessors import EditDataPreprocessor from mmagic.models.editors import TDAN, TDANNet from mmagic.models.losses import MSELoss -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample def test_tdan(): @@ -28,7 +28,7 @@ def test_tdan(): # prepare data inputs = torch.rand(5, 3, 16, 16) target = torch.rand(3, 64, 64) - data_sample = EditDataSample(gt_img=target) + data_sample = DataSample(gt_img=target) data = dict(inputs=[inputs], data_samples=[data_sample]) # train diff --git a/tests/test_models/test_editors/test_ttsr/test_ttsr.py b/tests/test_models/test_editors/test_ttsr/test_ttsr.py index 193e786312..bc8c8e2055 100644 --- a/tests/test_models/test_editors/test_ttsr/test_ttsr.py +++ b/tests/test_models/test_editors/test_ttsr/test_ttsr.py @@ -12,7 +12,7 @@ from mmagic.models.losses import (GANLoss, L1Loss, PerceptualVGG, TransferalPerceptualLoss) from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample @pytest.mark.skipif( @@ -80,7 +80,7 @@ def test_ttsr(init_weights): # prepare data inputs = torch.rand(1, 3, 32, 32) - data_sample = EditDataSample( + data_sample = DataSample( gt_img=torch.rand(3, 128, 128), ref_img=torch.rand(3, 128, 128), img_lq=torch.rand(3, 128, 128), @@ -101,7 +101,7 @@ def test_ttsr(init_weights): assert output[0].output.pred_img.shape == (3, 128, 128) # feat - stacked_data_sample = EditDataSample.stack([data_sample]) + stacked_data_sample = DataSample.stack([data_sample]) output = model( torch.rand(1, 3, 32, 32), stacked_data_sample, mode='tensor') assert output.shape == (1, 3, 128, 128) 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 ce44d79310..8bd35534cb 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 @@ -11,7 +11,7 @@ from mmagic.models import WGANGP, EditDataPreprocessor from mmagic.registry import MODELS -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample generator = dict( type='DCGANGenerator', noise_size=10, output_scale=16, base_channels=16) @@ -82,7 +82,7 @@ def test_train_step(self): disc_optim, accumulative_counts=accu_iter)) # prepare inputs img = torch.randn(3, 16, 16) - data = dict(inputs=dict(), data_samples=[EditDataSample(gt_img=img)]) + data = dict(inputs=dict(), data_samples=[DataSample(gt_img=img)]) # simulate train_loop here for idx in range(n_disc * accu_iter): diff --git a/tests/test_structures/test_edit_data_sample.py b/tests/test_structures/test_edit_data_sample.py index fda74b4fe5..91a6578421 100644 --- a/tests/test_structures/test_edit_data_sample.py +++ b/tests/test_structures/test_edit_data_sample.py @@ -6,12 +6,12 @@ from mmengine.structures import LabelData from mmengine.testing import assert_allclose -from mmagic.structures import EditDataSample -from mmagic.structures.edit_data_sample import is_splitable_var +from mmagic.structures import DataSample +from mmagic.structures.data_sample import is_splitable_var def test_is_stacked_var(): - assert is_splitable_var(EditDataSample()) + assert is_splitable_var(DataSample()) assert is_splitable_var(torch.randn(10, 10)) assert is_splitable_var(np.ndarray((10, 10))) assert is_splitable_var([1, 2]) @@ -20,7 +20,7 @@ def test_is_stacked_var(): assert not is_splitable_var('a') -class TestEditDataSample(TestCase): +class TestDataSample(TestCase): def test_init(self): meta_info = dict( @@ -28,7 +28,7 @@ def test_init(self): scale_factor=np.array([1.5, 1.5]), img_shape=torch.rand(4)) - edit_data_sample = EditDataSample(metainfo=meta_info) + edit_data_sample = DataSample(metainfo=meta_info) assert 'target_size' in edit_data_sample assert edit_data_sample.target_size == [256, 256] assert edit_data_sample.get('target_size') == [256, 256] @@ -77,7 +77,7 @@ def test_set_prefined_data(self): gt_channel_order=gt_channel_order, gt_color_type=gt_color_type, prompt=prompt) - data_sample = EditDataSample() + data_sample = DataSample() data_sample.set_predefined_data(data) self._check_in_and_same(data_sample, 'gt_img', gt) @@ -98,7 +98,7 @@ def test_set_prefined_data(self): data_sample.gt_label.data = gt_label def _test_set_label(self, key): - data_sample = EditDataSample() + data_sample = DataSample() method = getattr(data_sample, 'set_' + key) # Test number method(1) @@ -155,7 +155,7 @@ def _test_set_label(self, key): method('hi') # Test set num_classes - data_sample = EditDataSample(metainfo={'num_classes': 10}) + data_sample = DataSample(metainfo={'num_classes': 10}) method = getattr(data_sample, 'set_' + key) method(5) self.assertIn(key, data_sample) @@ -172,7 +172,7 @@ def test_set_gt_label(self): self._test_set_label('gt_label') def test_del_gt_label(self): - data_sample = EditDataSample() + data_sample = DataSample() self.assertNotIn('gt_label', data_sample) data_sample.set_gt_label(1) self.assertIn('gt_label', data_sample) @@ -181,7 +181,7 @@ def test_del_gt_label(self): def test_stack_and_split(self): # test stack - data_sample1 = EditDataSample() + data_sample1 = DataSample() data_sample1.set_gt_label(1) data_sample1.set_tensor_data({'img': torch.randn(3, 4, 5)}) data_sample1.set_data({'mode': 'a'}) @@ -190,7 +190,7 @@ def test_stack_and_split(self): 'channel_order': 'rgb', 'color_flag': 'color' }) - data_sample2 = EditDataSample() + data_sample2 = DataSample() data_sample2.set_gt_label(2) data_sample2.set_tensor_data({'img': torch.randn(3, 4, 5)}) data_sample2.set_data({'mode': 'b'}) @@ -200,7 +200,7 @@ def test_stack_and_split(self): 'color_flag': 'color' }) - data_sample_merged = EditDataSample.stack([data_sample1, data_sample2]) + data_sample_merged = DataSample.stack([data_sample1, data_sample2]) assert (data_sample_merged.img == torch.stack( [data_sample1.img, data_sample2.img])).all() assert (data_sample_merged.gt_label.label == torch.LongTensor( @@ -215,8 +215,7 @@ def test_stack_and_split(self): # test split data_sample_merged.sample_model = 'ema' - data_sample_merged.fake_img = EditDataSample( - img=torch.randn(2, 3, 4, 4)) + data_sample_merged.fake_img = DataSample(img=torch.randn(2, 3, 4, 4)) data_splited_1, data_splited_2 = data_sample_merged.split(True) assert (data_splited_1.gt_label.label == 1).all() @@ -240,7 +239,7 @@ def test_stack_and_split(self): data_sample_merged.split() # test stack and split when batch size is 1 - data_sample = EditDataSample() + data_sample = DataSample() data_sample.set_gt_label(3) data_sample.set_tensor_data({'img': torch.randn(3, 4, 5)}) data_sample.set_data({'mode': 'c'}) @@ -250,7 +249,7 @@ def test_stack_and_split(self): 'color_flag': 'color' }) - data_sample_merged = EditDataSample.stack([data_sample]) + data_sample_merged = DataSample.stack([data_sample]) assert (data_sample_merged.img == torch.stack([data_sample.img])).all() assert (data_sample_merged.gt_label.label == torch.LongTensor( [[3]])).all() @@ -271,12 +270,12 @@ def test_stack_and_split(self): channel_order='rgb', color_flag='color')) def test_len(self): - empty_data = EditDataSample(sample_kwargs={'a': 'a'}) + empty_data = DataSample(sample_kwargs={'a': 'a'}) assert len(empty_data) == 1 - empty_data = EditDataSample() + empty_data = DataSample() assert len(empty_data) == 1 - empty_data = EditDataSample( + empty_data = DataSample( img=torch.randn(3, 3), metainfo=dict(img_shape=[3, 3])) assert len(empty_data) == 1 diff --git a/tests/test_visualization/test_concat_visualizer.py b/tests/test_visualization/test_concat_visualizer.py index 20b852138f..51636465e2 100644 --- a/tests/test_visualization/test_concat_visualizer.py +++ b/tests/test_visualization/test_concat_visualizer.py @@ -3,12 +3,12 @@ import numpy as np import torch -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.visualization import ConcatImageVisualizer def test_concatimagevisualizer(): - data_sample = EditDataSample( + data_sample = DataSample( path_rgb='fake_dir/rgb.png', path_bgr='fake_dir/bgr.png', tensor3d=torch.ones(3, 32, 32) * diff --git a/tests/test_visualization/test_vis_backend.py b/tests/test_visualization/test_vis_backend.py index 6b6bf9002d..6bd6ff6689 100644 --- a/tests/test_visualization/test_vis_backend.py +++ b/tests/test_visualization/test_vis_backend.py @@ -10,11 +10,11 @@ import torch from mmengine import Config, MessageHub -from mmagic.visualization import (GenVisBackend, PaviGenVisBackend, - TensorboardGenVisBackend, WandbGenVisBackend) +from mmagic.visualization import (PaviVisBackend, TensorboardVisBackend, + VisBackend, WandbVisBackend) -class TestGenVisBackend(TestCase): +class TestVisBackend(TestCase): def test_vis_backend(self): message_hub = MessageHub.get_instance('test-visbackend') @@ -23,7 +23,7 @@ def test_vis_backend(self): data_root = 'tmp_dir' sys.modules['petrel_client'] = MagicMock() - vis_backend = GenVisBackend(save_dir='tmp_dir', ceph_path='s3://xxx') + vis_backend = VisBackend(save_dir='tmp_dir', ceph_path='s3://xxx') self.assertEqual(vis_backend.experiment, vis_backend) # test path mapping @@ -61,7 +61,7 @@ def test_vis_backend(self): self.assertTrue(osp.exists(osp.join(data_root, 'scalars.json'))) # test with `ceph_path` is None - vis_backend = GenVisBackend(save_dir='tmp_dir') + vis_backend = VisBackend(save_dir='tmp_dir') vis_backend.add_config(Config(dict(name='test'))) vis_backend.add_image( name='add_img', image=np.random.random((8, 8, 3)).astype(np.uint8)) @@ -91,7 +91,7 @@ class TestTensorboardBackend(TestCase): def test_tensorboard(self): save_dir = 'tmp_dir' - vis_backend = TensorboardGenVisBackend(save_dir) + vis_backend = TensorboardVisBackend(save_dir) sys.modules['torch.utils.tensorboard'] = MagicMock() # add image @@ -112,7 +112,7 @@ class TestPaviBackend(TestCase): def test_pavi(self): save_dir = 'tmp_dir' exp_name = 'unit test' - vis_backend = PaviGenVisBackend(save_dir=save_dir, exp_name=exp_name) + vis_backend = PaviVisBackend(save_dir=save_dir, exp_name=exp_name) with self.assertRaises(ImportError): vis_backend._init_env() sys.modules['pavi'] = MagicMock() @@ -139,7 +139,7 @@ def test_wandb(self): wandb_mock = MagicMock() sys.modules['wandb'] = wandb_mock - vis_backend = WandbGenVisBackend( + vis_backend = WandbVisBackend( save_dir=f'parent_dir/exp_name/{timestamp}/vis_data', init_kwargs=dict(project='test_backend')) # test save gif image @@ -153,7 +153,7 @@ def test_wandb(self): # test wandb backend with name wandb_mock.reset_mock() - vis_backend = WandbGenVisBackend( + vis_backend = WandbVisBackend( save_dir=f'parent_dir/exp_name/{timestamp}/vis_data', init_kwargs=dict(project='test_backend', name='test_wandb')) vis_backend._init_env() diff --git a/tests/test_visualization/test_gen_visualizer.py b/tests/test_visualization/test_visualizer.py similarity index 84% rename from tests/test_visualization/test_gen_visualizer.py rename to tests/test_visualization/test_visualizer.py index 58f62246be..b7923fe02f 100644 --- a/tests/test_visualization/test_gen_visualizer.py +++ b/tests/test_visualization/test_visualizer.py @@ -5,9 +5,9 @@ import torch -from mmagic.structures import EditDataSample +from mmagic.structures import DataSample from mmagic.utils import register_all_modules -from mmagic.visualization import GenVisualizer +from mmagic.visualization import Visualizer register_all_modules() @@ -15,19 +15,19 @@ class TestGenVisualer(TestCase): def test_add_datasample(self): - visualizer = GenVisualizer( - save_dir='tmp_dir', vis_backends=[dict(type='GenVisBackend')]) + visualizer = Visualizer( + save_dir='tmp_dir', vis_backends=[dict(type='VisBackend')]) img_root = osp.join('tmp_dir', 'vis_data', 'vis_image') # construct gen sample to vis gen_sample = [ - EditDataSample( + DataSample( fake_img=torch.randn(3, 16, 16), gt_img=torch.randn(1, 16, 16), - ema=EditDataSample(fake_img=torch.randn(10, 3, 16, 16)), + ema=DataSample(fake_img=torch.randn(10, 3, 16, 16)), gif=torch.randn(10, 3, 16, 16), - something=EditDataSample( - new=EditDataSample(img=torch.randn(3, 16, 16)))) + something=DataSample( + new=DataSample(img=torch.randn(3, 16, 16)))) for _ in range(3) ] visualizer.add_datasample( diff --git a/tools/dataset_converters/unconditional_gans/README.md b/tools/dataset_converters/unconditional_gans/README.md index 86ea7c8079..97226cb238 100644 --- a/tools/dataset_converters/unconditional_gans/README.md +++ b/tools/dataset_converters/unconditional_gans/README.md @@ -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 `EditDataSample`. All of supported data pipelines can be found in `mmagic/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 `DataSample`. All of supported data pipelines can be found in `mmagic/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: @@ -73,7 +73,7 @@ Note that this dataset should be used with `PGGANFetchDataHook`. In this config ```python custom_hooks = [ dict( - type='GenVisualizationHook', + type='VisualizationHook', interval=5000, fixed_input=True, # vis ema and orig at the same time From 58380b2d899c7cab036d2dc728d4c8d5dc5c4fd1 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Fri, 21 Apr 2023 16:03:20 +0800 Subject: [PATCH 30/42] [Enhancement] Refactor folder structure (#1785) * rename base_archs -> archs * revise index.rst --- docs/en/index.rst | 2 +- docs/zh_cn/index.rst | 2 +- mmagic/models/{base_archs => archs}/__init__.py | 0 mmagic/models/{base_archs => archs}/all_gather_layer.py | 0 mmagic/models/{base_archs => archs}/aspp.py | 0 mmagic/models/{base_archs => archs}/conv.py | 0 mmagic/models/{base_archs => archs}/downsample.py | 0 mmagic/models/{base_archs => archs}/ensemble.py | 0 mmagic/models/{base_archs => archs}/gated_conv_module.py | 0 mmagic/models/{base_archs => archs}/img_normalize.py | 0 mmagic/models/{base_archs => archs}/linear_module.py | 0 mmagic/models/{base_archs => archs}/lora.py | 0 mmagic/models/{base_archs => archs}/multi_layer_disc.py | 2 +- mmagic/models/{base_archs => archs}/patch_disc.py | 0 mmagic/models/{base_archs => archs}/resnet.py | 0 mmagic/models/{base_archs => archs}/separable_conv_module.py | 0 mmagic/models/{base_archs => archs}/simple_encoder_decoder.py | 0 mmagic/models/{base_archs => archs}/smpatch_disc.py | 0 mmagic/models/{base_archs => archs}/sr_backbone.py | 0 mmagic/models/{base_archs => archs}/upsample.py | 0 mmagic/models/{base_archs => archs}/vgg.py | 2 +- mmagic/models/{base_archs => archs}/wrapper.py | 0 mmagic/models/editors/basicvsr/basicvsr.py | 2 +- mmagic/models/editors/basicvsr/basicvsr_net.py | 2 +- .../editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py | 2 +- mmagic/models/editors/cain/cain_net.py | 2 +- mmagic/models/editors/deepfillv1/contextual_attention_neck.py | 2 +- mmagic/models/editors/deepfillv1/deepfill_decoder.py | 2 +- mmagic/models/editors/deepfillv1/deepfill_encoder.py | 2 +- mmagic/models/editors/dreambooth/dreambooth.py | 2 +- mmagic/models/editors/edsr/edsr_net.py | 2 +- mmagic/models/editors/edvr/edvr_net.py | 2 +- mmagic/models/editors/esrgan/rrdb_net.py | 2 +- mmagic/models/editors/fba/fba_encoder.py | 2 +- mmagic/models/editors/glean/glean_styleganv2.py | 2 +- mmagic/models/editors/global_local/gl_dilation.py | 2 +- mmagic/models/editors/global_local/gl_disc.py | 2 +- mmagic/models/editors/iconvsr/iconvsr_net.py | 2 +- mmagic/models/editors/indexnet/indexnet_decoder.py | 2 +- mmagic/models/editors/indexnet/indexnet_encoder.py | 2 +- mmagic/models/editors/pggan/pggan_modules.py | 2 +- mmagic/models/editors/srgan/sr_resnet.py | 2 +- mmagic/models/editors/stylegan2/stylegan2_modules.py | 2 +- mmagic/models/editors/tdan/tdan_net.py | 2 +- mmagic/models/editors/ttsr/lte.py | 2 +- mmagic/models/editors/ttsr/ttsr_net.py | 2 +- .../test_models/{test_base_archs => test_archs}/test_aspp.py | 2 +- .../test_models/{test_base_archs => test_archs}/test_conv.py | 2 +- .../{test_base_archs => test_archs}/test_downsample.py | 2 +- .../{test_base_archs => test_archs}/test_ensemble.py | 2 +- .../{test_base_archs => test_archs}/test_gated_conv_module.py | 2 +- .../{test_base_archs => test_archs}/test_img_normalize.py | 2 +- .../{test_base_archs => test_archs}/test_linear_module.py | 2 +- .../test_models/{test_base_archs => test_archs}/test_lora.py | 4 ++-- .../{test_base_archs => test_archs}/test_multi_layer_disc.py | 2 +- .../{test_base_archs => test_archs}/test_patch_disc.py | 0 .../{test_base_archs => test_archs}/test_resnet.py | 2 +- .../test_separable_conv_module.py | 2 +- .../test_simple_encoder_decoder.py | 2 +- .../{test_base_archs => test_archs}/test_smpatch_disc.py | 0 .../{test_base_archs => test_archs}/test_sr_backbone.py | 2 +- .../{test_base_archs => test_archs}/test_upsample.py | 2 +- tests/test_models/{test_base_archs => test_archs}/test_vgg.py | 2 +- .../{test_base_archs => test_archs}/test_wrapper.py | 0 tests/test_models/test_editors/test_cyclegan/test_cyclegan.py | 2 +- .../test_deepfillv1/test_contextual_attention_neck.py | 2 +- .../test_editors/test_deepfillv1/test_deepfill_disc.py | 2 +- .../test_editors/test_deepfillv1/test_deepfill_encoder.py | 2 +- .../test_editors/test_global_local/test_gl_dilation.py | 2 +- tests/test_models/test_editors/test_pix2pix/test_pix2pix.py | 2 +- .../test_models/test_editors/test_plain/test_plain_decoder.py | 2 +- 71 files changed, 51 insertions(+), 51 deletions(-) rename mmagic/models/{base_archs => archs}/__init__.py (100%) rename mmagic/models/{base_archs => archs}/all_gather_layer.py (100%) rename mmagic/models/{base_archs => archs}/aspp.py (100%) rename mmagic/models/{base_archs => archs}/conv.py (100%) rename mmagic/models/{base_archs => archs}/downsample.py (100%) rename mmagic/models/{base_archs => archs}/ensemble.py (100%) rename mmagic/models/{base_archs => archs}/gated_conv_module.py (100%) rename mmagic/models/{base_archs => archs}/img_normalize.py (100%) rename mmagic/models/{base_archs => archs}/linear_module.py (100%) rename mmagic/models/{base_archs => archs}/lora.py (100%) rename mmagic/models/{base_archs => archs}/multi_layer_disc.py (99%) rename mmagic/models/{base_archs => archs}/patch_disc.py (100%) rename mmagic/models/{base_archs => archs}/resnet.py (100%) rename mmagic/models/{base_archs => archs}/separable_conv_module.py (100%) rename mmagic/models/{base_archs => archs}/simple_encoder_decoder.py (100%) rename mmagic/models/{base_archs => archs}/smpatch_disc.py (100%) rename mmagic/models/{base_archs => archs}/sr_backbone.py (100%) rename mmagic/models/{base_archs => archs}/upsample.py (100%) rename mmagic/models/{base_archs => archs}/vgg.py (99%) rename mmagic/models/{base_archs => archs}/wrapper.py (100%) rename tests/test_models/{test_base_archs => test_archs}/test_aspp.py (96%) rename tests/test_models/{test_base_archs => test_archs}/test_conv.py (73%) rename tests/test_models/{test_base_archs => test_archs}/test_downsample.py (91%) rename tests/test_models/{test_base_archs => test_archs}/test_ensemble.py (97%) rename tests/test_models/{test_base_archs => test_archs}/test_gated_conv_module.py (94%) rename tests/test_models/{test_base_archs => test_archs}/test_img_normalize.py (92%) rename tests/test_models/{test_base_archs => test_archs}/test_linear_module.py (96%) rename tests/test_models/{test_base_archs => test_archs}/test_lora.py (95%) rename tests/test_models/{test_base_archs => test_archs}/test_multi_layer_disc.py (98%) rename tests/test_models/{test_base_archs => test_archs}/test_patch_disc.py (100%) rename tests/test_models/{test_base_archs => test_archs}/test_resnet.py (91%) rename tests/test_models/{test_base_archs => test_archs}/test_separable_conv_module.py (97%) rename tests/test_models/{test_base_archs => test_archs}/test_simple_encoder_decoder.py (98%) rename tests/test_models/{test_base_archs => test_archs}/test_smpatch_disc.py (100%) rename tests/test_models/{test_base_archs => test_archs}/test_sr_backbone.py (85%) rename tests/test_models/{test_base_archs => test_archs}/test_upsample.py (88%) rename tests/test_models/{test_base_archs => test_archs}/test_vgg.py (99%) rename tests/test_models/{test_base_archs => test_archs}/test_wrapper.py (100%) diff --git a/docs/en/index.rst b/docs/en/index.rst index 040e98312f..5306579a1b 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -128,7 +128,7 @@ Documentation mmagic.engine.optimizers mmagic.engine.runner mmagic.engine.schedulers - mmagic.models.base_archs + mmagic.models.archs mmagic.models.base_models mmagic.models.losses mmagic.models.data_preprocessors diff --git a/docs/zh_cn/index.rst b/docs/zh_cn/index.rst index bd8c0bb105..0b30fafd38 100644 --- a/docs/zh_cn/index.rst +++ b/docs/zh_cn/index.rst @@ -99,7 +99,7 @@ mmagic/engine.optimizers mmagic/engine.runner mmagic/engine.schedulers - mmagic/models.base_archs + mmagic/models.archs mmagic/models.base_models mmagic/models.losses mmagic/models.data_preprocessors diff --git a/mmagic/models/base_archs/__init__.py b/mmagic/models/archs/__init__.py similarity index 100% rename from mmagic/models/base_archs/__init__.py rename to mmagic/models/archs/__init__.py diff --git a/mmagic/models/base_archs/all_gather_layer.py b/mmagic/models/archs/all_gather_layer.py similarity index 100% rename from mmagic/models/base_archs/all_gather_layer.py rename to mmagic/models/archs/all_gather_layer.py diff --git a/mmagic/models/base_archs/aspp.py b/mmagic/models/archs/aspp.py similarity index 100% rename from mmagic/models/base_archs/aspp.py rename to mmagic/models/archs/aspp.py diff --git a/mmagic/models/base_archs/conv.py b/mmagic/models/archs/conv.py similarity index 100% rename from mmagic/models/base_archs/conv.py rename to mmagic/models/archs/conv.py diff --git a/mmagic/models/base_archs/downsample.py b/mmagic/models/archs/downsample.py similarity index 100% rename from mmagic/models/base_archs/downsample.py rename to mmagic/models/archs/downsample.py diff --git a/mmagic/models/base_archs/ensemble.py b/mmagic/models/archs/ensemble.py similarity index 100% rename from mmagic/models/base_archs/ensemble.py rename to mmagic/models/archs/ensemble.py diff --git a/mmagic/models/base_archs/gated_conv_module.py b/mmagic/models/archs/gated_conv_module.py similarity index 100% rename from mmagic/models/base_archs/gated_conv_module.py rename to mmagic/models/archs/gated_conv_module.py diff --git a/mmagic/models/base_archs/img_normalize.py b/mmagic/models/archs/img_normalize.py similarity index 100% rename from mmagic/models/base_archs/img_normalize.py rename to mmagic/models/archs/img_normalize.py diff --git a/mmagic/models/base_archs/linear_module.py b/mmagic/models/archs/linear_module.py similarity index 100% rename from mmagic/models/base_archs/linear_module.py rename to mmagic/models/archs/linear_module.py diff --git a/mmagic/models/base_archs/lora.py b/mmagic/models/archs/lora.py similarity index 100% rename from mmagic/models/base_archs/lora.py rename to mmagic/models/archs/lora.py diff --git a/mmagic/models/base_archs/multi_layer_disc.py b/mmagic/models/archs/multi_layer_disc.py similarity index 99% rename from mmagic/models/base_archs/multi_layer_disc.py rename to mmagic/models/archs/multi_layer_disc.py index 5d720fd6b8..815fb5ff75 100644 --- a/mmagic/models/base_archs/multi_layer_disc.py +++ b/mmagic/models/archs/multi_layer_disc.py @@ -7,7 +7,7 @@ from mmengine.runner import load_checkpoint from torch import Tensor -from mmagic.models.base_archs import LinearModule +from mmagic.models.archs import LinearModule from mmagic.registry import MODELS diff --git a/mmagic/models/base_archs/patch_disc.py b/mmagic/models/archs/patch_disc.py similarity index 100% rename from mmagic/models/base_archs/patch_disc.py rename to mmagic/models/archs/patch_disc.py diff --git a/mmagic/models/base_archs/resnet.py b/mmagic/models/archs/resnet.py similarity index 100% rename from mmagic/models/base_archs/resnet.py rename to mmagic/models/archs/resnet.py diff --git a/mmagic/models/base_archs/separable_conv_module.py b/mmagic/models/archs/separable_conv_module.py similarity index 100% rename from mmagic/models/base_archs/separable_conv_module.py rename to mmagic/models/archs/separable_conv_module.py diff --git a/mmagic/models/base_archs/simple_encoder_decoder.py b/mmagic/models/archs/simple_encoder_decoder.py similarity index 100% rename from mmagic/models/base_archs/simple_encoder_decoder.py rename to mmagic/models/archs/simple_encoder_decoder.py diff --git a/mmagic/models/base_archs/smpatch_disc.py b/mmagic/models/archs/smpatch_disc.py similarity index 100% rename from mmagic/models/base_archs/smpatch_disc.py rename to mmagic/models/archs/smpatch_disc.py diff --git a/mmagic/models/base_archs/sr_backbone.py b/mmagic/models/archs/sr_backbone.py similarity index 100% rename from mmagic/models/base_archs/sr_backbone.py rename to mmagic/models/archs/sr_backbone.py diff --git a/mmagic/models/base_archs/upsample.py b/mmagic/models/archs/upsample.py similarity index 100% rename from mmagic/models/base_archs/upsample.py rename to mmagic/models/archs/upsample.py diff --git a/mmagic/models/base_archs/vgg.py b/mmagic/models/archs/vgg.py similarity index 99% rename from mmagic/models/base_archs/vgg.py rename to mmagic/models/archs/vgg.py index 6cbdc254b3..6c2804b00a 100644 --- a/mmagic/models/base_archs/vgg.py +++ b/mmagic/models/archs/vgg.py @@ -7,7 +7,7 @@ from torch import Tensor from mmagic.registry import MODELS -from ..base_archs.aspp import ASPP +from ..archs.aspp import ASPP @MODELS.register_module() diff --git a/mmagic/models/base_archs/wrapper.py b/mmagic/models/archs/wrapper.py similarity index 100% rename from mmagic/models/base_archs/wrapper.py rename to mmagic/models/archs/wrapper.py diff --git a/mmagic/models/editors/basicvsr/basicvsr.py b/mmagic/models/editors/basicvsr/basicvsr.py index d3d4eba083..9c64feb805 100644 --- a/mmagic/models/editors/basicvsr/basicvsr.py +++ b/mmagic/models/editors/basicvsr/basicvsr.py @@ -55,7 +55,7 @@ def __init__(self, self.forward_ensemble = None if ensemble is not None: if ensemble['type'] == 'SpatialTemporalEnsemble': - from mmagic.models.base_archs import SpatialTemporalEnsemble + from mmagic.models.archs import SpatialTemporalEnsemble is_temporal = ensemble.get('is_temporal_ensemble', False) self.forward_ensemble = SpatialTemporalEnsemble(is_temporal) else: diff --git a/mmagic/models/editors/basicvsr/basicvsr_net.py b/mmagic/models/editors/basicvsr/basicvsr_net.py index 295f908171..c52bdb91ca 100644 --- a/mmagic/models/editors/basicvsr/basicvsr_net.py +++ b/mmagic/models/editors/basicvsr/basicvsr_net.py @@ -9,7 +9,7 @@ from mmengine.model import BaseModule from mmengine.runner import load_checkpoint -from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.archs import PixelShufflePack, ResidualBlockNoBN from mmagic.models.utils import flow_warp, make_layer from mmagic.registry import MODELS diff --git a/mmagic/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py b/mmagic/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py index b360d1cba1..baf9b8b8de 100644 --- a/mmagic/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py +++ b/mmagic/models/editors/basicvsr_plusplus_net/basicvsr_plusplus_net.py @@ -6,7 +6,7 @@ from mmengine.model import BaseModule from mmengine.model.weight_init import constant_init -from mmagic.models.base_archs import PixelShufflePack +from mmagic.models.archs import PixelShufflePack from mmagic.models.utils import flow_warp from mmagic.registry import MODELS from ..basicvsr.basicvsr_net import ResidualBlocksWithInputConv, SPyNet diff --git a/mmagic/models/editors/cain/cain_net.py b/mmagic/models/editors/cain/cain_net.py index d804f6c114..07bafdc0ed 100644 --- a/mmagic/models/editors/cain/cain_net.py +++ b/mmagic/models/editors/cain/cain_net.py @@ -4,7 +4,7 @@ import torch.nn.functional as F from mmengine.model import BaseModule -from mmagic.models.base_archs import pixel_unshuffle +from mmagic.models.archs import pixel_unshuffle from mmagic.models.utils import make_layer from mmagic.registry import MODELS diff --git a/mmagic/models/editors/deepfillv1/contextual_attention_neck.py b/mmagic/models/editors/deepfillv1/contextual_attention_neck.py index 5286301c79..dc4e2802c3 100644 --- a/mmagic/models/editors/deepfillv1/contextual_attention_neck.py +++ b/mmagic/models/editors/deepfillv1/contextual_attention_neck.py @@ -2,7 +2,7 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.archs import SimpleGatedConvModule from mmagic.models.editors.deepfillv1.contextual_attention import \ ContextualAttentionModule from mmagic.registry import MODELS diff --git a/mmagic/models/editors/deepfillv1/deepfill_decoder.py b/mmagic/models/editors/deepfillv1/deepfill_decoder.py index 5bccc467b8..ecf6b13b28 100644 --- a/mmagic/models/editors/deepfillv1/deepfill_decoder.py +++ b/mmagic/models/editors/deepfillv1/deepfill_decoder.py @@ -8,7 +8,7 @@ from mmengine.model import BaseModule # from ...modules import SimpleGatedConvModule -from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.archs import SimpleGatedConvModule from mmagic.registry import MODELS diff --git a/mmagic/models/editors/deepfillv1/deepfill_encoder.py b/mmagic/models/editors/deepfillv1/deepfill_encoder.py index d32b32f9e8..e6d9cd8ad6 100644 --- a/mmagic/models/editors/deepfillv1/deepfill_encoder.py +++ b/mmagic/models/editors/deepfillv1/deepfill_encoder.py @@ -2,7 +2,7 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.archs import SimpleGatedConvModule from mmagic.registry import MODELS diff --git a/mmagic/models/editors/dreambooth/dreambooth.py b/mmagic/models/editors/dreambooth/dreambooth.py index e508cbf48f..8aedd755e3 100644 --- a/mmagic/models/editors/dreambooth/dreambooth.py +++ b/mmagic/models/editors/dreambooth/dreambooth.py @@ -8,7 +8,7 @@ import torch.nn.functional as F from mmengine import print_log -from mmagic.models.base_archs import set_lora +from mmagic.models.archs import set_lora from mmagic.registry import MODELS from mmagic.structures import DataSample from mmagic.utils.typing import SampleList diff --git a/mmagic/models/editors/edsr/edsr_net.py b/mmagic/models/editors/edsr/edsr_net.py index 243bfdc27f..cbb06ef375 100644 --- a/mmagic/models/editors/edsr/edsr_net.py +++ b/mmagic/models/editors/edsr/edsr_net.py @@ -5,7 +5,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.archs import PixelShufflePack, ResidualBlockNoBN from mmagic.models.utils import make_layer from mmagic.registry import MODELS diff --git a/mmagic/models/editors/edvr/edvr_net.py b/mmagic/models/editors/edvr/edvr_net.py index 5547aa2156..cce16dc934 100644 --- a/mmagic/models/editors/edvr/edvr_net.py +++ b/mmagic/models/editors/edvr/edvr_net.py @@ -7,7 +7,7 @@ from mmengine.model.weight_init import constant_init, kaiming_init from torch.nn.modules.utils import _pair -from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.archs import PixelShufflePack, ResidualBlockNoBN from mmagic.models.utils import make_layer from mmagic.registry import MODELS diff --git a/mmagic/models/editors/esrgan/rrdb_net.py b/mmagic/models/editors/esrgan/rrdb_net.py index 4c574bf1e0..9f386692a4 100644 --- a/mmagic/models/editors/esrgan/rrdb_net.py +++ b/mmagic/models/editors/esrgan/rrdb_net.py @@ -4,7 +4,7 @@ import torch.nn.functional as F from mmengine.model import BaseModule -from mmagic.models.base_archs import pixel_unshuffle +from mmagic.models.archs import pixel_unshuffle from mmagic.models.utils import default_init_weights, make_layer from mmagic.registry import MODELS diff --git a/mmagic/models/editors/fba/fba_encoder.py b/mmagic/models/editors/fba/fba_encoder.py index daf49f7202..ee7b917c7c 100644 --- a/mmagic/models/editors/fba/fba_encoder.py +++ b/mmagic/models/editors/fba/fba_encoder.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmagic.models.base_archs import ResNet +from mmagic.models.archs import ResNet from mmagic.registry import MODELS diff --git a/mmagic/models/editors/glean/glean_styleganv2.py b/mmagic/models/editors/glean/glean_styleganv2.py index 1ab017fcc5..828189d8aa 100644 --- a/mmagic/models/editors/glean/glean_styleganv2.py +++ b/mmagic/models/editors/glean/glean_styleganv2.py @@ -4,7 +4,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmagic.models.base_archs import PixelShufflePack +from mmagic.models.archs import PixelShufflePack from mmagic.models.utils import make_layer from mmagic.registry import MODELS from ..esrgan.rrdb_net import RRDB diff --git a/mmagic/models/editors/global_local/gl_dilation.py b/mmagic/models/editors/global_local/gl_dilation.py index f418a70d9a..107e74d658 100644 --- a/mmagic/models/editors/global_local/gl_dilation.py +++ b/mmagic/models/editors/global_local/gl_dilation.py @@ -3,7 +3,7 @@ from mmcv.cnn import ConvModule from mmengine.model import BaseModule -from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.archs import SimpleGatedConvModule from mmagic.registry import MODELS diff --git a/mmagic/models/editors/global_local/gl_disc.py b/mmagic/models/editors/global_local/gl_disc.py index ce4174879a..6f03463267 100644 --- a/mmagic/models/editors/global_local/gl_disc.py +++ b/mmagic/models/editors/global_local/gl_disc.py @@ -3,7 +3,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmagic.models.base_archs import MultiLayerDiscriminator +from mmagic.models.archs import MultiLayerDiscriminator from mmagic.registry import MODELS diff --git a/mmagic/models/editors/iconvsr/iconvsr_net.py b/mmagic/models/editors/iconvsr/iconvsr_net.py index 184bac5712..2947d2a9a8 100644 --- a/mmagic/models/editors/iconvsr/iconvsr_net.py +++ b/mmagic/models/editors/iconvsr/iconvsr_net.py @@ -9,7 +9,7 @@ from mmengine.model import BaseModule from mmengine.runner import load_checkpoint -from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.archs import PixelShufflePack, ResidualBlockNoBN from mmagic.models.utils import flow_warp, make_layer from mmagic.registry import MODELS from ..basicvsr.basicvsr_net import ResidualBlocksWithInputConv, SPyNet diff --git a/mmagic/models/editors/indexnet/indexnet_decoder.py b/mmagic/models/editors/indexnet/indexnet_decoder.py index f7c9260075..c7e556ecf8 100644 --- a/mmagic/models/editors/indexnet/indexnet_decoder.py +++ b/mmagic/models/editors/indexnet/indexnet_decoder.py @@ -9,7 +9,7 @@ from mmengine.model import BaseModule from mmengine.model.weight_init import kaiming_init, normal_init -from mmagic.models.base_archs import DepthwiseSeparableConvModule +from mmagic.models.archs import DepthwiseSeparableConvModule from mmagic.registry import MODELS diff --git a/mmagic/models/editors/indexnet/indexnet_encoder.py b/mmagic/models/editors/indexnet/indexnet_encoder.py index 3041c8323f..fc634efd9e 100644 --- a/mmagic/models/editors/indexnet/indexnet_encoder.py +++ b/mmagic/models/editors/indexnet/indexnet_encoder.py @@ -10,7 +10,7 @@ from mmengine.model.weight_init import constant_init, xavier_init from mmengine.utils.dl_utils.parrots_wrapper import SyncBatchNorm -from mmagic.models.base_archs import ASPP, DepthwiseSeparableConvModule +from mmagic.models.archs import ASPP, DepthwiseSeparableConvModule from mmagic.registry import MODELS diff --git a/mmagic/models/editors/pggan/pggan_modules.py b/mmagic/models/editors/pggan/pggan_modules.py index ebae867aa6..6b086823b6 100644 --- a/mmagic/models/editors/pggan/pggan_modules.py +++ b/mmagic/models/editors/pggan/pggan_modules.py @@ -9,7 +9,7 @@ from mmengine.model import normal_init from torch.nn.init import _calculate_correct_fan -from mmagic.models.base_archs import AllGatherLayer +from mmagic.models.archs import AllGatherLayer from mmagic.registry import MODELS diff --git a/mmagic/models/editors/srgan/sr_resnet.py b/mmagic/models/editors/srgan/sr_resnet.py index 5f7aa79bd2..c132cff784 100644 --- a/mmagic/models/editors/srgan/sr_resnet.py +++ b/mmagic/models/editors/srgan/sr_resnet.py @@ -2,7 +2,7 @@ import torch.nn as nn from mmengine.model import BaseModule -from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.archs import PixelShufflePack, ResidualBlockNoBN from mmagic.models.utils import default_init_weights, make_layer from mmagic.registry import MODELS diff --git a/mmagic/models/editors/stylegan2/stylegan2_modules.py b/mmagic/models/editors/stylegan2/stylegan2_modules.py index d9cbc3d41b..7a73c2821b 100644 --- a/mmagic/models/editors/stylegan2/stylegan2_modules.py +++ b/mmagic/models/editors/stylegan2/stylegan2_modules.py @@ -9,7 +9,7 @@ from mmengine.dist import get_dist_info from mmengine.runner.amp import autocast -from mmagic.models.base_archs import AllGatherLayer +from mmagic.models.archs import AllGatherLayer from ..pggan import EqualizedLRConvModule, equalized_lr from ..stylegan1 import Blur, EqualLinearActModule, NoiseInjection, make_kernel diff --git a/mmagic/models/editors/tdan/tdan_net.py b/mmagic/models/editors/tdan/tdan_net.py index bb4b4e0026..e752d5205b 100644 --- a/mmagic/models/editors/tdan/tdan_net.py +++ b/mmagic/models/editors/tdan/tdan_net.py @@ -7,7 +7,7 @@ from mmengine.model.weight_init import constant_init from torch.nn.modules.utils import _pair -from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.archs import PixelShufflePack, ResidualBlockNoBN from mmagic.models.utils import make_layer from mmagic.registry import MODELS diff --git a/mmagic/models/editors/ttsr/lte.py b/mmagic/models/editors/ttsr/lte.py index 7c2bd789ba..b3d0a03889 100644 --- a/mmagic/models/editors/ttsr/lte.py +++ b/mmagic/models/editors/ttsr/lte.py @@ -3,7 +3,7 @@ from mmengine.model import BaseModule from torchvision import models -from mmagic.models.base_archs import ImgNormalize +from mmagic.models.archs import ImgNormalize from mmagic.registry import MODELS diff --git a/mmagic/models/editors/ttsr/ttsr_net.py b/mmagic/models/editors/ttsr/ttsr_net.py index db4ae4c061..15f2ad819a 100644 --- a/mmagic/models/editors/ttsr/ttsr_net.py +++ b/mmagic/models/editors/ttsr/ttsr_net.py @@ -6,7 +6,7 @@ from mmcv.cnn import build_conv_layer from mmengine.model import BaseModule -from mmagic.models.base_archs import PixelShufflePack, ResidualBlockNoBN +from mmagic.models.archs import PixelShufflePack, ResidualBlockNoBN from mmagic.models.utils import make_layer from mmagic.registry import MODELS diff --git a/tests/test_models/test_base_archs/test_aspp.py b/tests/test_models/test_archs/test_aspp.py similarity index 96% rename from tests/test_models/test_base_archs/test_aspp.py rename to tests/test_models/test_archs/test_aspp.py index cf0bfde7b8..578327dec4 100644 --- a/tests/test_models/test_base_archs/test_aspp.py +++ b/tests/test_models/test_archs/test_aspp.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmagic.models.base_archs import ASPP +from mmagic.models.archs import ASPP def test_aspp(): diff --git a/tests/test_models/test_base_archs/test_conv.py b/tests/test_models/test_archs/test_conv.py similarity index 73% rename from tests/test_models/test_base_archs/test_conv.py rename to tests/test_models/test_archs/test_conv.py index bddb53dcb8..691d1e489a 100644 --- a/tests/test_models/test_base_archs/test_conv.py +++ b/tests/test_models/test_archs/test_conv.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmagic.models.base_archs import conv +from mmagic.models.archs import conv def test_conv(): diff --git a/tests/test_models/test_base_archs/test_downsample.py b/tests/test_models/test_archs/test_downsample.py similarity index 91% rename from tests/test_models/test_base_archs/test_downsample.py rename to tests/test_models/test_archs/test_downsample.py index 22bdb2939e..5929ae9d61 100644 --- a/tests/test_models/test_base_archs/test_downsample.py +++ b/tests/test_models/test_archs/test_downsample.py @@ -2,7 +2,7 @@ import pytest import torch -from mmagic.models.base_archs import pixel_unshuffle +from mmagic.models.archs import pixel_unshuffle def test_pixel_unshuffle(): diff --git a/tests/test_models/test_base_archs/test_ensemble.py b/tests/test_models/test_archs/test_ensemble.py similarity index 97% rename from tests/test_models/test_base_archs/test_ensemble.py rename to tests/test_models/test_archs/test_ensemble.py index bde99e09a6..717667a716 100644 --- a/tests/test_models/test_base_archs/test_ensemble.py +++ b/tests/test_models/test_archs/test_ensemble.py @@ -4,7 +4,7 @@ import torch import torch.nn as nn -from mmagic.models.base_archs import SpatialTemporalEnsemble +from mmagic.models.archs import SpatialTemporalEnsemble def test_ensemble_cpu(): diff --git a/tests/test_models/test_base_archs/test_gated_conv_module.py b/tests/test_models/test_archs/test_gated_conv_module.py similarity index 94% rename from tests/test_models/test_base_archs/test_gated_conv_module.py rename to tests/test_models/test_archs/test_gated_conv_module.py index a3b442c467..6092041392 100644 --- a/tests/test_models/test_base_archs/test_gated_conv_module.py +++ b/tests/test_models/test_archs/test_gated_conv_module.py @@ -3,7 +3,7 @@ import torch import torch.nn as nn -from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.archs import SimpleGatedConvModule def test_gated_conv(): diff --git a/tests/test_models/test_base_archs/test_img_normalize.py b/tests/test_models/test_archs/test_img_normalize.py similarity index 92% rename from tests/test_models/test_base_archs/test_img_normalize.py rename to tests/test_models/test_archs/test_img_normalize.py index 86b663e2cb..4bfc8c9ffd 100644 --- a/tests/test_models/test_base_archs/test_img_normalize.py +++ b/tests/test_models/test_archs/test_img_normalize.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmagic.models.base_archs import ImgNormalize +from mmagic.models.archs import ImgNormalize def test_normalize_layer(): diff --git a/tests/test_models/test_base_archs/test_linear_module.py b/tests/test_models/test_archs/test_linear_module.py similarity index 96% rename from tests/test_models/test_base_archs/test_linear_module.py rename to tests/test_models/test_archs/test_linear_module.py index e2cf84e9e3..f7d518118e 100644 --- a/tests/test_models/test_base_archs/test_linear_module.py +++ b/tests/test_models/test_archs/test_linear_module.py @@ -2,7 +2,7 @@ import torch import torch.nn as nn -from mmagic.models.base_archs import LinearModule +from mmagic.models.archs import LinearModule def test_linear_module(): diff --git a/tests/test_models/test_base_archs/test_lora.py b/tests/test_models/test_archs/test_lora.py similarity index 95% rename from tests/test_models/test_base_archs/test_lora.py rename to tests/test_models/test_archs/test_lora.py index 54a3e5d1c0..5e821defb4 100644 --- a/tests/test_models/test_base_archs/test_lora.py +++ b/tests/test_models/test_archs/test_lora.py @@ -5,8 +5,8 @@ from mmengine.utils import digit_version from mmengine.utils.dl_utils import TORCH_VERSION -from mmagic.models.base_archs import (LoRAWrapper, set_lora, set_lora_disable, - set_lora_enable, set_only_lora_trainable) +from mmagic.models.archs import (LoRAWrapper, set_lora, set_lora_disable, + set_lora_enable, set_only_lora_trainable) class ToyAttn(nn.Module): diff --git a/tests/test_models/test_base_archs/test_multi_layer_disc.py b/tests/test_models/test_archs/test_multi_layer_disc.py similarity index 98% rename from tests/test_models/test_base_archs/test_multi_layer_disc.py rename to tests/test_models/test_archs/test_multi_layer_disc.py index b51288f335..3372e32c09 100644 --- a/tests/test_models/test_base_archs/test_multi_layer_disc.py +++ b/tests/test_models/test_archs/test_multi_layer_disc.py @@ -3,7 +3,7 @@ import torch import torch.nn as nn -from mmagic.models.base_archs import MultiLayerDiscriminator +from mmagic.models.archs import MultiLayerDiscriminator def test_multi_layer_disc(): diff --git a/tests/test_models/test_base_archs/test_patch_disc.py b/tests/test_models/test_archs/test_patch_disc.py similarity index 100% rename from tests/test_models/test_base_archs/test_patch_disc.py rename to tests/test_models/test_archs/test_patch_disc.py diff --git a/tests/test_models/test_base_archs/test_resnet.py b/tests/test_models/test_archs/test_resnet.py similarity index 91% rename from tests/test_models/test_base_archs/test_resnet.py rename to tests/test_models/test_archs/test_resnet.py index 5a732ba100..0ce5605f67 100644 --- a/tests/test_models/test_base_archs/test_resnet.py +++ b/tests/test_models/test_archs/test_resnet.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmagic.models.base_archs import ResNet +from mmagic.models.archs import ResNet def test_resnet(): diff --git a/tests/test_models/test_base_archs/test_separable_conv_module.py b/tests/test_models/test_archs/test_separable_conv_module.py similarity index 97% rename from tests/test_models/test_base_archs/test_separable_conv_module.py rename to tests/test_models/test_archs/test_separable_conv_module.py index a24cf9bfd1..1f975c629f 100644 --- a/tests/test_models/test_base_archs/test_separable_conv_module.py +++ b/tests/test_models/test_archs/test_separable_conv_module.py @@ -3,7 +3,7 @@ import torch import torch.nn as nn -from mmagic.models.base_archs import DepthwiseSeparableConvModule +from mmagic.models.archs import DepthwiseSeparableConvModule def test_depthwise_separable_conv(): diff --git a/tests/test_models/test_base_archs/test_simple_encoder_decoder.py b/tests/test_models/test_archs/test_simple_encoder_decoder.py similarity index 98% rename from tests/test_models/test_base_archs/test_simple_encoder_decoder.py rename to tests/test_models/test_archs/test_simple_encoder_decoder.py index 8483ce6f63..3a546bd533 100644 --- a/tests/test_models/test_base_archs/test_simple_encoder_decoder.py +++ b/tests/test_models/test_archs/test_simple_encoder_decoder.py @@ -2,7 +2,7 @@ import numpy as np import torch -from mmagic.models.base_archs import SimpleEncoderDecoder +from mmagic.models.archs import SimpleEncoderDecoder def assert_dict_keys_equal(dictionary, target_keys): diff --git a/tests/test_models/test_base_archs/test_smpatch_disc.py b/tests/test_models/test_archs/test_smpatch_disc.py similarity index 100% rename from tests/test_models/test_base_archs/test_smpatch_disc.py rename to tests/test_models/test_archs/test_smpatch_disc.py diff --git a/tests/test_models/test_base_archs/test_sr_backbone.py b/tests/test_models/test_archs/test_sr_backbone.py similarity index 85% rename from tests/test_models/test_base_archs/test_sr_backbone.py rename to tests/test_models/test_archs/test_sr_backbone.py index 488ab5a9d8..13ed5c0583 100644 --- a/tests/test_models/test_base_archs/test_sr_backbone.py +++ b/tests/test_models/test_archs/test_sr_backbone.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmagic.models.base_archs import ResidualBlockNoBN +from mmagic.models.archs import ResidualBlockNoBN from mmagic.models.utils import make_layer diff --git a/tests/test_models/test_base_archs/test_upsample.py b/tests/test_models/test_archs/test_upsample.py similarity index 88% rename from tests/test_models/test_base_archs/test_upsample.py rename to tests/test_models/test_archs/test_upsample.py index 94ad96f48b..4e1c605ac0 100644 --- a/tests/test_models/test_base_archs/test_upsample.py +++ b/tests/test_models/test_archs/test_upsample.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmagic.models.base_archs import PixelShufflePack +from mmagic.models.archs import PixelShufflePack def test_pixel_shuffle(): diff --git a/tests/test_models/test_base_archs/test_vgg.py b/tests/test_models/test_archs/test_vgg.py similarity index 99% rename from tests/test_models/test_base_archs/test_vgg.py rename to tests/test_models/test_archs/test_vgg.py index beb3c2ba43..78fdb74afd 100644 --- a/tests/test_models/test_base_archs/test_vgg.py +++ b/tests/test_models/test_archs/test_vgg.py @@ -6,7 +6,7 @@ import torch from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm -from mmagic.models.base_archs import VGG16 +from mmagic.models.archs import VGG16 def check_norm_state(modules, train_state): diff --git a/tests/test_models/test_base_archs/test_wrapper.py b/tests/test_models/test_archs/test_wrapper.py similarity index 100% rename from tests/test_models/test_base_archs/test_wrapper.py rename to tests/test_models/test_archs/test_wrapper.py diff --git a/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py b/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py index ccfab725a6..7a4b7e064d 100644 --- a/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py +++ b/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from mmagic.models import CycleGAN, EditDataPreprocessor -from mmagic.models.base_archs import PatchDiscriminator +from mmagic.models.archs import PatchDiscriminator from mmagic.models.editors.cyclegan import ResnetGenerator from mmagic.structures import DataSample diff --git a/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention_neck.py b/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention_neck.py index 13f6e9fbc1..08dd9a98a5 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention_neck.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_contextual_attention_neck.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.archs import SimpleGatedConvModule from mmagic.models.editors import ContextualAttentionNeck diff --git a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_disc.py b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_disc.py index 9cf86c8a7a..aba79f02d2 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_disc.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_disc.py @@ -2,7 +2,7 @@ import pytest import torch -from mmagic.models.base_archs import MultiLayerDiscriminator +from mmagic.models.archs import MultiLayerDiscriminator from mmagic.models.editors import DeepFillv1Discriminators diff --git a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_encoder.py b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_encoder.py index 999b23a7ef..1b7115612f 100644 --- a/tests/test_models/test_editors/test_deepfillv1/test_deepfill_encoder.py +++ b/tests/test_models/test_editors/test_deepfillv1/test_deepfill_encoder.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.archs import SimpleGatedConvModule from mmagic.models.editors import DeepFillEncoder diff --git a/tests/test_models/test_editors/test_global_local/test_gl_dilation.py b/tests/test_models/test_editors/test_global_local/test_gl_dilation.py index 6a0ad5d7c9..cabfd74876 100644 --- a/tests/test_models/test_editors/test_global_local/test_gl_dilation.py +++ b/tests/test_models/test_editors/test_global_local/test_gl_dilation.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch -from mmagic.models.base_archs import SimpleGatedConvModule +from mmagic.models.archs import SimpleGatedConvModule from mmagic.models.editors.global_local import GLDilationNeck from mmagic.registry import MODELS from mmagic.utils import register_all_modules diff --git a/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py b/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py index 9cb76a9e25..6975d7a431 100644 --- a/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py +++ b/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py @@ -9,7 +9,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from mmagic.models import EditDataPreprocessor, Pix2Pix -from mmagic.models.base_archs import PatchDiscriminator +from mmagic.models.archs import PatchDiscriminator from mmagic.models.editors.pix2pix import UnetGenerator from mmagic.utils import register_all_modules diff --git a/tests/test_models/test_editors/test_plain/test_plain_decoder.py b/tests/test_models/test_editors/test_plain/test_plain_decoder.py index f3b5c113ad..528c0661e3 100644 --- a/tests/test_models/test_editors/test_plain/test_plain_decoder.py +++ b/tests/test_models/test_editors/test_plain/test_plain_decoder.py @@ -5,7 +5,7 @@ import pytest import torch -from mmagic.models.base_archs import VGG16 +from mmagic.models.archs import VGG16 from mmagic.models.editors import PlainDecoder From 9996c7726c39ea5711ec9c992ac56da7c014bec2 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Sun, 23 Apr 2023 18:51:56 +0800 Subject: [PATCH 31/42] [Enhancement] Refactor more magic cls name (#1790) * rename EditLoops -> MultiLoops * rename EditEvaluator -> Evaluator * rename edit_loops.py -> multi_loops.py * rename EditDataPreprocessor -> DataPreprocessor --- .../_base_/datasets/basicvsr_test_config.py | 2 +- configs/_base_/datasets/liif_test_config.py | 2 +- .../_base_/datasets/sisr_x2_test_config.py | 8 +-- .../_base_/datasets/sisr_x3_test_config.py | 8 +-- .../_base_/datasets/sisr_x4_test_config.py | 8 +-- configs/_base_/datasets/tdan_test_config.py | 10 +-- configs/_base_/gen_default_runtime.py | 8 +-- configs/_base_/models/base_cyclegan.py | 2 +- configs/_base_/models/base_deepfillv1.py | 2 +- configs/_base_/models/base_deepfillv2.py | 2 +- configs/_base_/models/base_edvr.py | 4 +- configs/_base_/models/base_gl.py | 2 +- configs/_base_/models/base_glean.py | 4 +- configs/_base_/models/base_liif.py | 4 +- configs/_base_/models/base_pconv.py | 2 +- configs/_base_/models/base_pix2pix.py | 2 +- configs/_base_/models/base_styleganv1.py | 2 +- configs/_base_/models/base_styleganv2.py | 2 +- configs/_base_/models/base_styleganv3.py | 2 +- configs/_base_/models/base_tof.py | 4 +- .../models/biggan/base_biggan_128x128.py | 2 +- .../_base_/models/dcgan/base_dcgan_128x128.py | 2 +- .../_base_/models/dcgan/base_dcgan_64x64.py | 2 +- .../_base_/models/sagan/base_sagan_128x128.py | 2 +- .../_base_/models/sagan/base_sagan_32x32.py | 2 +- .../sngan_proj/base_sngan_proj_128x128.py | 2 +- .../sngan_proj/base_sngan_proj_32x32.py | 2 +- .../aot-gan_smpgan_4xb4_places-512x512.py | 6 +- configs/basicvsr/basicvsr_2xb4_reds4.py | 6 +- configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py | 2 +- ...pp_c128n25_600k_ntire-decompress-track1.py | 6 +- .../basicvsr-pp_c128n25_600k_ntire-vsr.py | 2 +- ...basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py | 2 +- ...basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py | 2 +- .../basicvsr-pp_c64n7_8xb1-600k_reds4.py | 2 +- ...cvt-hugging-face-rgb_imagenet1k-128x128.py | 2 +- ...cvt-hugging-face_rgb_imagenet1k-256x256.py | 2 +- ...cvt-hugging-face_rgb_imagenet1k-512x512.py | 2 +- .../biggan_2xb25-500kiters_cifar10-32x32.py | 2 +- ...t-BigGAN-PyTorch-rgb_imagenet1k-128x128.py | 2 +- .../cain/cain_g1b32_1xb5_vimeo90k-triplet.py | 6 +- configs/controlnet/controlnet-1xb1-fill50k.py | 2 +- configs/controlnet/controlnet-canny.py | 2 +- configs/controlnet/controlnet-pose.py | 2 +- configs/controlnet/controlnet-seg.py | 2 +- .../controlnet_animation/anythingv3_config.py | 2 +- .../deepfillv1_4xb4_celeba-256x256.py | 4 +- .../deepfillv1_8xb2_places-256x256.py | 4 +- .../deepfillv2_8xb2_celeba-256x256.py | 4 +- .../deepfillv2_8xb2_places-256x256.py | 4 +- .../dic_gan-x8c48b6_4xb2-500k_celeba-hq.py | 2 +- .../dic/dic_x8c48b6_4xb2-150k_celeba-hq.py | 6 +- .../dim/dim_stage1-v16_1xb1-1000k_comp1k.py | 4 +- .../dreambooth-finetune_text_encoder.py | 2 +- configs/dreambooth/dreambooth-lora.py | 2 +- configs/dreambooth/dreambooth.py | 2 +- .../edsr/edsr_x2c64b16_1xb16-300k_div2k.py | 6 +- .../edsr/edsr_x3c64b16_1xb16-300k_div2k.py | 6 +- .../edsr/edsr_x4c64b16_1xb16-300k_div2k.py | 6 +- .../edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py | 2 +- ...rl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py | 2 +- configs/edvr/edvrm_8xb4-600k_reds.py | 2 +- configs/edvr/edvrm_wotsa_8xb4-600k_reds.py | 2 +- .../eg3d_cvt-official-rgb_afhq-512x512.py | 2 +- .../eg3d_cvt-official-rgb_ffhq-512x512.py | 2 +- .../eg3d_cvt-official-rgb_shapenet-128x128.py | 2 +- ...rgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py | 6 +- .../esrgan_x4c64b23g32_1xb16-400k_div2k.py | 2 +- .../flavr_in4out1_8xb4_vimeo90k-septuplet.py | 6 +- configs/gca/baseline_r34_4xb10-200k_comp1k.py | 4 +- configs/gca/gca_r34_4xb10-200k_comp1k.py | 4 +- ...r1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py | 2 +- ...n_in128out1024_4xb2-300k_ffhq-celeba-hq.py | 2 +- configs/glean/glean_x16_2xb8_cat.py | 2 +- configs/glean/glean_x16_2xb8_ffhq.py | 2 +- configs/glean/glean_x8_2xb8_cat.py | 2 +- .../global_local/gl_8xb12_celeba-256x256.py | 4 +- .../global_local/gl_8xb12_places-256x256.py | 4 +- .../adm_ddim250_8xb32_imagenet-256x256.py | 2 +- .../adm_ddim250_8xb32_imagenet-512x512.py | 2 +- .../adm_ddim250_8xb32_imagenet-64x64.py | 2 +- configs/iconvsr/iconvsr_2xb4_reds4.py | 2 +- configs/iconvsr/iconvsr_2xb4_vimeo90k-bd.py | 2 +- configs/iconvsr/iconvsr_2xb4_vimeo90k-bi.py | 2 +- .../indexnet_mobv2_1xb16-78k_comp1k.py | 4 +- ...zatioon_full_official_cocostuff-256x256.py | 2 +- ...liif-edsr-norm_c64b16_1xb16-1000k_div2k.py | 2 +- .../liif-rdn-norm_c64b16_1xb16-1000k_div2k.py | 2 +- ...1e-4-1xb64-10Mimgs_lsun-bedroom-128x128.py | 2 +- ...eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py | 6 +- ...4eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py | 6 +- .../pconv_stage1_8xb12_places-256x256.py | 4 +- .../pconv_stage1_8xb1_celeba-256x256.py | 4 +- .../pconv_stage2_4xb2_celeba-256x256.py | 4 +- .../pconv_stage2_4xb2_places-256x256.py | 4 +- .../pggan_8xb4-12Mimg_celeba-hq-1024x1024.py | 2 +- ...gan_8xb4-12Mimgs_celeba-cropped-128x128.py | 2 +- configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py | 6 +- configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py | 6 +- configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py | 6 +- ...vsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py | 2 +- ...gan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py | 10 +-- ...an_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.py | 2 +- ...t_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py | 8 +-- .../restormer_official_dfwb-color-sigma15.py | 2 +- .../restormer_official_dfwb-color-sigma25.py | 2 +- .../restormer_official_dfwb-color-sigma50.py | 2 +- .../restormer_official_dfwb-gray-sigma15.py | 2 +- .../restormer_official_dfwb-gray-sigma25.py | 2 +- .../restormer_official_dfwb-gray-sigma50.py | 2 +- .../restormer/restormer_official_dpdd-dual.py | 2 +- .../restormer_official_dpdd-single.py | 2 +- configs/restormer/restormer_official_gopro.py | 2 +- .../restormer/restormer_official_rain13k.py | 2 +- configs/restormer/restormer_official_sidd.py | 2 +- configs/singan/singan_fish.py | 2 +- .../srcnn/srcnn_x4k915_1xb16-1000k_div2k.py | 6 +- .../msrresnet_x4c64b16_1xb16-1000k_div2k.py | 6 +- .../srgan_x4c64b16_1xb16-1000k_div2k.py | 2 +- ...x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py | 3 +- ...6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py | 3 +- ...d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py | 2 +- ...d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py | 3 +- ...8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py | 2 +- ...ir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py | 3 +- ...ir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py | 3 +- ...ir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py | 3 +- .../tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py | 6 +- .../tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py | 2 +- ...spynet-chair-wobn_1xb1_vimeo90k-triplet.py | 2 +- ...spynet-kitti-wobn_1xb1_vimeo90k-triplet.py | 2 +- ...net-pytoflow-wobn_1xb1_vimeo90k-triplet.py | 2 +- ...sintel-wobn-clean_1xb1_vimeo90k-triplet.py | 2 +- ...sintel-wobn-final_1xb1_vimeo90k-triplet.py | 2 +- configs/tof/tof_x4_official_vimeo90k.py | 8 +-- .../ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.py | 2 +- .../ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py | 8 +-- ..._1xb64-160kiters_celeba-cropped-128x128.py | 2 +- docs/en/howto/models.md | 2 +- docs/en/migration/eval_test.md | 2 +- docs/en/migration/models.md | 2 +- docs/en/user_guides/config.md | 8 +-- docs/en/user_guides/train_test.md | 4 +- mmagic/engine/runner/__init__.py | 4 +- mmagic/engine/runner/loop_utils.py | 23 ++++--- .../runner/{edit_loops.py => multi_loops.py} | 46 +++++++------ mmagic/evaluation/__init__.py | 4 +- mmagic/evaluation/evaluator.py | 6 +- mmagic/models/__init__.py | 6 +- .../base_models/base_conditional_gan.py | 2 +- mmagic/models/base_models/base_gan.py | 2 +- mmagic/models/data_preprocessors/__init__.py | 4 +- ...a_preprocessor.py => data_preprocessor.py} | 2 +- .../data_preprocessors/mattor_preprocessor.py | 6 +- mmagic/models/editors/biggan/biggan.py | 2 +- .../models/editors/controlnet/controlnet.py | 4 +- .../models/editors/dreambooth/dreambooth.py | 4 +- mmagic/models/editors/eg3d/eg3d.py | 2 +- mmagic/models/editors/sagan/sagan.py | 2 +- mmagic/models/editors/singan/singan.py | 2 +- .../stable_diffusion/stable_diffusion.py | 6 +- mmagic/models/editors/stylegan1/stylegan1.py | 2 +- mmagic/models/editors/stylegan2/stylegan2.py | 2 +- mmagic/utils/sampler.py | 2 +- tests/configs/aot_test.py | 2 +- tests/configs/deepfillv1_test.py | 2 +- tests/configs/gl_test.py | 6 +- tests/configs/one_stage_gl.py | 2 +- tests/configs/pconv_test.py | 2 +- tests/configs/two_stage_test.py | 2 +- .../test_inferencers/test_eg3d_inferencer.py | 2 +- .../test_hooks/test_pggan_fetch_data_hook.py | 2 +- .../test_hooks/test_visualization_hook.py | 9 ++- .../test_pggan_optimizer_constructor.py | 2 +- .../test_singan_optimizer_constructor.py | 2 +- .../test_runner/test_loop_utils.py | 22 +++--- ...test_edit_loops.py => test_multi_loops.py} | 32 ++++----- tests/test_evaluation/test_evaluator.py | 30 ++++----- .../test_metrics/test_equivariance.py | 4 +- .../test_evaluation/test_metrics/test_fid.py | 4 +- .../test_metrics/test_inception_score.py | 4 +- .../test_evaluation/test_metrics/test_ppl.py | 4 +- .../test_metrics/test_precision_and_recall.py | 4 +- .../test_evaluation/test_metrics/test_swd.py | 4 +- .../test_base_conditional_gan.py | 18 ++--- .../test_base_models/test_base_edit_model.py | 4 +- .../test_base_models/test_base_gan.py | 34 +++++----- .../test_edit_data_preprocessor.py | 67 +++++++++---------- .../test_basicvsr/test_basicvsr.py | 8 +-- .../test_editors/test_biggan/test_biggan.py | 16 ++--- .../test_editors/test_cain/test_cain.py | 6 +- .../test_controlnet/test_controlnet.py | 2 +- .../test_cyclegan/test_cyclegan.py | 13 ++-- .../test_editors/test_dcgan/test_dcgan.py | 14 ++-- .../test_editors/test_dic/test_dic.py | 4 +- .../test_dreambooth/test_dreambooth.py | 2 +- .../test_editors/test_edvr/test_edvr.py | 2 +- .../test_editors/test_eg3d/test_eg3d.py | 2 +- .../test_editors/test_esrgan/test_esrgan.py | 4 +- .../test_editors/test_ggan/test_ggan.py | 14 ++-- .../test_glean/test_glean_styleganv2.py | 4 +- .../test_guided_diffusion/test_adm.py | 2 +- .../test_inst_colorization.py | 2 +- .../test_editors/test_liif/test_liif.py | 4 +- .../test_editors/test_lsgan/test_lsgan.py | 14 ++-- .../test_mspie/test_mspie_stylegan2.py | 4 +- .../test_editors/test_mspie/test_pe_singan.py | 2 +- .../test_editors/test_pggan/test_pggan.py | 2 +- .../test_editors/test_pix2pix/test_pix2pix.py | 6 +- .../test_real_basicvsr/test_real_basicvsr.py | 4 +- .../test_real_esrgan/test_real_esrgan.py | 4 +- .../test_editors/test_sagan/test_sagan.py | 18 +++-- .../test_editors/test_singan/test_singan.py | 2 +- .../test_editors/test_srgan/test_srgan.py | 4 +- .../test_stylegan1/test_stylegan1.py | 2 +- .../test_stylegan2/test_stylegan2.py | 4 +- .../test_stylegan3/test_stylegan3.py | 2 +- .../test_editors/test_tdan/test_tdan.py | 6 +- .../test_editors/test_ttsr/test_ttsr.py | 4 +- .../test_editors/test_wgan_gp/test_wgan_gp.py | 14 ++-- 220 files changed, 521 insertions(+), 533 deletions(-) rename mmagic/engine/runner/{edit_loops.py => multi_loops.py} (94%) rename mmagic/models/data_preprocessors/{edit_data_preprocessor.py => data_preprocessor.py} (99%) rename tests/test_engine/test_runner/{test_edit_loops.py => test_multi_loops.py} (89%) diff --git a/configs/_base_/datasets/basicvsr_test_config.py b/configs/_base_/datasets/basicvsr_test_config.py index 14804c01eb..7f16b094a3 100644 --- a/configs/_base_/datasets/basicvsr_test_config.py +++ b/configs/_base_/datasets/basicvsr_test_config.py @@ -163,7 +163,7 @@ ] # config for test -test_cfg = dict(type='EditTestLoop') +test_cfg = dict(type='MultiTestLoop') test_dataloader = [ reds_dataloader, vimeo_90k_bd_dataloader, diff --git a/configs/_base_/datasets/liif_test_config.py b/configs/_base_/datasets/liif_test_config.py index 80e42620c0..de8e1845a4 100644 --- a/configs/_base_/datasets/liif_test_config.py +++ b/configs/_base_/datasets/liif_test_config.py @@ -73,7 +73,7 @@ ] for scale in scale_test_list] # test config -test_cfg = dict(type='EditTestLoop') +test_cfg = dict(type='MultiTestLoop') test_dataloader = [ *set5_dataloaders, *set14_dataloaders, diff --git a/configs/_base_/datasets/sisr_x2_test_config.py b/configs/_base_/datasets/sisr_x2_test_config.py index 8ad2f92581..872644b86f 100644 --- a/configs/_base_/datasets/sisr_x2_test_config.py +++ b/configs/_base_/datasets/sisr_x2_test_config.py @@ -28,7 +28,7 @@ data_prefix=dict(img='LRbicx2', gt='GTmod12'), pipeline=test_pipeline)) set5_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', crop_border=2, prefix='Set5'), dict(type='SSIM', crop_border=2, prefix='Set5'), @@ -47,7 +47,7 @@ data_prefix=dict(img='LRbicx2', gt='GTmod12'), pipeline=test_pipeline)) set14_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', crop_border=2, prefix='Set14'), dict(type='SSIM', crop_border=2, prefix='Set14'), @@ -70,14 +70,14 @@ img='DIV2K_train_LR_bicubic/X2_sub', gt='DIV2K_train_HR_sub'), pipeline=test_pipeline)) div2k_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', crop_border=2, prefix='DIV2K'), dict(type='SSIM', crop_border=2, prefix='DIV2K'), ]) # test config -test_cfg = dict(type='EditTestLoop') +test_cfg = dict(type='MultiTestLoop') test_dataloader = [ set5_dataloader, set14_dataloader, diff --git a/configs/_base_/datasets/sisr_x3_test_config.py b/configs/_base_/datasets/sisr_x3_test_config.py index d6b5148063..42a21f6488 100644 --- a/configs/_base_/datasets/sisr_x3_test_config.py +++ b/configs/_base_/datasets/sisr_x3_test_config.py @@ -28,7 +28,7 @@ data_prefix=dict(img='LRbicx3', gt='GTmod12'), pipeline=test_pipeline)) set5_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', crop_border=3, prefix='Set5'), dict(type='SSIM', crop_border=3, prefix='Set5'), @@ -47,7 +47,7 @@ data_prefix=dict(img='LRbicx3', gt='GTmod12'), pipeline=test_pipeline)) set14_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', crop_border=3, prefix='Set14'), dict(type='SSIM', crop_border=3, prefix='Set14'), @@ -69,14 +69,14 @@ img='DIV2K_train_LR_bicubic/X3_sub', gt='DIV2K_train_HR_sub'), pipeline=test_pipeline)) div2k_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', crop_border=3, prefix='DIV2K'), dict(type='SSIM', crop_border=3, prefix='DIV2K'), ]) # test config -test_cfg = dict(type='EditTestLoop') +test_cfg = dict(type='MultiTestLoop') test_dataloader = [ set5_dataloader, set14_dataloader, diff --git a/configs/_base_/datasets/sisr_x4_test_config.py b/configs/_base_/datasets/sisr_x4_test_config.py index ad544e5897..cd40e3e271 100644 --- a/configs/_base_/datasets/sisr_x4_test_config.py +++ b/configs/_base_/datasets/sisr_x4_test_config.py @@ -28,7 +28,7 @@ data_prefix=dict(img='LRbicx4', gt='GTmod12'), pipeline=test_pipeline)) set5_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', crop_border=4, prefix='Set5'), dict(type='SSIM', crop_border=4, prefix='Set5'), @@ -47,7 +47,7 @@ data_prefix=dict(img='LRbicx4', gt='GTmod12'), pipeline=test_pipeline)) set14_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', crop_border=4, prefix='Set14'), dict(type='SSIM', crop_border=4, prefix='Set14'), @@ -69,14 +69,14 @@ img='DIV2K_train_LR_bicubic/X4_sub', gt='DIV2K_train_HR_sub'), pipeline=test_pipeline)) div2k_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', crop_border=4, prefix='DIV2K'), dict(type='SSIM', crop_border=4, prefix='DIV2K'), ]) # test config -test_cfg = dict(type='EditTestLoop') +test_cfg = dict(type='MultiTestLoop') test_dataloader = [ set5_dataloader, set14_dataloader, diff --git a/configs/_base_/datasets/tdan_test_config.py b/configs/_base_/datasets/tdan_test_config.py index 3e2ee63416..f6610b108f 100644 --- a/configs/_base_/datasets/tdan_test_config.py +++ b/configs/_base_/datasets/tdan_test_config.py @@ -39,7 +39,7 @@ pipeline=SPMC_pipeline)) SPMC_bd_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict( type='PSNR', crop_border=8, convert_to='Y', prefix='SPMCS-BDx4-Y'), @@ -47,7 +47,7 @@ type='SSIM', crop_border=8, convert_to='Y', prefix='SPMCS-BDx4-Y'), ]) SPMC_bi_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict( type='PSNR', crop_border=8, convert_to='Y', prefix='SPMCS-BIx4-Y'), @@ -96,20 +96,20 @@ pipeline=vid4_pipeline)) vid4_bd_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', convert_to='Y', prefix='VID4-BDx4-Y'), dict(type='SSIM', convert_to='Y', prefix='VID4-BDx4-Y'), ]) vid4_bi_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', convert_to='Y', prefix='VID4-BIx4-Y'), dict(type='SSIM', convert_to='Y', prefix='VID4-BIx4-Y'), ]) # config for test -test_cfg = dict(type='EditTestLoop') +test_cfg = dict(type='MultiTestLoop') test_dataloader = [ SPMC_bd_dataloader, SPMC_bi_dataloader, diff --git a/configs/_base_/gen_default_runtime.py b/configs/_base_/gen_default_runtime.py index 03ad5da182..13720ee1d6 100644 --- a/configs/_base_/gen_default_runtime.py +++ b/configs/_base_/gen_default_runtime.py @@ -57,12 +57,12 @@ train_cfg = dict(by_epoch=False, val_begin=1, val_interval=10000) # config for val -val_cfg = dict(type='EditValLoop') -val_evaluator = dict(type='EditEvaluator') +val_cfg = dict(type='MultiValLoop') +val_evaluator = dict(type='Evaluator') # config for test -test_cfg = dict(type='EditTestLoop') -test_evaluator = dict(type='EditEvaluator') +test_cfg = dict(type='MultiTestLoop') +test_evaluator = dict(type='Evaluator') # config for optim_wrapper_constructor optim_wrapper = dict(constructor='MultiOptimWrapperConstructor') diff --git a/configs/_base_/models/base_cyclegan.py b/configs/_base_/models/base_cyclegan.py index 6017945ad3..a935837188 100644 --- a/configs/_base_/models/base_cyclegan.py +++ b/configs/_base_/models/base_cyclegan.py @@ -2,7 +2,7 @@ _domain_b = None # set by user model = dict( type='CycleGAN', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='ResnetGenerator', in_channels=3, diff --git a/configs/_base_/models/base_deepfillv1.py b/configs/_base_/models/base_deepfillv1.py index f0495635fc..f16327ca8a 100644 --- a/configs/_base_/models/base_deepfillv1.py +++ b/configs/_base_/models/base_deepfillv1.py @@ -4,7 +4,7 @@ model = dict( type='DeepFillv1Inpaintor', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/configs/_base_/models/base_deepfillv2.py b/configs/_base_/models/base_deepfillv2.py index 765f26f6a2..e7fcdd9c7b 100644 --- a/configs/_base_/models/base_deepfillv2.py +++ b/configs/_base_/models/base_deepfillv2.py @@ -5,7 +5,7 @@ type='TwoStageInpaintor', disc_input_with_mask=True, data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/configs/_base_/models/base_edvr.py b/configs/_base_/models/base_edvr.py index 0502dd01b6..a4b94d2da3 100644 --- a/configs/_base_/models/base_edvr.py +++ b/configs/_base_/models/base_edvr.py @@ -98,8 +98,8 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=600_000, val_interval=5000) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/_base_/models/base_gl.py b/configs/_base_/models/base_gl.py index 1354db9289..40f70aa36d 100644 --- a/configs/_base_/models/base_gl.py +++ b/configs/_base_/models/base_gl.py @@ -4,7 +4,7 @@ model = dict( type='GLInpaintor', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/configs/_base_/models/base_glean.py b/configs/_base_/models/base_glean.py index 4729b6530d..4a9eaa4c0a 100644 --- a/configs/_base_/models/base_glean.py +++ b/configs/_base_/models/base_glean.py @@ -15,8 +15,8 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=300_000, val_interval=5000) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/_base_/models/base_liif.py b/configs/_base_/models/base_liif.py index 0e001adc77..a8a9d8a400 100644 --- a/configs/_base_/models/base_liif.py +++ b/configs/_base_/models/base_liif.py @@ -87,7 +87,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale_max), @@ -96,7 +96,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=1_000_000, val_interval=3000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/_base_/models/base_pconv.py b/configs/_base_/models/base_pconv.py index e2fcac3c58..2bee3fd0e8 100644 --- a/configs/_base_/models/base_pconv.py +++ b/configs/_base_/models/base_pconv.py @@ -4,7 +4,7 @@ model = dict( type='PConvInpaintor', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/configs/_base_/models/base_pix2pix.py b/configs/_base_/models/base_pix2pix.py index 0f6b641f9f..f91d32ba2d 100644 --- a/configs/_base_/models/base_pix2pix.py +++ b/configs/_base_/models/base_pix2pix.py @@ -3,7 +3,7 @@ # model settings model = dict( type='Pix2Pix', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='UnetGenerator', in_channels=3, diff --git a/configs/_base_/models/base_styleganv1.py b/configs/_base_/models/base_styleganv1.py index d3ec444ed2..8ae511e370 100644 --- a/configs/_base_/models/base_styleganv1.py +++ b/configs/_base_/models/base_styleganv1.py @@ -1,6 +1,6 @@ model = dict( type='StyleGANv1', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), style_channels=512, generator=dict( type='StyleGANv1Generator', out_size=None, style_channels=512), diff --git a/configs/_base_/models/base_styleganv2.py b/configs/_base_/models/base_styleganv2.py index d4d272653f..1b62261f2d 100644 --- a/configs/_base_/models/base_styleganv2.py +++ b/configs/_base_/models/base_styleganv2.py @@ -16,7 +16,7 @@ model = dict( type='StyleGAN2', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='StyleGANv2Generator', out_size=None, # Need to be set. diff --git a/configs/_base_/models/base_styleganv3.py b/configs/_base_/models/base_styleganv3.py index d50fcc617a..90446ae57b 100644 --- a/configs/_base_/models/base_styleganv3.py +++ b/configs/_base_/models/base_styleganv3.py @@ -8,7 +8,7 @@ model = dict( type='StyleGAN3', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='StyleGANv3Generator', noise_size=512, diff --git a/configs/_base_/models/base_tof.py b/configs/_base_/models/base_tof.py index 79eee49575..921c36f584 100644 --- a/configs/_base_/models/base_tof.py +++ b/configs/_base_/models/base_tof.py @@ -72,8 +72,8 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=1_000_000, val_interval=epoch_length) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/_base_/models/biggan/base_biggan_128x128.py b/configs/_base_/models/biggan/base_biggan_128x128.py index 66f20cd967..2a68f22722 100644 --- a/configs/_base_/models/biggan/base_biggan_128x128.py +++ b/configs/_base_/models/biggan/base_biggan_128x128.py @@ -1,7 +1,7 @@ model = dict( type='BigGAN', num_classes=1000, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='BigGANGenerator', output_scale=128, diff --git a/configs/_base_/models/dcgan/base_dcgan_128x128.py b/configs/_base_/models/dcgan/base_dcgan_128x128.py index 08b8c9369e..9535446d2f 100644 --- a/configs/_base_/models/dcgan/base_dcgan_128x128.py +++ b/configs/_base_/models/dcgan/base_dcgan_128x128.py @@ -2,7 +2,7 @@ model = dict( type='DCGAN', noise_size=100, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='DCGANGenerator', output_scale=128, base_channels=1024), discriminator=dict( diff --git a/configs/_base_/models/dcgan/base_dcgan_64x64.py b/configs/_base_/models/dcgan/base_dcgan_64x64.py index 9e81330804..7be6975fa7 100644 --- a/configs/_base_/models/dcgan/base_dcgan_64x64.py +++ b/configs/_base_/models/dcgan/base_dcgan_64x64.py @@ -2,7 +2,7 @@ model = dict( type='DCGAN', noise_size=100, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict(type='DCGANGenerator', output_scale=64, base_channels=1024), discriminator=dict( type='DCGANDiscriminator', diff --git a/configs/_base_/models/sagan/base_sagan_128x128.py b/configs/_base_/models/sagan/base_sagan_128x128.py index e143a10d0d..76c817cde5 100644 --- a/configs/_base_/models/sagan/base_sagan_128x128.py +++ b/configs/_base_/models/sagan/base_sagan_128x128.py @@ -1,7 +1,7 @@ model = dict( type='SAGAN', num_classes=1000, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='SAGANGenerator', output_scale=128, diff --git a/configs/_base_/models/sagan/base_sagan_32x32.py b/configs/_base_/models/sagan/base_sagan_32x32.py index 5307d58223..e97529f023 100644 --- a/configs/_base_/models/sagan/base_sagan_32x32.py +++ b/configs/_base_/models/sagan/base_sagan_32x32.py @@ -1,6 +1,6 @@ model = dict( type='SAGAN', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), num_classes=10, generator=dict( type='SAGANGenerator', diff --git a/configs/_base_/models/sngan_proj/base_sngan_proj_128x128.py b/configs/_base_/models/sngan_proj/base_sngan_proj_128x128.py index a40e48b8e7..7719abd773 100644 --- a/configs/_base_/models/sngan_proj/base_sngan_proj_128x128.py +++ b/configs/_base_/models/sngan_proj/base_sngan_proj_128x128.py @@ -2,7 +2,7 @@ model = dict( type='SNGAN', num_classes=1000, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict(type='SNGANGenerator', output_scale=128, base_channels=64), discriminator=dict( type='ProjDiscriminator', input_scale=128, base_channels=64), diff --git a/configs/_base_/models/sngan_proj/base_sngan_proj_32x32.py b/configs/_base_/models/sngan_proj/base_sngan_proj_32x32.py index 6b0b8e29ce..1a062ae0ee 100644 --- a/configs/_base_/models/sngan_proj/base_sngan_proj_32x32.py +++ b/configs/_base_/models/sngan_proj/base_sngan_proj_32x32.py @@ -2,7 +2,7 @@ model = dict( type='SNGAN', num_classes=10, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict(type='SNGANGenerator', output_scale=32, base_channels=256), discriminator=dict( type='ProjDiscriminator', input_scale=32, base_channels=128), diff --git a/configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py b/configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py index 01f0d09326..b5ac3c8913 100644 --- a/configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py +++ b/configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py @@ -13,7 +13,7 @@ model = dict( type='AOTInpaintor', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), @@ -139,8 +139,8 @@ max_iters=500002, val_interval=50000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/basicvsr/basicvsr_2xb4_reds4.py b/configs/basicvsr/basicvsr_2xb4_reds4.py index 53e37f3ec2..c71bca7b86 100644 --- a/configs/basicvsr/basicvsr_2xb4_reds4.py +++ b/configs/basicvsr/basicvsr_2xb4_reds4.py @@ -21,7 +21,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'), train_cfg=dict(fix_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -90,14 +90,14 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', metrics=[ + type='Evaluator', metrics=[ dict(type='PSNR'), dict(type='SSIM'), ]) train_cfg = dict( type='IterBasedTrainLoop', max_iters=300_000, val_interval=5000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py b/configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py index 93f4f4b795..fbf80b4266 100644 --- a/configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py +++ b/configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py @@ -73,7 +73,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', convert_to='Y'), dict(type='SSIM', convert_to='Y'), diff --git a/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track1.py b/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track1.py index 9b1da3802c..5993834bb3 100644 --- a/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track1.py +++ b/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track1.py @@ -18,7 +18,7 @@ ensemble=dict(type='SpatialTemporalEnsemble', is_temporal_ensemble=False), train_cfg=dict(fix_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -53,9 +53,9 @@ pipeline=test_pipeline)) test_evaluator = dict( - type='EditEvaluator', metrics=[ + type='Evaluator', metrics=[ dict(type='PSNR'), dict(type='SSIM'), ]) -test_cfg = dict(type='EditTestLoop') +test_cfg = dict(type='MultiTestLoop') diff --git a/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-vsr.py b/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-vsr.py index 6e830794d1..2760cab88b 100644 --- a/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-vsr.py +++ b/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-vsr.py @@ -15,7 +15,7 @@ ensemble=dict(type='SpatialTemporalEnsemble', is_temporal_ensemble=False), train_cfg=dict(fix_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py b/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py index f8d60e0657..e21936d86b 100644 --- a/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py +++ b/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py @@ -19,7 +19,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'), train_cfg=dict(fix_iter=-1), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py b/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py index 15f6e6dca7..7f63484342 100644 --- a/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py +++ b/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py @@ -19,7 +19,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'), train_cfg=dict(fix_iter=-1), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py b/configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py index 17e44da401..7aec38aa53 100644 --- a/configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py +++ b/configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py @@ -17,7 +17,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'), train_cfg=dict(fix_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/biggan/biggan-deep_cvt-hugging-face-rgb_imagenet1k-128x128.py b/configs/biggan/biggan-deep_cvt-hugging-face-rgb_imagenet1k-128x128.py index e5784c783a..faaf077e68 100644 --- a/configs/biggan/biggan-deep_cvt-hugging-face-rgb_imagenet1k-128x128.py +++ b/configs/biggan/biggan-deep_cvt-hugging-face-rgb_imagenet1k-128x128.py @@ -13,7 +13,7 @@ model = dict( type='BigGAN', num_classes=1000, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), ema_config=ema_config, generator=dict( type='BigGANDeepGenerator', 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 902feb9448..355bda2909 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 @@ -18,7 +18,7 @@ model = dict( type='BigGAN', num_classes=1000, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), ema_config=ema_config, generator=dict( type='BigGANDeepGenerator', 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 b86ab79338..f1db0c6017 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 @@ -18,7 +18,7 @@ model = dict( type='BigGAN', num_classes=1000, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), ema_config=ema_config, generator=dict( type='BigGANDeepGenerator', diff --git a/configs/biggan/biggan_2xb25-500kiters_cifar10-32x32.py b/configs/biggan/biggan_2xb25-500kiters_cifar10-32x32.py index fccd5d09f6..59eaa4cba2 100644 --- a/configs/biggan/biggan_2xb25-500kiters_cifar10-32x32.py +++ b/configs/biggan/biggan_2xb25-500kiters_cifar10-32x32.py @@ -14,7 +14,7 @@ type='BigGAN', num_classes=10, data_preprocessor=dict( - type='EditDataPreprocessor', output_channel_order='BGR'), + type='DataPreprocessor', output_channel_order='BGR'), generator=dict( type='BigGANGenerator', output_scale=32, diff --git a/configs/biggan/biggan_cvt-BigGAN-PyTorch-rgb_imagenet1k-128x128.py b/configs/biggan/biggan_cvt-BigGAN-PyTorch-rgb_imagenet1k-128x128.py index c6e652501d..bc75ddc0cf 100644 --- a/configs/biggan/biggan_cvt-BigGAN-PyTorch-rgb_imagenet1k-128x128.py +++ b/configs/biggan/biggan_cvt-BigGAN-PyTorch-rgb_imagenet1k-128x128.py @@ -13,7 +13,7 @@ model = dict( type='BigGAN', num_classes=1000, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), ema_config=ema_config, generator=dict( type='BigGANGenerator', diff --git a/configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py b/configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py index dc3317a033..a9470e6623 100644 --- a/configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py +++ b/configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py @@ -15,7 +15,7 @@ step_frames=1, init_cfg=None, data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', pad_mode='reflect', )) @@ -118,8 +118,8 @@ test_evaluator = val_evaluator train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=500) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/controlnet/controlnet-1xb1-fill50k.py b/configs/controlnet/controlnet-1xb1-fill50k.py index fc79680c1c..c556f70f6d 100644 --- a/configs/controlnet/controlnet-1xb1-fill50k.py +++ b/configs/controlnet/controlnet-1xb1-fill50k.py @@ -33,7 +33,7 @@ type='DDIMScheduler', from_pretrained=stable_diffusion_v15_url, subfolder='scheduler'), - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), init_cfg=dict(type='init_from_unet')) # config for training diff --git a/configs/controlnet/controlnet-canny.py b/configs/controlnet/controlnet-canny.py index e965b93cd8..1cf22c188c 100644 --- a/configs/controlnet/controlnet-canny.py +++ b/configs/controlnet/controlnet-canny.py @@ -28,5 +28,5 @@ type='DDIMScheduler', from_pretrained=stable_diffusion_v15_url, subfolder='scheduler'), - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), init_cfg=dict(type='init_from_unet')) diff --git a/configs/controlnet/controlnet-pose.py b/configs/controlnet/controlnet-pose.py index 91360a5232..082940d3d9 100644 --- a/configs/controlnet/controlnet-pose.py +++ b/configs/controlnet/controlnet-pose.py @@ -28,5 +28,5 @@ type='DDIMScheduler', from_pretrained=stable_diffusion_v15_url, subfolder='scheduler'), - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), init_cfg=dict(type='init_from_unet')) diff --git a/configs/controlnet/controlnet-seg.py b/configs/controlnet/controlnet-seg.py index 9d65016c51..cb92abd9f4 100644 --- a/configs/controlnet/controlnet-seg.py +++ b/configs/controlnet/controlnet-seg.py @@ -28,5 +28,5 @@ type='DDIMScheduler', from_pretrained=stable_diffusion_v15_url, subfolder='scheduler'), - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), init_cfg=dict(type='init_from_unet')) diff --git a/configs/controlnet_animation/anythingv3_config.py b/configs/controlnet_animation/anythingv3_config.py index 8bfd594b75..e213322548 100644 --- a/configs/controlnet_animation/anythingv3_config.py +++ b/configs/controlnet_animation/anythingv3_config.py @@ -30,7 +30,7 @@ type='DDIMScheduler', from_pretrained=stable_diffusion_v15_url, subfolder='scheduler'), - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), init_cfg=dict(type='init_from_unet'), enable_xformers=False, ) diff --git a/configs/deepfillv1/deepfillv1_4xb4_celeba-256x256.py b/configs/deepfillv1/deepfillv1_4xb4_celeba-256x256.py index 04d38b1bf5..6c1a890e66 100644 --- a/configs/deepfillv1/deepfillv1_4xb4_celeba-256x256.py +++ b/configs/deepfillv1/deepfillv1_4xb4_celeba-256x256.py @@ -56,8 +56,8 @@ max_iters=1500003, val_interval=250000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') checkpoint = dict( type='CheckpointHook', interval=250000, by_epoch=False, out_dir=save_dir) diff --git a/configs/deepfillv1/deepfillv1_8xb2_places-256x256.py b/configs/deepfillv1/deepfillv1_8xb2_places-256x256.py index 940655a05f..c1ad8480c5 100644 --- a/configs/deepfillv1/deepfillv1_8xb2_places-256x256.py +++ b/configs/deepfillv1/deepfillv1_8xb2_places-256x256.py @@ -55,8 +55,8 @@ max_iters=5000003, val_interval=250000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') checkpoint = dict( type='CheckpointHook', interval=250000, by_epoch=False, out_dir=save_dir) diff --git a/configs/deepfillv2/deepfillv2_8xb2_celeba-256x256.py b/configs/deepfillv2/deepfillv2_8xb2_celeba-256x256.py index f61c564e20..8a7dd175d5 100644 --- a/configs/deepfillv2/deepfillv2_8xb2_celeba-256x256.py +++ b/configs/deepfillv2/deepfillv2_8xb2_celeba-256x256.py @@ -56,8 +56,8 @@ max_iters=500003, val_interval=50000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') checkpoint = dict( type='CheckpointHook', interval=50000, by_epoch=False, out_dir=save_dir) diff --git a/configs/deepfillv2/deepfillv2_8xb2_places-256x256.py b/configs/deepfillv2/deepfillv2_8xb2_places-256x256.py index 4cf7205899..0c9dbe71c9 100644 --- a/configs/deepfillv2/deepfillv2_8xb2_places-256x256.py +++ b/configs/deepfillv2/deepfillv2_8xb2_places-256x256.py @@ -56,8 +56,8 @@ max_iters=1000003, val_interval=50000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') checkpoint = dict( type='CheckpointHook', interval=50000, by_epoch=False, out_dir=save_dir) diff --git a/configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py b/configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py index 055d9c504d..ee56d4403f 100644 --- a/configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py +++ b/configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py @@ -33,7 +33,7 @@ train_cfg=dict(pixel_init=10000, disc_repeat=2), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[129.795, 108.12, 96.39], std=[255, 255, 255], )) diff --git a/configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py b/configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py index 0249756208..e32d9364e2 100644 --- a/configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py +++ b/configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py @@ -19,7 +19,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[129.795, 108.12, 96.39], std=[255, 255, 255], )) @@ -141,8 +141,8 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=150_000, val_interval=2000) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py b/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py index 98a1c68c4b..8df6763160 100644 --- a/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py +++ b/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py @@ -77,8 +77,8 @@ max_iters=1_000_000, val_interval=40000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/dreambooth/dreambooth-finetune_text_encoder.py b/configs/dreambooth/dreambooth-finetune_text_encoder.py index 54d1b5bdad..c9f86a2a20 100644 --- a/configs/dreambooth/dreambooth-finetune_text_encoder.py +++ b/configs/dreambooth/dreambooth-finetune_text_encoder.py @@ -34,7 +34,7 @@ type='DDIMScheduler', from_pretrained=stable_diffusion_v15_url, subfolder='scheduler'), - data_preprocessor=dict(type='EditDataPreprocessor', data_keys=None), + data_preprocessor=dict(type='DataPreprocessor', data_keys=None), val_prompts=val_prompts) train_cfg = dict(max_iters=1000) diff --git a/configs/dreambooth/dreambooth-lora.py b/configs/dreambooth/dreambooth-lora.py index 2b180655ae..1e0ff43b71 100644 --- a/configs/dreambooth/dreambooth-lora.py +++ b/configs/dreambooth/dreambooth-lora.py @@ -34,7 +34,7 @@ type='DDIMScheduler', from_pretrained=stable_diffusion_v15_url, subfolder='scheduler'), - data_preprocessor=dict(type='EditDataPreprocessor', data_keys=None), + data_preprocessor=dict(type='DataPreprocessor', data_keys=None), prior_loss_weight=0, val_prompts=val_prompts, lora_config=lora_config) diff --git a/configs/dreambooth/dreambooth.py b/configs/dreambooth/dreambooth.py index cd8d277781..0ba329404d 100644 --- a/configs/dreambooth/dreambooth.py +++ b/configs/dreambooth/dreambooth.py @@ -33,7 +33,7 @@ type='DDIMScheduler', from_pretrained=stable_diffusion_v15_url, subfolder='scheduler'), - data_preprocessor=dict(type='EditDataPreprocessor', data_keys=None), + data_preprocessor=dict(type='DataPreprocessor', data_keys=None), val_prompts=val_prompts) train_cfg = dict(max_iters=1000) diff --git a/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py b/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py index e7dff3f3ac..56d07ce68c 100644 --- a/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py +++ b/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py @@ -24,7 +24,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -103,7 +103,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale), @@ -112,7 +112,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=300000, val_interval=5000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/edsr/edsr_x3c64b16_1xb16-300k_div2k.py b/configs/edsr/edsr_x3c64b16_1xb16-300k_div2k.py index 412d54894d..08476bcd3e 100644 --- a/configs/edsr/edsr_x3c64b16_1xb16-300k_div2k.py +++ b/configs/edsr/edsr_x3c64b16_1xb16-300k_div2k.py @@ -26,7 +26,7 @@ train_cfg=dict(), test_cfg=dict(metrics=['PSNR'], crop_border=scale), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -105,7 +105,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale), @@ -114,7 +114,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=300000, val_interval=5000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py b/configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py index c3912a52b5..1f979a6e73 100644 --- a/configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py +++ b/configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py @@ -26,7 +26,7 @@ train_cfg=dict(), test_cfg=dict(metrics=['PSNR'], crop_border=scale), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -105,7 +105,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale), @@ -114,7 +114,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=300000, val_interval=5000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/edvr/edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py b/configs/edvr/edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py index adb43d0821..6df5389f05 100644 --- a/configs/edvr/edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py +++ b/configs/edvr/edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py @@ -23,7 +23,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'), train_cfg=dict(tsa_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/edvr/edvrl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py b/configs/edvr/edvrl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py index 2ab97b7495..a4873e2320 100644 --- a/configs/edvr/edvrl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py +++ b/configs/edvr/edvrl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py @@ -21,7 +21,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'), train_cfg=dict(tsa_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/edvr/edvrm_8xb4-600k_reds.py b/configs/edvr/edvrm_8xb4-600k_reds.py index 5330a23cf8..3996f92531 100644 --- a/configs/edvr/edvrm_8xb4-600k_reds.py +++ b/configs/edvr/edvrm_8xb4-600k_reds.py @@ -28,7 +28,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'), train_cfg=dict(tsa_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/edvr/edvrm_wotsa_8xb4-600k_reds.py b/configs/edvr/edvrm_wotsa_8xb4-600k_reds.py index c01e377817..14d9d6c5e5 100644 --- a/configs/edvr/edvrm_wotsa_8xb4-600k_reds.py +++ b/configs/edvr/edvrm_wotsa_8xb4-600k_reds.py @@ -21,7 +21,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'), train_cfg=dict(tsa_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py b/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py index 5d58852ad7..4b76ae2e9c 100644 --- a/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py +++ b/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py @@ -2,7 +2,7 @@ model = dict( type='EG3D', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='TriplaneGenerator', out_size=512, diff --git a/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py b/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py index 174c0f5bad..b5e6bdac5c 100644 --- a/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py +++ b/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py @@ -2,7 +2,7 @@ model = dict( type='EG3D', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='TriplaneGenerator', out_size=512, diff --git a/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py b/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py index 6648af6927..8d9e55a346 100644 --- a/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py +++ b/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py @@ -2,7 +2,7 @@ model = dict( type='EG3D', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='TriplaneGenerator', out_size=128, diff --git a/configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py b/configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py index 92eb0f6749..38667f8df7 100644 --- a/configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py +++ b/configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py @@ -22,7 +22,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -96,7 +96,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale), @@ -105,7 +105,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=1_000_000, val_interval=5000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py b/configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py index 14d3fc0b72..b5779e9fa4 100644 --- a/configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py +++ b/configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py @@ -44,7 +44,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py b/configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py index 5552d0386a..6316e4d721 100644 --- a/configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py +++ b/configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py @@ -23,7 +23,7 @@ required_frames=4, step_frames=1, init_cfg=None, - data_preprocessor=dict(type='EditDataPreprocessor', )) + data_preprocessor=dict(type='DataPreprocessor', )) train_pipeline = [ dict( @@ -126,8 +126,8 @@ test_evaluator = val_evaluator train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=500) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/gca/baseline_r34_4xb10-200k_comp1k.py b/configs/gca/baseline_r34_4xb10-200k_comp1k.py index ac839e16a1..9daa69b694 100644 --- a/configs/gca/baseline_r34_4xb10-200k_comp1k.py +++ b/configs/gca/baseline_r34_4xb10-200k_comp1k.py @@ -103,8 +103,8 @@ max_iters=200_000, val_interval=10_000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/gca/gca_r34_4xb10-200k_comp1k.py b/configs/gca/gca_r34_4xb10-200k_comp1k.py index e1fc757422..2bb0a73d76 100644 --- a/configs/gca/gca_r34_4xb10-200k_comp1k.py +++ b/configs/gca/gca_r34_4xb10-200k_comp1k.py @@ -104,8 +104,8 @@ max_iters=200_000, val_interval=10_000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py b/configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py index ea71e5e8b3..ab2ddb0284 100644 --- a/configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py +++ b/configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py @@ -6,7 +6,7 @@ model = dict( type='GGAN', noise_size=1024, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict(type='LSGANGenerator', output_scale=64), discriminator=dict(type='LSGANDiscriminator', input_scale=64)) 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 f0797d26f6..4c1e0732d7 100644 --- a/configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py +++ b/configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py @@ -47,7 +47,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], ), diff --git a/configs/glean/glean_x16_2xb8_cat.py b/configs/glean/glean_x16_2xb8_cat.py index c90e673b59..1ed04b7c1b 100644 --- a/configs/glean/glean_x16_2xb8_cat.py +++ b/configs/glean/glean_x16_2xb8_cat.py @@ -47,7 +47,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], ), diff --git a/configs/glean/glean_x16_2xb8_ffhq.py b/configs/glean/glean_x16_2xb8_ffhq.py index cdd902b8da..57f417a9c5 100644 --- a/configs/glean/glean_x16_2xb8_ffhq.py +++ b/configs/glean/glean_x16_2xb8_ffhq.py @@ -47,7 +47,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], ), diff --git a/configs/glean/glean_x8_2xb8_cat.py b/configs/glean/glean_x8_2xb8_cat.py index c9c8a07a1a..2f90585219 100644 --- a/configs/glean/glean_x8_2xb8_cat.py +++ b/configs/glean/glean_x8_2xb8_cat.py @@ -47,7 +47,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], ), diff --git a/configs/global_local/gl_8xb12_celeba-256x256.py b/configs/global_local/gl_8xb12_celeba-256x256.py index 1451bdd42a..355ad5967b 100644 --- a/configs/global_local/gl_8xb12_celeba-256x256.py +++ b/configs/global_local/gl_8xb12_celeba-256x256.py @@ -63,8 +63,8 @@ max_iters=300002, val_interval=50000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # runtime settings # inheritate from _base_ diff --git a/configs/global_local/gl_8xb12_places-256x256.py b/configs/global_local/gl_8xb12_places-256x256.py index 46bc445a0b..622e4d8ed7 100644 --- a/configs/global_local/gl_8xb12_places-256x256.py +++ b/configs/global_local/gl_8xb12_places-256x256.py @@ -63,8 +63,8 @@ max_iters=500002, val_interval=50000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # runtime settings # inheritate from _base_ diff --git a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py index 55dff5f0a4..53874ced21 100644 --- a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py +++ b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-256x256.py @@ -5,7 +5,7 @@ model = dict( type='AblatedDiffusionModel', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), unet=dict( type='DenoisingUnet', image_size=256, diff --git a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-512x512.py b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-512x512.py index 8a804cc05a..01191c1377 100644 --- a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-512x512.py +++ b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-512x512.py @@ -5,7 +5,7 @@ model = dict( type='AblatedDiffusionModel', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), unet=dict( type='DenoisingUnet', image_size=512, diff --git a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-64x64.py b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-64x64.py index 2ba79bcc23..d7e423dd2c 100644 --- a/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-64x64.py +++ b/configs/guided_diffusion/adm_ddim250_8xb32_imagenet-64x64.py @@ -5,7 +5,7 @@ model = dict( type='AblatedDiffusionModel', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), unet=dict( type='DenoisingUnet', image_size=64, diff --git a/configs/iconvsr/iconvsr_2xb4_reds4.py b/configs/iconvsr/iconvsr_2xb4_reds4.py index b6566f241d..08dc6e0e35 100644 --- a/configs/iconvsr/iconvsr_2xb4_reds4.py +++ b/configs/iconvsr/iconvsr_2xb4_reds4.py @@ -20,7 +20,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'), train_cfg=dict(fix_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/iconvsr/iconvsr_2xb4_vimeo90k-bd.py b/configs/iconvsr/iconvsr_2xb4_vimeo90k-bd.py index f7b57e0e44..d01784a923 100644 --- a/configs/iconvsr/iconvsr_2xb4_vimeo90k-bd.py +++ b/configs/iconvsr/iconvsr_2xb4_vimeo90k-bd.py @@ -20,7 +20,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'), train_cfg=dict(fix_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/iconvsr/iconvsr_2xb4_vimeo90k-bi.py b/configs/iconvsr/iconvsr_2xb4_vimeo90k-bi.py index 7726db443d..63c3308c46 100644 --- a/configs/iconvsr/iconvsr_2xb4_vimeo90k-bi.py +++ b/configs/iconvsr/iconvsr_2xb4_vimeo90k-bi.py @@ -21,7 +21,7 @@ pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'), train_cfg=dict(fix_iter=5000), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py b/configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py index e40dddfcd1..0b9266dcd4 100644 --- a/configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py +++ b/configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py @@ -96,8 +96,8 @@ max_iters=78000, val_interval=2600, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py b/configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py index 952bc74cda..f392cb763e 100644 --- a/configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py +++ b/configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py @@ -9,7 +9,7 @@ model = dict( type='InstColorization', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.py b/configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.py index 8d25835fea..d6fb261e78 100644 --- a/configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.py +++ b/configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.py @@ -30,7 +30,7 @@ eval_bsize=30000), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.4488 * 255, 0.4371 * 255, 0.4040 * 255], std=[255., 255., 255.], )) diff --git a/configs/liif/liif-rdn-norm_c64b16_1xb16-1000k_div2k.py b/configs/liif/liif-rdn-norm_c64b16_1xb16-1000k_div2k.py index c82f03fe50..aad85e1d06 100644 --- a/configs/liif/liif-rdn-norm_c64b16_1xb16-1000k_div2k.py +++ b/configs/liif/liif-rdn-norm_c64b16_1xb16-1000k_div2k.py @@ -33,7 +33,7 @@ eval_bsize=30000), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.5 * 255, 0.5 * 255, 0.5 * 255], std=[0.5 * 255, 0.5 * 255, 0.5 * 255], )) diff --git a/configs/lsgan/lsgan_lsgan-archi_lr1e-4-1xb64-10Mimgs_lsun-bedroom-128x128.py b/configs/lsgan/lsgan_lsgan-archi_lr1e-4-1xb64-10Mimgs_lsun-bedroom-128x128.py index fe5a2171ef..006e6a836a 100644 --- a/configs/lsgan/lsgan_lsgan-archi_lr1e-4-1xb64-10Mimgs_lsun-bedroom-128x128.py +++ b/configs/lsgan/lsgan_lsgan-archi_lr1e-4-1xb64-10Mimgs_lsun-bedroom-128x128.py @@ -6,7 +6,7 @@ model = dict( type='LSGAN', noise_size=1024, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='LSGANGenerator', output_scale=128, diff --git a/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py b/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py index d115f08481..46349eccc2 100644 --- a/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py +++ b/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py @@ -19,7 +19,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -86,8 +86,8 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=400_000, val_interval=20000) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') optim_wrapper = dict( constructor='DefaultOptimWrapperConstructor', diff --git a/configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py b/configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py index 5235d3c79a..b7ec34a455 100644 --- a/configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py +++ b/configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py @@ -19,7 +19,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.0, 0.0, 0.0], std=[255.0, 255.0, 255.0], )) @@ -86,8 +86,8 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=400_000, val_interval=20000) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/partial_conv/pconv_stage1_8xb12_places-256x256.py b/configs/partial_conv/pconv_stage1_8xb12_places-256x256.py index 7cb5e772f8..20c7470785 100644 --- a/configs/partial_conv/pconv_stage1_8xb12_places-256x256.py +++ b/configs/partial_conv/pconv_stage1_8xb12_places-256x256.py @@ -71,8 +71,8 @@ max_iters=800002, val_interval=50000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/partial_conv/pconv_stage1_8xb1_celeba-256x256.py b/configs/partial_conv/pconv_stage1_8xb1_celeba-256x256.py index 86b9aaf052..4d9ead7f1f 100644 --- a/configs/partial_conv/pconv_stage1_8xb1_celeba-256x256.py +++ b/configs/partial_conv/pconv_stage1_8xb1_celeba-256x256.py @@ -71,8 +71,8 @@ max_iters=800002, val_interval=50000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/partial_conv/pconv_stage2_4xb2_celeba-256x256.py b/configs/partial_conv/pconv_stage2_4xb2_celeba-256x256.py index 6b843803d4..5478ce931e 100644 --- a/configs/partial_conv/pconv_stage2_4xb2_celeba-256x256.py +++ b/configs/partial_conv/pconv_stage2_4xb2_celeba-256x256.py @@ -71,8 +71,8 @@ max_iters=300002, val_interval=50000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/partial_conv/pconv_stage2_4xb2_places-256x256.py b/configs/partial_conv/pconv_stage2_4xb2_places-256x256.py index 2757f48d91..464ac414c8 100644 --- a/configs/partial_conv/pconv_stage2_4xb2_places-256x256.py +++ b/configs/partial_conv/pconv_stage2_4xb2_places-256x256.py @@ -68,8 +68,8 @@ max_iters=500000, val_interval=50000, ) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py b/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py index ee75c071c8..acd7127231 100644 --- a/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py +++ b/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py @@ -3,7 +3,7 @@ # define GAN model model = dict( type='ProgressiveGrowingGAN', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), noise_size=512, generator=dict(type='PGGANGenerator', out_scale=1024, noise_size=512), discriminator=dict(type='PGGANDiscriminator', in_scale=1024), diff --git a/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py b/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py index 57a1148d1d..205482d394 100644 --- a/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py +++ b/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py @@ -3,7 +3,7 @@ # define GAN model model = dict( type='ProgressiveGrowingGAN', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), noise_size=512, generator=dict(type='PGGANGenerator', out_scale=128), discriminator=dict(type='PGGANDiscriminator', in_scale=128), diff --git a/configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py b/configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py index 32fb472c96..469e7b4cb0 100644 --- a/configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py +++ b/configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py @@ -21,7 +21,7 @@ train_cfg=dict(), test_cfg=dict(metrics=['PSNR'], crop_border=scale), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -99,7 +99,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale), @@ -108,7 +108,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=1000000, val_interval=5000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py b/configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py index 78385a1056..1bcc90b9b8 100644 --- a/configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py +++ b/configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py @@ -21,7 +21,7 @@ train_cfg=dict(), test_cfg=dict(metrics=['PSNR'], crop_border=scale), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -99,7 +99,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale), @@ -108,7 +108,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=1000000, val_interval=5000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py b/configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py index 86e110d874..5e938c176a 100644 --- a/configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py +++ b/configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py @@ -21,7 +21,7 @@ train_cfg=dict(), test_cfg=dict(metrics=['PSNR'], crop_border=scale), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -100,7 +100,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale), @@ -109,7 +109,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=1000000, val_interval=5000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/real_basicvsr/realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py b/configs/real_basicvsr/realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py index b17c62b6f2..684fa0adbb 100644 --- a/configs/real_basicvsr/realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py +++ b/configs/real_basicvsr/realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py @@ -52,7 +52,7 @@ is_use_sharpened_gt_in_gan=False, is_use_ema=True, data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/real_basicvsr/realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py b/configs/real_basicvsr/realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py index 956cd02b16..74eef2d1bc 100644 --- a/configs/real_basicvsr/realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py +++ b/configs/real_basicvsr/realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py @@ -24,7 +24,7 @@ is_use_sharpened_gt_in_pixel=True, is_use_ema=True, data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -261,19 +261,19 @@ pipeline=test_pipeline)) val_evaluator = dict( - type='EditEvaluator', metrics=[ + type='Evaluator', metrics=[ dict(type='PSNR'), dict(type='SSIM'), ]) test_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[dict(type='NIQE', input_order='CHW', convert_to='Y')]) train_cfg = dict( type='IterBasedTrainLoop', max_iters=300_000, val_interval=5000) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/real_esrgan/realesrgan_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.py b/configs/real_esrgan/realesrgan_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.py index b27a9adf79..187f96385d 100644 --- a/configs/real_esrgan/realesrgan_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.py +++ b/configs/real_esrgan/realesrgan_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.py @@ -51,7 +51,7 @@ train_cfg=dict(start_iter=1000000), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py b/configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py index 9c0e6cdfff..b361c6e8e5 100644 --- a/configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py +++ b/configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py @@ -27,7 +27,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -211,7 +211,7 @@ test_dataloader = val_dataloader val_evaluator = dict( - type='EditEvaluator', metrics=[ + type='Evaluator', metrics=[ dict(type='PSNR'), dict(type='SSIM'), ]) @@ -219,8 +219,8 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=1_000_000, val_interval=2000) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/restormer/restormer_official_dfwb-color-sigma15.py b/configs/restormer/restormer_official_dfwb-color-sigma15.py index 3985289ef6..a41e3a8f0a 100644 --- a/configs/restormer/restormer_official_dfwb-color-sigma15.py +++ b/configs/restormer/restormer_official_dfwb-color-sigma15.py @@ -31,7 +31,7 @@ dual_pixel_task=False), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', 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 index e1ecdb5cfd..e88b3e8bd2 100644 --- a/configs/restormer/restormer_official_dfwb-color-sigma25.py +++ b/configs/restormer/restormer_official_dfwb-color-sigma25.py @@ -31,7 +31,7 @@ dual_pixel_task=False), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', 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 index 37a355083f..1b093d20c8 100644 --- a/configs/restormer/restormer_official_dfwb-color-sigma50.py +++ b/configs/restormer/restormer_official_dfwb-color-sigma50.py @@ -31,7 +31,7 @@ dual_pixel_task=False), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', 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 index a7db922251..0762c5c44c 100644 --- a/configs/restormer/restormer_official_dfwb-gray-sigma15.py +++ b/configs/restormer/restormer_official_dfwb-gray-sigma15.py @@ -31,7 +31,7 @@ dual_pixel_task=False), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.], std=[255.], )) diff --git a/configs/restormer/restormer_official_dfwb-gray-sigma25.py b/configs/restormer/restormer_official_dfwb-gray-sigma25.py index 3ce1537c69..ef9557e889 100644 --- a/configs/restormer/restormer_official_dfwb-gray-sigma25.py +++ b/configs/restormer/restormer_official_dfwb-gray-sigma25.py @@ -31,7 +31,7 @@ dual_pixel_task=False), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.], std=[255.], )) diff --git a/configs/restormer/restormer_official_dfwb-gray-sigma50.py b/configs/restormer/restormer_official_dfwb-gray-sigma50.py index e97ecfd2b0..4ef69d0804 100644 --- a/configs/restormer/restormer_official_dfwb-gray-sigma50.py +++ b/configs/restormer/restormer_official_dfwb-gray-sigma50.py @@ -31,7 +31,7 @@ dual_pixel_task=False), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.], std=[255.], )) diff --git a/configs/restormer/restormer_official_dpdd-dual.py b/configs/restormer/restormer_official_dpdd-dual.py index 14abfb1180..94b611e395 100644 --- a/configs/restormer/restormer_official_dpdd-dual.py +++ b/configs/restormer/restormer_official_dpdd-dual.py @@ -15,4 +15,4 @@ # model settings model = dict( generator=dict(inp_channels=6, dual_pixel_task=True), - data_preprocessor=dict(type='EditDataPreprocessor')) + data_preprocessor=dict(type='DataPreprocessor')) diff --git a/configs/restormer/restormer_official_dpdd-single.py b/configs/restormer/restormer_official_dpdd-single.py index 136520da00..6fdc0e7097 100644 --- a/configs/restormer/restormer_official_dpdd-single.py +++ b/configs/restormer/restormer_official_dpdd-single.py @@ -24,7 +24,7 @@ dual_pixel_task=False), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/restormer/restormer_official_gopro.py b/configs/restormer/restormer_official_gopro.py index a07a489725..83e5149c7f 100644 --- a/configs/restormer/restormer_official_gopro.py +++ b/configs/restormer/restormer_official_gopro.py @@ -24,7 +24,7 @@ dual_pixel_task=False), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/restormer/restormer_official_rain13k.py b/configs/restormer/restormer_official_rain13k.py index c352582737..564fe3b539 100644 --- a/configs/restormer/restormer_official_rain13k.py +++ b/configs/restormer/restormer_official_rain13k.py @@ -24,7 +24,7 @@ dual_pixel_task=False), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/restormer/restormer_official_sidd.py b/configs/restormer/restormer_official_sidd.py index 926796fcde..cd88be548c 100644 --- a/configs/restormer/restormer_official_sidd.py +++ b/configs/restormer/restormer_official_sidd.py @@ -24,7 +24,7 @@ dual_pixel_task=False), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/configs/singan/singan_fish.py b/configs/singan/singan_fish.py index eeb0c7aa5e..7c6fbfe5e1 100644 --- a/configs/singan/singan_fish.py +++ b/configs/singan/singan_fish.py @@ -15,7 +15,7 @@ model = dict( type='SinGAN', data_preprocessor=dict( - type='EditDataPreprocessor', non_image_keys=['input_sample']), + type='DataPreprocessor', non_image_keys=['input_sample']), generator=dict( type='SinGANMultiScaleGenerator', in_channels=3, diff --git a/configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py b/configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py index ec58d58bb2..d6679b8df7 100644 --- a/configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py +++ b/configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py @@ -19,7 +19,7 @@ train_cfg=dict(), test_cfg=dict(metrics=['PSNR'], crop_border=scale), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -97,7 +97,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale), @@ -106,7 +106,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=1000000, val_interval=5000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py b/configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py index 7f7ed85361..984c55100d 100644 --- a/configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py +++ b/configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py @@ -21,7 +21,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) @@ -95,7 +95,7 @@ pipeline=val_pipeline)) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale), @@ -104,7 +104,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=1_000_000, val_interval=5000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # optimizer optim_wrapper = dict( diff --git a/configs/srgan_resnet/srgan_x4c64b16_1xb16-1000k_div2k.py b/configs/srgan_resnet/srgan_x4c64b16_1xb16-1000k_div2k.py index a5f0c275e6..d4c92b7289 100644 --- a/configs/srgan_resnet/srgan_x4c64b16_1xb16-1000k_div2k.py +++ b/configs/srgan_resnet/srgan_x4c64b16_1xb16-1000k_div2k.py @@ -38,7 +38,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) 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 index ee1dc77bfb..7739c9f4c2 100644 --- 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 @@ -25,8 +25,7 @@ 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.])) + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.])) test_pipeline = [ dict( 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 index 7eea2d978c..8affa9c269 100644 --- a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py @@ -27,8 +27,7 @@ resi_connection='1conv'), pixel_loss=dict(type='CharbonnierLoss', eps=1e-9), data_preprocessor=dict( - type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., - 255.])) + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.])) train_pipeline = [ dict( 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 index 2b651dfa5e..0a36827ea6 100644 --- a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py @@ -26,7 +26,7 @@ upsampler='', resi_connection='1conv'), pixel_loss=dict(type='CharbonnierLoss', eps=1e-9), - data_preprocessor=dict(type='EditDataPreprocessor', mean=[0.], std=[255.])) + data_preprocessor=dict(type='DataPreprocessor', mean=[0.], std=[255.])) train_pipeline = [ dict( 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 index 469e4c6e8b..b89ae76c15 100644 --- a/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py +++ b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py @@ -32,8 +32,7 @@ resi_connection='1conv'), pixel_loss=dict(type='CharbonnierLoss', eps=1e-9), data_preprocessor=dict( - type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., - 255.])) + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.])) train_pipeline = [ dict( 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 index 2f765c3c3a..3291dfaf5a 100644 --- a/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py +++ b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py @@ -31,7 +31,7 @@ upsampler='', resi_connection='1conv'), pixel_loss=dict(type='CharbonnierLoss', eps=1e-9), - data_preprocessor=dict(type='EditDataPreprocessor', mean=[0.], std=[255.])) + data_preprocessor=dict(type='DataPreprocessor', mean=[0.], std=[255.])) train_pipeline = [ dict( diff --git a/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py index 2791be079e..618d684936 100644 --- a/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +++ b/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py @@ -33,8 +33,7 @@ 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.])) + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.])) train_pipeline = [ dict( diff --git a/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py index ba37928dba..1ef576431d 100644 --- a/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +++ b/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py @@ -33,8 +33,7 @@ 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.])) + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.])) train_pipeline = [ dict( diff --git a/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py index 3383e07815..1d28407c74 100644 --- a/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +++ b/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py @@ -33,8 +33,7 @@ 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.])) + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.])) train_pipeline = [ dict( diff --git a/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py b/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py index 3652be5e1b..bd1f6d97c7 100644 --- a/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py +++ b/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py @@ -20,13 +20,13 @@ pixel_loss=dict(type='MSELoss', loss_weight=1.0, reduction='mean'), lq_pixel_loss=dict(type='MSELoss', loss_weight=0.01, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.5 * 255, 0.5 * 255, 0.5 * 255], std=[255, 255, 255], )) val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='PSNR', crop_border=8, convert_to='Y'), dict(type='SSIM', crop_border=8, convert_to='Y'), @@ -106,7 +106,7 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=400_000, val_interval=50000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # No learning policy 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 fbfbcb19c7..11f75cfb06 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 @@ -10,6 +10,6 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=400_000, val_interval=50000) -val_cfg = dict(type='EditValLoop') +val_cfg = dict(type='MultiValLoop') # No learning policy diff --git a/configs/tof/tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py b/configs/tof/tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py index cc251843a7..8a741a2a4a 100644 --- a/configs/tof/tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py +++ b/configs/tof/tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py @@ -21,7 +21,7 @@ step_frames=1, init_cfg=None, data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.485 * 255, 0.456 * 255, 0.406 * 255], std=[0.229 * 255, 0.224 * 255, 0.225 * 255], pad_size_divisor=16, diff --git a/configs/tof/tof_spynet-kitti-wobn_1xb1_vimeo90k-triplet.py b/configs/tof/tof_spynet-kitti-wobn_1xb1_vimeo90k-triplet.py index e443bbb726..5a4ef714b1 100644 --- a/configs/tof/tof_spynet-kitti-wobn_1xb1_vimeo90k-triplet.py +++ b/configs/tof/tof_spynet-kitti-wobn_1xb1_vimeo90k-triplet.py @@ -21,7 +21,7 @@ step_frames=1, init_cfg=None, data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.485 * 255, 0.456 * 255, 0.406 * 255], std=[0.229 * 255, 0.224 * 255, 0.225 * 255], pad_size_divisor=16, diff --git a/configs/tof/tof_spynet-pytoflow-wobn_1xb1_vimeo90k-triplet.py b/configs/tof/tof_spynet-pytoflow-wobn_1xb1_vimeo90k-triplet.py index 9adf7b0dd5..e65b3f3743 100644 --- a/configs/tof/tof_spynet-pytoflow-wobn_1xb1_vimeo90k-triplet.py +++ b/configs/tof/tof_spynet-pytoflow-wobn_1xb1_vimeo90k-triplet.py @@ -21,7 +21,7 @@ step_frames=1, init_cfg=None, data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.485 * 255, 0.456 * 255, 0.406 * 255], std=[0.229 * 255, 0.224 * 255, 0.225 * 255], pad_size_divisor=16, diff --git a/configs/tof/tof_spynet-sintel-wobn-clean_1xb1_vimeo90k-triplet.py b/configs/tof/tof_spynet-sintel-wobn-clean_1xb1_vimeo90k-triplet.py index 3d2833da77..7f101b4f45 100644 --- a/configs/tof/tof_spynet-sintel-wobn-clean_1xb1_vimeo90k-triplet.py +++ b/configs/tof/tof_spynet-sintel-wobn-clean_1xb1_vimeo90k-triplet.py @@ -21,7 +21,7 @@ step_frames=1, init_cfg=None, data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.485 * 255, 0.456 * 255, 0.406 * 255], std=[0.229 * 255, 0.224 * 255, 0.225 * 255], pad_size_divisor=16, diff --git a/configs/tof/tof_spynet-sintel-wobn-final_1xb1_vimeo90k-triplet.py b/configs/tof/tof_spynet-sintel-wobn-final_1xb1_vimeo90k-triplet.py index 9b4bc279a5..1c681755ee 100644 --- a/configs/tof/tof_spynet-sintel-wobn-final_1xb1_vimeo90k-triplet.py +++ b/configs/tof/tof_spynet-sintel-wobn-final_1xb1_vimeo90k-triplet.py @@ -21,7 +21,7 @@ step_frames=1, init_cfg=None, data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.485 * 255, 0.456 * 255, 0.406 * 255], std=[0.229 * 255, 0.224 * 255, 0.225 * 255], pad_size_divisor=16, diff --git a/configs/tof/tof_x4_official_vimeo90k.py b/configs/tof/tof_x4_official_vimeo90k.py index e98917174f..ed78f739d6 100644 --- a/configs/tof/tof_x4_official_vimeo90k.py +++ b/configs/tof/tof_x4_official_vimeo90k.py @@ -11,7 +11,7 @@ generator=dict(type='TOFlowVSRNet', adapt_official_weights=True), pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0.485 * 255, 0.456 * 255, 0.406 * 255], std=[0.229 * 255, 0.224 * 255, 0.225 * 255], )) @@ -62,7 +62,7 @@ # test_dataloader = val_dataloader val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR'), @@ -70,5 +70,5 @@ ]) # test_evaluator = val_evaluator -val_cfg = dict(type='EditValLoop') -# test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +# test_cfg = dict(type='MultiTestLoop') diff --git a/configs/ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.py b/configs/ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.py index 659edd82ec..b1851aa4f7 100644 --- a/configs/ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.py +++ b/configs/ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.py @@ -42,7 +42,7 @@ train_cfg=dict(pixel_init=25000, disc_repeat=2), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], )) diff --git a/configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py b/configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py index cc8652eed0..289fac373e 100644 --- a/configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py +++ b/configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py @@ -24,7 +24,7 @@ train_cfg=dict(), test_cfg=dict(), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], )) @@ -189,7 +189,7 @@ test_dataloader = val_dataloader val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict(type='MAE'), dict(type='PSNR', crop_border=scale), @@ -199,8 +199,8 @@ train_cfg = dict( type='IterBasedTrainLoop', max_iters=200_000, val_interval=5000) -val_cfg = dict(type='EditValLoop') -test_cfg = dict(type='EditTestLoop') +val_cfg = dict(type='MultiValLoop') +test_cfg = dict(type='MultiTestLoop') # optimizer optim_wrapper = dict( diff --git a/configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py b/configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py index 85038bfcab..27d4e797c4 100644 --- a/configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py +++ b/configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py @@ -7,7 +7,7 @@ loss_config = dict(gp_norm_mode='HWC', gp_loss_weight=10) model = dict( type='WGANGP', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict(type='WGANGPGenerator', noise_size=128, out_scale=128), discriminator=dict( type='WGANGPDiscriminator', diff --git a/docs/en/howto/models.md b/docs/en/howto/models.md index 1ffff12b9d..84a661d324 100644 --- a/docs/en/howto/models.md +++ b/docs/en/howto/models.md @@ -419,7 +419,7 @@ model = dict( upscale_factor=scale), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.], )) diff --git a/docs/en/migration/eval_test.md b/docs/en/migration/eval_test.md index b9b27b593c..f6d7e2ddbe 100644 --- a/docs/en/migration/eval_test.md +++ b/docs/en/migration/eval_test.md @@ -83,7 +83,7 @@ evaluation = dict( ```python val_evaluator = dict( - type='EditEvaluator', + type='Evaluator', metrics=[ dict( type='FID', diff --git a/docs/en/migration/models.md b/docs/en/migration/models.md index f467755eb8..0ea5d7a61a 100644 --- a/docs/en/migration/models.md +++ b/docs/en/migration/models.md @@ -53,7 +53,7 @@ model = dict( train_cfg=dict(), # Config of training model. test_cfg=dict(), # Config of testing model. data_preprocessor=dict( # The Config to build data preprocessor - type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.])) ``` diff --git a/docs/en/user_guides/config.md b/docs/en/user_guides/config.md index 1a00652c75..31cc34cc66 100644 --- a/docs/en/user_guides/config.md +++ b/docs/en/user_guides/config.md @@ -102,7 +102,7 @@ model = dict( train_cfg=dict(), # Config of training model. test_cfg=dict(), # Config of testing model. data_preprocessor=dict( # The Config to build data preprocessor - type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.])) ``` @@ -367,7 +367,7 @@ The config of evaluators consists of one or a list of metric configs: ```python val_evaluator = dict( # The config for validation evaluator - type='EditEvaluator', # The type of evaluation + type='Evaluator', # The type of evaluation metrics=[ # The config for metrics dict( type='FrechetInceptionDistance', @@ -494,7 +494,7 @@ For more detailed usage and the corresponding alternative for each modules, plea model = dict( type='GLInpaintor', # The name of inpaintor data_preprocessor=dict( - type='EditDataPreprocessor', # The name of data preprocessor + type='DataPreprocessor', # The name of data preprocessor mean=[127.5], # Mean value used in data normalization std=[127.5], # Std value used in data normalization ), @@ -869,7 +869,7 @@ model = dict( train_cfg=dict(), # Config of training model. test_cfg=dict(), # Config of testing model. data_preprocessor=dict( # The Config to build data preprocessor - type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., + type='DataPreprocessor', mean=[0., 0., 0.], std=[255., 255., 255.])) train_pipeline = [ # Training data processing pipeline diff --git a/docs/en/user_guides/train_test.md b/docs/en/user_guides/train_test.md index 6a05543f87..15a961593c 100644 --- a/docs/en/user_guides/train_test.md +++ b/docs/en/user_guides/train_test.md @@ -205,8 +205,8 @@ val_dataloader = dict( train_cfg = dict(by_epoch=False, val_begin=1, val_interval=10000) # define val loop and evaluator -val_cfg = dict(type='EditValLoop') -val_evaluator = dict(type='EditEvaluator', metrics=metrics) +val_cfg = dict(type='MultiValLoop') +val_evaluator = dict(type='Evaluator', metrics=metrics) ``` You can set `val_begin` and `val_interval` to adjust when to begin validation and interval of validation. diff --git a/mmagic/engine/runner/__init__.py b/mmagic/engine/runner/__init__.py index eab02a27df..170397f05e 100644 --- a/mmagic/engine/runner/__init__.py +++ b/mmagic/engine/runner/__init__.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from .edit_loops import EditTestLoop, EditValLoop from .log_processor import LogProcessor +from .multi_loops import MultiTestLoop, MultiValLoop -__all__ = ['EditTestLoop', 'EditValLoop', 'LogProcessor'] +__all__ = ['MultiTestLoop', 'MultiValLoop', 'LogProcessor'] diff --git a/mmagic/engine/runner/loop_utils.py b/mmagic/engine/runner/loop_utils.py index 02ce80f95e..88078c1ae7 100644 --- a/mmagic/engine/runner/loop_utils.py +++ b/mmagic/engine/runner/loop_utils.py @@ -10,10 +10,10 @@ def update_and_check_evaluator(evaluator: EVALUATOR_TYPE ) -> Union[Evaluator, dict]: - """Check the whether the evaluator instance or dict config is - EditEvaluator. If input is a dict config, attempt to set evaluator type as - EditEvaluator and raised warning if it is not allowed. If input is a - Evaluator instance, check whether it is a EditEvaluator class, otherwise, + """Check the whether the evaluator instance or dict config is Evaluator. If + input is a dict config, attempt to set evaluator type as Evaluator and + raised warning if it is not allowed. If input is a Evaluator instance, + check whether it is a Evaluator class, otherwise, Args: evaluator (Union[Evaluator, dict, list]): The evaluator instance or @@ -21,28 +21,29 @@ def update_and_check_evaluator(evaluator: EVALUATOR_TYPE """ # check Evaluator instance warning_template = ('Evaluator type for current config is \'{}\'. ' - 'If you want to use EditValLoop, we strongly ' - 'recommand you to use \'EditEvaluator\'. Otherwise, ' - 'there maybe some potential bugs.') + 'If you want to use MultiValLoop, we strongly ' + 'recommand you to use \'Evaluator\' provided by ' + '\'MMagic\'. Otherwise, there maybe some potential ' + 'bugs.') if isinstance(evaluator, Evaluator): cls_name = evaluator.__class__.__name__ - if cls_name != 'EditEvaluator': + if cls_name != 'Evaluator': print_log(warning_template.format(cls_name), 'current', WARNING) return evaluator # add type for **single evaluator with list of metrics** if isinstance(evaluator, list): - evaluator = dict(type='EditEvaluator', metrics=evaluator) + evaluator = dict(type='Evaluator', metrics=evaluator) return evaluator # check and update dict config assert isinstance(evaluator, dict), ( 'Can only conduct check and update for list of metrics, a config dict ' f'or a Evaluator object. But receives {type(evaluator)}.') - evaluator.setdefault('type', 'EditEvaluator') + evaluator.setdefault('type', 'Evaluator') evaluator.setdefault('metrics', None) # default as 'dummy evaluator' _type = evaluator['type'] - if _type != 'EditEvaluator': + if _type != 'Evaluator': print_log(warning_template.format(_type), 'current', WARNING) return evaluator diff --git a/mmagic/engine/runner/edit_loops.py b/mmagic/engine/runner/multi_loops.py similarity index 94% rename from mmagic/engine/runner/edit_loops.py rename to mmagic/engine/runner/multi_loops.py index ad6e3350f3..ae973a9631 100644 --- a/mmagic/engine/runner/edit_loops.py +++ b/mmagic/engine/runner/multi_loops.py @@ -16,8 +16,9 @@ @LOOPS.register_module() -class EditValLoop(BaseLoop): - """Validation loop for MMagic models. This class support evaluate: +class MultiValLoop(BaseLoop): + """Validation loop for MMagic models which support evaluate multiply + dataset at the same time. This class support evaluate: 1. Metrics (metric) on a single dataset (e.g. PSNR and SSIM on DIV2K dataset) @@ -29,11 +30,11 @@ class EditValLoop(BaseLoop): Case 1: metrics on a single dataset >>> # add the following lines in your config - >>> # 1. use `EditValLoop` instead of `ValLoop` in MMEngine - >>> val_cfg = dict(type='EditValLoop') - >>> # 2. specific EditEvaluator instead of Evaluator in MMEngine + >>> # 1. use `MultiValLoop` instead of `ValLoop` in MMEngine + >>> val_cfg = dict(type='MultiValLoop') + >>> # 2. specific MultiEvaluator instead of Evaluator in MMEngine >>> val_evaluator = dict( - >>> type='EditEvaluator', + >>> type='MultiEvaluator', >>> metrics=[ >>> dict(type='PSNR', crop_border=2, prefix='Set5'), >>> dict(type='SSIM', crop_border=2, prefix='Set5'), @@ -44,15 +45,15 @@ class EditValLoop(BaseLoop): Case 2: different metrics on different datasets >>> # add the following lines in your config - >>> # 1. use `EditValLoop` instead of `ValLoop` in MMEngine - >>> val_cfg = dict(type='EditValLoop') - >>> # 2. specific a list EditEvaluator + >>> # 1. use `MultiValLoop` instead of `ValLoop` in MMEngine + >>> val_cfg = dict(type='MultiValLoop') + >>> # 2. specific a list MultiEvaluator >>> # do not forget to add prefix for each metric group >>> div2k_evaluator = dict( - >>> type='EditEvaluator', + >>> type='MultiEvaluator', >>> metrics=dict(type='SSIM', crop_border=2, prefix='DIV2K')) >>> set5_evaluator = dict( - >>> type='EditEvaluator', + >>> type='MultiEvaluator', >>> metrics=[ >>> dict(type='PSNR', crop_border=2, prefix='Set5'), >>> dict(type='SSIM', crop_border=2, prefix='Set5'), @@ -270,8 +271,9 @@ def run_iter(self, idx, data_batch: dict, metrics: Sequence[BaseMetric]): @LOOPS.register_module() -class EditTestLoop(BaseLoop): - """Test loop for MMagic models. This class support evaluate: +class MultiTestLoop(BaseLoop): + """Test loop for MMagic models which support evaluate multiply dataset at + the same time. This class support evaluate: 1. Metrics (metric) on a single dataset (e.g. PSNR and SSIM on DIV2K dataset) @@ -283,11 +285,11 @@ class EditTestLoop(BaseLoop): Case 1: metrics on a single dataset >>> # add the following lines in your config - >>> # 1. use `EditTestLoop` instead of `TestLoop` in MMEngine - >>> val_cfg = dict(type='EditTestLoop') - >>> # 2. specific EditEvaluator instead of Evaluator in MMEngine + >>> # 1. use `MultiTestLoop` instead of `TestLoop` in MMEngine + >>> val_cfg = dict(type='MultiTestLoop') + >>> # 2. specific MultiEvaluator instead of Evaluator in MMEngine >>> test_evaluator = dict( - >>> type='EditEvaluator', + >>> type='MultiEvaluator', >>> metrics=[ >>> dict(type='PSNR', crop_border=2, prefix='Set5'), >>> dict(type='SSIM', crop_border=2, prefix='Set5'), @@ -298,15 +300,15 @@ class EditTestLoop(BaseLoop): Case 2: different metrics on different datasets >>> # add the following lines in your config - >>> # 1. use `EditTestLoop` instead of `TestLoop` in MMEngine - >>> Test_cfg = dict(type='EditTestLoop') - >>> # 2. specific a list EditEvaluator + >>> # 1. use `MultiTestLoop` instead of `TestLoop` in MMEngine + >>> Test_cfg = dict(type='MultiTestLoop') + >>> # 2. specific a list MultiEvaluator >>> # do not forget to add prefix for each metric group >>> div2k_evaluator = dict( - >>> type='EditEvaluator', + >>> type='MultiEvaluator', >>> metrics=dict(type='SSIM', crop_border=2, prefix='DIV2K')) >>> set5_evaluator = dict( - >>> type='EditEvaluator', + >>> type='MultiEvaluator', >>> metrics=[ >>> dict(type='PSNR', crop_border=2, prefix='Set5'), >>> dict(type='SSIM', crop_border=2, prefix='Set5'), diff --git a/mmagic/evaluation/__init__.py b/mmagic/evaluation/__init__.py index 147962f5b2..d774db166e 100644 --- a/mmagic/evaluation/__init__.py +++ b/mmagic/evaluation/__init__.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from .evaluator import EditEvaluator +from .evaluator import Evaluator from .functional import gauss_gradient from .metrics import (MAE, MSE, NIQE, PSNR, SAD, SNR, SSIM, ConnectivityError, Equivariance, FrechetInceptionDistance, GradientError, @@ -9,7 +9,7 @@ TransIS, niqe, psnr, snr, ssim) __all__ = [ - 'EditEvaluator', + 'Evaluator', 'gauss_gradient', 'ConnectivityError', 'GradientError', diff --git a/mmagic/evaluation/evaluator.py b/mmagic/evaluation/evaluator.py index e8bb9fd53d..1ee778623e 100644 --- a/mmagic/evaluation/evaluator.py +++ b/mmagic/evaluation/evaluator.py @@ -13,7 +13,7 @@ @EVALUATORS.register_module() -class EditEvaluator(Evaluator): +class Evaluator(Evaluator): """Evaluator for generative models. Unlike high-level vision tasks, metrics for generative models have various input types. For example, Inception Score (IS, :class:`~mmagic.evaluation.InceptionScore`) only needs to @@ -36,8 +36,8 @@ class EditEvaluator(Evaluator): same sample mode can share the sampler. The whole evaluation process can be found in - :meth:`mmagic.engine.runner.GenValLoop.run` and - :meth:`mmagic.engine.runner.GenTestLoop.run`. + :meth:`mmagic.engine.runner.MultiValLoop.run` and + :meth:`mmagic.engine.runner.MultiTestLoop.run`. Args: metrics (dict or BaseMetric or Sequence): The config of metrics. diff --git a/mmagic/models/__init__.py b/mmagic/models/__init__.py index 4d6054ed96..c028a3c91f 100644 --- a/mmagic/models/__init__.py +++ b/mmagic/models/__init__.py @@ -2,12 +2,12 @@ from .base_models import (BaseConditionalGAN, BaseEditModel, BaseGAN, BaseMattor, BaseTranslationModel, BasicInterpolator, ExponentialMovingAverage) -from .data_preprocessors import EditDataPreprocessor, MattorPreprocessor +from .data_preprocessors import DataPreprocessor, MattorPreprocessor from .editors import * # noqa: F401, F403 from .losses import * # noqa: F401, F403 __all__ = [ 'BaseGAN', 'BaseTranslationModel', 'BaseEditModel', 'MattorPreprocessor', - 'EditDataPreprocessor', 'BasicInterpolator', 'BaseMattor', - 'BasicInterpolator', 'ExponentialMovingAverage', 'BaseConditionalGAN' + 'DataPreprocessor', 'BasicInterpolator', 'BaseMattor', 'BasicInterpolator', + 'ExponentialMovingAverage', 'BaseConditionalGAN' ] diff --git a/mmagic/models/base_models/base_conditional_gan.py b/mmagic/models/base_models/base_conditional_gan.py index 21bec7edfa..9fb6c1885d 100644 --- a/mmagic/models/base_models/base_conditional_gan.py +++ b/mmagic/models/base_models/base_conditional_gan.py @@ -24,7 +24,7 @@ class BaseConditionalGAN(BaseGAN): discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmagic.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.DataPreprocessor`. generator_steps (int): The number of times the generator is completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): The number of times the discriminator is diff --git a/mmagic/models/base_models/base_gan.py b/mmagic/models/base_models/base_gan.py index 285078ea20..7427120722 100644 --- a/mmagic/models/base_models/base_gan.py +++ b/mmagic/models/base_models/base_gan.py @@ -27,7 +27,7 @@ class BaseGAN(BaseModel, metaclass=ABCMeta): discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmagic.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.DataPreprocessor`. generator_steps (int): The number of times the generator is completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): The number of times the discriminator is diff --git a/mmagic/models/data_preprocessors/__init__.py b/mmagic/models/data_preprocessors/__init__.py index 54bb9004eb..fc3d9b07f4 100644 --- a/mmagic/models/data_preprocessors/__init__.py +++ b/mmagic/models/data_preprocessors/__init__.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from .edit_data_preprocessor import EditDataPreprocessor +from .data_preprocessor import DataPreprocessor from .mattor_preprocessor import MattorPreprocessor -__all__ = ['EditDataPreprocessor', 'MattorPreprocessor'] +__all__ = ['DataPreprocessor', 'MattorPreprocessor'] diff --git a/mmagic/models/data_preprocessors/edit_data_preprocessor.py b/mmagic/models/data_preprocessors/data_preprocessor.py similarity index 99% rename from mmagic/models/data_preprocessors/edit_data_preprocessor.py rename to mmagic/models/data_preprocessors/data_preprocessor.py index 88d75de8cb..02ec643a8b 100644 --- a/mmagic/models/data_preprocessors/edit_data_preprocessor.py +++ b/mmagic/models/data_preprocessors/data_preprocessor.py @@ -18,7 +18,7 @@ @MODELS.register_module() -class EditDataPreprocessor(ImgDataPreprocessor): +class DataPreprocessor(ImgDataPreprocessor): """Image pre-processor for generative models. This class provide normalization and bgr to rgb conversion for image tensor inputs. The input of this classes should be dict which keys are `inputs` and `data_samples`. diff --git a/mmagic/models/data_preprocessors/mattor_preprocessor.py b/mmagic/models/data_preprocessors/mattor_preprocessor.py index bb7fc8571e..562058961a 100644 --- a/mmagic/models/data_preprocessors/mattor_preprocessor.py +++ b/mmagic/models/data_preprocessors/mattor_preprocessor.py @@ -9,7 +9,7 @@ from mmagic.registry import MODELS from mmagic.structures import DataSample from mmagic.utils.typing import SampleList -from .edit_data_preprocessor import EditDataPreprocessor +from .data_preprocessor import DataPreprocessor DataSamples = Optional[Union[list, torch.Tensor]] ForwardResults = Union[Dict[str, torch.Tensor], List[DataSample], @@ -18,10 +18,10 @@ @MODELS.register_module() -class MattorPreprocessor(EditDataPreprocessor): +class MattorPreprocessor(DataPreprocessor): """DataPreprocessor for matting models. - See base class ``EditDataPreprocessor`` for detailed information. + See base class ``DataPreprocessor`` for detailed information. Workflow as follow : diff --git a/mmagic/models/editors/biggan/biggan.py b/mmagic/models/editors/biggan/biggan.py index 56c65a15db..3cc13cc200 100644 --- a/mmagic/models/editors/biggan/biggan.py +++ b/mmagic/models/editors/biggan/biggan.py @@ -31,7 +31,7 @@ class BigGAN(BaseConditionalGAN): discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmagic.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.DataPreprocessor`. generator_steps (int): Number of times the generator was completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): Number of times the discriminator was diff --git a/mmagic/models/editors/controlnet/controlnet.py b/mmagic/models/editors/controlnet/controlnet.py index 1ce03d7cd5..4855a9f894 100644 --- a/mmagic/models/editors/controlnet/controlnet.py +++ b/mmagic/models/editors/controlnet/controlnet.py @@ -47,7 +47,7 @@ class ControlStableDiffusion(StableDiffusion): Defaults to True. data_preprocessor (dict, optional): The pre-process config of :class:`BaseDataPreprocessor`. Defaults to - dict(type='EditDataPreprocessor'). + dict(type='DataPreprocessor'). init_cfg (dict, optional): The weight initialized config for :class:`BaseModule`. Defaults to None/ """ @@ -61,7 +61,7 @@ def __init__(self, scheduler: ModelType, test_scheduler: Optional[ModelType] = None, enable_xformers: bool = True, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), init_cfg: Optional[dict] = None): super().__init__(vae, text_encoder, tokenizer, unet, scheduler, test_scheduler, enable_xformers, data_preprocessor, diff --git a/mmagic/models/editors/dreambooth/dreambooth.py b/mmagic/models/editors/dreambooth/dreambooth.py index 8aedd755e3..358bc1d288 100644 --- a/mmagic/models/editors/dreambooth/dreambooth.py +++ b/mmagic/models/editors/dreambooth/dreambooth.py @@ -53,7 +53,7 @@ class DreamBooth(StableDiffusion): Defaults to True. data_preprocessor (dict, optional): The pre-process config of :class:`BaseDataPreprocessor`. Defaults to - dict(type='EditDataPreprocessor'). + dict(type='DataPreprocessor'). init_cfg (dict, optional): The weight initialized config for :class:`BaseModule`. Defaults to None/ """ @@ -74,7 +74,7 @@ def __init__(self, dtype: str = 'fp16', enable_xformers: bool = True, data_preprocessor: Optional[ModelType] = dict( - type='EditDataPreprocessor'), + type='DataPreprocessor'), init_cfg: Optional[dict] = None): super().__init__(vae, text_encoder, tokenizer, unet, scheduler, diff --git a/mmagic/models/editors/eg3d/eg3d.py b/mmagic/models/editors/eg3d/eg3d.py index afbddc8112..14c36b6c8d 100644 --- a/mmagic/models/editors/eg3d/eg3d.py +++ b/mmagic/models/editors/eg3d/eg3d.py @@ -37,7 +37,7 @@ class EG3D(BaseConditionalGAN): camera position. If you want to generate images or videos via high-level API, you must set this argument. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmagic.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.DataPreprocessor`. generator_steps (int): Number of times the generator was completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): Number of times the discriminator was diff --git a/mmagic/models/editors/sagan/sagan.py b/mmagic/models/editors/sagan/sagan.py index ebdc8d2db3..9b522a0691 100644 --- a/mmagic/models/editors/sagan/sagan.py +++ b/mmagic/models/editors/sagan/sagan.py @@ -36,7 +36,7 @@ class SAGAN(BaseConditionalGAN): discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmagic.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.DataPreprocessor`. generator_steps (int): Number of times the generator was completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): Number of times the discriminator was diff --git a/mmagic/models/editors/singan/singan.py b/mmagic/models/editors/singan/singan.py index ed0801e398..a5a06c9b23 100644 --- a/mmagic/models/editors/singan/singan.py +++ b/mmagic/models/editors/singan/singan.py @@ -53,7 +53,7 @@ class SinGAN(BaseGAN): discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmagic.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.DataPreprocessor`. generator_steps (int): The number of times the generator is completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): The number of times the discriminator is diff --git a/mmagic/models/editors/stable_diffusion/stable_diffusion.py b/mmagic/models/editors/stable_diffusion/stable_diffusion.py index 0104fffc9a..f78e2fcb6b 100644 --- a/mmagic/models/editors/stable_diffusion/stable_diffusion.py +++ b/mmagic/models/editors/stable_diffusion/stable_diffusion.py @@ -60,7 +60,7 @@ def __init__(self, test_scheduler: Optional[ModelType] = None, enable_xformers: bool = True, data_preprocessor: Optional[ModelType] = dict( - type='EditDataPreprocessor'), + type='DataPreprocessor'), init_cfg: Optional[dict] = None): # TODO: support `from_pretrained` for this class @@ -263,8 +263,8 @@ def infer(self, def output_to_pil(self, image) -> List[Image.Image]: """Convert output tensor to PIL image. Output tensor will be de-normed - to [0, 255] by `EditDataPreprocessor.destruct`. Due to no - `data_samples` is passed, color order conversion will not be performed. + to [0, 255] by `DataPreprocessor.destruct`. Due to no `data_samples` is + passed, color order conversion will not be performed. Args: image (torch.Tensor): The output tensor of the decoder. diff --git a/mmagic/models/editors/stylegan1/stylegan1.py b/mmagic/models/editors/stylegan1/stylegan1.py index 349fee3480..abd52b51a6 100644 --- a/mmagic/models/editors/stylegan1/stylegan1.py +++ b/mmagic/models/editors/stylegan1/stylegan1.py @@ -36,7 +36,7 @@ class StyleGAN1(ProgressiveGrowingGAN): discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmagic.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.DataPreprocessor`. style_channels (int): The number of channels for style code. Defaults to 128. nkimgs_per_scale (dict): The number of images need for each diff --git a/mmagic/models/editors/stylegan2/stylegan2.py b/mmagic/models/editors/stylegan2/stylegan2.py index ea79e093b6..e911a6382e 100644 --- a/mmagic/models/editors/stylegan2/stylegan2.py +++ b/mmagic/models/editors/stylegan2/stylegan2.py @@ -35,7 +35,7 @@ class StyleGAN2(BaseGAN): discriminator (Optional[ModelType]): The config or model of the discriminator. Defaults to None. data_preprocessor (Optional[Union[dict, Config]]): The pre-process - config or :class:`~mmagic.models.EditDataPreprocessor`. + config or :class:`~mmagic.models.DataPreprocessor`. generator_steps (int): The number of times the generator is completely updated before the discriminator is updated. Defaults to 1. discriminator_steps (int): The number of times the discriminator is diff --git a/mmagic/utils/sampler.py b/mmagic/utils/sampler.py index 44f87e8bda..07440ae92d 100644 --- a/mmagic/utils/sampler.py +++ b/mmagic/utils/sampler.py @@ -138,7 +138,7 @@ def __init__(self, sample_kwargs: dict, runner: Runner) -> None: dataset = runner.val_loop.dataloader.dataset batch_size = runner.val_loop.dataloader.batch_size else: - # EditValLoop use `dataloaders` instead `dataloader` + # MultiValLoop use `dataloaders` instead `dataloader` loaders = runner.val_loop.dataloaders dataset = ConcatDataset([loader.dataset for loader in loaders]) batch_size = loaders[0].batch_size diff --git a/tests/configs/aot_test.py b/tests/configs/aot_test.py index 1ad6b2af67..a4613c146c 100644 --- a/tests/configs/aot_test.py +++ b/tests/configs/aot_test.py @@ -6,7 +6,7 @@ start_iter=0, ), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/tests/configs/deepfillv1_test.py b/tests/configs/deepfillv1_test.py index e6064e05c4..d3e7f10a73 100644 --- a/tests/configs/deepfillv1_test.py +++ b/tests/configs/deepfillv1_test.py @@ -3,7 +3,7 @@ model = dict( type='DeepFillv1Inpaintor', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/tests/configs/gl_test.py b/tests/configs/gl_test.py index dd8fc733fb..950bed797b 100644 --- a/tests/configs/gl_test.py +++ b/tests/configs/gl_test.py @@ -20,7 +20,7 @@ model = dict( type='GLInpaintor', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), @@ -47,7 +47,7 @@ model_dirty = dict( type='GLInpaintor', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), @@ -67,7 +67,7 @@ model_inference = dict( type='GLInpaintor', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/tests/configs/one_stage_gl.py b/tests/configs/one_stage_gl.py index 0808fa587a..b9455f398f 100644 --- a/tests/configs/one_stage_gl.py +++ b/tests/configs/one_stage_gl.py @@ -2,7 +2,7 @@ model = dict( type='OneStageInpaintor', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/tests/configs/pconv_test.py b/tests/configs/pconv_test.py index ddf980f30b..2a94616e87 100644 --- a/tests/configs/pconv_test.py +++ b/tests/configs/pconv_test.py @@ -7,7 +7,7 @@ start_iter=0, ), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/tests/configs/two_stage_test.py b/tests/configs/two_stage_test.py index c91823335d..fe49633d19 100644 --- a/tests/configs/two_stage_test.py +++ b/tests/configs/two_stage_test.py @@ -5,7 +5,7 @@ disc_input_with_mask=True, train_cfg=dict(disc_step=1, start_iter=0), data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/tests/test_apis/test_inferencers/test_eg3d_inferencer.py b/tests/test_apis/test_inferencers/test_eg3d_inferencer.py index c36bc90cbd..3c43df363a 100644 --- a/tests/test_apis/test_inferencers/test_eg3d_inferencer.py +++ b/tests/test_apis/test_inferencers/test_eg3d_inferencer.py @@ -45,7 +45,7 @@ focal=1.025390625, up=[0, 0, 1], radius=1.2), - data_preprocessor=dict(type='EditDataPreprocessor'))) + data_preprocessor=dict(type='DataPreprocessor'))) def test_eg3d_inferencer(): diff --git a/tests/test_engine/test_hooks/test_pggan_fetch_data_hook.py b/tests/test_engine/test_hooks/test_pggan_fetch_data_hook.py index 0d7531ffc3..953cb1402d 100644 --- a/tests/test_engine/test_hooks/test_pggan_fetch_data_hook.py +++ b/tests/test_engine/test_hooks/test_pggan_fetch_data_hook.py @@ -19,7 +19,7 @@ class TestPGGANFetchDataHook(TestCase): pggan_cfg = dict( type='ProgressiveGrowingGAN', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), noise_size=512, generator=dict(type='PGGANGenerator', out_scale=8), discriminator=dict(type='PGGANDiscriminator', in_scale=8), diff --git a/tests/test_engine/test_hooks/test_visualization_hook.py b/tests/test_engine/test_hooks/test_visualization_hook.py index b17c85efad..c55e6b5155 100644 --- a/tests/test_engine/test_hooks/test_visualization_hook.py +++ b/tests/test_engine/test_hooks/test_visualization_hook.py @@ -110,7 +110,7 @@ def test_vis_sample_with_gan_alias(self): gan_model_cfg = dict( type='DCGAN', noise_size=10, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='DCGANGenerator', output_scale=32, base_channels=32)) model = MODELS.build(gan_model_cfg) @@ -155,8 +155,7 @@ def test_vis_sample_with_translation_alias(self): translation_cfg = dict( type='CycleGAN', data_preprocessor=dict( - type='EditDataPreprocessor', - data_keys=['img_photo', 'img_mask']), + type='DataPreprocessor', data_keys=['img_photo', 'img_mask']), generator=dict( type='ResnetGenerator', in_channels=3, @@ -269,7 +268,7 @@ def __getitem__(self, index): # ddpm_cfg = dict( # type='BasicGaussianDiffusion', # num_timesteps=4, - # data_preprocessor=dict(type='EditDataPreprocessor'), + # data_preprocessor=dict(type='DataPreprocessor'), # betas_cfg=dict(type='cosine'), # denoising=dict( # type='DenoisingUnet', @@ -358,7 +357,7 @@ def test_after_train_iter(self): gan_model_cfg = dict( type='DCGAN', noise_size=10, - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='DCGANGenerator', output_scale=32, base_channels=32)) model = MODELS.build(gan_model_cfg) diff --git a/tests/test_engine/test_optimizers/test_pggan_optimizer_constructor.py b/tests/test_engine/test_optimizers/test_pggan_optimizer_constructor.py index fd23ee3b8a..d0f7ecff0b 100644 --- a/tests/test_engine/test_optimizers/test_pggan_optimizer_constructor.py +++ b/tests/test_engine/test_optimizers/test_pggan_optimizer_constructor.py @@ -16,7 +16,7 @@ class TestPGGANOptimWrapperConstructor(TestCase): pggan_cfg = dict( type='ProgressiveGrowingGAN', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), noise_size=512, generator=dict(type='PGGANGenerator', out_scale=8), discriminator=dict(type='PGGANDiscriminator', in_scale=8), diff --git a/tests/test_engine/test_optimizers/test_singan_optimizer_constructor.py b/tests/test_engine/test_optimizers/test_singan_optimizer_constructor.py index 9fbf62fe48..fc38719ea0 100644 --- a/tests/test_engine/test_optimizers/test_singan_optimizer_constructor.py +++ b/tests/test_engine/test_optimizers/test_singan_optimizer_constructor.py @@ -15,7 +15,7 @@ class TestSinGANOptimWrapperConstructor(TestCase): type='SinGAN', num_scales=2, data_preprocessor=dict( - type='EditDataPreprocessor', non_image_keys=['input_sample']), + type='DataPreprocessor', non_image_keys=['input_sample']), generator=dict( type='SinGANMultiScaleGenerator', in_channels=3, diff --git a/tests/test_engine/test_runner/test_loop_utils.py b/tests/test_engine/test_runner/test_loop_utils.py index 299f1e2d12..4a11cccb96 100644 --- a/tests/test_engine/test_runner/test_loop_utils.py +++ b/tests/test_engine/test_runner/test_loop_utils.py @@ -2,21 +2,21 @@ from unittest.mock import MagicMock import pytest -from mmengine.evaluator import Evaluator +from mmengine.evaluator import Evaluator as BaseEvaluator from mmagic.engine.runner.loop_utils import (is_evaluator, update_and_check_evaluator) -from mmagic.evaluation import EditEvaluator +from mmagic.evaluation import Evaluator def test_is_evaluator(): - evaluator = dict(type='EditEvaluator', metrics=[dict(type='PSNR')]) + evaluator = dict(type='Evaluator', metrics=[dict(type='PSNR')]) assert is_evaluator(evaluator) evaluator = [dict(type='PSNR'), dict(type='SSIM')] assert is_evaluator(evaluator) - evaluator = MagicMock(spec=Evaluator) + evaluator = MagicMock(spec=BaseEvaluator) assert is_evaluator(evaluator) evaluator = 'SSIM' @@ -31,16 +31,16 @@ def test_is_evaluator(): def test_update_and_check_evaluator(): - evaluator = MagicMock(spec=Evaluator) + evaluator = MagicMock(spec=BaseEvaluator) assert evaluator == update_and_check_evaluator(evaluator) - evaluator = MagicMock(spec=EditEvaluator) + evaluator = MagicMock(spec=Evaluator) assert evaluator == update_and_check_evaluator(evaluator) evaluator = [dict(type='PSNR'), dict(type='SSIM')] evaluator = update_and_check_evaluator(evaluator) assert isinstance(evaluator, dict) - assert evaluator['type'] == 'EditEvaluator' + assert evaluator['type'] == 'Evaluator' evaluator = 'this is wrong' with pytest.raises(AssertionError): @@ -49,16 +49,16 @@ def test_update_and_check_evaluator(): evaluator = dict(metrics=[dict(type='PSNR')]) evaluator = update_and_check_evaluator(evaluator) assert 'type' in evaluator - assert evaluator['type'] == 'EditEvaluator' + assert evaluator['type'] == 'Evaluator' evaluator = dict(type='Evaluator', metrics=[dict(type='PSNR')]) evaluator = update_and_check_evaluator(evaluator) assert evaluator['type'] == 'Evaluator' - evaluator = dict(type='EditEvaluator', metrics=[dict(type='PSNR')]) + evaluator = dict(type='Evaluator', metrics=[dict(type='PSNR')]) evaluator = update_and_check_evaluator(evaluator) - assert evaluator['type'] == 'EditEvaluator' + assert evaluator['type'] == 'Evaluator' - evaluator = dict(type='EditEvaluator') + evaluator = dict(type='Evaluator') evaluator = update_and_check_evaluator(evaluator) assert evaluator['metrics'] is None diff --git a/tests/test_engine/test_runner/test_edit_loops.py b/tests/test_engine/test_runner/test_multi_loops.py similarity index 89% rename from tests/test_engine/test_runner/test_edit_loops.py rename to tests/test_engine/test_runner/test_multi_loops.py index fa124eafac..6c3e42d9d3 100644 --- a/tests/test_engine/test_runner/test_edit_loops.py +++ b/tests/test_engine/test_runner/test_multi_loops.py @@ -2,10 +2,10 @@ from unittest import TestCase from unittest.mock import MagicMock -from mmengine.evaluator import Evaluator +from mmengine.evaluator import Evaluator as BaseEvaluator -from mmagic.engine import EditTestLoop, EditValLoop -from mmagic.evaluation import EditEvaluator +from mmagic.engine import MultiTestLoop, MultiValLoop +from mmagic.evaluation import Evaluator def build_dataloader(loader, **kwargs): @@ -28,16 +28,16 @@ def build_metrics(metrics): def build_evaluator(evaluator): - if isinstance(evaluator, Evaluator): + if isinstance(evaluator, BaseEvaluator): return evaluator if isinstance(evaluator, dict): # a dirty way to check Evaluator type - if 'type' in evaluator and evaluator['type'] == 'EditEvaluator': - spec = EditEvaluator - else: + if 'type' in evaluator and evaluator['type'] == 'Evaluator': spec = Evaluator + else: + spec = BaseEvaluator # if `metrics` in dict keys, it means to build customized evalutor if 'metrics' in evaluator: @@ -71,7 +71,7 @@ def build_mock_runner(): class TestLoop(TestCase): def _test_init(self, is_val): - LOOP_CLS = EditValLoop if is_val else EditTestLoop + LOOP_CLS = MultiValLoop if is_val else MultiTestLoop # test init with single evaluator runner = build_mock_runner() @@ -79,7 +79,7 @@ def _test_init(self, is_val): evaluators = [dict(prefix='m1'), dict(prefix='m2')] loop = LOOP_CLS(runner, dataloaders, evaluators) self.assertEqual(len(loop.evaluators), 1) - self.assertIsInstance(loop.evaluators[0], EditEvaluator) + self.assertIsInstance(loop.evaluators[0], Evaluator) self.assertEqual(loop.evaluators[0].metrics[0].prefix, 'm1') self.assertEqual(loop.evaluators[0].metrics[1].prefix, 'm2') @@ -91,7 +91,7 @@ def _test_init(self, is_val): dict(prefix='m2')]) loop = LOOP_CLS(runner, dataloaders, evaluators) self.assertEqual(len(loop.evaluators), 1) - self.assertIsInstance(loop.evaluators[0], Evaluator) + self.assertIsInstance(loop.evaluators[0], BaseEvaluator) self.assertEqual(loop.evaluators[0].metrics[0].prefix, 'm1') self.assertEqual(loop.evaluators[0].metrics[1].prefix, 'm2') @@ -107,8 +107,8 @@ def _test_init(self, is_val): ] loop = LOOP_CLS(runner, dataloaders, evaluators) self.assertEqual(len(loop.evaluators), 2) - self.assertIsInstance(loop.evaluators[0], Evaluator) - self.assertIsInstance(loop.evaluators[1], EditEvaluator) + self.assertIsInstance(loop.evaluators[0], BaseEvaluator) + self.assertIsInstance(loop.evaluators[1], Evaluator) self.assertEqual(loop.evaluators[0].metrics[0].prefix, 'm1') self.assertEqual(loop.evaluators[0].metrics[1].prefix, 'm2') self.assertEqual(loop.evaluators[1].metrics[0].prefix, 'm3') @@ -123,7 +123,7 @@ def test_init(self): def _test_run(self, is_val): # since we have tested init, we direct use predefined mock object to # test run function - LOOP_CLS = EditValLoop if is_val else EditTestLoop + LOOP_CLS = MultiValLoop if is_val else MultiTestLoop # test single evaluator runner = build_mock_runner() @@ -133,7 +133,7 @@ def _test_run(self, is_val): metric1, metric2, metric3 = MagicMock(), MagicMock(), MagicMock() - evaluator = MagicMock(spec=EditEvaluator) + evaluator = MagicMock(spec=Evaluator) evaluator.prepare_metrics = MagicMock() evaluator.prepare_samplers = MagicMock( return_value=[[[metric1, metric2], @@ -166,13 +166,13 @@ def _test_run(self, is_val): metric11, metric12, metric13 = MagicMock(), MagicMock(), MagicMock() metric21 = MagicMock() - evaluator1 = MagicMock(spec=EditEvaluator) + evaluator1 = MagicMock(spec=Evaluator) evaluator1.prepare_metrics = MagicMock() evaluator1.prepare_samplers = MagicMock( return_value=[[[metric11, metric12], [dict(inputs=1), dict( inputs=2)]], [[metric13], [dict(inputs=4)]]]) - evaluator2 = MagicMock(spec=EditEvaluator) + evaluator2 = MagicMock(spec=Evaluator) evaluator2.prepare_metrics = MagicMock() evaluator2.prepare_samplers = MagicMock( return_value=[[[metric21], [dict(inputs=3)]]]) diff --git a/tests/test_evaluation/test_evaluator.py b/tests/test_evaluation/test_evaluator.py index b1072a4d49..da8960d9df 100644 --- a/tests/test_evaluation/test_evaluator.py +++ b/tests/test_evaluation/test_evaluator.py @@ -3,7 +3,7 @@ from unittest import TestCase from unittest.mock import MagicMock, patch -from mmagic.evaluation import (EditEvaluator, FrechetInceptionDistance, +from mmagic.evaluation import (Evaluator, FrechetInceptionDistance, InceptionScore) from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -16,7 +16,7 @@ loading_mock = MagicMock(return_value=(MagicMock(), 'StyleGAN')) -class TestEditEvaluator(TestCase): +class TestEvaluator(TestCase): @classmethod def setUpClass(cls): @@ -37,13 +37,13 @@ def setUpClass(cls): @patch(is_loading_str, loading_mock) @patch(fid_loading_str, loading_mock) def test_init(self): - evaluator = EditEvaluator(self.metrics) + evaluator = Evaluator(self.metrics) self.assertFalse(evaluator.is_ready) @patch(is_loading_str, loading_mock) @patch(fid_loading_str, loading_mock) def test_prepare_metric(self): - evaluator = EditEvaluator(self.metrics) + evaluator = Evaluator(self.metrics) model = MagicMock() model.data_preprocessor.device = 'cpu' dataloader = MagicMock() @@ -51,7 +51,7 @@ def test_prepare_metric(self): evaluator.prepare_metrics(model, dataloader) self.assertTrue(evaluator.is_ready) - evaluator = EditEvaluator(self.metrics) + evaluator = Evaluator(self.metrics) evaluator.metrics = [MagicMock()] evaluator.is_ready = True evaluator.prepare_metrics(model, dataloader) @@ -60,7 +60,7 @@ def test_prepare_metric(self): @patch(is_loading_str, loading_mock) @patch(fid_loading_str, loading_mock) def test_prepare_samplers(self): - evaluator = EditEvaluator(self.metrics) + evaluator = Evaluator(self.metrics) model = MagicMock() model.data_preprocessor.device = 'cpu' @@ -86,7 +86,7 @@ def test_prepare_samplers(self): fake_nums=12, inception_style='pytorch', sample_model='ema')) - evaluator = EditEvaluator(cfg) + evaluator = Evaluator(cfg) # mock metrics model = MagicMock() @@ -128,7 +128,7 @@ def test_prepare_samplers(self): # all metrics (5 groups): [[IS-orig, FID-orig], [TransFID-orig], # [FID-ema], [FID-cond-ema, IS-cond-ema], # [IS-cond-orig]] - evaluator = EditEvaluator(cfg) + evaluator = Evaluator(cfg) # mock metrics model = MagicMock() @@ -143,7 +143,7 @@ def test_prepare_samplers(self): @patch(is_loading_str, loading_mock) @patch(fid_loading_str, loading_mock) def test_process(self): - evaluator = EditEvaluator(self.metrics) + evaluator = Evaluator(self.metrics) metrics_mock = [MagicMock(), MagicMock()] data_samples = [DataSample(a=1, b=2), dict(c=3, d=4)] @@ -164,7 +164,7 @@ def test_process(self): @patch(is_loading_str, loading_mock) @patch(fid_loading_str, loading_mock) def test_evaluate(self): - evaluator = EditEvaluator(self.metrics) + evaluator = Evaluator(self.metrics) # mock metrics metric_mock1, metric_mock2 = MagicMock(), MagicMock() @@ -187,24 +187,24 @@ def test_evaluate(self): class TestNonMetricEvaluator(TestCase): def test_init(self): - evaluator = EditEvaluator(None) + evaluator = Evaluator(None) self.assertIsNone(evaluator.metrics) def test_prepare_metrics(self): - evaluator = EditEvaluator(None) + evaluator = Evaluator(None) evaluator.prepare_metrics(None, None) self.assertTrue(evaluator.is_ready) def test_prepare_samplers(self): - evaluator = EditEvaluator(None) + evaluator = Evaluator(None) metric_sampler_list = evaluator.prepare_samplers(None, None) self.assertEqual(metric_sampler_list, [[[None], []]]) def test_process(self): - evaluator = EditEvaluator(None) + evaluator = Evaluator(None) evaluator.process(None, None, None) def test_evalute(self): - evaluator = EditEvaluator(None) + evaluator = Evaluator(None) output = evaluator.evaluate() self.assertEqual(output, {'No Metric': 'Nan'}) diff --git a/tests/test_evaluation/test_metrics/test_equivariance.py b/tests/test_evaluation/test_metrics/test_equivariance.py index 0372be2d64..52c686dd8d 100644 --- a/tests/test_evaluation/test_metrics/test_equivariance.py +++ b/tests/test_evaluation/test_metrics/test_equivariance.py @@ -8,7 +8,7 @@ from mmagic.datasets import BasicImageDataset from mmagic.datasets.transforms import PackEditInputs from mmagic.evaluation import Equivariance -from mmagic.models import EditDataPreprocessor, StyleGAN3 +from mmagic.models import DataPreprocessor, StyleGAN3 from mmagic.models.editors.stylegan3 import StyleGAN3Generator from mmagic.utils import register_all_modules @@ -44,7 +44,7 @@ def setup_class(cls): batch_size=2, dataset=dataset, sampler=dict(type='DefaultSampler'))) - gan_data_preprocessor = EditDataPreprocessor() + gan_data_preprocessor = DataPreprocessor() generator = StyleGAN3Generator(64, 8, 3, noise_size=8) cls.module = StyleGAN3( generator, data_preprocessor=gan_data_preprocessor) diff --git a/tests/test_evaluation/test_metrics/test_fid.py b/tests/test_evaluation/test_metrics/test_fid.py index 2b2b67dae0..5c1a3f534b 100644 --- a/tests/test_evaluation/test_metrics/test_fid.py +++ b/tests/test_evaluation/test_metrics/test_fid.py @@ -13,7 +13,7 @@ from mmagic.datasets import PairedImageDataset from mmagic.evaluation import FrechetInceptionDistance, TransFID -from mmagic.models import EditDataPreprocessor, Pix2Pix +from mmagic.models import DataPreprocessor, Pix2Pix from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -211,7 +211,7 @@ def setup_class(cls): batch_size=2, dataset=dataset, sampler=dict(type='DefaultSampler'))) - gan_data_preprocessor = EditDataPreprocessor() + gan_data_preprocessor = DataPreprocessor() generator = dict( type='UnetGenerator', in_channels=3, diff --git a/tests/test_evaluation/test_metrics/test_inception_score.py b/tests/test_evaluation/test_metrics/test_inception_score.py index 100db8fa60..edbc6ae734 100644 --- a/tests/test_evaluation/test_metrics/test_inception_score.py +++ b/tests/test_evaluation/test_metrics/test_inception_score.py @@ -10,7 +10,7 @@ from mmagic.datasets import PairedImageDataset from mmagic.evaluation import InceptionScore, TransIS -from mmagic.models import EditDataPreprocessor, Pix2Pix +from mmagic.models import DataPreprocessor, Pix2Pix from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -166,7 +166,7 @@ def setup_class(cls): batch_size=2, dataset=dataset, sampler=dict(type='DefaultSampler'))) - gan_data_preprocessor = EditDataPreprocessor() + gan_data_preprocessor = DataPreprocessor() generator = dict( type='UnetGenerator', in_channels=3, diff --git a/tests/test_evaluation/test_metrics/test_ppl.py b/tests/test_evaluation/test_metrics/test_ppl.py index f22c77f89a..0a34a6fd67 100644 --- a/tests/test_evaluation/test_metrics/test_ppl.py +++ b/tests/test_evaluation/test_metrics/test_ppl.py @@ -9,7 +9,7 @@ from mmagic.datasets import BasicImageDataset from mmagic.datasets.transforms import PackEditInputs from mmagic.evaluation import PerceptualPathLength -from mmagic.models import LSGAN, EditDataPreprocessor +from mmagic.models import LSGAN, DataPreprocessor from mmagic.models.editors.stylegan2 import StyleGAN2Generator from mmagic.utils import register_all_modules @@ -55,7 +55,7 @@ def setup_class(cls): batch_size=2, dataset=dataset, sampler=dict(type='DefaultSampler'))) - gan_data_preprocessor = EditDataPreprocessor() + gan_data_preprocessor = DataPreprocessor() generator = StyleGAN2Generator(64, 8) cls.module = LSGAN(generator, data_preprocessor=gan_data_preprocessor) diff --git a/tests/test_evaluation/test_metrics/test_precision_and_recall.py b/tests/test_evaluation/test_metrics/test_precision_and_recall.py index 338485c2f4..d39e27aa27 100644 --- a/tests/test_evaluation/test_metrics/test_precision_and_recall.py +++ b/tests/test_evaluation/test_metrics/test_precision_and_recall.py @@ -9,7 +9,7 @@ from mmagic.datasets import BasicImageDataset from mmagic.datasets.transforms import PackEditInputs from mmagic.evaluation import PrecisionAndRecall -from mmagic.models import LSGAN, EditDataPreprocessor +from mmagic.models import LSGAN, DataPreprocessor from mmagic.models.editors.dcgan import DCGANGenerator from mmagic.utils import register_all_modules @@ -61,7 +61,7 @@ def setup_class(cls): batch_size=2, dataset=dataset, sampler=dict(type='DefaultSampler'))) - gan_data_preprocessor = EditDataPreprocessor() + gan_data_preprocessor = DataPreprocessor() generator = DCGANGenerator(128, noise_size=10, base_channels=20) cls.module = LSGAN( generator, data_preprocessor=gan_data_preprocessor) # noqa diff --git a/tests/test_evaluation/test_metrics/test_swd.py b/tests/test_evaluation/test_metrics/test_swd.py index fafa870726..b953385bdb 100644 --- a/tests/test_evaluation/test_metrics/test_swd.py +++ b/tests/test_evaluation/test_metrics/test_swd.py @@ -6,7 +6,7 @@ import torch from mmagic.evaluation import SlicedWassersteinDistance -from mmagic.models import EditDataPreprocessor +from mmagic.models import DataPreprocessor from mmagic.structures import DataSample @@ -18,7 +18,7 @@ def test_init(self): def test_prosess(self): model = MagicMock() - model.data_preprocessor = EditDataPreprocessor() + model.data_preprocessor = DataPreprocessor() swd = SlicedWassersteinDistance(fake_nums=100, image_shape=(3, 32, 32)) swd.prepare(model, None) diff --git a/tests/test_models/test_base_models/test_base_conditional_gan.py b/tests/test_models/test_base_models/test_base_conditional_gan.py index 9924f00d46..ee1b888787 100644 --- a/tests/test_models/test_base_models/test_base_conditional_gan.py +++ b/tests/test_models/test_base_models/test_base_conditional_gan.py @@ -9,7 +9,7 @@ from mmengine.testing import assert_allclose from torch.nn import ModuleList -from mmagic.models import BaseConditionalGAN, EditDataPreprocessor +from mmagic.models import BaseConditionalGAN, DataPreprocessor from mmagic.models.losses import (DiscShiftLossComps, GANLossComps, GeneratorPathRegularizerComps, GradientPenaltyLossComps) @@ -50,7 +50,7 @@ def test_val_step_and_test_step(self): noise_size=10, num_classes=10, generator=deepcopy(generator), - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) gan.eval() # no mode @@ -105,7 +105,7 @@ def test_forward(self): noise_size=10, num_classes=10, generator=deepcopy(generator), - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) gan.eval() inputs = dict(num_batches=3) outputs = gan(inputs, None) @@ -128,7 +128,7 @@ def test_forward(self): noise_size=10, num_classes=10, generator=deepcopy(generator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), ema_config=dict(interval=1)) gan.eval() # inputs = dict(inputs=dict(num_batches=3)) @@ -180,7 +180,7 @@ def test_custom_loss(self): num_classes=10, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), loss_config=dict()) self.assertIsNone(gan.gan_loss) self.assertIsNone(gan.disc_auxiliary_losses) @@ -201,7 +201,7 @@ def test_custom_loss(self): num_classes=10, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), loss_config=loss_config) self.assertIsInstance(gan.disc_auxiliary_losses, ModuleList) self.assertIsInstance(gan.disc_auxiliary_losses[0], DiscShiftLossComps) @@ -227,7 +227,7 @@ def test_custom_loss(self): num_classes=10, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), loss_config=loss_config) self.assertIsInstance(gan.gan_loss, GANLossComps) self.assertIsInstance(gan.disc_auxiliary_losses, ModuleList) @@ -242,7 +242,7 @@ def test_custom_loss(self): num_classes=10, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), loss_config=loss_config) # mock gen aux loss to avoid build styleGAN Generator gen_aux_loss_mock = MagicMock(return_value=torch.Tensor([1.])) @@ -278,7 +278,7 @@ def test_custom_loss(self): num_classes=10, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), loss_config=loss_config) log_vars = gan.train_step(data, optim_wrapper=optimizer_wrapper) self.assertIn('loss', log_vars) diff --git a/tests/test_models/test_base_models/test_base_edit_model.py b/tests/test_models/test_base_models/test_base_edit_model.py index 72c65609a5..e6c01f302e 100644 --- a/tests/test_models/test_base_models/test_base_edit_model.py +++ b/tests/test_models/test_base_models/test_base_edit_model.py @@ -4,7 +4,7 @@ from torch import nn from torch.optim import Adam -from mmagic.models import BaseEditModel, EditDataPreprocessor +from mmagic.models import BaseEditModel, DataPreprocessor from mmagic.models.losses import L1Loss from mmagic.registry import MODELS from mmagic.structures import DataSample @@ -33,7 +33,7 @@ def test_base_edit_model(): model = BaseEditModel( generator=dict(type='ToyBaseModel'), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) assert model.__class__.__name__ == 'BaseEditModel' assert isinstance(model.generator, ToyBaseModel) diff --git a/tests/test_models/test_base_models/test_base_gan.py b/tests/test_models/test_base_models/test_base_gan.py index 6b6b90aa51..82c398fde6 100644 --- a/tests/test_models/test_base_models/test_base_gan.py +++ b/tests/test_models/test_base_models/test_base_gan.py @@ -10,7 +10,7 @@ from torch.nn import ModuleList from torch.optim import SGD -from mmagic.models import BaseGAN, EditDataPreprocessor +from mmagic.models import BaseGAN, DataPreprocessor from mmagic.models.losses import (DiscShiftLossComps, GANLossComps, GeneratorPathRegularizerComps, GradientPenaltyLossComps) @@ -45,9 +45,9 @@ def test_init(self): noise_size=5, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertIsInstance(gan, BaseGAN) - self.assertIsInstance(gan.data_preprocessor, EditDataPreprocessor) + self.assertIsInstance(gan.data_preprocessor, DataPreprocessor) # test only generator have noise size gen_cfg = deepcopy(generator) @@ -55,7 +55,7 @@ def test_init(self): gan = ToyGAN( generator=gen_cfg, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.noise_size, 10) # test init with nn.Module @@ -67,12 +67,12 @@ def test_init(self): gan = ToyGAN( generator=gen, discriminator=disc, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.generator, gen) self.assertEqual(gan.discriminator, disc) # test init without discriminator - gan = ToyGAN(generator=gen, data_preprocessor=EditDataPreprocessor()) + gan = ToyGAN(generator=gen, data_preprocessor=DataPreprocessor()) self.assertEqual(gan.discriminator, None) self.assertIsNone(gan.gan_loss) @@ -89,7 +89,7 @@ def test_train_step(self): noise_size=10, generator=generator, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), discriminator_steps=n_disc) ToyGAN.train_discriminator = MagicMock( return_value=dict(loss_disc=torch.Tensor(1), loss=torch.Tensor(1))) @@ -139,7 +139,7 @@ def test_update_ema(self): noise_size=10, generator=generator, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), discriminator_steps=n_disc, generator_steps=n_gen, ema_config=dict(interval=ema_interval)) @@ -188,7 +188,7 @@ def test_val_step_and_test_step(self): gan = ToyGAN( noise_size=10, generator=deepcopy(generator), - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) # no mode inputs = dict(inputs=dict(num_batches=3)) @@ -234,7 +234,7 @@ def test_forward(self): gan = ToyGAN( noise_size=10, generator=deepcopy(generator), - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) inputs = dict(num_batches=3) outputs = gan(inputs, None) self.assertEqual(len(outputs), 3) @@ -255,7 +255,7 @@ def test_forward(self): gan = ToyGAN( noise_size=10, generator=deepcopy(generator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), ema_config=dict(interval=1)) inputs = dict(num_batches=3) outputs = gan(inputs) @@ -297,7 +297,7 @@ def test_custom_loss(self): noise_size=5, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), loss_config=dict()) self.assertIsNone(gan.gan_loss) self.assertIsNone(gan.disc_auxiliary_losses) @@ -317,7 +317,7 @@ def test_custom_loss(self): noise_size=5, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), loss_config=loss_config) self.assertIsInstance(gan.disc_auxiliary_losses, ModuleList) self.assertIsInstance(gan.disc_auxiliary_losses[0], DiscShiftLossComps) @@ -342,7 +342,7 @@ def test_custom_loss(self): noise_size=5, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), loss_config=loss_config) self.assertIsInstance(gan.gan_loss, GANLossComps) self.assertIsInstance(gan.disc_auxiliary_losses, ModuleList) @@ -356,7 +356,7 @@ def test_custom_loss(self): noise_size=5, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), loss_config=loss_config) # mock gen aux loss to avoid build styleGAN Generator gen_aux_loss_mock = MagicMock(return_value=torch.Tensor([1.])) @@ -385,7 +385,7 @@ def test_custom_loss(self): noise_size=5, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), loss_config=loss_config) data = dict(inputs=dict(img=torch.randn(2, 3, 32, 32))) log_vars = gan.train_step(data, optim_wrapper=optimizer_wrapper) @@ -401,7 +401,7 @@ def test_gather_log_vars(self): noise_size=5, generator=deepcopy(generator), discriminator=deepcopy(discriminator), - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) log_dict_list = [ dict(loss=torch.Tensor([2.33]), loss_disc=torch.Tensor([1.14514])) ] diff --git a/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py b/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py index f101bedd08..9d06700a53 100644 --- a/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py +++ b/tests/test_models/test_data_preprocessors/test_edit_data_preprocessor.py @@ -5,14 +5,14 @@ import torch.nn.functional as F from mmengine.testing import assert_allclose -from mmagic.models.data_preprocessors import EditDataPreprocessor +from mmagic.models.data_preprocessors import DataPreprocessor from mmagic.structures import DataSample class TestBaseDataPreprocessor(TestCase): def test_init(self): - data_preprocessor = EditDataPreprocessor( + data_preprocessor = DataPreprocessor( mean=[0, 0, 0], std=[255, 255, 255], pad_size_divisor=16, @@ -28,20 +28,19 @@ def test_init(self): self.assertEqual(data_preprocessor.pad_mode, 'constant') # test non-image-keys - data_preprocessor = EditDataPreprocessor(non_image_keys='feature') + data_preprocessor = DataPreprocessor(non_image_keys='feature') self.assertIn('feature', data_preprocessor._NON_IMAGE_KEYS) - data_preprocessor = EditDataPreprocessor(non_image_keys=['feature']) + data_preprocessor = DataPreprocessor(non_image_keys=['feature']) self.assertIn('feature', data_preprocessor._NON_IMAGE_KEYS) # test non-concentate-keys - data_preprocessor = EditDataPreprocessor(non_concentate_keys='n_imgs') + data_preprocessor = DataPreprocessor(non_concentate_keys='n_imgs') self.assertIn('n_imgs', data_preprocessor._NON_CONCATENATE_KEYS) - data_preprocessor = EditDataPreprocessor( - non_concentate_keys=['n_imgs']) + data_preprocessor = DataPreprocessor(non_concentate_keys=['n_imgs']) self.assertIn('n_imgs', data_preprocessor._NON_CONCATENATE_KEYS) def test_parse_channel_index(self): - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() self.assertEqual( data_preprocessor._parse_channel_index(torch.rand(3, 5, 5)), 0) self.assertEqual( @@ -56,7 +55,7 @@ def test_parse_channel_index(self): torch.rand(1, 2, 10, 3, 5, 5, 5)) def test_parse_channel_order(self): - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() parse_fn = data_preprocessor._parse_channel_order # test no data sample self.assertEqual(parse_fn('img', torch.rand(3, 5, 5)), 'BGR') @@ -130,7 +129,7 @@ def test_parse_channel_order(self): parse_fn('AAA', torch.rand(3, 5, 5), data_sample), 'RGB') def test_parse_batch_channel_order(self): - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() parse_fn = data_preprocessor._parse_batch_channel_order with self.assertRaises(AssertionError): @@ -151,7 +150,7 @@ def test_parse_batch_channel_order(self): parse_fn(parse_fn('mm_img', inputs_batch, data_sample_batch)) def test_do_conversion(self): - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() cov_fn = data_preprocessor._do_conversion # RGB -> BGR @@ -211,7 +210,7 @@ def test_do_conversion(self): self.assertEqual(order, 'BGR') def test_update_metainfo(self): - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() update_fn = data_preprocessor._update_metainfo with self.assertRaises(AssertionError): @@ -252,7 +251,7 @@ def test_preprocess_image_tensor(self): 5. metainfo (single) + output channel order is RGB: no conversion 6. datasample is None: return new data sample with metainfo """ - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() process_fn = data_preprocessor._preprocess_image_tensor # 1. raise error with self.assertRaises(AssertionError): @@ -276,7 +275,7 @@ def test_preprocess_image_tensor(self): self.assertTrue((padding_size == target_padding_info).all()) # 3. no metainfo + output channel order is RGB -> do conversion - data_preprocessor = EditDataPreprocessor(output_channel_order='RGB') + data_preprocessor = DataPreprocessor(output_channel_order='RGB') process_fn = data_preprocessor._preprocess_image_tensor inputs = torch.randint(0, 255, (4, 3, 5, 5)) targets = ((inputs - 127.5) / 127.5)[:, [2, 1, 0]] @@ -290,7 +289,7 @@ def test_preprocess_image_tensor(self): self.assertTrue((padding_size == target_padding_info).all()) # 4. metainfo (BGR) + output channel order is RGB -> do conversion - data_preprocessor = EditDataPreprocessor(output_channel_order='RGB') + data_preprocessor = DataPreprocessor(output_channel_order='RGB') process_fn = data_preprocessor._preprocess_image_tensor inputs = torch.randint(0, 255, (4, 3, 5, 5)) targets = ((inputs - 127.5) / 127.5)[:, [2, 1, 0]] @@ -307,7 +306,7 @@ def test_preprocess_image_tensor(self): self.assertTrue((padding_size == target_padding_info).all()) # 5. metainfo (single) + output channel order is RGB -> no conversion - data_preprocessor = EditDataPreprocessor(output_channel_order='RGB') + data_preprocessor = DataPreprocessor(output_channel_order='RGB') process_fn = data_preprocessor._preprocess_image_tensor inputs = torch.randint(0, 255, (4, 1, 5, 5)) targets = ((inputs - 127.5) / 127.5) @@ -325,7 +324,7 @@ def test_preprocess_image_tensor(self): self.assertTrue((padding_size == target_padding_info).all()) # 6. data sample is None + video inputs - data_preprocessor = EditDataPreprocessor(output_channel_order='RGB') + data_preprocessor = DataPreprocessor(output_channel_order='RGB') inputs = torch.randint(0, 255, (4, 5, 3, 5, 5)) targets = ((inputs - 127.5) / 127.5)[:, :, [2, 1, 0]] outputs, data_samples = process_fn(inputs, None, 'sin') @@ -346,7 +345,7 @@ def test_preprocess_image_list(self): 5. data_sample is None """ # no metainfo + output channel order is None - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() process_fn = data_preprocessor._preprocess_image_list input1 = torch.randint(0, 255, (3, 3, 5)) input2 = torch.randint(0, 255, (3, 3, 5)) @@ -364,7 +363,7 @@ def test_preprocess_image_list(self): (data.metainfo['padding_size'] == target_padding_info).all()) # no metainfo + output channel order is RGB - data_preprocessor = EditDataPreprocessor( + data_preprocessor = DataPreprocessor( output_channel_order='RGB', pad_value=42) process_fn = data_preprocessor._preprocess_image_list input1 = torch.randint(0, 255, (3, 3, 5)) @@ -386,7 +385,7 @@ def test_preprocess_image_list(self): self.assertTrue((data.metainfo['padding_size'] == pad).all()) # meta info + output channel order is RGB - data_preprocessor = EditDataPreprocessor( + data_preprocessor = DataPreprocessor( output_channel_order='RGB', pad_value=42) process_fn = data_preprocessor._preprocess_image_list input1 = torch.randint(0, 255, (3, 3, 5)) @@ -411,7 +410,7 @@ def test_preprocess_image_list(self): self.assertTrue((data.metainfo['padding_size'] == pad).all()) # meta info (single) + output channel order is RGB - data_preprocessor = EditDataPreprocessor( + data_preprocessor = DataPreprocessor( output_channel_order='RGB', pad_value=42) process_fn = data_preprocessor._preprocess_image_list input1 = torch.randint(0, 255, (1, 3, 5)) @@ -437,7 +436,7 @@ def test_preprocess_image_list(self): self.assertTrue((data.metainfo['padding_size'] == pad).all()) # test data sample is None - data_preprocessor = EditDataPreprocessor( + data_preprocessor = DataPreprocessor( output_channel_order='RGB', pad_value=42) process_fn = data_preprocessor._preprocess_image_list input1 = torch.randint(0, 255, (1, 3, 5)) @@ -462,7 +461,7 @@ def test_preprocess_dict_inputs(self): """Since preprocess of dict inputs are based on `_preprocess_image_list` and `_preprocess_image_tensor`, we just test a simple case for translation model and padding behavior.""" - data_preprocessor = EditDataPreprocessor(output_channel_order='RGB') + data_preprocessor = DataPreprocessor(output_channel_order='RGB') process_fn = data_preprocessor._preprocess_dict_inputs inputs = dict( @@ -517,7 +516,7 @@ def test_preprocess_dict_inputs(self): def test_prerprocess_data_sample(self): """Only test training and testint mode in this test case.""" - data_preprocessor = EditDataPreprocessor( + data_preprocessor = DataPreprocessor( data_keys=['gt_img', 'AA', 'dk'], output_channel_order='RGB') cov_fn = data_preprocessor._preprocess_data_sample @@ -576,7 +575,7 @@ def test_prerprocess_data_sample(self): def test_destruct_tensor_norm_and_conversion(self): """Test batch inputs, single input and batch inputs + no norm in this unit test.""" - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() cov_fn = data_preprocessor._destruct_norm_and_conversion # test batch @@ -636,7 +635,7 @@ def test_destruct_tensor_padding(self): 8. data sample is stacked 9. data sample is stacked + padding size not found in metainfo """ - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() cov_fn = data_preprocessor._destruct_padding # data sample is None, no un-padding @@ -721,13 +720,13 @@ def test_forward(self): 6. data samples behavior in training = False / True 7. Input is wrong type. """ - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() # 1. input is tensor inputs = torch.randint(0, 255, (2, 3, 5, 5)) data = dict(inputs=inputs) tar_output = (inputs.clone() - 127.5) / 127.5 - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() data = data_preprocessor(data) assert_allclose(data['inputs'], tar_output) @@ -769,7 +768,7 @@ def test_forward(self): dict(noise=noise1, img=img1, num_batches=2, mode='ema'), dict(noise=noise2, img=img2, num_batches=2, mode='ema'), ]) - data_preprocessor = EditDataPreprocessor(output_channel_order='RGB') + data_preprocessor = DataPreprocessor(output_channel_order='RGB') data = data_preprocessor(data) self.assertEqual( @@ -793,7 +792,7 @@ def test_forward(self): data = data_preprocessor(sampler_results) # # 5. input is tensor + no norm - data_preprocessor = EditDataPreprocessor(mean=None, std=None) + data_preprocessor = DataPreprocessor(mean=None, std=None) input1 = torch.randn(3, 3, 5) input2 = torch.randn(3, 3, 5) data = dict(inputs=torch.stack([input1, input2], dim=0)) @@ -803,7 +802,7 @@ def test_forward(self): dim=0)).all()) # 6. data samples behavior in training = False / True - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() gt_inp1 = torch.randint(0, 255, (3, 5, 5)) gt_inp2 = torch.randint(0, 255, (3, 5, 5)) @@ -830,7 +829,7 @@ def test_destruct(self): 3. test no un-norm + no un-padding """ # 1. test un-padding - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() input1 = torch.randn(3, 3, 5) input2 = torch.randn(3, 5, 3) data = dict(inputs=[input1, input2]) @@ -845,7 +844,7 @@ def test_destruct(self): self.assertEqual(destruct_batch.shape, (2, 3, 3, 5)) # 2. test no un-padding + un-norm - data_preprocessor = EditDataPreprocessor() + data_preprocessor = DataPreprocessor() input1 = torch.randint(0, 255, (3, 5, 5)) input2 = torch.randint(0, 255, (3, 5, 5)) data = dict(inputs=[input1, input2]) @@ -862,7 +861,7 @@ def test_destruct(self): torch.stack([input1, input2], dim=0).float()) # 3. test no un-norm - data_preprocessor = EditDataPreprocessor(std=None, mean=None) + data_preprocessor = DataPreprocessor(std=None, mean=None) input1 = torch.randint(0, 255, (1, 5, 5)) input2 = torch.randint(0, 255, (1, 5, 5)) inputs = torch.stack([input1, input2], dim=0) diff --git a/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py b/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py index def5c69218..4b2f345830 100644 --- a/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py +++ b/tests/test_models/test_editors/test_basicvsr/test_basicvsr.py @@ -4,7 +4,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models import BasicVSR, BasicVSRNet, EditDataPreprocessor +from mmagic.models import BasicVSR, BasicVSRNet, DataPreprocessor from mmagic.models.losses import CharbonnierLoss from mmagic.structures import DataSample @@ -21,7 +21,7 @@ def test_basicvsr(): type='CharbonnierLoss', loss_weight=1.0, reduction='mean'), train_cfg=dict(fix_iter=1), ensemble=None, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) assert isinstance(model, BasicVSR) assert isinstance(model.generator, BasicVSRNet) @@ -65,7 +65,7 @@ def test_basicvsr(): type='CharbonnierLoss', loss_weight=1.0, reduction='mean'), train_cfg=dict(fix_iter=1), ensemble=dict(type='SpatialTemporalEnsemble'), - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) with pytest.raises(NotImplementedError): model = BasicVSR( @@ -78,4 +78,4 @@ def test_basicvsr(): type='CharbonnierLoss', loss_weight=1.0, reduction='mean'), train_cfg=dict(fix_iter=1), ensemble=dict(type=''), - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) diff --git a/tests/test_models/test_editors/test_biggan/test_biggan.py b/tests/test_models/test_editors/test_biggan/test_biggan.py index 7b41eb4601..c69f7c8417 100644 --- a/tests/test_models/test_editors/test_biggan/test_biggan.py +++ b/tests/test_models/test_editors/test_biggan/test_biggan.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmagic.models import BigGAN, EditDataPreprocessor +from mmagic.models import BigGAN, DataPreprocessor from mmagic.registry import MODELS from mmagic.structures import DataSample @@ -39,14 +39,14 @@ class TestBigGAN(TestCase): def test_init(self): gan = BigGAN( num_classes=10, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), generator=generator, discriminator=discriminator, generator_steps=1, discriminator_steps=4) self.assertIsInstance(gan, BigGAN) - self.assertIsInstance(gan.data_preprocessor, EditDataPreprocessor) + self.assertIsInstance(gan.data_preprocessor, DataPreprocessor) # test only generator have noise size gen_cfg = deepcopy(generator) @@ -55,7 +55,7 @@ def test_init(self): noise_size=10, generator=gen_cfg, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.noise_size, 10) # test init with nn.Module @@ -67,18 +67,18 @@ def test_init(self): gan = BigGAN( generator=gen, discriminator=disc, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.generator, gen) self.assertEqual(gan.discriminator, disc) # test init without discriminator - gan = BigGAN(generator=gen, data_preprocessor=EditDataPreprocessor()) + gan = BigGAN(generator=gen, data_preprocessor=DataPreprocessor()) self.assertEqual(gan.discriminator, None) # test init with different num_classes gan = BigGAN( num_classes=10, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), generator=generator, discriminator=discriminator, generator_steps=1, @@ -92,7 +92,7 @@ def test_train_step(self): gan = BigGAN( generator=generator, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), discriminator_steps=n_disc) # prepare messageHub message_hub.update_info('iter', 0) diff --git a/tests/test_models/test_editors/test_cain/test_cain.py b/tests/test_models/test_editors/test_cain/test_cain.py index e3ba615262..830cbcce0c 100644 --- a/tests/test_models/test_editors/test_cain/test_cain.py +++ b/tests/test_models/test_editors/test_cain/test_cain.py @@ -6,7 +6,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models import EditDataPreprocessor +from mmagic.models import DataPreprocessor from mmagic.models.editors import CAIN, CAINNet from mmagic.models.losses import L1Loss from mmagic.registry import MODELS @@ -98,11 +98,11 @@ def test_cain(): model = CAIN( generator=dict(type='CAINNet'), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), - data_preprocessor=EditDataPreprocessor(pad_mode='reflect')) + data_preprocessor=DataPreprocessor(pad_mode='reflect')) # test attributes assert isinstance(model, CAIN) - assert isinstance(model.data_preprocessor, EditDataPreprocessor) + assert isinstance(model.data_preprocessor, DataPreprocessor) assert isinstance(model.generator, CAINNet) assert isinstance(model.pixel_loss, L1Loss) diff --git a/tests/test_models/test_editors/test_controlnet/test_controlnet.py b/tests/test_models/test_editors/test_controlnet/test_controlnet.py index 3f9251fc7d..0263a7528e 100644 --- a/tests/test_models/test_editors/test_controlnet/test_controlnet.py +++ b/tests/test_models/test_editors/test_controlnet/test_controlnet.py @@ -53,7 +53,7 @@ type='DDIMScheduler', from_pretrained=stable_diffusion_v15_url, subfolder='scheduler'), - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), enable_xformers=False, init_cfg=dict(type='init_from_unet')) diff --git a/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py b/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py index 7a4b7e064d..3727245aa0 100644 --- a/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py +++ b/tests/test_models/test_editors/test_cyclegan/test_cyclegan.py @@ -6,7 +6,7 @@ from mmengine import MessageHub from mmengine.optim import OptimWrapper, OptimWrapperDict -from mmagic.models import CycleGAN, EditDataPreprocessor +from mmagic.models import CycleGAN, DataPreprocessor from mmagic.models.archs import PatchDiscriminator from mmagic.models.editors.cyclegan import ResnetGenerator from mmagic.structures import DataSample @@ -75,8 +75,7 @@ def test_cyclegan(): train_settings = None # build synthesizer - synthesizer = CycleGAN( - **model_cfg, data_preprocessor=EditDataPreprocessor()) + synthesizer = CycleGAN(**model_cfg, data_preprocessor=DataPreprocessor()) # test attributes assert synthesizer.__class__.__name__ == 'CycleGAN' @@ -227,9 +226,7 @@ def test_cyclegan(): # test disc_steps and disc_init_steps train_settings = dict(discriminator_steps=2, disc_init_steps=2) synthesizer = CycleGAN( - **model_cfg, - **train_settings, - data_preprocessor=EditDataPreprocessor()) + **model_cfg, **train_settings, data_preprocessor=DataPreprocessor()) optimizer = OptimWrapperDict( generators=OptimWrapper( obj_from_dict( @@ -283,9 +280,7 @@ def test_cyclegan(): data_batch = dict(inputs={'img_mask': inputs, 'img_photo': targets}) train_settings = dict(buffer_size=0) synthesizer = CycleGAN( - **model_cfg, - **train_settings, - data_preprocessor=EditDataPreprocessor()) + **model_cfg, **train_settings, data_preprocessor=DataPreprocessor()) optimizer = OptimWrapperDict( generators=OptimWrapper( obj_from_dict( diff --git a/tests/test_models/test_editors/test_dcgan/test_dcgan.py b/tests/test_models/test_editors/test_dcgan/test_dcgan.py index d0077f2a30..351600545c 100644 --- a/tests/test_models/test_editors/test_dcgan/test_dcgan.py +++ b/tests/test_models/test_editors/test_dcgan/test_dcgan.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmagic.models import DCGAN, EditDataPreprocessor +from mmagic.models import DCGAN, DataPreprocessor from mmagic.registry import MODELS from mmagic.structures import DataSample @@ -22,12 +22,12 @@ class TestDCGAN(TestCase): def test_init(self): gan = DCGAN( noise_size=10, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), generator=generator, discriminator=discriminator) self.assertIsInstance(gan, DCGAN) - self.assertIsInstance(gan.data_preprocessor, EditDataPreprocessor) + self.assertIsInstance(gan.data_preprocessor, DataPreprocessor) # test only generator have noise size gen_cfg = deepcopy(generator) @@ -35,7 +35,7 @@ def test_init(self): gan = DCGAN( generator=gen_cfg, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.noise_size, 10) # test init with nn.Module @@ -47,12 +47,12 @@ def test_init(self): gan = DCGAN( generator=gen, discriminator=disc, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.generator, gen) self.assertEqual(gan.discriminator, disc) # test init without discriminator - gan = DCGAN(generator=gen, data_preprocessor=EditDataPreprocessor()) + gan = DCGAN(generator=gen, data_preprocessor=DataPreprocessor()) self.assertEqual(gan.discriminator, None) def test_train_step(self): @@ -64,7 +64,7 @@ def test_train_step(self): noise_size=10, generator=generator, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), discriminator_steps=n_disc) # prepare messageHub message_hub.update_info('iter', 0) diff --git a/tests/test_models/test_editors/test_dic/test_dic.py b/tests/test_models/test_editors/test_dic/test_dic.py index 84127f274c..dc3f3a8701 100644 --- a/tests/test_models/test_editors/test_dic/test_dic.py +++ b/tests/test_models/test_editors/test_dic/test_dic.py @@ -5,7 +5,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models import DIC, DICNet, EditDataPreprocessor, LightCNN +from mmagic.models import DIC, DataPreprocessor, DICNet, LightCNN from mmagic.models.losses import (GANLoss, L1Loss, LightCNNFeatureLoss, PerceptualVGG) from mmagic.structures import DataSample @@ -33,7 +33,7 @@ def test_dic(init_weights): fake_label_val=0), train_cfg=dict(), test_cfg=dict(), - data_preprocessor=EditDataPreprocessor( + data_preprocessor=DataPreprocessor( mean=[129.795, 108.12, 96.39], std=[255, 255, 255], )) diff --git a/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py b/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py index e7c2216e66..be5f971569 100644 --- a/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py +++ b/tests/test_models/test_editors/test_dreambooth/test_dreambooth.py @@ -50,7 +50,7 @@ from_pretrained=stable_diffusion_v15_url, subfolder='scheduler'), dtype='fp32', - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), enable_xformers=False, val_prompts=val_prompts) diff --git a/tests/test_models/test_editors/test_edvr/test_edvr.py b/tests/test_models/test_editors/test_edvr/test_edvr.py index e9f02422b7..fbdca1592c 100644 --- a/tests/test_models/test_editors/test_edvr/test_edvr.py +++ b/tests/test_models/test_editors/test_edvr/test_edvr.py @@ -29,7 +29,7 @@ def test_edvr(): pixel_loss=dict( type='CharbonnierLoss', loss_weight=1.0, reduction='sum'), train_cfg=dict(tsa_iter=5000), - data_preprocessor=dict(type='EditDataPreprocessor')) + data_preprocessor=dict(type='DataPreprocessor')) assert isinstance(model, EDVR) assert isinstance(model.generator, EDVRNet) diff --git a/tests/test_models/test_editors/test_eg3d/test_eg3d.py b/tests/test_models/test_editors/test_eg3d/test_eg3d.py index f26e068a96..d80012e70f 100644 --- a/tests/test_models/test_editors/test_eg3d/test_eg3d.py +++ b/tests/test_models/test_editors/test_eg3d/test_eg3d.py @@ -50,7 +50,7 @@ def setUp(self): self.default_cfg = dict( generator=self.generator_cfg, camera=self.camera_cfg, - data_preprocessor=dict(type='EditDataPreprocessor')) + data_preprocessor=dict(type='DataPreprocessor')) def test_init(self): cfg_ = deepcopy(self.default_cfg) diff --git a/tests/test_models/test_editors/test_esrgan/test_esrgan.py b/tests/test_models/test_editors/test_esrgan/test_esrgan.py index f5e450ec44..4a329ad2a9 100644 --- a/tests/test_models/test_editors/test_esrgan/test_esrgan.py +++ b/tests/test_models/test_editors/test_esrgan/test_esrgan.py @@ -5,7 +5,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models import ESRGAN, EditDataPreprocessor, ModifiedVGG, RRDBNet +from mmagic.models import ESRGAN, DataPreprocessor, ModifiedVGG, RRDBNet from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG from mmagic.structures import DataSample @@ -39,7 +39,7 @@ def test_esrgan(init_weights): fake_label_val=0), train_cfg=None, test_cfg=None, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) assert isinstance(model, ESRGAN) assert isinstance(model.generator, RRDBNet) diff --git a/tests/test_models/test_editors/test_ggan/test_ggan.py b/tests/test_models/test_editors/test_ggan/test_ggan.py index b3006c32ab..40c98cb8a9 100644 --- a/tests/test_models/test_editors/test_ggan/test_ggan.py +++ b/tests/test_models/test_editors/test_ggan/test_ggan.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmagic.models import GGAN, EditDataPreprocessor +from mmagic.models import GGAN, DataPreprocessor from mmagic.registry import MODELS from mmagic.structures import DataSample @@ -22,12 +22,12 @@ class TestGGAN(TestCase): def test_init(self): gan = GGAN( noise_size=10, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), generator=generator, discriminator=discriminator) self.assertIsInstance(gan, GGAN) - self.assertIsInstance(gan.data_preprocessor, EditDataPreprocessor) + self.assertIsInstance(gan.data_preprocessor, DataPreprocessor) # test only generator have noise size gen_cfg = deepcopy(generator) @@ -35,7 +35,7 @@ def test_init(self): gan = GGAN( generator=gen_cfg, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.noise_size, 10) # test init with nn.Module @@ -47,12 +47,12 @@ def test_init(self): gan = GGAN( generator=gen, discriminator=disc, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.generator, gen) self.assertEqual(gan.discriminator, disc) # test init without discriminator - gan = GGAN(generator=gen, data_preprocessor=EditDataPreprocessor()) + gan = GGAN(generator=gen, data_preprocessor=DataPreprocessor()) self.assertEqual(gan.discriminator, None) def test_train_step(self): @@ -64,7 +64,7 @@ def test_train_step(self): noise_size=10, generator=generator, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), discriminator_steps=n_disc) # prepare messageHub message_hub.update_info('iter', 0) diff --git a/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py b/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py index 880e9f7e0b..09d3980006 100644 --- a/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py +++ b/tests/test_models/test_editors/test_glean/test_glean_styleganv2.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models import SRGAN, EditDataPreprocessor, GLEANStyleGANv2 +from mmagic.models import SRGAN, DataPreprocessor, GLEANStyleGANv2 from mmagic.models.editors.stylegan2 import StyleGAN2Discriminator from mmagic.models.losses import (GANLoss, MSELoss, PerceptualLoss, PerceptualVGG) @@ -42,7 +42,7 @@ def test_glean(init_weights): fake_label_val=0), train_cfg=None, test_cfg=None, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) assert isinstance(model, SRGAN) assert isinstance(model.generator, GLEANStyleGANv2) diff --git a/tests/test_models/test_editors/test_guided_diffusion/test_adm.py b/tests/test_models/test_editors/test_guided_diffusion/test_adm.py index f00aa38a08..b670ff0c23 100644 --- a/tests/test_models/test_editors/test_guided_diffusion/test_adm.py +++ b/tests/test_models/test_editors/test_guided_diffusion/test_adm.py @@ -15,7 +15,7 @@ class TestAdm(TestCase): def setup_class(cls): # test init cls.model = AblatedDiffusionModel( - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), unet=dict( type='DenoisingUnet', image_size=64, diff --git a/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py b/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py index d92b04bccd..56b67e7d25 100644 --- a/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py +++ b/tests/test_models/test_editors/test_inst_colorization/test_inst_colorization.py @@ -24,7 +24,7 @@ def test_inst_colorization(self): model_cfg = dict( type='InstColorization', data_preprocessor=dict( - type='EditDataPreprocessor', + type='DataPreprocessor', mean=[127.5], std=[127.5], ), diff --git a/tests/test_models/test_editors/test_liif/test_liif.py b/tests/test_models/test_editors/test_liif/test_liif.py index b759922047..a8e3b88cb6 100644 --- a/tests/test_models/test_editors/test_liif/test_liif.py +++ b/tests/test_models/test_editors/test_liif/test_liif.py @@ -5,7 +5,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models import LIIF, EditDataPreprocessor +from mmagic.models import LIIF, DataPreprocessor from mmagic.structures import DataSample @@ -30,7 +30,7 @@ def test_liif(): cell_decode=True, eval_bsize=64), pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), - data_preprocessor=EditDataPreprocessor( + data_preprocessor=DataPreprocessor( mean=[0.4488 * 255, 0.4371 * 255, 0.4040 * 255], std=[255., 255., 255.], # input_view=(-1, 1, 1), diff --git a/tests/test_models/test_editors/test_lsgan/test_lsgan.py b/tests/test_models/test_editors/test_lsgan/test_lsgan.py index bd0cdde221..32b32fa876 100644 --- a/tests/test_models/test_editors/test_lsgan/test_lsgan.py +++ b/tests/test_models/test_editors/test_lsgan/test_lsgan.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmagic.models import LSGAN, EditDataPreprocessor +from mmagic.models import LSGAN, DataPreprocessor from mmagic.registry import MODELS from mmagic.structures import DataSample @@ -22,12 +22,12 @@ class TestLSGAN(TestCase): def test_init(self): gan = LSGAN( noise_size=10, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), generator=generator, discriminator=discriminator) self.assertIsInstance(gan, LSGAN) - self.assertIsInstance(gan.data_preprocessor, EditDataPreprocessor) + self.assertIsInstance(gan.data_preprocessor, DataPreprocessor) # test only generator have noise size gen_cfg = deepcopy(generator) @@ -35,7 +35,7 @@ def test_init(self): gan = LSGAN( generator=gen_cfg, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.noise_size, 10) # test init with nn.Module @@ -47,12 +47,12 @@ def test_init(self): gan = LSGAN( generator=gen, discriminator=disc, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.generator, gen) self.assertEqual(gan.discriminator, disc) # test init without discriminator - gan = LSGAN(generator=gen, data_preprocessor=EditDataPreprocessor()) + gan = LSGAN(generator=gen, data_preprocessor=DataPreprocessor()) self.assertEqual(gan.discriminator, None) def test_train_step(self): @@ -64,7 +64,7 @@ def test_train_step(self): noise_size=10, generator=generator, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), discriminator_steps=n_disc) # prepare messageHub message_hub.update_info('iter', 0) diff --git a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py index d249fb7866..01758bad14 100644 --- a/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py +++ b/tests/test_models/test_editors/test_mspie/test_mspie_stylegan2.py @@ -7,7 +7,7 @@ from mmengine import MessageHub from mmengine.optim import OptimWrapper, OptimWrapperDict -from mmagic.models import EditDataPreprocessor, MSPIEStyleGAN2 +from mmagic.models import DataPreprocessor, MSPIEStyleGAN2 from mmagic.structures import DataSample from mmagic.utils import register_all_modules @@ -50,7 +50,7 @@ def test_stylegan2_cpu(self): gan = MSPIEStyleGAN2( self.generator_cfg, self.disc_cfg, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), ema_config=self.ema_config, loss_config=self.loss_config, train_settings=dict(num_upblocks=3)) diff --git a/tests/test_models/test_editors/test_mspie/test_pe_singan.py b/tests/test_models/test_editors/test_mspie/test_pe_singan.py index 628537b715..cd689b3327 100644 --- a/tests/test_models/test_editors/test_mspie/test_pe_singan.py +++ b/tests/test_models/test_editors/test_mspie/test_pe_singan.py @@ -26,7 +26,7 @@ def setup_class(cls): num_scales=3) # noqa cls.data_preprocessor = dict( - type='EditDataPreprocessor', non_image_keys=['input_sample']) + type='DataPreprocessor', non_image_keys=['input_sample']) cls.noise_weight_init = 0.1 cls.iters_per_scale = 2 diff --git a/tests/test_models/test_editors/test_pggan/test_pggan.py b/tests/test_models/test_editors/test_pggan/test_pggan.py index b7cdcb255c..8e1a56407d 100644 --- a/tests/test_models/test_editors/test_pggan/test_pggan.py +++ b/tests/test_models/test_editors/test_pggan/test_pggan.py @@ -26,7 +26,7 @@ class TestPGGAN(TestCase): discriminator_cfg = dict( type='PGGANDiscriminator', in_scale=16, label_size=0) - data_preprocessor = dict(type='EditDataPreprocessor') + data_preprocessor = dict(type='DataPreprocessor') nkimgs_per_scale = {'4': 0.004, '8': 0.008, '16': 0.016} diff --git a/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py b/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py index 6975d7a431..f95f28ab99 100644 --- a/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py +++ b/tests/test_models/test_editors/test_pix2pix/test_pix2pix.py @@ -8,7 +8,7 @@ from mmengine.logging import MessageHub from mmengine.optim import OptimWrapper, OptimWrapperDict -from mmagic.models import EditDataPreprocessor, Pix2Pix +from mmagic.models import DataPreprocessor, Pix2Pix from mmagic.models.archs import PatchDiscriminator from mmagic.models.editors.pix2pix import UnetGenerator from mmagic.utils import register_all_modules @@ -58,7 +58,7 @@ def obj_from_dict(info: dict, parent=None, default_args=None): def test_pix2pix(): # model settings model_cfg = dict( - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), generator=dict( type='UnetGenerator', in_channels=3, @@ -220,7 +220,7 @@ def test_pix2pix(): def test_pix2pix_val_step(): # model settings model_cfg = dict( - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), generator=dict( type='UnetGenerator', in_channels=3, diff --git a/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py b/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py index 54f35b2760..dd54f79213 100644 --- a/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py +++ b/tests/test_models/test_editors/test_real_basicvsr/test_real_basicvsr.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models.data_preprocessors import EditDataPreprocessor +from mmagic.models.data_preprocessors import DataPreprocessor from mmagic.models.editors import (RealBasicVSR, RealBasicVSRNet, UNetDiscriminatorWithSpectralNorm) from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG @@ -59,7 +59,7 @@ def test_real_basicvsr(init_weights): is_use_sharpened_gt_in_pixel=True, is_use_sharpened_gt_in_percep=True, is_use_sharpened_gt_in_gan=False, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) assert isinstance(model, RealBasicVSR) assert isinstance(model.generator, RealBasicVSRNet) diff --git a/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py b/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py index 549995265f..0727ff9d68 100644 --- a/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py +++ b/tests/test_models/test_editors/test_real_esrgan/test_real_esrgan.py @@ -5,7 +5,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models import (EditDataPreprocessor, RealESRGAN, RRDBNet, +from mmagic.models import (DataPreprocessor, RealESRGAN, RRDBNet, UNetDiscriminatorWithSpectralNorm) from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG from mmagic.structures import DataSample @@ -54,7 +54,7 @@ def test_real_esrgan(init_weights): is_use_ema=False, train_cfg=None, test_cfg=None, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) assert isinstance(model, RealESRGAN) assert isinstance(model.generator, RRDBNet) diff --git a/tests/test_models/test_editors/test_sagan/test_sagan.py b/tests/test_models/test_editors/test_sagan/test_sagan.py index 13592a4f67..1feb3d9878 100644 --- a/tests/test_models/test_editors/test_sagan/test_sagan.py +++ b/tests/test_models/test_editors/test_sagan/test_sagan.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmagic.models import SAGAN, EditDataPreprocessor +from mmagic.models import SAGAN, DataPreprocessor from mmagic.registry import MODELS from mmagic.structures import DataSample @@ -36,14 +36,14 @@ def test_init(self): gan = SAGAN( noise_size=10, num_classes=10, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), generator=generator, discriminator=discriminator, generator_steps=1, discriminator_steps=4) self.assertIsInstance(gan, SAGAN) - self.assertIsInstance(gan.data_preprocessor, EditDataPreprocessor) + self.assertIsInstance(gan.data_preprocessor, DataPreprocessor) # test only generator have noise size gen_cfg = deepcopy(generator) @@ -52,7 +52,7 @@ def test_init(self): noise_size=10, generator=gen_cfg, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.noise_size, 10) # test init with nn.Module @@ -65,21 +65,19 @@ def test_init(self): noise_size=10, generator=gen, discriminator=disc, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.generator, gen) self.assertEqual(gan.discriminator, disc) # test init without discriminator gan = SAGAN( - noise_size=10, - generator=gen, - data_preprocessor=EditDataPreprocessor()) + noise_size=10, generator=gen, data_preprocessor=DataPreprocessor()) self.assertEqual(gan.discriminator, None) # test init with different num_classes gan = SAGAN( num_classes=10, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), generator=generator, discriminator=discriminator, generator_steps=1, @@ -94,7 +92,7 @@ def test_train_step(self): noise_size=10, generator=generator, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), discriminator_steps=n_disc) # prepare messageHub message_hub.update_info('iter', 0) diff --git a/tests/test_models/test_editors/test_singan/test_singan.py b/tests/test_models/test_editors/test_singan/test_singan.py index 82491431ac..716dddcf02 100644 --- a/tests/test_models/test_editors/test_singan/test_singan.py +++ b/tests/test_models/test_editors/test_singan/test_singan.py @@ -23,7 +23,7 @@ def setup_class(cls): type='SinGANMultiScaleDiscriminator', in_channels=3, num_scales=3) cls.data_preprocessor = dict( - type='EditDataPreprocessor', non_image_keys=['input_sample']) + type='DataPreprocessor', non_image_keys=['input_sample']) cls.noise_weight_init = 0.1 cls.curr_scale = -1 cls.iters_per_scale = 2 diff --git a/tests/test_models/test_editors/test_srgan/test_srgan.py b/tests/test_models/test_editors/test_srgan/test_srgan.py index 18519760aa..f531002659 100644 --- a/tests/test_models/test_editors/test_srgan/test_srgan.py +++ b/tests/test_models/test_editors/test_srgan/test_srgan.py @@ -5,7 +5,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models import SRGAN, EditDataPreprocessor, ModifiedVGG, MSRResNet +from mmagic.models import SRGAN, DataPreprocessor, ModifiedVGG, MSRResNet from mmagic.models.losses import GANLoss, L1Loss, PerceptualLoss, PerceptualVGG from mmagic.structures import DataSample @@ -38,7 +38,7 @@ def test_srgan_resnet(init_weights): fake_label_val=0), train_cfg=None, test_cfg=None, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) assert isinstance(model, SRGAN) assert isinstance(model.generator, MSRResNet) 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 55f5c696ab..9e3e1b2ce6 100644 --- a/tests/test_models/test_editors/test_stylegan1/test_stylegan1.py +++ b/tests/test_models/test_editors/test_stylegan1/test_stylegan1.py @@ -23,7 +23,7 @@ class TestStyleGAN1(TestCase): nkimgs_per_scale = {'16': 0.004, '32': 0.008, '64': 0.016} - data_preprocessor = dict(type='EditDataPreprocessor') + data_preprocessor = dict(type='DataPreprocessor') lr_schedule = dict(generator={'32': 0.0015}, discriminator={'32': 0.0015}) optim_wrapper_cfg = dict( 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 4a44391f46..450e8b8591 100644 --- a/tests/test_models/test_editors/test_stylegan2/test_stylegan2.py +++ b/tests/test_models/test_editors/test_stylegan2/test_stylegan2.py @@ -7,7 +7,7 @@ from mmengine import MessageHub from mmengine.optim import OptimWrapper, OptimWrapperDict -from mmagic.models import EditDataPreprocessor, StyleGAN2 +from mmagic.models import DataPreprocessor, StyleGAN2 from mmagic.structures import DataSample @@ -46,7 +46,7 @@ def test_stylegan2_cpu(self): stylegan2 = StyleGAN2( self.generator_cfg, self.disc_cfg, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), ema_config=self.ema_config, loss_config=self.loss_config) diff --git a/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py b/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py index 3151f66829..a8c828e40a 100644 --- a/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py +++ b/tests/test_models/test_editors/test_stylegan3/test_stylegan3.py @@ -20,7 +20,7 @@ class TestStyleGAN3(TestCase): @classmethod def setUpClass(cls): cls.default_cfg = dict( - data_preprocessor=dict(type='EditDataPreprocessor'), + data_preprocessor=dict(type='DataPreprocessor'), generator=dict( type='StyleGANv3Generator', noise_size=6, diff --git a/tests/test_models/test_editors/test_tdan/test_tdan.py b/tests/test_models/test_editors/test_tdan/test_tdan.py index f2e52e85ed..98a36a76d3 100644 --- a/tests/test_models/test_editors/test_tdan/test_tdan.py +++ b/tests/test_models/test_editors/test_tdan/test_tdan.py @@ -3,7 +3,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models.data_preprocessors import EditDataPreprocessor +from mmagic.models.data_preprocessors import DataPreprocessor from mmagic.models.editors import TDAN, TDANNet from mmagic.models.losses import MSELoss from mmagic.structures import DataSample @@ -15,12 +15,12 @@ def test_tdan(): generator=dict(type='TDANNet'), pixel_loss=dict(type='MSELoss', loss_weight=1.0, reduction='mean'), lq_pixel_loss=dict(type='MSELoss', loss_weight=0.01, reduction='mean'), - data_preprocessor=EditDataPreprocessor(mean=[0.5, 0.5, 0.5])) + data_preprocessor=DataPreprocessor(mean=[0.5, 0.5, 0.5])) assert model.__class__.__name__ == 'TDAN' assert isinstance(model.generator, TDANNet) assert isinstance(model.pixel_loss, MSELoss) - assert isinstance(model.data_preprocessor, EditDataPreprocessor) + assert isinstance(model.data_preprocessor, DataPreprocessor) optimizer = Adam(model.generator.parameters(), lr=0.001) optim_wrapper = OptimWrapper(optimizer) diff --git a/tests/test_models/test_editors/test_ttsr/test_ttsr.py b/tests/test_models/test_editors/test_ttsr/test_ttsr.py index bc8c8e2055..6a7b0dbde2 100644 --- a/tests/test_models/test_editors/test_ttsr/test_ttsr.py +++ b/tests/test_models/test_editors/test_ttsr/test_ttsr.py @@ -7,7 +7,7 @@ from mmengine.optim import OptimWrapper from torch.optim import Adam -from mmagic.models import (LTE, TTSR, EditDataPreprocessor, SearchTransformer, +from mmagic.models import (LTE, TTSR, DataPreprocessor, SearchTransformer, TTSRDiscriminator, TTSRNet) from mmagic.models.losses import (GANLoss, L1Loss, PerceptualVGG, TransferalPerceptualLoss) @@ -50,7 +50,7 @@ def test_ttsr(init_weights): loss_weight=1e-3, real_label_val=1.0, fake_label_val=0), - data_preprocessor=EditDataPreprocessor( + data_preprocessor=DataPreprocessor( mean=[127.5, 127.5, 127.5], std=[127.5, 127.5, 127.5], )) 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 8bd35534cb..73bdc29075 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 @@ -9,7 +9,7 @@ from mmengine.optim import OptimWrapper, OptimWrapperDict from torch.optim import SGD -from mmagic.models import WGANGP, EditDataPreprocessor +from mmagic.models import WGANGP, DataPreprocessor from mmagic.registry import MODELS from mmagic.structures import DataSample @@ -24,12 +24,12 @@ class TestWGANGP(TestCase): def test_init(self): gan = WGANGP( noise_size=10, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), generator=generator, discriminator=discriminator) self.assertIsInstance(gan, WGANGP) - self.assertIsInstance(gan.data_preprocessor, EditDataPreprocessor) + self.assertIsInstance(gan.data_preprocessor, DataPreprocessor) # test only generator have noise size gen_cfg = deepcopy(generator) @@ -37,7 +37,7 @@ def test_init(self): gan = WGANGP( generator=gen_cfg, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.noise_size, 10) # test init with nn.Module @@ -49,12 +49,12 @@ def test_init(self): gan = WGANGP( generator=gen, discriminator=disc, - data_preprocessor=EditDataPreprocessor()) + data_preprocessor=DataPreprocessor()) self.assertEqual(gan.generator, gen) self.assertEqual(gan.discriminator, disc) # test init without discriminator - gan = WGANGP(generator=gen, data_preprocessor=EditDataPreprocessor()) + gan = WGANGP(generator=gen, data_preprocessor=DataPreprocessor()) self.assertEqual(gan.discriminator, None) @pytest.mark.skipif( @@ -69,7 +69,7 @@ def test_train_step(self): noise_size=10, generator=generator, discriminator=discriminator, - data_preprocessor=EditDataPreprocessor(), + data_preprocessor=DataPreprocessor(), discriminator_steps=n_disc) # prepare messageHub message_hub.update_info('iter', 0) From a26c9d1043e2b450d4ccfba33f849ec1f123765e Mon Sep 17 00:00:00 2001 From: rangoliu Date: Sun, 23 Apr 2023 20:59:49 +0800 Subject: [PATCH 32/42] [Rename] rename to mmagic in inferencers (#1791) rename to mmagic in inferencers --- demo/gradio_controlnet_animation.py | 4 +- demo/mmediting_inference_demo.py | 10 ++--- ...nferencer.py => base_mmagic_inferencer.py} | 2 +- .../inferencers/colorization_inferencer.py | 4 +- .../inferencers/conditional_inferencer.py | 4 +- .../controlnet_animation_inferencer.py | 4 +- mmagic/apis/inferencers/eg3d_inferencer.py | 4 +- .../image_super_resolution_inferencer.py | 4 +- .../apis/inferencers/inpainting_inferencer.py | 4 +- mmagic/apis/inferencers/matting_inferencer.py | 4 +- .../apis/inferencers/text2image_inferencer.py | 4 +- .../inferencers/translation_inferencer.py | 4 +- .../inferencers/unconditional_inferencer.py | 4 +- .../video_interpolation_inferencer.py | 4 +- .../video_restoration_inferencer.py | 4 +- mmagic/{edit.py => mmagic.py} | 44 +++++++++---------- .../test_base_mmedit_inferencer.py | 8 ++-- tests/{test_edit.py => test_mmagic.py} | 28 ++++++------ 18 files changed, 72 insertions(+), 72 deletions(-) rename mmagic/apis/inferencers/{base_mmedit_inferencer.py => base_mmagic_inferencer.py} (99%) rename mmagic/{edit.py => mmagic.py} (86%) rename tests/{test_edit.py => test_mmagic.py} (56%) diff --git a/demo/gradio_controlnet_animation.py b/demo/gradio_controlnet_animation.py index 58b99998ff..640f2a39d1 100644 --- a/demo/gradio_controlnet_animation.py +++ b/demo/gradio_controlnet_animation.py @@ -1,9 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. import gradio as gr -from mmagic.edit import MMEdit +from mmagic.mmagic import MMagic -editor = MMEdit(model_name='controlnet_animation') +editor = MMagic(model_name='controlnet_animation') def process(video, prompt, a_prompt, negative_prompt, diff --git a/demo/mmediting_inference_demo.py b/demo/mmediting_inference_demo.py index d7646cd721..92823c4cb7 100644 --- a/demo/mmediting_inference_demo.py +++ b/demo/mmediting_inference_demo.py @@ -1,7 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. # isort: off from argparse import ArgumentParser -from mmagic.edit import MMEdit +from mmagic.mmagic import MMagic from mmengine import DictAction @@ -109,25 +109,25 @@ def main(): user_defined.update(vars(args)) if args.print_supported_models: - inference_supported_models = MMEdit.get_inference_supported_models() + inference_supported_models = MMagic.get_inference_supported_models() print('all supported models:') print(inference_supported_models) return if args.print_supported_tasks: - supported_tasks = MMEdit.get_inference_supported_tasks() + supported_tasks = MMagic.get_inference_supported_tasks() print('all supported tasks:') print(supported_tasks) return if args.print_task_supported_models: task_supported_models = \ - MMEdit.get_task_supported_models(args.print_task_supported_models) + MMagic.get_task_supported_models(args.print_task_supported_models) print('translation models:') print(task_supported_models) return - editor = MMEdit(**vars(args)) + editor = MMagic(**vars(args)) editor.infer(**user_defined) diff --git a/mmagic/apis/inferencers/base_mmedit_inferencer.py b/mmagic/apis/inferencers/base_mmagic_inferencer.py similarity index 99% rename from mmagic/apis/inferencers/base_mmedit_inferencer.py rename to mmagic/apis/inferencers/base_mmagic_inferencer.py index 7807d44276..b31d1d5604 100644 --- a/mmagic/apis/inferencers/base_mmedit_inferencer.py +++ b/mmagic/apis/inferencers/base_mmagic_inferencer.py @@ -22,7 +22,7 @@ ResType = Union[Dict, List[Dict], BaseDataElement, List[BaseDataElement]] -class BaseMMEditInferencer(BaseInferencer): +class BaseMMagicInferencer(BaseInferencer): """Base inferencer. Args: diff --git a/mmagic/apis/inferencers/colorization_inferencer.py b/mmagic/apis/inferencers/colorization_inferencer.py index 073d10a41c..b23b3f12d6 100644 --- a/mmagic/apis/inferencers/colorization_inferencer.py +++ b/mmagic/apis/inferencers/colorization_inferencer.py @@ -11,10 +11,10 @@ from mmagic.structures import DataSample from mmagic.utils import tensor2img -from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType +from .base_mmagic_inferencer import BaseMMagicInferencer, InputsType, PredType -class ColorizationInferencer(BaseMMEditInferencer): +class ColorizationInferencer(BaseMMagicInferencer): """inferencer that predicts with colorization models.""" func_kwargs = dict( diff --git a/mmagic/apis/inferencers/conditional_inferencer.py b/mmagic/apis/inferencers/conditional_inferencer.py index 46d6d7aff9..d8efd53b3b 100644 --- a/mmagic/apis/inferencers/conditional_inferencer.py +++ b/mmagic/apis/inferencers/conditional_inferencer.py @@ -8,10 +8,10 @@ from torchvision import utils from mmagic.structures import DataSample -from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType +from .base_mmagic_inferencer import BaseMMagicInferencer, InputsType, PredType -class ConditionalInferencer(BaseMMEditInferencer): +class ConditionalInferencer(BaseMMagicInferencer): """inferencer that predicts with conditional models.""" func_kwargs = dict( diff --git a/mmagic/apis/inferencers/controlnet_animation_inferencer.py b/mmagic/apis/inferencers/controlnet_animation_inferencer.py index fa32c4abfb..35b2d90486 100644 --- a/mmagic/apis/inferencers/controlnet_animation_inferencer.py +++ b/mmagic/apis/inferencers/controlnet_animation_inferencer.py @@ -14,7 +14,7 @@ from mmagic.registry import DIFFUSION_SCHEDULERS, MODELS from mmagic.utils import ConfigType -from .base_mmedit_inferencer import BaseMMEditInferencer +from .base_mmagic_inferencer import BaseMMagicInferencer VIDEO_EXTENSIONS = ('.mp4', '.mov', '.avi') IMAGE_EXTENSIONS = ('.jpg', '.jpeg', '.png', '.JPG', '.JPEG', '.PNG') @@ -49,7 +49,7 @@ def load_image(image: Union[str, PIL.Image.Image]) -> PIL.Image.Image: return image -class ControlnetAnimationInferencer(BaseMMEditInferencer): +class ControlnetAnimationInferencer(BaseMMagicInferencer): """Base inferencer. Args: diff --git a/mmagic/apis/inferencers/eg3d_inferencer.py b/mmagic/apis/inferencers/eg3d_inferencer.py index bdf182b1f4..502575481d 100644 --- a/mmagic/apis/inferencers/eg3d_inferencer.py +++ b/mmagic/apis/inferencers/eg3d_inferencer.py @@ -15,13 +15,13 @@ from mmagic.structures import DataSample from mmagic.utils import ForwardInputs, try_import -from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType +from .base_mmagic_inferencer import BaseMMagicInferencer, InputsType, PredType from .inference_functions import calculate_grid_size imageio = try_import('imageio') -class EG3DInferencer(BaseMMEditInferencer): +class EG3DInferencer(BaseMMagicInferencer): func_kwargs = dict( preprocess=['inputs'], diff --git a/mmagic/apis/inferencers/image_super_resolution_inferencer.py b/mmagic/apis/inferencers/image_super_resolution_inferencer.py index 180ba50ead..58cce12d17 100644 --- a/mmagic/apis/inferencers/image_super_resolution_inferencer.py +++ b/mmagic/apis/inferencers/image_super_resolution_inferencer.py @@ -10,10 +10,10 @@ from mmengine.dataset.utils import default_collate as collate from mmagic.utils import tensor2img -from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType +from .base_mmagic_inferencer import BaseMMagicInferencer, InputsType, PredType -class ImageSuperResolutionInferencer(BaseMMEditInferencer): +class ImageSuperResolutionInferencer(BaseMMagicInferencer): """inferencer that predicts with restoration models.""" func_kwargs = dict( diff --git a/mmagic/apis/inferencers/inpainting_inferencer.py b/mmagic/apis/inferencers/inpainting_inferencer.py index 469de568cf..092dd1325b 100644 --- a/mmagic/apis/inferencers/inpainting_inferencer.py +++ b/mmagic/apis/inferencers/inpainting_inferencer.py @@ -12,10 +12,10 @@ from mmagic.structures import DataSample from mmagic.utils import tensor2img -from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType +from .base_mmagic_inferencer import BaseMMagicInferencer, InputsType, PredType -class InpaintingInferencer(BaseMMEditInferencer): +class InpaintingInferencer(BaseMMagicInferencer): """inferencer that predicts with inpainting models.""" func_kwargs = dict( diff --git a/mmagic/apis/inferencers/matting_inferencer.py b/mmagic/apis/inferencers/matting_inferencer.py index 0a105a76a4..1185ad3022 100644 --- a/mmagic/apis/inferencers/matting_inferencer.py +++ b/mmagic/apis/inferencers/matting_inferencer.py @@ -11,10 +11,10 @@ from torch.nn.parallel import scatter from mmagic.structures import DataSample -from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType +from .base_mmagic_inferencer import BaseMMagicInferencer, InputsType, PredType -class MattingInferencer(BaseMMEditInferencer): +class MattingInferencer(BaseMMagicInferencer): """inferencer that predicts with matting models.""" func_kwargs = dict( diff --git a/mmagic/apis/inferencers/text2image_inferencer.py b/mmagic/apis/inferencers/text2image_inferencer.py index 99105f5636..3944465389 100644 --- a/mmagic/apis/inferencers/text2image_inferencer.py +++ b/mmagic/apis/inferencers/text2image_inferencer.py @@ -6,10 +6,10 @@ from mmengine import mkdir_or_exist from torchvision.utils import save_image -from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType +from .base_mmagic_inferencer import BaseMMagicInferencer, InputsType, PredType -class Text2ImageInferencer(BaseMMEditInferencer): +class Text2ImageInferencer(BaseMMagicInferencer): """inferencer that predicts with text2image models.""" func_kwargs = dict( diff --git a/mmagic/apis/inferencers/translation_inferencer.py b/mmagic/apis/inferencers/translation_inferencer.py index c5ffc8e29b..9a11e35630 100644 --- a/mmagic/apis/inferencers/translation_inferencer.py +++ b/mmagic/apis/inferencers/translation_inferencer.py @@ -10,10 +10,10 @@ from torchvision import utils from mmagic.models.base_models import BaseTranslationModel -from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType +from .base_mmagic_inferencer import BaseMMagicInferencer, InputsType, PredType -class TranslationInferencer(BaseMMEditInferencer): +class TranslationInferencer(BaseMMagicInferencer): """inferencer that predicts with translation models.""" func_kwargs = dict( diff --git a/mmagic/apis/inferencers/unconditional_inferencer.py b/mmagic/apis/inferencers/unconditional_inferencer.py index 8b6ebead9b..39b3f99946 100644 --- a/mmagic/apis/inferencers/unconditional_inferencer.py +++ b/mmagic/apis/inferencers/unconditional_inferencer.py @@ -8,10 +8,10 @@ from torchvision import utils from mmagic.structures import DataSample -from .base_mmedit_inferencer import BaseMMEditInferencer, InputsType, PredType +from .base_mmagic_inferencer import BaseMMagicInferencer, InputsType, PredType -class UnconditionalInferencer(BaseMMEditInferencer): +class UnconditionalInferencer(BaseMMagicInferencer): """inferencer that predicts with unconditional models.""" func_kwargs = dict( diff --git a/mmagic/apis/inferencers/video_interpolation_inferencer.py b/mmagic/apis/inferencers/video_interpolation_inferencer.py index 4caa13ebda..8a4d3cae70 100644 --- a/mmagic/apis/inferencers/video_interpolation_inferencer.py +++ b/mmagic/apis/inferencers/video_interpolation_inferencer.py @@ -13,12 +13,12 @@ from mmengine.logging import MMLogger from mmengine.utils import ProgressBar -from .base_mmedit_inferencer import (BaseMMEditInferencer, InputsType, +from .base_mmagic_inferencer import (BaseMMagicInferencer, InputsType, PredType, ResType) from .inference_functions import VIDEO_EXTENSIONS, read_frames, read_image -class VideoInterpolationInferencer(BaseMMEditInferencer): +class VideoInterpolationInferencer(BaseMMagicInferencer): """inferencer that predicts with video interpolation models.""" func_kwargs = dict( diff --git a/mmagic/apis/inferencers/video_restoration_inferencer.py b/mmagic/apis/inferencers/video_restoration_inferencer.py index c35011692c..89ed6748d6 100644 --- a/mmagic/apis/inferencers/video_restoration_inferencer.py +++ b/mmagic/apis/inferencers/video_restoration_inferencer.py @@ -12,12 +12,12 @@ from mmengine.logging import MMLogger from mmagic.utils import tensor2img -from .base_mmedit_inferencer import (BaseMMEditInferencer, InputsType, +from .base_mmagic_inferencer import (BaseMMagicInferencer, InputsType, PredType, ResType) from .inference_functions import VIDEO_EXTENSIONS, pad_sequence -class VideoRestorationInferencer(BaseMMEditInferencer): +class VideoRestorationInferencer(BaseMMagicInferencer): """inferencer that predicts with video restoration models.""" func_kwargs = dict( diff --git a/mmagic/edit.py b/mmagic/mmagic.py similarity index 86% rename from mmagic/edit.py rename to mmagic/mmagic.py index ac35d66930..67c59c6304 100644 --- a/mmagic/edit.py +++ b/mmagic/mmagic.py @@ -9,11 +9,11 @@ from mmengine.registry import init_default_scope from mmagic.apis import Inferencers -from mmagic.apis.inferencers.base_mmedit_inferencer import InputsType +from mmagic.apis.inferencers.base_mmagic_inferencer import InputsType -class MMEdit: - """MMEdit API for mmagic models inference. +class MMagic: + """MMagic API for mmagic models inference. Args: model_name (str): Name of the editing model. @@ -29,11 +29,11 @@ class MMEdit: Examples: >>> # inference of a conditional model, biggan for example - >>> editor = MMEdit(model_name='biggan') + >>> editor = MMagic(model_name='biggan') >>> editor.infer(label=1, result_out_dir='./biggan_res.jpg') >>> # inference of a translation model, pix2pix for example - >>> editor = MMEdit(model_name='pix2pix') + >>> editor = MMagic(model_name='pix2pix') >>> editor.infer(img='./test.jpg', result_out_dir='./pix2pix_res.jpg') >>> # see demo/mmediting_inference_tutorial.ipynb for more examples @@ -119,7 +119,7 @@ def __init__(self, seed: int = 2022, **kwargs) -> None: init_default_scope('mmagic') - MMEdit.init_inference_supported_models_cfg() + MMagic.init_inference_supported_models_cfg() inferencer_kwargs = {} inferencer_kwargs.update( self._get_inferencer_kwargs(model_name, model_setting, @@ -221,50 +221,50 @@ def get_model_config(self, model_name: str) -> Dict: @staticmethod def init_inference_supported_models_cfg() -> None: - if not MMEdit.inference_supported_models_cfg_inited: + if not MMagic.inference_supported_models_cfg_inited: all_cfgs_dir = osp.join(osp.dirname(__file__), '..', 'configs') - for model_name in MMEdit.inference_supported_models: + for model_name in MMagic.inference_supported_models: meta_file_dir = osp.join(all_cfgs_dir, model_name, 'metafile.yml') with open(meta_file_dir, 'r') as stream: parsed_yaml = yaml.safe_load(stream) task = parsed_yaml['Models'][0]['Results'][0]['Task'] - MMEdit.inference_supported_models_cfg[model_name] = {} - MMEdit.inference_supported_models_cfg[model_name][ + MMagic.inference_supported_models_cfg[model_name] = {} + MMagic.inference_supported_models_cfg[model_name][ 'task'] = task # noqa - MMEdit.inference_supported_models_cfg[model_name][ + MMagic.inference_supported_models_cfg[model_name][ 'settings'] = parsed_yaml['Models'] # noqa - MMEdit.inference_supported_models_cfg_inited = True + MMagic.inference_supported_models_cfg_inited = True @staticmethod def get_inference_supported_models() -> List: """static function for getting inference supported modes.""" - return MMEdit.inference_supported_models + return MMagic.inference_supported_models @staticmethod def get_inference_supported_tasks() -> List: """static function for getting inference supported tasks.""" - if not MMEdit.inference_supported_models_cfg_inited: - MMEdit.init_inference_supported_models_cfg() + if not MMagic.inference_supported_models_cfg_inited: + MMagic.init_inference_supported_models_cfg() supported_task = set() - for key in MMEdit.inference_supported_models_cfg.keys(): - if MMEdit.inference_supported_models_cfg[key]['task'] \ + for key in MMagic.inference_supported_models_cfg.keys(): + if MMagic.inference_supported_models_cfg[key]['task'] \ not in supported_task: supported_task.add( - MMEdit.inference_supported_models_cfg[key]['task']) + MMagic.inference_supported_models_cfg[key]['task']) return list(supported_task) @staticmethod def get_task_supported_models(task: str) -> List: """static function for getting task supported models.""" - if not MMEdit.inference_supported_models_cfg_inited: - MMEdit.init_inference_supported_models_cfg() + if not MMagic.inference_supported_models_cfg_inited: + MMagic.init_inference_supported_models_cfg() supported_models = [] - for key in MMEdit.inference_supported_models_cfg.keys(): - if MMEdit.inference_supported_models_cfg[key]['task'] == task: + for key in MMagic.inference_supported_models_cfg.keys(): + if MMagic.inference_supported_models_cfg[key]['task'] == task: supported_models.append(key) return supported_models diff --git a/tests/test_apis/test_inferencers/test_base_mmedit_inferencer.py b/tests/test_apis/test_inferencers/test_base_mmedit_inferencer.py index 5c256eac1e..429f9cbeb9 100644 --- a/tests/test_apis/test_inferencers/test_base_mmedit_inferencer.py +++ b/tests/test_apis/test_inferencers/test_base_mmedit_inferencer.py @@ -3,7 +3,7 @@ import pytest -from mmagic.apis.inferencers.base_mmedit_inferencer import BaseMMEditInferencer +from mmagic.apis.inferencers.base_mmagic_inferencer import BaseMMagicInferencer from mmagic.utils import register_all_modules register_all_modules() @@ -11,15 +11,15 @@ def test_base_mmedit_inferencer(): with pytest.raises(Exception): - BaseMMEditInferencer(1, None) + BaseMMagicInferencer(1, None) cfg = osp.join( osp.dirname(__file__), '..', '..', '..', 'configs', 'sngan_proj', 'sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py') with pytest.raises(Exception): - BaseMMEditInferencer(cfg, 'test') + BaseMMagicInferencer(cfg, 'test') - inferencer_instance = BaseMMEditInferencer(cfg, None) + inferencer_instance = BaseMMagicInferencer(cfg, None) extra_parameters = inferencer_instance.get_extra_parameters() assert len(extra_parameters) == 0 diff --git a/tests/test_edit.py b/tests/test_mmagic.py similarity index 56% rename from tests/test_edit.py rename to tests/test_mmagic.py index 5b56bd183a..9bea8f9bae 100644 --- a/tests/test_edit.py +++ b/tests/test_mmagic.py @@ -3,7 +3,7 @@ import pytest -from mmagic.edit import MMEdit +from mmagic.mmagic import MMagic from mmagic.utils import register_all_modules register_all_modules() @@ -11,27 +11,27 @@ def test_edit(): with pytest.raises(Exception): - MMEdit('dog', ['error_type'], None) + MMagic('dog', ['error_type'], None) with pytest.raises(Exception): - MMEdit() + MMagic() with pytest.raises(Exception): - MMEdit(model_setting=1) + MMagic(model_setting=1) - supported_models = MMEdit.get_inference_supported_models() - MMEdit.inference_supported_models_cfg_inited = False - supported_models = MMEdit.get_inference_supported_models() + supported_models = MMagic.get_inference_supported_models() + MMagic.inference_supported_models_cfg_inited = False + supported_models = MMagic.get_inference_supported_models() - supported_tasks = MMEdit.get_inference_supported_tasks() - MMEdit.inference_supported_models_cfg_inited = False - supported_tasks = MMEdit.get_inference_supported_tasks() + supported_tasks = MMagic.get_inference_supported_tasks() + MMagic.inference_supported_models_cfg_inited = False + supported_tasks = MMagic.get_inference_supported_tasks() task_supported_models = \ - MMEdit.get_task_supported_models('Image2Image Translation') - MMEdit.inference_supported_models_cfg_inited = False + MMagic.get_task_supported_models('Image2Image Translation') + MMagic.inference_supported_models_cfg_inited = False task_supported_models = \ - MMEdit.get_task_supported_models('Image2Image Translation') + MMagic.get_task_supported_models('Image2Image Translation') print(supported_models) print(supported_tasks) @@ -41,7 +41,7 @@ def test_edit(): osp.dirname(__file__), '..', 'configs', 'biggan', 'biggan_2xb25-500kiters_cifar10-32x32.py') - mmedit_instance = MMEdit( + mmedit_instance = MMagic( 'biggan', model_ckpt='', model_config=cfg, From 5de02fb8d003fd409cbd8bb2fb2e33ddea84e86a Mon Sep 17 00:00:00 2001 From: Qunliang Xing Date: Mon, 24 Apr 2023 11:10:50 +0800 Subject: [PATCH 33/42] [Fix]Fix 'augmention' typo (#1794) Fix typo --- mmagic/datasets/transforms/generate_frame_indices.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mmagic/datasets/transforms/generate_frame_indices.py b/mmagic/datasets/transforms/generate_frame_indices.py index 8980fc223a..411690d708 100644 --- a/mmagic/datasets/transforms/generate_frame_indices.py +++ b/mmagic/datasets/transforms/generate_frame_indices.py @@ -11,7 +11,7 @@ @TRANSFORMS.register_module() class GenerateFrameIndices(BaseTransform): """Generate frame index for REDS datasets. It also performs temporal - augmention with random interval. + augmentation with random interval. Required Keys: @@ -207,7 +207,7 @@ def __repr__(self): @TRANSFORMS.register_module() class GenerateSegmentIndices(BaseTransform): """Generate frame indices for a segment. It also performs temporal - augmention with random interval. + augmentation with random interval. Required Keys: From fc09e37c19f4d66bdc74e8bb5381d903b4ffc21e Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Mon, 24 Apr 2023 16:32:24 +0800 Subject: [PATCH 34/42] [Release] update v1.0.0 release info (#1787) * [Release] update mmagic's changelog * update changelog * update changelog * update changelog * update version * update changelog * update install * update migration * update changelog * update changelog * update changelog * update readme * update citation * update install * fix ut --- CITATION.cff | 6 +- LICENSE | 18 ++- README.md | 118 ++++++++++---- README_zh-CN.md | 119 ++++++++++---- docs/en/changelog.md | 205 ++++++++++++++++++------- docs/en/get_started/install.md | 12 +- docs/en/migration/amp.md | 2 +- docs/en/migration/data.md | 10 +- docs/en/migration/distributed_train.md | 2 +- docs/en/migration/eval_test.md | 8 +- docs/en/migration/models.md | 6 +- docs/en/migration/optimizers.md | 2 +- docs/en/migration/overview.md | 10 +- docs/en/migration/runtime.md | 2 +- docs/en/migration/schedule.md | 2 +- docs/zh_cn/changelog.md | 155 +++++++++++++++---- mmagic/version.py | 2 +- mmagic/visualization/vis_backend.py | 3 +- 18 files changed, 499 insertions(+), 183 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index b88a1995b9..c58bed7683 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -3,8 +3,8 @@ message: "If you use this software, please cite it as below." authors: - family-names: MMagic given-names: Contributors -title: "MMagic: OpenMMLab Image and Video Editing Toolbox" -version: 0.13.0 -date-released: 2022-03-01 +title: "MMagic: OpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox" +version: 1.0.0 +date-released: 2023-04-25 url: "https://github.com/open-mmlab/mmagic" license: Apache-2.0 diff --git a/LICENSE b/LICENSE index d11d98549d..b635b6143a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) MMagic Authors. All rights reserved. +Copyright (c) OpenMMLab. All rights reserved. Apache License Version 2.0, January 2004 @@ -188,7 +188,21 @@ Copyright (c) MMagic Authors. All rights reserved. same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2020 MMagic Authors. All rights reserved. + Copyright 2023 MMagic Authors. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Copyright 2020 MMEditing Authors. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 3956107d70..87c7f4322e 100644 --- a/README.md +++ b/README.md @@ -53,17 +53,60 @@ English | [简体中文](README_zh-CN.md) ## 🚀 What's New -### New release [**MMagic v1.0.0rc7**](https://github.com/open-mmlab/mmagic/releases/tag/v1.0.0rc7) \[07/04/2023\]: +### New release [**MMagic v1.0.0**](https://github.com/open-mmlab/mmagic/releases/tag/v1.0.0) \[25/04/2023\]: -- Support DiffuserWrapper -- Support ControlNet (training and inference). -- Support PyTorch 2.0 (successfully compile 33+ models on 'inductor' backend). +We are excited to announce the release of MMagic v1.0.0 that inherits from [MMEditing](https://github.com/open-mmlab/mmediting) and [MMGeneration](https://github.com/open-mmlab/mmgeneration). -**MMagic** has supported all the tasks, models, metrics, and losses in [MMGeneration](https://github.com/open-mmlab/mmgeneration) and unifies interfaces of all components based on [MMEngine](https://github.com/open-mmlab/mmengine) 😍. +After iterative updates with OpenMMLab 2.0 framework and merged with MMGeneration, MMEditing has become a powerful tool that supports low-level algorithms based on both GAN and CNN. Today, MMEditing embraces the Diffusion Model and transforms into a more advanced and comprehensive AIGC toolkit: **MMagic** (**M**ultimodal **A**dvanced, **G**enerative, and **I**ntelligent **C**reation). MMagic will provide more agile and flexible experimental support for researchers and AIGC enthusiasts, and help you on your AIGC exploration journey. + +We highlight the following new features. + +**1. New Models** + +We support 11 new models in 4 new tasks. + +- Text2Image / Diffusion + - ControlNet + - DreamBooth + - Stable Diffusion + - Disco Diffusion + - GLIDE + - Guided Diffusion +- 3D-aware Generation + - EG3D +- Image Restoration + - NAFNet + - Restormer + - SwinIR +- Image Colorization + - InstColorization + +**2. Magic Diffusion Model** + +For the Diffusion Model, we provide the following "magic" : + +- Support image generation based on Stable Diffusion and Disco Diffusion. +- Support Finetune methods such as Dreambooth and DreamBooth LoRA. +- Support controllability in text-to-image generation using ControlNet. +- Support acceleration and optimization strategies based on xFormers to improve training and inference efficiency. +- Support video generation based on MultiFrame Render. +- Support calling basic models and sampling strategies through DiffuserWrapper. + +**3. Upgraded Framework** + +By using MMEngine and MMCV of OpenMMLab 2.0 framework, MMagic has upgraded in the following new features: + +- Refactor DataSample to support the combination and splitting of batch dimensions. +- Refactor DataPreprocessor and unify the data format for various tasks during training and inference. +- Refactor MultiValLoop and MultiTestLoop, supporting the evaluation of both generation-type metrics (e.g. FID) and reconstruction-type metrics (e.g. SSIM), and supporting the evaluation of multiple datasets at once. +- Support visualization on local files or using tensorboard and wandb. +- Support for 33+ algorithms accelerated by Pytorch 2.0. + +**MMagic** has supported all the tasks, models, metrics, and losses in [MMEditing](https://github.com/open-mmlab/mmediting) and [MMGeneration](https://github.com/open-mmlab/mmgeneration) and unifies interfaces of all components based on [MMEngine](https://github.com/open-mmlab/mmengine) 😍. Please refer to [changelog.md](docs/en/changelog.md) for details and release history. -Please refer to [migration documents](docs/en/migration/overview.md) to migrate from [old version](https://github.com/open-mmlab/mmagic/tree/master) MMagic 0.x to our brand new 1.x version. +Please refer to [migration documents](docs/en/migration/overview.md) to migrate from [old version](https://github.com/open-mmlab/mmagic/tree/0.x) MMEditing 0.x to new version MMagic 1.x . ## 📄 Table of Contents @@ -80,31 +123,27 @@ Please refer to [migration documents](docs/en/migration/overview.md) to migrate ## 📖 Introduction -MMagic is an open-source image and video editing&generating toolbox based on PyTorch. It is a part of the [OpenMMLab](https://openmmlab.com/) project. +MMagic (**M**ultimodal **A**dvanced, **G**enerative, and **I**ntelligent **C**reation) is an advanced and comprehensive AIGC toolkit that inherits from [MMEditing](https://github.com/open-mmlab/mmediting) and [MMGeneration](https://github.com/open-mmlab/mmgeneration). It is an open-source image and video editing&generating toolbox based on PyTorch. It is a part of the [OpenMMLab](https://openmmlab.com/) project. Currently, MMagic support multiple image and video generation/editing tasks. -https://user-images.githubusercontent.com/49083766/233324087-04542ec1-97cb-45d9-a096-c5337c3e5c75.mp4 +https://user-images.githubusercontent.com/49083766/233564593-7d3d48ed-e843-4432-b610-35e3d257765c.mp4 The best practice on our main branch works with **Python 3.8+** and **PyTorch 1.9+**. ### ✨ Major features -- **State of the Art** +- **State of the Art Models** MMagic provides state-of-the-art generative models to process, edit and synthesize images and videos. - **Powerful and Popular Applications** - MMagic supports popular and contemporary image restoration, text-to-image, 3D-aware generation, inpainting, matting, super-resolution and generation applications. Specifically, MMagic supports GAN interpolation, GAN projection, GAN manipulations and many other popular GAN’s applications. It’s time to play with your GANs! - -- **New Modular Design for Flexible Combination** + MMagic supports popular and contemporary image restoration, text-to-image, 3D-aware generation, inpainting, matting, super-resolution and generation applications. Specifically, MMagic supports fine-tuning for stable diffusion and many exciting diffusion's application such as ControlNet Animation with SAM. MMagic also supports GAN interpolation, GAN projection, GAN manipulations and many other popular GAN’s applications. It’s time to begin your AIGC exploration journey! - 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](https://mmagic.readthedocs.io/en/latest/howto/losses.html)) +- **Efficient Framework** -- **Efficient Distributed Training** - - With the support of [MMSeparateDistributedDataParallel](https://github.com/open-mmlab/mmengine/blob/main/mmengine/model/wrappers/seperate_distributed.py), distributed training for dynamic architectures can be easily implemented. + By using MMEngine and MMCV of OpenMMLab 2.0 framework, MMagic decompose the editing framework into different modules and one can easily construct a customized editor framework by combining different module. We can define the training process just like playing with Legos and provide rich components and strategies. In MMagic, you can complete controls on the training process with different levels of APIs. With the support of [MMSeparateDistributedDataParallel](https://github.com/open-mmlab/mmengine/blob/main/mmengine/model/wrappers/seperate_distributed.py), distributed training for dynamic architectures can be easily implemented.

    🔝Back to top

    @@ -118,7 +157,7 @@ More and more community contributors are joining us to make our repo better. Som [Projects](projects/README.md) is opened to make it easier for everyone to add projects to MMagic. -We appreciate all contributions to improve MMagic. Please refer to [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/tree/2.x/CONTRIBUTING.md) in MMCV and [CONTRIBUTING.md](https://github.com/open-mmlab/mmengine/blob/main/CONTRIBUTING.md) in MMEngine for more details about the contributing guideline. +We appreciate all contributions to improve MMagic. Please refer to [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/blob/main/CONTRIBUTING.md) in MMCV and [CONTRIBUTING.md](https://github.com/open-mmlab/mmengine/blob/main/CONTRIBUTING.md) in MMEngine for more details about the contributing guideline.

    🔝Back to top

    @@ -131,16 +170,29 @@ Below are quick steps for installation. Install PyTorch following [official instructions](https://pytorch.org/get-started/locally/). **Step 2.** -Install MMCV with [MIM](https://github.com/open-mmlab/mim). +Install MMCV, MMEngine and MMagic with [MIM](https://github.com/open-mmlab/mim). ```shell pip3 install openmim -# wait for more pre-compiled pkgs to release mim install 'mmcv>=2.0.0' +mim install 'mmengine' +mim install 'mmagic' ``` **Step 3.** -Install MMagic from source. +Verify MMagic has been successfully installed. + +```shell +cd ~ +python -c "import mmagic; print(mmagic.__version__)" +# Example output: 1.0.0 +``` + +**Getting Started** +Please see [quick run](docs/en/get_started/quick_run.md) and [inference](docs/en/user_guides/inference.md) for the basic usage of MMagic. + +**Install MMagic from source** +You can also experiment on the latest developed version rather than the stable release by installing MMagic from source with the following commands: ```shell git clone https://github.com/open-mmlab/mmagic.git @@ -150,10 +202,6 @@ pip3 install -e . Please refer to [installation](docs/en/get_started/install.md) for more detailed instruction. -**Getting Started** - -Please see [quick run](docs/en/get_started/quick_run.md) and [inference](docs/en/user_guides/inference.md) for the basic usage of MMagic. -

    🔝Back to top

    ## 📊 Model Zoo @@ -307,9 +355,11 @@ Please see [quick run](docs/en/get_started/quick_run.md) and [inference](docs/en
    diff --git a/docs/en/migration/models.md b/docs/en/migration/models.md index 0ea5d7a61a..801a58e1ae 100644 --- a/docs/en/migration/models.md +++ b/docs/en/migration/models.md @@ -1,6 +1,6 @@ # Migration of Model Settings -We update model settings in MMEdit 1.x. Important modifications are as following. +We update model settings in MMagic 1.x. Important modifications are as following. - Remove `pretrained` fields. - Add `train_cfg` and `test_cfg` fields in model settings. @@ -63,9 +63,9 @@ model = dict(
    @@ -344,10 +394,19 @@ We appreciate all the contributors who implement their methods or add new featur If MMagic is helpful to your research, please cite it as below. ```bibtex -@misc{mmagic2022, +@misc{mmagic2023, title = {{MMagic}: {OpenMMLab} Image and Video Editing Toolbox}, author = {{MMagic Contributors}}, howpublished = {\url{https://github.com/open-mmlab/mmagic}}, + year = {2023} +} +``` + +```bibtex +@misc{mmediting2022, + title = {{MMEditing}: {OpenMMLab} Image and Video Editing Toolbox}, + author = {{MMEditing Contributors}}, + howpublished = {\url{https://github.com/open-mmlab/mmediting}}, year = {2022} } ``` @@ -366,7 +425,7 @@ Please refer to [LICENSES](LICENSE) for the careful check, if you are using our - [MMEngine](https://github.com/open-mmlab/mmengine): OpenMMLab foundational library for training deep learning models. - [MMCV](https://github.com/open-mmlab/mmcv): OpenMMLab foundational library for computer vision. - [MIM](https://github.com/open-mmlab/mim): MIM installs OpenMMLab packages. -- [MMClassification](https://github.com/open-mmlab/mmclassification): OpenMMLab image classification toolbox and benchmark. +- [MMPreTrain](https://github.com/open-mmlab/mmpretrain): OpenMMLab Pre-training Toolbox and Benchmark. - [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab detection toolbox and benchmark. - [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab's next-generation platform for general 3D object detection. - [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab rotated object detection toolbox and benchmark. @@ -380,8 +439,7 @@ Please refer to [LICENSES](LICENSE) for the careful check, if you are using our - [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab's next-generation action understanding toolbox and benchmark. - [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab video perception toolbox and benchmark. - [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab optical flow toolbox and benchmark. -- [MMagic](https://github.com/open-mmlab/mmagic): OpenMMLab image and video editing toolbox. -- [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab image and video generative models toolbox. +- [MMagic](https://github.com/open-mmlab/mmagic): OpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. - [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab model deployment framework.

    🔝Back to top

    diff --git a/README_zh-CN.md b/README_zh-CN.md index e3bb2fc825..f334df89e1 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -53,15 +53,58 @@ ## 🚀 最新进展 -### 最新的 [**MMagic v1.0.0rc7**](https://github.com/open-mmlab/mmagic/releases/tag/v1.0.0rc7) 版本已经在 \[07/04/2023\] 发布: +### 最新的 [**MMagic v1.0.0**](https://github.com/open-mmlab/mmagic/releases/tag/v1.0.0) 版本已经在 \[25/04/2023\] 发布: -- 支持了 DiffuserWrapper. -- 支持了 ControlNet 的推理与训练. -- 支持了 PyTorch 2.0 (使用 'inductor' 后端成功编译 33+ 模型). +我们正式发布 MMagic v1.0.0 版本,源自 [MMEditing](https://github.com/open-mmlab/mmediting) 和 [MMGeneration](https://github.com/open-mmlab/mmgeneration)。 -**MMagic** 已经支持了[MMGeneration](https://github.com/open-mmlab/mmgeneration)中的全量任务、模型、优化函数和评价指标 ,并基于[MMEngine](https://github.com/open-mmlab/mmengine)统一了各组件接口 😍。 +经过 OpenMMLab 2.0 框架的迭代更新以及与 MMGeneration 的合并,MMEditing 已经成为了一个支持基于 GAN 和 CNN 的底层视觉算法的强大工具。而今天,MMEditing 将拥抱 Diffusion Model(扩散模型),正式更名为 **MMagic**(**M**ultimodal **A**dvanced, **G**enerative, and **I**ntelligent **C**reation),转化为更为先进、全面的 AIGC 开源算法库。MMagic 将为广大研究者与 AIGC 爱好者们提供更加快捷灵活的实验支持,助力你的 AIGC 探索之旅。 -如果想了解更多版本更新细节和历史信息,请阅读[更新日志](docs/zh_cn/changelog.md)。如果想从[旧版本](https://github.com/open-mmlab/mmagic/tree/master) MMagic 0.x 迁移到新版本 MMagic 1.x,请阅读[迁移文档](docs/zh_cn/migration/overview.md)。 +以下是此次版本发布的重点新功能: + +**1. 新算法** + +我们支持了4个新任务以及11个新算法。 + +- Text2Image / Diffusion + - ControlNet + - DreamBooth + - Stable Diffusion + - Disco Diffusion + - GLIDE + - Guided Diffusion +- 3D-aware Generation + - EG3D +- Image Restoration + - NAFNet + - Restormer + - SwinIR +- Image Colorization + - InstColorization + +**2. Magic Diffusion Model** + +针对 Diffusion Model,我们提供了以下“魔法” + +- 支持基于 Stable Diffusion 与 Disco Diffusion 的图像生成. +- 支持 Dreambooth 以及 DreamBooth LoRA 等 Finetune 方法. +- 支持 ControlNet 进行可控性的文本到图像生成. +- 支持 xFormers 加速和优化策略,提高训练与推理效率. +- 支持基于 MultiFrame Render 的视频生成. +- 支持通过 Wrapper 调用 Diffusers 的基础模型以及采样策略. + +**3. 框架升级** + +通过 OpenMMLab 2.0 框架的 MMEngine 和 MMCV, MMagic 在以下几方面完成升级: + +- 重构 DataSample,支持 batch 维度的组合与拆分. +- 重构 DataPreprocessor,并统一各种任务在训练与推理时的数据格式. +- 重构 MultiValLoop 与 MultiTestLoop,同时支持生成类型指标(e.g. FID)与重建类型指标(e.g. SSIM) 的评测,同时支持一次性评测多个数据集 +- 支持本地可视化以及使用 tensorboard 或 wandb的可视化. +- 支持 33+ 算法 Pytorch 2.0 加速. + +**MMagic** 已经支持了[MMEditing](https://github.com/open-mmlab/mmediting) and [MMGeneration](https://github.com/open-mmlab/mmgeneration)和[MMGeneration](https://github.com/open-mmlab/mmgeneration)中的全量任务、模型、优化函数和评价指标 ,并基于[MMEngine](https://github.com/open-mmlab/mmengine)统一了各组件接口 😍。 + +如果想了解更多版本更新细节和历史信息,请阅读[更新日志](docs/zh_cn/changelog.md)。如果想从[旧版本](https://github.com/open-mmlab/mmagic/tree/master) MMEditing 0.x 迁移到新版本 MMagic 1.x,请阅读[迁移文档](docs/zh_cn/migration/overview.md)。 ## 📄 目录 @@ -82,27 +125,23 @@ MMagic 是基于 PyTorch 的图像&视频编辑和生成开源工具箱。是 [O 目前 MMagic 支持多种图像和视频的生成/编辑任务。 -https://user-images.githubusercontent.com/49083766/233324087-04542ec1-97cb-45d9-a096-c5337c3e5c75.mp4 +https://user-images.githubusercontent.com/49083766/233564593-7d3d48ed-e843-4432-b610-35e3d257765c.mp4 主分支代码的最佳实践基于 **Python 3.8+** 和 **PyTorch 1.9+** 。 ### ✨ 主要特性 -- **SOTA** +- **SOTA 算法** - MMagic 提供了处理、编辑、生成图像和视频的SOTA算法。 + MMagic 提供了处理、编辑、生成图像和视频的 SOTA 算法。 - **强有力且流行的应用** - MMagic 支持了流行的图像修复、图文生成、3D生成、图像修补、抠图、超分辨率和生成等任务的应用。特别是 MMagic 支持了 GANs 的插值,投影和编辑和其他流行的应用。请用你的 GANs 尽情尝试! - -- **灵活组合的模块化设计** + MMagic 支持了流行的图像修复、图文生成、3D生成、图像修补、抠图、超分辨率和生成等任务的应用。特别是 MMagic 支持了 Stable Diffusion 的微调和许多激动人心的 diffusion 应用,例如 ControlNet 动画生成。MMagic 也支持了 GANs 的插值,投影,编辑和其他流行的应用。请立即开始你的 AIGC 探索之旅! - MMagic 将编辑框架分解为不同的组件,并且可以通过组合不同的模块轻松地构建自定义的编辑器模型。 +- **高效的框架** -- **高效的分布式训练** - - 得益于 [MMSeparateDistributedDataParallel](https://github.com/open-mmlab/mmengine/blob/main/mmengine/model/wrappers/seperate_distributed.py), 动态模型结构的分布式训练可以轻松实现。 + 通过 OpenMMLab 2.0 框架的 MMEngine 和 MMCV, MMagic 将编辑框架分解为不同的组件,并且可以通过组合不同的模块轻松地构建自定义的编辑器模型。我们可以像搭建“乐高”一样定义训练流程,提供丰富的组件和策略。在 MMagic 中,你可以使用不同的 APIs 完全控制训练流程。得益于 [MMSeparateDistributedDataParallel](https://github.com/open-mmlab/mmengine/blob/main/mmengine/model/wrappers/seperate_distributed.py), 动态模型结构的分布式训练可以轻松实现。

    🔝返回顶部

    @@ -116,7 +155,7 @@ https://user-images.githubusercontent.com/49083766/233324087-04542ec1-97cb-45d9- 为使向 MMagic 中添加项目更加容易,我们开启了 [Projects](projects/README.md) 。 -感谢您为改善 MMagic 所做的所有贡献。请参阅 MMCV 中的 [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/tree/2.x/CONTRIBUTING.md) 和 MMEngine 中的 [CONTRIBUTING.md](https://github.com/open-mmlab/mmengine/blob/main/CONTRIBUTING_zh-CN.md) 以获取贡献指南。 +感谢您为改善 MMagic 所做的所有贡献。请参阅 MMCV 中的 [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/blob/main/CONTRIBUTING_zh-CN.md) 和 MMEngine 中的 [CONTRIBUTING.md](https://github.com/open-mmlab/mmengine/blob/main/CONTRIBUTING_zh-CN.md) 以获取贡献指南。

    🔝返回顶部

    @@ -128,16 +167,30 @@ MMagic 依赖 [PyTorch](https://pytorch.org/),[MMEngine](https://github.com/op 依照[官方教程](https://pytorch.org/get-started/locally/)安装 PyTorch 。 **步骤 2.** -使用 [MIM](https://github.com/open-mmlab/mim) 安装 MMCV 。 +使用 [MIM](https://github.com/open-mmlab/mim) 安装 MMCV,MMEngine 和 MMagic 。 ``` pip3 install openmim -# wait for more pre-compiled pkgs to release mim install 'mmcv>=2.0.0' +mim install 'mmengine' +mim install 'mmagic' ``` **步骤 3.** -从源码安装 MMagic +验证 MMagic 安装成功。 + +```shell +cd ~ +python -c "import mmagic; print(mmagic.__version__)" +# Example output: 1.0.0 +``` + +**开始使用** + +请参考[快速运行](docs/zh_cn/get_started/quick_run.md)和[推理演示](docs/zh_cn/user_guides/inference.md)获取 MMagic 的基本用法。 + +**从源码安装 MMagic** +使用以下命令从源码安装 MMagic,你可以选择不使用已发布的稳定版本,而在最新开发的版本上进行实验。 ``` git clone https://github.com/open-mmlab/mmagic.git @@ -147,10 +200,6 @@ pip3 install -e . 更详细的安装指南请参考 [安装指南](docs/zh_cn/get_started/install.md) 。 -**开始使用** - -请参考[快速运行](docs/zh_cn/get_started/quick_run.md)和[推理演示](docs/zh_cn/user_guides/inference.md)获取MMagic的基本用法。 -

    🔝Back to top

    ## 📊 模型库 @@ -304,9 +353,11 @@ pip3 install -e .
    @@ -339,10 +390,19 @@ MMagic 是一款由不同学校和公司共同贡献的开源项目。我们感 如果 MMagic 对您的研究有所帮助,请按照如下 bibtex 引用它。 ```bibtex -@misc{mmagic2022, +@misc{mmagic2023, title = {{MMagic}: {OpenMMLab} Image and Video Editing Toolbox}, author = {{MMagic Contributors}}, howpublished = {\url{https://github.com/open-mmlab/mmagic}}, + year = {2023} +} +``` + +```bibtex +@misc{mmediting2022, + title = {{MMEditing}: {OpenMMLab} Image and Video Editing Toolbox}, + author = {{MMEditing Contributors}}, + howpublished = {\url{https://github.com/open-mmlab/mmediting}}, year = {2022} } ``` @@ -360,7 +420,7 @@ MMagic 是一款由不同学校和公司共同贡献的开源项目。我们感 - [MMEngine](https://github.com/open-mmlab/mmengine): OpenMMLab MMEngine. - [MMCV](https://github.com/open-mmlab/mmcv): OpenMMLab 计算机视觉基础库 - [MIM](https://github.com/open-mmlab/mim): MIM 是 OpenMMlab 项目、算法、模型的统一入口 -- [MMClassification](https://github.com/open-mmlab/mmclassification): OpenMMLab 图像分类工具箱 +- [MMPreTrain](https://github.com/open-mmlab/mmpretrain): OpenMMLab 预训练工具箱 - [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab 目标检测工具箱 - [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab 新一代通用 3D 目标检测平台 - [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab 旋转框检测工具箱与测试基准 @@ -374,8 +434,7 @@ MMagic 是一款由不同学校和公司共同贡献的开源项目。我们感 - [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab 新一代视频理解工具箱 - [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab 一体化视频目标感知平台 - [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab 光流估计工具箱与测试基准 -- [MMagic](https://github.com/open-mmlab/mmagic): OpenMMLab 图像视频编辑工具箱 -- [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab 图片视频生成模型工具箱 +- [MMagic](https://github.com/open-mmlab/mmagic): OpenMMLab 新一代人工智能内容生成(AIGC)工具箱 - [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab 模型部署框架

    🔝返回顶部

    diff --git a/docs/en/changelog.md b/docs/en/changelog.md index 9fab2d8b97..5b1d2710ea 100644 --- a/docs/en/changelog.md +++ b/docs/en/changelog.md @@ -1,5 +1,96 @@ # Changelog +## v1.0.0 (25/04/2023) + +We are excited to announce the release of MMagic v1.0.0 that inherits from [MMEditing](https://github.com/open-mmlab/mmediting) and [MMGeneration](https://github.com/open-mmlab/mmgeneration). + +![mmagic-log](https://user-images.githubusercontent.com/49083766/233557648-9034f5a0-c85d-4092-b700-3a28072251b6.png) + +Since its inception, MMEditing has been the preferred algorithm library for many super-resolution, editing, and generation tasks, helping research teams win more than 10 top international competitions and supporting over 100 GitHub ecosystem projects. After iterative updates with OpenMMLab 2.0 framework and merged with MMGeneration, MMEditing has become a powerful tool that supports low-level algorithms based on both GAN and CNN. + +Today, MMEditing embraces the Diffusion Model and transforms into a more advanced and comprehensive AIGC toolkit: **MMagic** (**M**ultimodal **A**dvanced, **G**enerative, and **I**ntelligent **C**reation). + +In MMagic, we have supports 53+ models in multiple tasks such as fine-tuning for stable diffusion, text-to-image, image and video restoration, super-resolution, editing and generation. With excellent training and experiment management support from [MMEngine](https://github.com/open-mmlab/mmengine), MMagic will provide more agile and flexible experimental support for researchers and AIGC enthusiasts, and help you on your AIGC exploration journey. With MMagic, experience more magic in generation! Let's open a new era beyond editing together. More than Editing, Unlock the Magic! + +**Highlights** + +**1. New Models** + +We support 11 new models in 4 new tasks. + +- Text2Image / Diffusion + - ControlNet + - DreamBooth + - Stable Diffusion + - Disco Diffusion + - GLIDE + - Guided Diffusion +- 3D-aware Generation + - EG3D +- Image Restoration + - NAFNet + - Restormer + - SwinIR +- Image Colorization + - InstColorization + +https://user-images.githubusercontent.com/49083766/233564593-7d3d48ed-e843-4432-b610-35e3d257765c.mp4 + +**2. Magic Diffusion Model** + +For the Diffusion Model, we provide the following "magic" : + +- Support image generation based on Stable Diffusion and Disco Diffusion. + +- Support Finetune methods such as Dreambooth and DreamBooth LoRA. + +- Support controllability in text-to-image generation using ControlNet. + ![de87f16f-bf6d-4a61-8406-5ecdbb9167b6](https://user-images.githubusercontent.com/49083766/233558077-2005e603-c5a8-49af-930f-e7a465ca818b.png) + +- Support acceleration and optimization strategies based on xFormers to improve training and inference efficiency. + +- Support video generation based on MultiFrame Render. + MMagic supports the generation of long videos in various styles through ControlNet and MultiFrame Render. + prompt key words: a handsome man, silver hair, smiling, play basketball + + https://user-images.githubusercontent.com/12782558/227149757-fd054d32-554f-45d5-9f09-319184866d85.mp4 + + prompt key words: a girl, black hair, white pants, smiling, play basketball + + https://user-images.githubusercontent.com/49083766/233559964-bd5127bd-52f6-44b6-a089-9d7adfbc2430.mp4 + + prompt key words: a handsome man + + https://user-images.githubusercontent.com/12782558/227152129-d70d5f76-a6fc-4d23-97d1-a94abd08f95a.mp4 + +- Support calling basic models and sampling strategies through DiffuserWrapper. + +- SAM + MMagic = Generate Anything! + SAM (Segment Anything Model) is a popular model these days and can also provide more support for MMagic! If you want to create your own animation, you can go to [OpenMMLab PlayGround](https://github.com/open-mmlab/playground/blob/main/mmediting_sam/README.md). + + https://user-images.githubusercontent.com/49083766/233562228-f39fc675-326c-4ae8-986a-c942059effd0.mp4 + +**3. Upgraded Framework** + +To improve your "spellcasting" efficiency, we have made the following adjustments to the "magic circuit": + +- By using MMEngine and MMCV of OpenMMLab 2.0 framework, We decompose the editing framework into different modules and one can easily construct a customized editor framework by combining different module. We can define the training process just like playing with Legos and provide rich components and strategies. In MMagic, you can complete controls on the training process with different levels of APIs. +- Support for 33+ algorithms accelerated by Pytorch 2.0. +- Refactor DataSample to support the combination and splitting of batch dimensions. +- Refactor DataPreprocessor and unify the data format for various tasks during training and inference. +- Refactor MultiValLoop and MultiTestLoop, supporting the evaluation of both generation-type metrics (e.g. FID) and reconstruction-type metrics (e.g. SSIM), and supporting the evaluation of multiple datasets at once. +- Support visualization on local files or using tensorboard and wandb. + +**New Features & Improvements** + +- Support 53+ algorithms, 232+ configs, 213+ checkpoints, 26+ loss functions, and 20+ metrics. +- Support controlnet animation and Gradio gui. [Click to view.](https://github.com/open-mmlab/mmagic/tree/main/configs/controlnet_animation) +- Support Inferencer and Demo using High-level Inference APIs. [Click to view.](https://github.com/open-mmlab/mmagic/tree/main/demo) +- Support Gradio gui of Inpainting inference. [Click to view.](https://github.com/open-mmlab/mmagic/blob/main/demo/gradio-demo.py) +- Support qualitative comparison tools. [Click to view.](https://github.com/open-mmlab/mmagic/tree/main/tools/gui) +- Enable projects. [Click to view.](https://github.com/open-mmlab/mmagic/tree/main/projects) +- Improve converters scripts and documents for datasets. [Click to view.](https://github.com/open-mmlab/mmagic/tree/main/tools/dataset_converters) + ## v1.0.0rc7 (07/04/2023) **Highlights** @@ -12,19 +103,19 @@ We are excited to announce the release of MMEditing 1.0.0rc7. This release suppo **New Features & Improvements** -- Support DiffuserWrapper. [#1692](https://github.com/open-mmlab/mmediting/pull/1692) -- Support ControlNet (training and inference). [#1744](https://github.com/open-mmlab/mmediting/pull/1744) -- Support PyTorch 2.0 (successfully compile 33+ models on 'inductor' backend). [#1742](https://github.com/open-mmlab/mmediting/pull/1742) -- Support Image Super-Resolution and Video Super-Resolution models inferencer. [#1662](https://github.com/open-mmlab/mmediting/pull/1662), [#1720](https://github.com/open-mmlab/mmediting/pull/1720) -- Refactor tools/get_flops script. [#1675](https://github.com/open-mmlab/mmediting/pull/1675) -- Refactor dataset_converters and documents for datasets. [#1690](https://github.com/open-mmlab/mmediting/pull/1690) -- Move stylegan ops to MMCV. [#1383](https://github.com/open-mmlab/mmediting/pull/1383) +- Support DiffuserWrapper. [#1692](https://github.com/open-mmlab/mmagic/pull/1692) +- Support ControlNet (training and inference). [#1744](https://github.com/open-mmlab/mmagic/pull/1744) +- Support PyTorch 2.0 (successfully compile 33+ models on 'inductor' backend). [#1742](https://github.com/open-mmlab/mmagic/pull/1742) +- Support Image Super-Resolution and Video Super-Resolution models inferencer. [#1662](https://github.com/open-mmlab/mmagic/pull/1662), [#1720](https://github.com/open-mmlab/mmagic/pull/1720) +- Refactor tools/get_flops script. [#1675](https://github.com/open-mmlab/mmagic/pull/1675) +- Refactor dataset_converters and documents for datasets. [#1690](https://github.com/open-mmlab/mmagic/pull/1690) +- Move stylegan ops to MMCV. [#1383](https://github.com/open-mmlab/mmagic/pull/1383) **Bug Fixes** -- Fix disco inferencer. [#1673](https://github.com/open-mmlab/mmediting/pull/1673) -- Fix nafnet optimizer config. [#1716](https://github.com/open-mmlab/mmediting/pull/1716) -- Fix tof typo. [#1711](https://github.com/open-mmlab/mmediting/pull/1711) +- Fix disco inferencer. [#1673](https://github.com/open-mmlab/mmagic/pull/1673) +- Fix nafnet optimizer config. [#1716](https://github.com/open-mmlab/mmagic/pull/1716) +- Fix tof typo. [#1711](https://github.com/open-mmlab/mmagic/pull/1711) **Contributors** @@ -33,7 +124,7 @@ Thanks @LeoXing1996, @Z-Fran, @plyfager, @zengyh1900, @liuwenran, @ryanxingql, @ **New Contributors** -- @HAOCHENYE made their first contribution in https://github.com/open-mmlab/mmediting/pull/1712 +- @HAOCHENYE made their first contribution in https://github.com/open-mmlab/mmagic/pull/1712 ## v1.0.0rc6 (02/03/2023) @@ -46,30 +137,30 @@ We are excited to announce the release of MMEditing 1.0.0rc6. This release suppo **New Features & Improvements** -- Refactor FileIO. [#1572](https://github.com/open-mmlab/mmediting/pull/1572) -- Refactor registry. [#1621](https://github.com/open-mmlab/mmediting/pull/1621) -- Refactor Random degradations. [#1583](https://github.com/open-mmlab/mmediting/pull/1583) -- Refactor DataSample, DataPreprocessor, Metric and Loop. [#1656](https://github.com/open-mmlab/mmediting/pull/1656) -- Use mmengine.basemodule instead of nn.module. [#1491](https://github.com/open-mmlab/mmediting/pull/1491) -- Refactor Main Page. [#1609](https://github.com/open-mmlab/mmediting/pull/1609) -- Support Gradio gui of Inpainting inference. [#1601](https://github.com/open-mmlab/mmediting/pull/1601) -- Support Colorization inferencer. [#1588](https://github.com/open-mmlab/mmediting/pull/1588) -- Support Translation models inferencer. [#1650](https://github.com/open-mmlab/mmediting/pull/1650) -- Support GAN models inferencer. [#1653](https://github.com/open-mmlab/mmediting/pull/1653), [#1659](https://github.com/open-mmlab/mmediting/pull/1659) -- Print config tool. [#1590](https://github.com/open-mmlab/mmediting/pull/1590) -- Improve type hints. [#1604](https://github.com/open-mmlab/mmediting/pull/1604) -- Update Chinese documents of metrics and datasets. [#1568](https://github.com/open-mmlab/mmediting/pull/1568), [#1638](https://github.com/open-mmlab/mmediting/pull/1638) -- Update Chinese documents of BigGAN and Disco-Diffusion. [#1620](https://github.com/open-mmlab/mmediting/pull/1620) -- Update Evaluation and README of Guided-Diffusion. [#1547](https://github.com/open-mmlab/mmediting/pull/1547) +- Refactor FileIO. [#1572](https://github.com/open-mmlab/mmagic/pull/1572) +- Refactor registry. [#1621](https://github.com/open-mmlab/mmagic/pull/1621) +- Refactor Random degradations. [#1583](https://github.com/open-mmlab/mmagic/pull/1583) +- Refactor DataSample, DataPreprocessor, Metric and Loop. [#1656](https://github.com/open-mmlab/mmagic/pull/1656) +- Use mmengine.basemodule instead of nn.module. [#1491](https://github.com/open-mmlab/mmagic/pull/1491) +- Refactor Main Page. [#1609](https://github.com/open-mmlab/mmagic/pull/1609) +- Support Gradio gui of Inpainting inference. [#1601](https://github.com/open-mmlab/mmagic/pull/1601) +- Support Colorization inferencer. [#1588](https://github.com/open-mmlab/mmagic/pull/1588) +- Support Translation models inferencer. [#1650](https://github.com/open-mmlab/mmagic/pull/1650) +- Support GAN models inferencer. [#1653](https://github.com/open-mmlab/mmagic/pull/1653), [#1659](https://github.com/open-mmlab/mmagic/pull/1659) +- Print config tool. [#1590](https://github.com/open-mmlab/mmagic/pull/1590) +- Improve type hints. [#1604](https://github.com/open-mmlab/mmagic/pull/1604) +- Update Chinese documents of metrics and datasets. [#1568](https://github.com/open-mmlab/mmagic/pull/1568), [#1638](https://github.com/open-mmlab/mmagic/pull/1638) +- Update Chinese documents of BigGAN and Disco-Diffusion. [#1620](https://github.com/open-mmlab/mmagic/pull/1620) +- Update Evaluation and README of Guided-Diffusion. [#1547](https://github.com/open-mmlab/mmagic/pull/1547) **Bug Fixes** -- Fix the meaning of `momentum` in EMA. [#1581](https://github.com/open-mmlab/mmediting/pull/1581) -- Fix output dtype of RandomNoise. [#1585](https://github.com/open-mmlab/mmediting/pull/1585) -- Fix pytorch2onnx tool. [#1629](https://github.com/open-mmlab/mmediting/pull/1629) -- Fix API documents. [#1641](https://github.com/open-mmlab/mmediting/pull/1641), [#1642](https://github.com/open-mmlab/mmediting/pull/1642) -- Fix loading RealESRGAN EMA weights. [#1647](https://github.com/open-mmlab/mmediting/pull/1647) -- Fix arg passing bug of dataset_converters scripts. [#1648](https://github.com/open-mmlab/mmediting/pull/1648) +- Fix the meaning of `momentum` in EMA. [#1581](https://github.com/open-mmlab/mmagic/pull/1581) +- Fix output dtype of RandomNoise. [#1585](https://github.com/open-mmlab/mmagic/pull/1585) +- Fix pytorch2onnx tool. [#1629](https://github.com/open-mmlab/mmagic/pull/1629) +- Fix API documents. [#1641](https://github.com/open-mmlab/mmagic/pull/1641), [#1642](https://github.com/open-mmlab/mmagic/pull/1642) +- Fix loading RealESRGAN EMA weights. [#1647](https://github.com/open-mmlab/mmagic/pull/1647) +- Fix arg passing bug of dataset_converters scripts. [#1648](https://github.com/open-mmlab/mmagic/pull/1648) **Contributors** @@ -78,12 +169,12 @@ Thanks @plyfager, @LeoXing1996, @Z-Fran, @zengyh1900, @VongolaWu, @liuwenran, @a **New Contributors** -- @dienachtderwelt made their first contribution in https://github.com/open-mmlab/mmediting/pull/1578 -- @i-aki-y made their first contribution in https://github.com/open-mmlab/mmediting/pull/1590 -- @triple-Mu made their first contribution in https://github.com/open-mmlab/mmediting/pull/1618 -- @Li-Qingyun made their first contribution in https://github.com/open-mmlab/mmediting/pull/1640 -- @Luo-Yihang made their first contribution in https://github.com/open-mmlab/mmediting/pull/1648 -- @ydengbi made their first contribution in https://github.com/open-mmlab/mmediting/pull/1557 +- @dienachtderwelt made their first contribution in https://github.com/open-mmlab/mmagic/pull/1578 +- @i-aki-y made their first contribution in https://github.com/open-mmlab/mmagic/pull/1590 +- @triple-Mu made their first contribution in https://github.com/open-mmlab/mmagic/pull/1618 +- @Li-Qingyun made their first contribution in https://github.com/open-mmlab/mmagic/pull/1640 +- @Luo-Yihang made their first contribution in https://github.com/open-mmlab/mmagic/pull/1648 +- @ydengbi made their first contribution in https://github.com/open-mmlab/mmagic/pull/1557 ## v1.0.0rc5 (04/01/2023) @@ -124,14 +215,14 @@ Thanks @plyfager, @LeoXing1996, @Z-Fran, @zengyh1900, @VongolaWu, @liuwenran, @A **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 +- @xiaomile made their first contribution in https://github.com/open-mmlab/mmagic/pull/1481 +- @ldr426 made their first contribution in https://github.com/open-mmlab/mmagic/pull/1542 +- @austin273 made their first contribution in https://github.com/open-mmlab/mmagic/pull/1553 +- @whu-lee made their first contribution in https://github.com/open-mmlab/mmagic/pull/1539 +- @willaty made their first contribution in https://github.com/open-mmlab/mmagic/pull/1541 +- @curiosity654 made their first contribution in https://github.com/open-mmlab/mmagic/pull/1556 +- @Zdafeng made their first contribution in https://github.com/open-mmlab/mmagic/pull/1476 +- @Taited made their first contribution in https://github.com/open-mmlab/mmagic/pull/1534 ## v1.0.0rc4 (05/12/2022) @@ -164,15 +255,15 @@ Thanks @plyfager, @LeoXing1996, @Z-Fran, @zengyh1900, @VongolaWu, @gaoyang07, @C **New Contributors** -- @gaoyang07 made their first contribution in https://github.com/open-mmlab/mmediting/pull/1372 -- @ChangjianZhao made their first contribution in https://github.com/open-mmlab/mmediting/pull/1461 -- @zxczrx123 made their first contribution in https://github.com/open-mmlab/mmediting/pull/1462 -- @jackghosts made their first contribution in https://github.com/open-mmlab/mmediting/pull/1463 -- @liuwenran made their first contribution in https://github.com/open-mmlab/mmediting/pull/1410 -- @CCODING04 made their first contribution in https://github.com/open-mmlab/mmediting/pull/783 -- @RoseZhao929 made their first contribution in https://github.com/open-mmlab/mmediting/pull/1474 -- @shaocongliu made their first contribution in https://github.com/open-mmlab/mmediting/pull/1470 -- @liangzelong made their first contribution in https://github.com/open-mmlab/mmediting/pull/1488 +- @gaoyang07 made their first contribution in https://github.com/open-mmlab/mmagic/pull/1372 +- @ChangjianZhao made their first contribution in https://github.com/open-mmlab/mmagic/pull/1461 +- @zxczrx123 made their first contribution in https://github.com/open-mmlab/mmagic/pull/1462 +- @jackghosts made their first contribution in https://github.com/open-mmlab/mmagic/pull/1463 +- @liuwenran made their first contribution in https://github.com/open-mmlab/mmagic/pull/1410 +- @CCODING04 made their first contribution in https://github.com/open-mmlab/mmagic/pull/783 +- @RoseZhao929 made their first contribution in https://github.com/open-mmlab/mmagic/pull/1474 +- @shaocongliu made their first contribution in https://github.com/open-mmlab/mmagic/pull/1470 +- @liangzelong made their first contribution in https://github.com/open-mmlab/mmagic/pull/1488 ## v1.0.0rc3 (10/11/2022) @@ -240,7 +331,7 @@ We are excited to announce the release of MMEditing 1.0.0rc2. This release suppo **New Contributors** -- @gaoyang07 made their first contribution in https://github.com/open-mmlab/mmediting/pull/1372 +- @gaoyang07 made their first contribution in https://github.com/open-mmlab/mmagic/pull/1372 **Contributors** @@ -262,4 +353,4 @@ MMEditing 1.0.0rc0 is the first version of MMEditing 1.x, a part of the OpenMMLa Built upon the new [training engine](https://github.com/open-mmlab/mmengine), MMEditing 1.x unifies the interfaces of dataset, models, evaluation, and visualization. -And there are some BC-breaking changes. Please check [the migration tutorial](https://mmediting.readthedocs.io/en/latest/migration/overview.html) for more details. +And there are some BC-breaking changes. Please check [the migration tutorial](https://mmagic.readthedocs.io/en/latest/migration/overview.html) for more details. diff --git a/docs/en/get_started/install.md b/docs/en/get_started/install.md index 2e644a9368..2114176894 100644 --- a/docs/en/get_started/install.md +++ b/docs/en/get_started/install.md @@ -20,8 +20,8 @@ In this section, we demonstrate how to prepare an environment with PyTorch. MMagic works on Linux, Windows, and macOS. It requires: - Python >= 3.6 -- [PyTorch](https://pytorch.org/) >= 1.5 -- [MMCV](https://github.com/open-mmlab/mmcv) >= 2.0.0rc1 +- [PyTorch](https://pytorch.org/) >= 1.8 +- [MMCV](https://github.com/open-mmlab/mmcv) >= 2.0.0 > @@ -65,6 +65,12 @@ mim install 'mmcv>=2.0.0' **Step 1.** Install [MMEngine](https://github.com/open-mmlab/mmengine). +```shell +mim install 'mmengine' +``` + +Or + ```shell pip install git+https://github.com/open-mmlab/mmengine.git ``` @@ -84,7 +90,7 @@ Verification. ```shell cd ~ python -c "import mmagic; print(mmagic.__version__)" -# Example output: 1.0.0rc1 +# Example output: 1.0.0 ``` The installation is successful if the version number is output correctly. diff --git a/docs/en/migration/amp.md b/docs/en/migration/amp.md index 5a186d6b2a..89e3d7781e 100644 --- a/docs/en/migration/amp.md +++ b/docs/en/migration/amp.md @@ -5,7 +5,7 @@ Instead, users must use `auto_fp16` decorator to warp the specific submodule and This allows for fine-grained control of the model parameters, but is more cumbersome to use. In addition, users need to handle operations such as scaling of the loss function during the training process by themselves. -In 1.x version, MMEditing use `AmpOptimWrapper` provided by MMEngine. +MMagic 1.x use `AmpOptimWrapper` provided by MMEngine. In `AmpOptimWrapper.update_params`, gradient scaling and `GradScaler` updating is automatically performed. And in `optim_context` context manager, `auto_cast` is applied to the entire forward process. diff --git a/docs/en/migration/data.md b/docs/en/migration/data.md index b91758d1c8..d534391932 100644 --- a/docs/en/migration/data.md +++ b/docs/en/migration/data.md @@ -8,10 +8,10 @@ This section introduces the migration of data settings: ## Data pipelines -We update data pipelines settings in MMEdit 1.x. Important modifications are as following. +We update data pipelines settings in MMagic 1.x. Important modifications are as following. - 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`. +- The original formatting transforms pipelines `Collect` and `ToTensor` are combined as `PackInputs`. More details of data pipelines are shown in [transform guides](../howto/transforms.md). @@ -114,7 +114,7 @@ train_pipeline = [ # Training data processing pipeline keys=['lq', 'gt'], # Images to be transposed transpose_ratio=0.5 # Transpose ratio ), - dict(type='PackEditInputs') # The config of collecting data from current pipeline + dict(type='PackInputs') # The config of collecting data from current pipeline ] test_pipeline = [ # Test pipeline dict(type='LoadImageFromFile', # Load images from files @@ -127,7 +127,7 @@ test_pipeline = [ # Test pipeline color_type='color', # Color type of image channel_order='rgb', # Channel order of image imdecode_backend='cv2'), # decode backend - dict(type='PackEditInputs') # The config of collecting data from current pipeline + dict(type='PackInputs') # The config of collecting data from current pipeline ] ``` @@ -139,7 +139,7 @@ test_pipeline = [ # Test pipeline ## Dataloader -We update dataloader settings in MMEdit 1.x. Important modifications are as following. +We update dataloader settings in MMagic 1.x. Important modifications are as following. - The original `data` field is split to `train_dataloader`, `val_dataloader` and `test_dataloader`. This allows us to configure them in fine-grained. For example, you can specify different sampler and batch size during training and test. - The `samples_per_gpu` is renamed to `batch_size`. diff --git a/docs/en/migration/distributed_train.md b/docs/en/migration/distributed_train.md index 8ac003ffb2..2bec319093 100644 --- a/docs/en/migration/distributed_train.md +++ b/docs/en/migration/distributed_train.md @@ -1,6 +1,6 @@ # Migration of Distributed Training Settings -We have merged [MMGeneration 1.x](https://github.com/open-mmlab/mmgeneration/tree/1.x) into MMEditing. Here is migration of Distributed Training Settings about MMGeneration. +We have merged [MMGeneration 1.x](https://github.com/open-mmlab/mmgeneration/tree/1.x) into MMagic. Here is migration of Distributed Training Settings about MMGeneration. In 0.x version, MMGeneration uses `DDPWrapper` and `DynamicRunner` to train static and dynamic model (e.g., PGGAN and StyleGANv2) respectively. In 1.x version, we use `MMSeparateDistributedDataParallel` provided by MMEngine to implement distributed training. diff --git a/docs/en/migration/eval_test.md b/docs/en/migration/eval_test.md index f6d7e2ddbe..03fde1486b 100644 --- a/docs/en/migration/eval_test.md +++ b/docs/en/migration/eval_test.md @@ -1,6 +1,6 @@ # Migration of Evaluation and Testing Settings -We update evaluation settings in MMEdit 1.x. Important modifications are as following. +We update evaluation settings in MMagic 1.x. Important modifications are as following. - The evaluation field is split to `val_evaluator` and `test_evaluator`. The `interval` is moved to `train_cfg.val_interval`. - The metrics to evaluation are moved from `test_cfg` to `val_evaluator` and `test_evaluator`. @@ -48,7 +48,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. +We have merged [MMGeneration 1.x](https://github.com/open-mmlab/mmgeneration/tree/1.x) into MMagic. 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](./schedule.md) and the `save_best` is moved to `default_hooks.checkpoint.save_best`. @@ -145,8 +145,8 @@ train_cfg = dict( max_iters=1000000, # max training iteration val_begin=1, val_interval=10000) # evaluation interval -val_cfg = dict(type='GenValLoop') # specific loop in validation -test_cfg = dict(type='GenTestLoop') # specific loop in testing +val_cfg = dict(type='EditValLoop') # specific loop in validation +test_cfg = dict(type='EditTestLoop') # specific loop in testing ```
    -We refactor models in MMEdit 1.x. Important modifications are as following. +We refactor models in MMagic 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`. +- The `models` in MMagic 1.x is refactored to six parts: `archs`, `base_models`, `data_preprocessors`, `editors`, `diffusion_schedulers` 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](../howto/models.md). diff --git a/docs/en/migration/optimizers.md b/docs/en/migration/optimizers.md index 0f4f8fc139..bab79ca63d 100644 --- a/docs/en/migration/optimizers.md +++ b/docs/en/migration/optimizers.md @@ -1,6 +1,6 @@ # Migration of Optimizers -We have merged [MMGeneration 1.x](https://github.com/open-mmlab/mmgeneration/tree/1.x) into MMEditing. Here is migration of Optimizers about MMGeneration. +We have merged [MMGeneration 1.x](https://github.com/open-mmlab/mmgeneration/tree/1.x) into MMagic. Here is migration of Optimizers about MMGeneration. In version 0.x, MMGeneration uses PyTorch's native Optimizer, which only provides general parameter optimization. In version 1.x, we use `OptimizerWrapper` provided by MMEngine. diff --git a/docs/en/migration/overview.md b/docs/en/migration/overview.md index b4e71473f3..3f2c593678 100644 --- a/docs/en/migration/overview.md +++ b/docs/en/migration/overview.md @@ -7,19 +7,15 @@ 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](../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. -3. [rich](https://github.com/Textualize/rich): A terminal formatting package, and we use it to beautify some outputs in the terminal. +MMagic 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). ## Overall structures -We refactor overall structures in MMEdit 1.x as following. +We refactor overall structures in MMagic 1.x as following. - The `core` in the old versions of MMEdit is split into `engine`, `evaluation`, `structures`, and `visualization` - The `pipelines` of `datasets` in the old versions of MMEdit is refactored to `transforms` -- The `models` in MMedit 1.x is refactored to five parts: `base_models`, `data_preprocessors`, `editors`, `layers` and `losses`. +- The `models` in MMagic 1.x is refactored to six parts: `archs`, `base_models`, `data_preprocessors`, `editors`, `diffusion_schedulers` and `losses`. ## Other config settings diff --git a/docs/en/migration/runtime.md b/docs/en/migration/runtime.md index e024b43776..d9b708e07c 100644 --- a/docs/en/migration/runtime.md +++ b/docs/en/migration/runtime.md @@ -1,6 +1,6 @@ # Migration of Runtime Settings -We update runtime settings in MMEdit 1.x. Important modifications are as following. +We update runtime settings in MMagic 1.x. Important modifications are as following. - The `checkpoint_config` is moved to `default_hooks.checkpoint` and the `log_config` is moved to `default_hooks.logger`. And we move many hooks settings from the script code to the `default_hooks` field in the runtime configuration. - The `resume_from` is removed. And we use `resume` to replace it. diff --git a/docs/en/migration/schedule.md b/docs/en/migration/schedule.md index e5c3016435..0d90bbe9dc 100644 --- a/docs/en/migration/schedule.md +++ b/docs/en/migration/schedule.md @@ -1,6 +1,6 @@ # Migration of Schedule Settings -We update schedule settings in MMEdit 1.x. Important modifications are as following. +We update schedule settings in MMagic 1.x. Important modifications are as following. - Now we use `optim_wrapper` field to specify all configuration about the optimization process. And the `optimizer` is a sub field of `optim_wrapper` now. - The `lr_config` field is removed and we use new `param_scheduler` to replace it. diff --git a/docs/zh_cn/changelog.md b/docs/zh_cn/changelog.md index 70b36b263f..4667990c29 100644 --- a/docs/zh_cn/changelog.md +++ b/docs/zh_cn/changelog.md @@ -1,5 +1,96 @@ # 变更日志 +## v1.0.0 (25/04/2023) + +我们正式发布 MMagic v1.0.0 版本,源自 [MMEditing](https://github.com/open-mmlab/mmediting) 和 [MMGeneration](https://github.com/open-mmlab/mmgeneration)。 + +![mmagic-log](https://user-images.githubusercontent.com/49083766/233557648-9034f5a0-c85d-4092-b700-3a28072251b6.png) + +自从 MMEditing 诞生以来,它一直是许多图像超分辨率、编辑和生成任务的首选算法库,帮助多个研究团队取得 10 余 项国际顶级赛事的胜利,支撑了 100 多个 GitHub 生态项目。经过 OpenMMLab 2.0 框架的迭代更新以及与 MMGeneration 的合并,MMEditing 已经成为了一个支持基于 GAN 和 CNN 的底层视觉算法的强大工具。 + +而今天,MMEditing 将拥抱 Diffusion Model(扩散模型),正式更名为 **MMagic**(**M**ultimodal **A**dvanced, **G**enerative, and **I**ntelligent **C**reation),转化为更为先进、全面的 AIGC 开源算法库。 + +在 MMagic 中,我们已经支持了 53+ 模型,分布于 Stable Diffusion 的微调、图文生成、图像及视频修复、超分辨率、编辑和生成等多种任务。配合 [MMEngine](https://github.com/open-mmlab/mmengine) 出色的训练与实验管理支持,MMagic 将为广大研究者与 AIGC 爱好者们提供更加快捷灵活的实验支持,助力你的 AIGC 探索之旅。使用 MMagic,体验更多生成的魔力!让我们一起开启超越编辑的新纪元! More than Editing, Unlock the Magic! + +**主要更新** + +**1. 新算法** + +我们支持了4个新任务以及11个新算法。 + +- Text2Image / Diffusion + - ControlNet + - DreamBooth + - Stable Diffusion + - Disco Diffusion + - GLIDE + - Guided Diffusion +- 3D-aware Generation + - EG3D +- Image Restoration + - NAFNet + - Restormer + - SwinIR +- Image Colorization + - InstColorization + +https://user-images.githubusercontent.com/49083766/233564593-7d3d48ed-e843-4432-b610-35e3d257765c.mp4 + +**2. Magic Diffusion Model** + +针对 Diffusion Model,我们提供了以下“魔法” + +- 支持基于 Stable Diffusion 与 Disco Diffusion 的图像生成. + +- 支持 Dreambooth 以及 DreamBooth LoRA 等 Finetune 方法. + +- 支持 ControlNet 进行可控性的文本到图像生成. + ![de87f16f-bf6d-4a61-8406-5ecdbb9167b6](https://user-images.githubusercontent.com/49083766/233558077-2005e603-c5a8-49af-930f-e7a465ca818b.png) + +- 支持 xFormers 加速和优化策略,提高训练与推理效率. + +- 支持基于 MultiFrame Render 的视频生成. + MMagic 支持通过 ControlNet 与多帧渲染法实现长视频的生成。 + prompt key words: a handsome man, silver hair, smiling, play basketball + + https://user-images.githubusercontent.com/12782558/227149757-fd054d32-554f-45d5-9f09-319184866d85.mp4 + + prompt key words: a girl, black hair, white pants, smiling, play basketball + + https://user-images.githubusercontent.com/49083766/233559964-bd5127bd-52f6-44b6-a089-9d7adfbc2430.mp4 + + prompt key words: a handsome man + + https://user-images.githubusercontent.com/12782558/227152129-d70d5f76-a6fc-4d23-97d1-a94abd08f95a.mp4 + +- 支持通过 Wrapper 调用 Diffusers 的基础模型以及采样策略. + +- SAM + MMagic = Generate Anything! + 当下流行的 SAM(Segment Anything Model)也可以为 MMagic 提供更多加持!想制作自己的动画,可以移步至 [OpenMMLab PlayGround](https://github.com/open-mmlab/playground/blob/main/mmediting_sam/README.md)! + + https://user-images.githubusercontent.com/49083766/233562228-f39fc675-326c-4ae8-986a-c942059effd0.mp4 + +**3. 框架升级** + +为了提升你的“施法”效率,我们对“魔术回路”做了以下升级: + +- 通过 OpenMMLab 2.0 框架的 MMEngine 和 MMCV, MMagic 将编辑框架分解为不同的组件,并且可以通过组合不同的模块轻松地构建自定义的编辑器模型。我们可以像搭建“乐高”一样定义训练流程,提供丰富的组件和策略。在 MMagic 中,你可以使用不同的 APIs 完全控制训练流程. +- 支持 33+ 算法 Pytorch 2.0 加速. +- 重构 DataSample,支持 batch 维度的组合与拆分. +- 重构 DataPreprocessor,并统一各种任务在训练与推理时的数据格式. +- 重构 MultiValLoop 与 MultiTestLoop,同时支持生成类型指标(e.g. FID)与重建类型指标(e.g. SSIM) 的评测,同时支持一次性评测多个数据集 +- 支持本地可视化以及使用 tensorboard 或 wandb的可视化. + +**新功能和改进** + +- 支持 53+ 算法,232+ 配置,213+ 模型权重,26+ 损失函数,and 20+ 评价指标. +- 支持 controlnet 动画生成以及 Gradio gui. [点击查看.](https://github.com/open-mmlab/mmagic/tree/main/configs/controlnet_animation) +- 支持 Inferencer 和 Demo,使用High-level Inference APIs. [点击查看.](https://github.com/open-mmlab/mmagic/tree/main/demo) +- 支持 Inpainting 推理的 Gradio gui. [点击查看.](https://github.com/open-mmlab/mmagic/blob/main/demo/gradio-demo.py) +- 支持可视化图像/视频质量比较工具. [点击查看.](https://github.com/open-mmlab/mmagic/tree/main/tools/gui) +- 开启 projects,助力社区更快向算法库中添加新算法. [点击查看.](https://github.com/open-mmlab/mmagic/tree/main/projects) +- 完善数据集的预处理脚本和使用说明文档. [点击查看.](https://github.com/open-mmlab/mmagic/tree/main/tools/dataset_converters) + ## v1.0.0rc7 (07/04/2023) **主要更新** @@ -12,19 +103,19 @@ **新功能和改进** -- 支持了 DiffuserWrapper. [#1692](https://github.com/open-mmlab/mmediting/pull/1692) -- 支持了 ControlNet 的推理与训练. [#1744](https://github.com/open-mmlab/mmediting/pull/1744) -- 支持了 PyTorch 2.0 (使用 'inductor' 后端成功编译 33+ 模型) [#1742](https://github.com/open-mmlab/mmediting/pull/1742). -- 支持了图像超分和视频超分的 inferencer. [#1662](https://github.com/open-mmlab/mmediting/pull/1662), [#1720](https://github.com/open-mmlab/mmediting/pull/1720) -- 重构 get_flops 脚本. [#1675](https://github.com/open-mmlab/mmediting/pull/1675) -- 重构数据集的 dataset_converters 脚本和使用文档. [#1690](https://github.com/open-mmlab/mmediting/pull/1690) -- 迁移 stylegan 算子到 MMCV 中. [#1383](https://github.com/open-mmlab/mmediting/pull/1383) +- 支持了 DiffuserWrapper. [#1692](https://github.com/open-mmlab/mmagic/pull/1692) +- 支持了 ControlNet 的推理与训练. [#1744](https://github.com/open-mmlab/mmagic/pull/1744) +- 支持了 PyTorch 2.0 (使用 'inductor' 后端成功编译 33+ 模型) [#1742](https://github.com/open-mmlab/mmagic/pull/1742). +- 支持了图像超分和视频超分的 inferencer. [#1662](https://github.com/open-mmlab/mmagic/pull/1662), [#1720](https://github.com/open-mmlab/mmagic/pull/1720) +- 重构 get_flops 脚本. [#1675](https://github.com/open-mmlab/mmagic/pull/1675) +- 重构数据集的 dataset_converters 脚本和使用文档. [#1690](https://github.com/open-mmlab/mmagic/pull/1690) +- 迁移 stylegan 算子到 MMCV 中. [#1383](https://github.com/open-mmlab/mmagic/pull/1383) **Bug 修复** -- 修复 disco inferencer. [#1673](https://github.com/open-mmlab/mmediting/pull/1673) -- 修复 nafnet optimizer 配置. [#1716](https://github.com/open-mmlab/mmediting/pull/1716) -- 修复 tof typo. [#1711](https://github.com/open-mmlab/mmediting/pull/1711) +- 修复 disco inferencer. [#1673](https://github.com/open-mmlab/mmagic/pull/1673) +- 修复 nafnet optimizer 配置. [#1716](https://github.com/open-mmlab/mmagic/pull/1716) +- 修复 tof typo. [#1711](https://github.com/open-mmlab/mmagic/pull/1711) **贡献者** @@ -41,30 +132,30 @@ **新功能和改进** -- 重构了 FileIO. [#1572](https://github.com/open-mmlab/mmediting/pull/1572) -- 重构了 registry. [#1621](https://github.com/open-mmlab/mmediting/pull/1621) -- 重构了 Random degradations. [#1583](https://github.com/open-mmlab/mmediting/pull/1583) -- 重构了 DataSample, DataPreprocessor, Metric 和 Loop. [#1656](https://github.com/open-mmlab/mmediting/pull/1656) -- 使用 mmengine.basemodule 替换 nn.module. [#1491](https://github.com/open-mmlab/mmediting/pull/1491) -- 重构了算法库主页. [#1609](https://github.com/open-mmlab/mmediting/pull/1609) -- 支持了 Inpainting 任务推理的 Gradio gui. [#1601](https://github.com/open-mmlab/mmediting/pull/1601) -- 支持了图像上色的 inferencer. [#1588](https://github.com/open-mmlab/mmediting/pull/1588) -- 支持了图像翻译和所有 GAN 模型的 inferencer. [#1650](https://github.com/open-mmlab/mmediting/pull/1650) -- 支持了 GAN 模型的 inferencer. [#1653](https://github.com/open-mmlab/mmediting/pull/1653), [#1659](https://github.com/open-mmlab/mmediting/pull/1659) -- 新增 Print config 工具. [#1590](https://github.com/open-mmlab/mmediting/pull/1590) -- 改进 type hints. [#1604](https://github.com/open-mmlab/mmediting/pull/1604) -- 更新 metrics 和 datasets 的中文文档. [#1568](https://github.com/open-mmlab/mmediting/pull/1568), [#1638](https://github.com/open-mmlab/mmediting/pull/1638) -- 更新 BigGAN 和 Disco-Diffusion 的中文文档. [#1620](https://github.com/open-mmlab/mmediting/pull/1620) -- 更新 Guided-Diffusion 的 Evaluation 和 README. [#1547](https://github.com/open-mmlab/mmediting/pull/1547) +- 重构了 FileIO. [#1572](https://github.com/open-mmlab/mmagic/pull/1572) +- 重构了 registry. [#1621](https://github.com/open-mmlab/mmagic/pull/1621) +- 重构了 Random degradations. [#1583](https://github.com/open-mmlab/mmagic/pull/1583) +- 重构了 DataSample, DataPreprocessor, Metric 和 Loop. [#1656](https://github.com/open-mmlab/mmagic/pull/1656) +- 使用 mmengine.basemodule 替换 nn.module. [#1491](https://github.com/open-mmlab/mmagic/pull/1491) +- 重构了算法库主页. [#1609](https://github.com/open-mmlab/mmagic/pull/1609) +- 支持了 Inpainting 任务推理的 Gradio gui. [#1601](https://github.com/open-mmlab/mmagic/pull/1601) +- 支持了图像上色的 inferencer. [#1588](https://github.com/open-mmlab/mmagic/pull/1588) +- 支持了图像翻译和所有 GAN 模型的 inferencer. [#1650](https://github.com/open-mmlab/mmagic/pull/1650) +- 支持了 GAN 模型的 inferencer. [#1653](https://github.com/open-mmlab/mmagic/pull/1653), [#1659](https://github.com/open-mmlab/mmagic/pull/1659) +- 新增 Print config 工具. [#1590](https://github.com/open-mmlab/mmagic/pull/1590) +- 改进 type hints. [#1604](https://github.com/open-mmlab/mmagic/pull/1604) +- 更新 metrics 和 datasets 的中文文档. [#1568](https://github.com/open-mmlab/mmagic/pull/1568), [#1638](https://github.com/open-mmlab/mmagic/pull/1638) +- 更新 BigGAN 和 Disco-Diffusion 的中文文档. [#1620](https://github.com/open-mmlab/mmagic/pull/1620) +- 更新 Guided-Diffusion 的 Evaluation 和 README. [#1547](https://github.com/open-mmlab/mmagic/pull/1547) **Bug 修复** -- 修复 EMA `momentum`. [#1581](https://github.com/open-mmlab/mmediting/pull/1581) -- 修复 RandomNoise 的输出类型. [#1585](https://github.com/open-mmlab/mmediting/pull/1585) -- 修复 pytorch2onnx 工具. [#1629](https://github.com/open-mmlab/mmediting/pull/1629) -- 修复 API 文档. [#1641](https://github.com/open-mmlab/mmediting/pull/1641), [#1642](https://github.com/open-mmlab/mmediting/pull/1642) -- 修复 RealESRGAN 加载 EMA 参数. [#1647](https://github.com/open-mmlab/mmediting/pull/1647) -- 修复 dataset_converters 脚本的 arg passing bug. [#1648](https://github.com/open-mmlab/mmediting/pull/1648) +- 修复 EMA `momentum`. [#1581](https://github.com/open-mmlab/mmagic/pull/1581) +- 修复 RandomNoise 的输出类型. [#1585](https://github.com/open-mmlab/mmagic/pull/1585) +- 修复 pytorch2onnx 工具. [#1629](https://github.com/open-mmlab/mmagic/pull/1629) +- 修复 API 文档. [#1641](https://github.com/open-mmlab/mmagic/pull/1641), [#1642](https://github.com/open-mmlab/mmagic/pull/1642) +- 修复 RealESRGAN 加载 EMA 参数. [#1647](https://github.com/open-mmlab/mmagic/pull/1647) +- 修复 dataset_converters 脚本的 arg passing bug. [#1648](https://github.com/open-mmlab/mmagic/pull/1648) **贡献者** @@ -216,4 +307,4 @@ MMEditing 1.0.0rc0 是 MMEditing 1.x 的第一个版本,是 OpenMMLab 2.0 项 基于新的[训练引擎](https://github.com/open-mmlab/mmengine), MMEditing 1.x 统一了数据、模型、评测和可视化的接口。 -该版本存在有一些 BC-breaking 的修改。 请在[迁移指南](https://mmediting.readthedocs.io/zh_CN/latest/migration/overview.html)中查看更多细节。 +该版本存在有一些 BC-breaking 的修改。 请在[迁移指南](https://mmagic.readthedocs.io/zh_CN/latest/migration/overview.html)中查看更多细节。 diff --git a/mmagic/version.py b/mmagic/version.py index e3b0f62e14..2099b9dbf8 100644 --- a/mmagic/version.py +++ b/mmagic/version.py @@ -1,6 +1,6 @@ # Copyright (c) Open-MMLab. All rights reserved. -__version__ = '1.0.0rc7' +__version__ = '1.0.0' def parse_version_info(version_str): diff --git a/mmagic/visualization/vis_backend.py b/mmagic/visualization/vis_backend.py index c8f7136e59..fcc00bb625 100644 --- a/mmagic/visualization/vis_backend.py +++ b/mmagic/visualization/vis_backend.py @@ -164,7 +164,8 @@ def add_image(self, frames_list.append(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)) if not (image.shape[0] % n_skip == 0): frames_list.append(image[-1]) - imageio.mimsave(save_file_path, frames_list, 'GIF', fps=fps) + imageio.mimsave( + save_file_path, frames_list, 'GIF', duration=1000. / fps) else: raise ValueError( 'Only support visualize image with dimension of 3 or 4. But ' From 4777c46d6292123d4b062a89bd6218226443cc37 Mon Sep 17 00:00:00 2001 From: rangoliu Date: Mon, 24 Apr 2023 17:01:02 +0800 Subject: [PATCH 35/42] [Remove] remove old demos (#1796) remove old demos Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> --- demo/README.md | 14 - demo/colorization_demo.py | 43 - demo/conditional_demo.py | 130 -- demo/inpainting_demo.py | 44 - demo/matting_demo.py | 42 - demo/matting_tutorial.ipynb | 1559 ----------------- demo/restoration_demo.py | 61 - demo/restoration_face_demo.py | 61 - demo/restoration_video_demo.py | 89 - demo/restorer_basic_tutorial.ipynb | 1 - demo/restorer_basic_tutorial_zh-CN.ipynb | 1 - demo/translation_demo.py | 60 - demo/unconditional_demo.py | 83 - demo/video_interpolation_demo.py | 88 - mmagic/apis/__init__.py | 18 +- mmagic/apis/inferencers/__init__.py | 25 +- .../apis/inferencers/inference_functions.py | 721 +------- .../test_inference_functions.py | 297 +--- 18 files changed, 10 insertions(+), 3327 deletions(-) delete mode 100644 demo/colorization_demo.py delete mode 100644 demo/conditional_demo.py delete mode 100644 demo/inpainting_demo.py delete mode 100644 demo/matting_demo.py delete mode 100644 demo/matting_tutorial.ipynb delete mode 100644 demo/restoration_demo.py delete mode 100644 demo/restoration_face_demo.py delete mode 100644 demo/restoration_video_demo.py delete mode 100644 demo/restorer_basic_tutorial.ipynb delete mode 100644 demo/restorer_basic_tutorial_zh-CN.ipynb delete mode 100644 demo/translation_demo.py delete mode 100644 demo/unconditional_demo.py delete mode 100644 demo/video_interpolation_demo.py diff --git a/demo/README.md b/demo/README.md index 2c12d53eaa..d7d031f7fe 100644 --- a/demo/README.md +++ b/demo/README.md @@ -191,17 +191,3 @@ python demo/mmediting_inference_demo.py \ --model-name eg3d \ --result-out-dir ../resources/output/eg3d-output ``` - -## 3. Other demos - -These demos are duplicated with mmedting_inference_demo.py and may be removed in the future. - -- [colorization_demo.py](./colorization_demo.py) -- [conditional_demo.py](./conditional_demo.py) -- [inpainting_demo.py](./inpainting_demo.py) -- [matting_demo.py](./matting_demo.py) -- [restoration_demo.py](./restoration_demo.py) -- [restoration_video_demo.py](./restoration_video_demo.py) -- [translation_demo.py](./translation_demo.py) -- [unconditional_demo.py](./unconditional_demo.py) -- [video_interpolation_demo.py](./video_interpolation_demo.py) diff --git a/demo/colorization_demo.py b/demo/colorization_demo.py deleted file mode 100644 index 0c30c6047f..0000000000 --- a/demo/colorization_demo.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -import argparse - -import mmcv -import torch - -from mmagic.apis import colorization_inference, init_model -from mmagic.utils import modify_args, tensor2img - - -def parse_args(): - modify_args() - parser = argparse.ArgumentParser(description='Colorzation demo') - parser.add_argument('config', help='test config file path') - parser.add_argument('checkpoints', help='checkpoints file path') - parser.add_argument('img_path', help='path to input image file') - parser.add_argument('save_path', help='path to save generation result') - parser.add_argument( - '--imshow', action='store_true', help='whether show image with opencv') - parser.add_argument('--device', type=int, default=0, help='CUDA device id') - args = parser.parse_args() - return args - - -def main(): - args = parse_args() - - if args.device < 0 or not torch.cuda.is_available(): - device = torch.device('cpu') - else: - device = torch.device('cuda', args.device) - - model = init_model(args.config, args.checkpoints, device=device) - output = colorization_inference(model, args.img_path) - result = tensor2img(output) - mmcv.imwrite(result, args.save_path) - - if args.imshow: - mmcv.imshow(output, 'predicted generation result') - - -if __name__ == '__main__': - main() diff --git a/demo/conditional_demo.py b/demo/conditional_demo.py deleted file mode 100644 index 4b81419246..0000000000 --- a/demo/conditional_demo.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -import argparse -import os -import sys - -import mmengine -from mmengine import DictAction -from torchvision import utils - -# yapf: disable -sys.path.append(os.path.abspath(os.path.join(__file__, '../..'))) # isort:skip # noqa - -from mmagic.apis import init_model, sample_conditional_model # isort:skip # noqa -# yapf: enable - - -def parse_args(): - parser = argparse.ArgumentParser(description='Generation demo') - parser.add_argument('config', help='test config file path') - parser.add_argument('checkpoint', help='checkpoint file') - parser.add_argument( - '--save-path', - type=str, - default='./work_dirs/demos/conditional_samples.png', - help='path to save unconditional samples') - parser.add_argument( - '--device', type=str, default='cuda:0', help='CUDA device id') - - # args for inference/sampling - parser.add_argument( - '--num-batches', type=int, default=4, help='Batch size in inference') - parser.add_argument( - '--samples-per-classes', - type=int, - default=5, - help=('This argument work together with `label`, and decide the ' - 'number of samples to generate for each class in the given ' - '`label`. If `label` is not given, samples-per-classes would ' - 'be regard as the total number of the images to sample.')) - parser.add_argument( - '--label', - type=int, - nargs='+', - help=('Labels want to sample. If not defined, ' - 'random sampling would be applied.')) - parser.add_argument( - '--sample-all-classes', - action='store_true', - help='Whether sample all classes of the dataset.') - - parser.add_argument( - '--sample-model', - type=str, - default='ema', - help='Which model to use for sampling') - parser.add_argument( - '--sample-cfg', - nargs='+', - action=DictAction, - help='Other customized kwargs for sampling function') - - # args for image grid - parser.add_argument( - '--padding', type=int, default=0, help='Padding in the image grid.') - parser.add_argument( - '--nrow', - type=int, - default=6, - help=('Number of images displayed in each row of the grid. ' - 'This argument would work only when label is not given.')) - - args = parser.parse_args() - return args - - -def main(): - args = parse_args() - model = init_model( - args.config, checkpoint=args.checkpoint, device=args.device) - - if args.sample_cfg is None: - args.sample_cfg = dict() - - if args.label is None and not args.sample_all_classes: - label = None - num_samples, nrow = args.samples_per_classes, args.nrow - mmengine.print_log('`label` is not passed, code would randomly sample ' - f'`samples-per-classes` (={num_samples}) images.') - else: - if args.sample_all_classes: - mmengine.print_log( - '`sample_all_classes` is set as True, `num-samples`, `label`, ' - 'and `nrows` would be ignored.') - - # get num_classes - if hasattr(model, 'num_classes') and model.num_classes is not None: - num_classes = model.num_classes - else: - raise AttributeError( - 'Cannot get attribute `num_classes` from ' - f'{type(model)}. Please check your config.') - # build label list - meta_labels = [idx for idx in range(num_classes)] - else: - # get unique label - meta_labels = list(set(args.label)) - meta_labels.sort() - - # generate label to sample - label = [] - for idx in meta_labels: - label += [idx] * args.samples_per_classes - num_samples = len(label) - nrow = args.samples_per_classes - - mmengine.print_log('Set `nrows` as number of samples for each class ' - f'(={args.samples_per_classes}).') - - results = sample_conditional_model(model, num_samples, args.num_batches, - args.sample_model, label, - **args.sample_cfg) - results = (results[:, [2, 1, 0]] + 1.) / 2. - - # save images - mmengine.mkdir_or_exist(os.path.dirname(args.save_path)) - utils.save_image(results, args.save_path, nrow=nrow, padding=args.padding) - - -if __name__ == '__main__': - main() diff --git a/demo/inpainting_demo.py b/demo/inpainting_demo.py deleted file mode 100644 index ada598e397..0000000000 --- a/demo/inpainting_demo.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -import argparse - -import mmcv -import torch - -from mmagic.apis import init_model, inpainting_inference -from mmagic.utils import tensor2img - - -def parse_args(): - parser = argparse.ArgumentParser(description='Inpainting demo') - parser.add_argument('config', help='test config file path') - parser.add_argument('checkpoint', help='checkpoint file') - parser.add_argument('masked_img_path', help='path to input image file') - parser.add_argument('mask_path', help='path to input mask file') - parser.add_argument('save_path', help='path to save inpainting result') - parser.add_argument( - '--imshow', action='store_true', help='whether show image with opencv') - parser.add_argument('--device', type=int, default=0, help='CUDA device id') - args = parser.parse_args() - return args - - -def main(): - args = parse_args() - - if args.device < 0 or not torch.cuda.is_available(): - device = torch.device('cpu') - else: - device = torch.device('cuda', args.device) - - model = init_model(args.config, args.checkpoint, device=device) - - result = inpainting_inference(model, args.masked_img_path, args.mask_path) - result = tensor2img(result)[..., ::-1] - - mmcv.imwrite(result, args.save_path) - if args.imshow: - mmcv.imshow(result, 'predicted inpainting result') - - -if __name__ == '__main__': - main() diff --git a/demo/matting_demo.py b/demo/matting_demo.py deleted file mode 100644 index a139b89d0d..0000000000 --- a/demo/matting_demo.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -import argparse - -import mmcv -import torch - -from mmagic.apis import init_model, matting_inference - - -def parse_args(): - parser = argparse.ArgumentParser(description='Matting demo') - parser.add_argument('config', help='test config file path') - parser.add_argument('checkpoint', help='checkpoint file') - parser.add_argument('img_path', help='path to input image file') - parser.add_argument('trimap_path', help='path to input trimap file') - parser.add_argument('save_path', help='path to save alpha matte result') - parser.add_argument( - '--imshow', action='store_true', help='whether show image with opencv') - parser.add_argument('--device', type=int, default=0, help='CUDA device id') - args = parser.parse_args() - return args - - -def main(): - args = parse_args() - - if args.device < 0 or not torch.cuda.is_available(): - device = torch.device('cpu') - else: - device = torch.device('cuda', args.device) - - model = init_model(args.config, args.checkpoint, device=device) - - pred_alpha = matting_inference(model, args.img_path, args.trimap_path) - - mmcv.imwrite(pred_alpha, args.save_path) - if args.imshow: - mmcv.imshow(pred_alpha, 'predicted alpha matte') - - -if __name__ == '__main__': - main() diff --git a/demo/matting_tutorial.ipynb b/demo/matting_tutorial.ipynb deleted file mode 100644 index 45757e652e..0000000000 --- a/demo/matting_tutorial.ipynb +++ /dev/null @@ -1,1559 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "cfzQr7x-V4QI" - }, - "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmediting/blob/master/demo/matting_tutorial.ipynb)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "A9VoEGTL_R50" - }, - "source": [ - "# MMEditing Tutorial-Matting\n", - "\n", - "Welcome to MMEditing! This is the official colab tutorial for using MMEditing for matting task. In this tutorial, you will learn to\n", - "\n", - "* perform inference with a MMEditing mattor,\n", - "* train a new mattor with a new dataset.\n", - "\n", - "Let's start!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-R6v39d__uJl" - }, - "source": [ - "## Install MMEditing" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch 1.10.0+cu111\n", - "torchaudio 0.10.0+cu111\n", - "torchsummary 1.5.1\n", - "torchtext 0.11.0\n", - "torchvision 0.11.1+cu111\n" - ] - } - ], - "source": [ - "# Check PyTorch version\n", - "!pip list | grep torch" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting openmim\n", - " Downloading openmim-0.1.5.tar.gz (35 kB)\n", - "Requirement already satisfied: Click==7.1.2 in /usr/local/lib/python3.7/dist-packages (from openmim) (7.1.2)\n", - "Collecting colorama\n", - " Downloading colorama-0.4.4-py2.py3-none-any.whl (16 kB)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from openmim) (2.23.0)\n", - "Collecting model-index\n", - " Downloading model_index-0.1.11-py3-none-any.whl (34 kB)\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from openmim) (1.3.5)\n", - "Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from openmim) (0.8.9)\n", - "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from model-index->openmim) (3.13)\n", - "Collecting ordered-set\n", - " Downloading ordered_set-4.1.0-py3-none-any.whl (7.6 kB)\n", - "Requirement already satisfied: markdown in /usr/local/lib/python3.7/dist-packages (from model-index->openmim) (3.3.6)\n", - "Requirement already satisfied: importlib-metadata>=4.4 in /usr/local/lib/python3.7/dist-packages (from markdown->model-index->openmim) (4.11.2)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=4.4->markdown->model-index->openmim) (3.7.0)\n", - "Requirement already satisfied: typing-extensions>=3.6.4 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=4.4->markdown->model-index->openmim) (3.10.0.2)\n", - "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas->openmim) (2018.9)\n", - "Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.7/dist-packages (from pandas->openmim) (1.21.5)\n", - "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas->openmim) (2.8.2)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas->openmim) (1.15.0)\n", - "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->openmim) (2.10)\n", - "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->openmim) (3.0.4)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->openmim) (1.24.3)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->openmim) (2021.10.8)\n", - "Building wheels for collected packages: openmim\n", - " Building wheel for openmim (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for openmim: filename=openmim-0.1.5-py2.py3-none-any.whl size=42503 sha256=73c8fbdde5bccccc5f7f988b130ae680165893e05d4f16d503bd79b64dd144d4\n", - " Stored in directory: /root/.cache/pip/wheels/16/8b/e1/bdebbbc687aa50224a5ce46fe97a040a0c59f92b34bfc750b6\n", - "Successfully built openmim\n", - "Installing collected packages: ordered-set, model-index, colorama, openmim\n", - "Successfully installed colorama-0.4.4 model-index-0.1.11 openmim-0.1.5 ordered-set-4.1.0\n", - "installing mmcv-full from wheel.\n", - "Looking in links: https://download.openmmlab.com/mmcv/dist/cu111/torch1.10.0/index.html\n", - "Collecting mmcv-full==1.4.6\n", - " Downloading https://download.openmmlab.com/mmcv/dist/cu111/torch1.10.0/mmcv_full-1.4.6-cp37-cp37m-manylinux1_x86_64.whl (46.0 MB)\n", - "\u001b[K |████████████████████████████████| 46.0 MB 9.3 MB/s \n", - "\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.4.6) (7.1.2)\n", - "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.4.6) (3.13)\n", - "Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.4.6) (4.1.2.30)\n", - "Collecting yapf\n", - " Downloading yapf-0.32.0-py2.py3-none-any.whl (190 kB)\n", - "\u001b[K |████████████████████████████████| 190 kB 4.3 MB/s \n", - "\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.4.6) (1.21.5)\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.4.6) (21.3)\n", - "Collecting addict\n", - " Downloading addict-2.4.0-py3-none-any.whl (3.8 kB)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging->mmcv-full==1.4.6) (3.0.7)\n", - "Installing collected packages: yapf, addict, mmcv-full\n", - "Successfully installed addict-2.4.0 mmcv-full-1.4.6 yapf-0.32.0\n", - "\u001b[32mSuccessfully installed mmcv-full.\u001b[0m\n" - ] - } - ], - "source": [ - "# Install mmcv-full dependency via openmim\n", - "!pip install openmim\n", - "!mim install mmcv-full" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cloning into 'mmediting'...\n", - "remote: Enumerating objects: 10110, done.\u001b[K\n", - "remote: Counting objects: 100% (783/783), done.\u001b[K\n", - "remote: Compressing objects: 100% (486/486), done.\u001b[K\n", - "remote: Total 10110 (delta 365), reused 566 (delta 277), pack-reused 9327\u001b[K\n", - "Receiving objects: 100% (10110/10110), 6.05 MiB | 12.56 MiB/s, done.\n", - "Resolving deltas: 100% (6710/6710), done.\n", - "/content/mmediting\n", - "Obtaining file:///content/mmediting\n", - "Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.99)\n", - "Requirement already satisfied: mmcv-full>=1.3.1 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (1.4.6)\n", - "Requirement already satisfied: opencv-python<=4.5.4.60 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (4.1.2.30)\n", - "Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.18.3)\n", - "Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (2.8.0)\n", - "Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.13.0) (0.32.0)\n", - "Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (7.1.2)\n", - "Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (2.4.0)\n", - "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (3.13)\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (1.21.5)\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.3.1->mmedit==0.13.0) (21.3)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging->mmcv-full>=1.3.1->mmedit==0.13.0) (3.0.7)\n", - "Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.13.0) (3.2.2)\n", - "Requirement already satisfied: tifffile>=2019.7.26 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.13.0) (2021.11.2)\n", - "Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.13.0) (2.6.3)\n", - "Requirement already satisfied: scipy>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.13.0) (1.4.1)\n", - "Requirement already satisfied: PyWavelets>=1.1.1 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.13.0) (1.2.0)\n", - "Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.13.0) (2.4.1)\n", - "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.13.0) (2.8.2)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.13.0) (1.3.2)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.13.0) (0.11.0)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.1->matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.13.0) (1.15.0)\n", - "Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (57.4.0)\n", - "Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (1.0.0)\n", - "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (1.8.1)\n", - "Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (1.44.0)\n", - "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (1.0.1)\n", - "Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (3.17.3)\n", - "Requirement already satisfied: google-auth<3,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (1.35.0)\n", - "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (0.6.1)\n", - "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (3.3.6)\n", - "Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (0.37.1)\n", - "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (0.4.6)\n", - "Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.13.0) (2.23.0)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<3,>=1.6.3->tensorboard->mmedit==0.13.0) (0.2.8)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.7/dist-packages (from google-auth<3,>=1.6.3->tensorboard->mmedit==0.13.0) (4.8)\n", - "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<3,>=1.6.3->tensorboard->mmedit==0.13.0) (4.2.4)\n", - "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.13.0) (1.3.1)\n", - "Requirement already satisfied: importlib-metadata>=4.4 in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.13.0) (4.11.2)\n", - "Requirement already satisfied: typing-extensions>=3.6.4 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=4.4->markdown>=2.6.8->tensorboard->mmedit==0.13.0) (3.10.0.2)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=4.4->markdown>=2.6.8->tensorboard->mmedit==0.13.0) (3.7.0)\n", - "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard->mmedit==0.13.0) (0.4.8)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.13.0) (1.24.3)\n", - "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.13.0) (2.10)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.13.0) (2021.10.8)\n", - "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.13.0) (3.0.4)\n", - "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.13.0) (3.2.0)\n", - "Installing collected packages: mmedit\n", - " Running setup.py develop for mmedit\n", - "Successfully installed mmedit-0.13.0\n" - ] - } - ], - "source": [ - "# Install mmediting from source\n", - "!git clone https://github.com/open-mmlab/mmediting.git\n", - "%cd mmediting\n", - "!pip install -e ." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.13.0\n" - ] - } - ], - "source": [ - "# Check MMEditing installation\n", - "import mmedit\n", - "print(mmedit.__version__)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "a-3YqEpeF9R6" - }, - "source": [ - "## Perform inference with a MMEditing mattor\n", - "\n", - "MMEditing already provides high level APIs to do inference and training." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--------------------------------------------------------------------------------\n", - "config id: indexnet_mobv2_1x16_78k_comp1k\n", - "architecture indexnet\n", - "comp1k/conn 44.8\n", - "comp1k/grad 25.5\n", - "comp1k/mse 0.012\n", - "comp1k/sad 45.6\n", - "config configs/indexnet/indexn...\n", - "model indexnet\n", - "paper https://arxiv.org/abs/1908.00672\n", - "readme configs/indexnet/README.md\n", - "training_data comp1k\n", - "weight https://download.openmmlab.com/...\n", - "--------------------------------------------------------------------------------\n", - "config id: indexnet_dimaug_mobv2_1x16_78k_comp1k\n", - "architecture indexnet\n", - "comp1k/conn 49.5\n", - "comp1k/grad 30.8\n", - "comp1k/mse 0.016\n", - "comp1k/sad 50.1\n", - "config configs/indexnet/indexn...\n", - "model indexnet\n", - "paper https://arxiv.org/abs/1908.00672\n", - "readme configs/indexnet/README.md\n", - "training_data comp1k\n", - "weight https://download.openmmlab.com/...\n", - "\n" - ] - } - ], - "source": [ - "# List all available IndexNet models\n", - "!mim search mmedit --model indexnet" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "processing indexnet_mobv2_1x16_78k_comp1k...\n", - "\u001b[?25l [####################################] 100% \u001b[?25h\n", - "\u001b[32mSuccessfully downloaded indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.pth to /content/mmediting/checkpoints\u001b[0m\n", - "\u001b[32mSuccessfully dumped indexnet_mobv2_1x16_78k_comp1k.py to /content/mmediting/checkpoints\u001b[0m\n" - ] - } - ], - "source": [ - "# Download config and checkpoints for IndexNet to current working directory\n", - "!mkdir -p checkpoints\n", - "!mim download mmedit --config indexnet_mobv2_1x16_78k_comp1k --dest checkpoints" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "load checkpoint from local path: checkpoints/indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.pth\n" - ] - } - ], - "source": [ - "from mmagic.apis import matting_inference, init_model\n", - "\n", - "# Choose to use a config and initialize the mattor\n", - "config = 'configs/indexnet/indexnet_mobv2_1x16_78k_comp1k.py'\n", - "# Setup a checkpoint file to load\n", - "checkpoint = 'checkpoints/indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.pth'\n", - "# Initialize the recognizer\n", - "model = init_model(config, checkpoint, device='cuda:0')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "%matplotlib inline\n", - "import mmcv\n", - "from matplotlib import pyplot as plt\n", - "\n", - "# Sample images path\n", - "merged_path = './tests/data/merged/GT05.jpg'\n", - "trimap_path = './tests/data/trimap/GT05.png'\n", - "\n", - "# Plot sample images\n", - "merged = mmcv.imread(merged_path)\n", - "trimap = mmcv.imread(trimap_path)\n", - "f, axarr = plt.subplots(1, 2)\n", - "f.dpi = 160\n", - "axarr[0].axis('off')\n", - "axarr[0].imshow(mmcv.bgr2rgb(merged))\n", - "axarr[1].axis('off')\n", - "axarr[1].imshow(trimap)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Use the mattor to do inference\n", - "pred_alpha = matting_inference(model, merged_path, trimap_path) * 255" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Plot result\n", - "plt.gcf().dpi = 80\n", - "plt.axis('off')\n", - "plt.imshow(pred_alpha, cmap=plt.get_cmap('gray'))\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "o2s8h_rqRX-3" - }, - "source": [ - "## Train a mattor on a customized dataset\n", - "\n", - "To train a new mattor, there are usually three things to do:\n", - "\n", - "1. Support a new dataset\n", - "2. Modify the config\n", - "3. Train a new mattor" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Gxs3HR86RatF" - }, - "source": [ - "### Support a new dataset\n", - "\n", - "In this tutorial, we gives an example to convert the data into the format of existing datasets. \n", - "\n", - "\n", - "\n", - "Firstly, let's download the only available open source matting dataset from [alphamatting.com](http://alphamatting.com/). " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " % Total % Received % Xferd Average Speed Time Time Time Current\n", - " Dload Upload Total Spent Left Speed\n", - "100 17.3M 100 17.3M 0 0 4241k 0 0:00:04 0:00:04 --:--:-- 4242k\n", - " % Total % Received % Xferd Average Speed Time Time Time Current\n", - " Dload Upload Total Spent Left Speed\n", - "100 366k 100 366k 0 0 221k 0 0:00:01 0:00:01 --:--:-- 221k\n", - " % Total % Received % Xferd Average Speed Time Time Time Current\n", - " Dload Upload Total Spent Left Speed\n", - "100 2215k 100 2215k 0 0 814k 0 0:00:02 0:00:02 --:--:-- 813k\n", - "Archive: data/alphamatting/input_training_lowres.zip\n", - " inflating: data/alphamatting/merged/GT27.png \n", - " inflating: data/alphamatting/merged/GT01.png \n", - " inflating: data/alphamatting/merged/GT02.png \n", - " inflating: data/alphamatting/merged/GT03.png \n", - " inflating: data/alphamatting/merged/GT04.png \n", - " inflating: data/alphamatting/merged/GT05.png \n", - " inflating: data/alphamatting/merged/GT06.png \n", - " inflating: data/alphamatting/merged/GT07.png \n", - " inflating: data/alphamatting/merged/GT08.png \n", - " inflating: data/alphamatting/merged/GT09.png \n", - " inflating: data/alphamatting/merged/GT10.png \n", - " inflating: data/alphamatting/merged/GT11.png \n", - " inflating: data/alphamatting/merged/GT12.png \n", - " inflating: data/alphamatting/merged/GT13.png \n", - " inflating: data/alphamatting/merged/GT14.png \n", - " inflating: data/alphamatting/merged/GT15.png \n", - " inflating: data/alphamatting/merged/GT16.png \n", - " inflating: data/alphamatting/merged/GT17.png \n", - " inflating: data/alphamatting/merged/GT18.png \n", - " inflating: data/alphamatting/merged/GT19.png \n", - " inflating: data/alphamatting/merged/GT20.png \n", - " inflating: data/alphamatting/merged/GT21.png \n", - " inflating: data/alphamatting/merged/GT22.png \n", - " inflating: data/alphamatting/merged/GT23.png \n", - " inflating: data/alphamatting/merged/GT24.png \n", - " inflating: data/alphamatting/merged/GT25.png \n", - " inflating: data/alphamatting/merged/GT26.png \n", - "Archive: data/alphamatting/trimap_training_lowres.zip\n", - " inflating: data/alphamatting/trimap/Trimap2/GT01.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT02.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT03.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT04.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT05.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT06.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT07.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT08.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT09.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT10.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT11.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT12.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT13.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT14.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT15.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT16.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT17.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT18.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT19.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT20.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT21.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT22.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT23.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT24.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT25.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT26.png \n", - " inflating: data/alphamatting/trimap/Trimap2/GT27.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT01.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT02.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT03.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT04.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT05.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT06.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT07.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT08.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT09.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT10.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT11.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT12.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT13.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT14.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT15.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT16.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT17.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT18.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT19.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT20.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT21.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT22.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT23.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT24.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT25.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT26.png \n", - " inflating: data/alphamatting/trimap/Trimap1/GT27.png \n", - "Archive: data/alphamatting/gt_training_lowres.zip\n", - " inflating: data/alphamatting/alpha/GT27.png \n", - " inflating: data/alphamatting/alpha/GT01.png \n", - " inflating: data/alphamatting/alpha/GT02.png \n", - " inflating: data/alphamatting/alpha/GT03.png \n", - " inflating: data/alphamatting/alpha/GT04.png \n", - " inflating: data/alphamatting/alpha/GT05.png \n", - " inflating: data/alphamatting/alpha/GT06.png \n", - " inflating: data/alphamatting/alpha/GT07.png \n", - " inflating: data/alphamatting/alpha/GT08.png \n", - " inflating: data/alphamatting/alpha/GT09.png \n", - " inflating: data/alphamatting/alpha/GT10.png \n", - " inflating: data/alphamatting/alpha/GT11.png \n", - " inflating: data/alphamatting/alpha/GT12.png \n", - " inflating: data/alphamatting/alpha/GT13.png \n", - " inflating: data/alphamatting/alpha/GT14.png \n", - " inflating: data/alphamatting/alpha/GT15.png \n", - " inflating: data/alphamatting/alpha/GT16.png \n", - " inflating: data/alphamatting/alpha/GT17.png \n", - " inflating: data/alphamatting/alpha/GT18.png \n", - " inflating: data/alphamatting/alpha/GT19.png \n", - " inflating: data/alphamatting/alpha/GT20.png \n", - " inflating: data/alphamatting/alpha/GT21.png \n", - " inflating: data/alphamatting/alpha/GT22.png \n", - " inflating: data/alphamatting/alpha/GT23.png \n", - " inflating: data/alphamatting/alpha/GT24.png \n", - " inflating: data/alphamatting/alpha/GT25.png \n", - " inflating: data/alphamatting/alpha/GT26.png \n" - ] - } - ], - "source": [ - "!mkdir -p data/alphamatting/\n", - "!curl http://alphamatting.com/datasets/zip/input_training_lowres.zip -o data/alphamatting/input_training_lowres.zip\n", - "!curl http://alphamatting.com/datasets/zip/trimap_training_lowres.zip -o data/alphamatting/trimap_training_lowres.zip\n", - "!curl http://alphamatting.com/datasets/zip/gt_training_lowres.zip -o data/alphamatting/gt_training_lowres.zip\n", - "!unzip -o data/alphamatting/input_training_lowres.zip -d data/alphamatting/merged\n", - "!unzip -o data/alphamatting/trimap_training_lowres.zip -d data/alphamatting/trimap\n", - "!unzip -o data/alphamatting/gt_training_lowres.zip -d data/alphamatting/alpha" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "DkmZzafQWrLP" - }, - "source": [ - "Then we create the annotation file for training data." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "num_file = 27\n", - "num_training = 20 # use 20 samples for training, 7 for test\n", - "\n", - "training_ann = list()\n", - "for i in range(num_training):\n", - " ann = dict()\n", - " ann['merged_path'] = f'merged/GT{i+1:02d}.png'\n", - " ann['alpha_path'] = f'alpha/GT{i+1:02d}.png'\n", - " # since data from alphamatting.com is not composited, we use original image \n", - " # as fg and bg\n", - " ann['fg_path'] = ann['merged_path']\n", - " ann['bg_path'] = ann['merged_path']\n", - " training_ann.append(ann)\n", - "\n", - "import mmcv\n", - "mmcv.dump(training_ann, './data/alphamatting/training_list.json')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MKWmqxkdZA51" - }, - "source": [ - "Let's create the annotation file for test data in the same way." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "num_trimap = 1\n", - "test_ann = list()\n", - "for i in range(num_training, num_file):\n", - " for j in range(num_trimap):\n", - " ann = dict()\n", - " ann['merged_path'] = f'merged/GT{i+1:02d}.png'\n", - " ann['trimap_path'] = f'trimap/Trimap{j+1}/GT{i+1:02d}.png'\n", - " ann['alpha_path'] = f'alpha/GT{i+1:02d}.png'\n", - " test_ann.append(ann)\n", - "\n", - "mmcv.dump(test_ann, './data/alphamatting/test_list.json')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "URUDy9x8cs-U" - }, - "source": [ - "### Modify the config\n", - "\n", - "In the next step, we need to modify the config for the training. To accelerate the process, we finetune a mattor using a pre-trained mattor." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "model = dict(\n", - " type='IndexNet',\n", - " backbone=dict(\n", - " type='SimpleEncoderDecoder',\n", - " encoder=dict(type='IndexNetEncoder', in_channels=4, freeze_bn=True),\n", - " decoder=dict(type='IndexNetDecoder')),\n", - " loss_alpha=dict(type='CharbonnierLoss', loss_weight=0.5, sample_wise=True),\n", - " loss_comp=dict(\n", - " type='CharbonnierCompLoss', loss_weight=1.5, sample_wise=True),\n", - " pretrained='open-mmlab://mmedit/mobilenet_v2')\n", - "train_cfg = dict(train_backbone=True)\n", - "test_cfg = dict(metrics=['SAD', 'MSE', 'GRAD', 'CONN'])\n", - "dataset_type = 'AdobeComp1kDataset'\n", - "data_root = 'data/adobe_composition-1k'\n", - "img_norm_cfg = dict(\n", - " mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], to_rgb=True)\n", - "train_pipeline = [\n", - " dict(type='LoadImageFromFile', key='alpha', flag='grayscale'),\n", - " dict(type='LoadImageFromFile', key='fg'),\n", - " dict(type='LoadImageFromFile', key='bg'),\n", - " dict(type='LoadImageFromFile', key='merged', save_original_img=True),\n", - " dict(type='GenerateTrimapWithDistTransform', dist_thr=20),\n", - " dict(\n", - " type='CropAroundUnknown',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg', 'trimap'],\n", - " crop_sizes=[320, 480, 640],\n", - " interpolations=[\n", - " 'bicubic', 'bicubic', 'bicubic', 'bicubic', 'bicubic', 'nearest'\n", - " ]),\n", - " dict(\n", - " type='Resize',\n", - " keys=['trimap'],\n", - " scale=(320, 320),\n", - " keep_ratio=False,\n", - " interpolation='nearest'),\n", - " dict(\n", - " type='Resize',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg'],\n", - " scale=(320, 320),\n", - " keep_ratio=False,\n", - " interpolation='bicubic'),\n", - " dict(\n", - " type='Flip',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg', 'trimap']),\n", - " dict(\n", - " type='RescaleToZeroOne',\n", - " keys=['merged', 'alpha', 'ori_merged', 'fg', 'bg', 'trimap']),\n", - " dict(\n", - " type='Normalize',\n", - " keys=['merged'],\n", - " mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225],\n", - " to_rgb=True),\n", - " dict(\n", - " type='Collect',\n", - " keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg'],\n", - " meta_keys=[]),\n", - " dict(\n", - " type='ImageToTensor',\n", - " keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg'])\n", - "]\n", - "test_pipeline = [\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='alpha',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='trimap',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(type='LoadImageFromFile', key='merged'),\n", - " dict(type='RescaleToZeroOne', keys=['merged', 'trimap']),\n", - " dict(\n", - " type='Normalize',\n", - " keys=['merged'],\n", - " mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225],\n", - " to_rgb=True),\n", - " dict(\n", - " type='Resize',\n", - " keys=['trimap'],\n", - " size_factor=32,\n", - " interpolation='nearest'),\n", - " dict(\n", - " type='Resize',\n", - " keys=['merged'],\n", - " size_factor=32,\n", - " interpolation='bicubic'),\n", - " dict(\n", - " type='Collect',\n", - " keys=['merged', 'trimap'],\n", - " meta_keys=[\n", - " 'merged_path', 'interpolation', 'merged_ori_shape', 'ori_alpha',\n", - " 'ori_trimap'\n", - " ]),\n", - " dict(type='ImageToTensor', keys=['merged', 'trimap'])\n", - "]\n", - "data = dict(\n", - " workers_per_gpu=8,\n", - " train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n", - " val_dataloader=dict(samples_per_gpu=1),\n", - " test_dataloader=dict(samples_per_gpu=1),\n", - " train=dict(\n", - " type='AdobeComp1kDataset',\n", - " ann_file='data/adobe_composition-1k/training_list.json',\n", - " data_prefix='data/adobe_composition-1k',\n", - " pipeline=[\n", - " dict(type='LoadImageFromFile', key='alpha', flag='grayscale'),\n", - " dict(type='LoadImageFromFile', key='fg'),\n", - " dict(type='LoadImageFromFile', key='bg'),\n", - " dict(\n", - " type='LoadImageFromFile', key='merged',\n", - " save_original_img=True),\n", - " dict(type='GenerateTrimapWithDistTransform', dist_thr=20),\n", - " dict(\n", - " type='CropAroundUnknown',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg', 'trimap'],\n", - " crop_sizes=[320, 480, 640],\n", - " interpolations=[\n", - " 'bicubic', 'bicubic', 'bicubic', 'bicubic', 'bicubic',\n", - " 'nearest'\n", - " ]),\n", - " dict(\n", - " type='Resize',\n", - " keys=['trimap'],\n", - " scale=(320, 320),\n", - " keep_ratio=False,\n", - " interpolation='nearest'),\n", - " dict(\n", - " type='Resize',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg'],\n", - " scale=(320, 320),\n", - " keep_ratio=False,\n", - " interpolation='bicubic'),\n", - " dict(\n", - " type='Flip',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg', 'trimap']),\n", - " dict(\n", - " type='RescaleToZeroOne',\n", - " keys=['merged', 'alpha', 'ori_merged', 'fg', 'bg', 'trimap']),\n", - " dict(\n", - " type='Normalize',\n", - " keys=['merged'],\n", - " mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225],\n", - " to_rgb=True),\n", - " dict(\n", - " type='Collect',\n", - " keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg'],\n", - " meta_keys=[]),\n", - " dict(\n", - " type='ImageToTensor',\n", - " keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg'])\n", - " ]),\n", - " val=dict(\n", - " type='AdobeComp1kDataset',\n", - " ann_file='data/adobe_composition-1k/test_list.json',\n", - " data_prefix='data/adobe_composition-1k',\n", - " pipeline=[\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='alpha',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='trimap',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(type='LoadImageFromFile', key='merged'),\n", - " dict(type='RescaleToZeroOne', keys=['merged', 'trimap']),\n", - " dict(\n", - " type='Normalize',\n", - " keys=['merged'],\n", - " mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225],\n", - " to_rgb=True),\n", - " dict(\n", - " type='Resize',\n", - " keys=['trimap'],\n", - " size_factor=32,\n", - " interpolation='nearest'),\n", - " dict(\n", - " type='Resize',\n", - " keys=['merged'],\n", - " size_factor=32,\n", - " interpolation='bicubic'),\n", - " dict(\n", - " type='Collect',\n", - " keys=['merged', 'trimap'],\n", - " meta_keys=[\n", - " 'merged_path', 'interpolation', 'merged_ori_shape',\n", - " 'ori_alpha', 'ori_trimap'\n", - " ]),\n", - " dict(type='ImageToTensor', keys=['merged', 'trimap'])\n", - " ]),\n", - " test=dict(\n", - " type='AdobeComp1kDataset',\n", - " ann_file='data/adobe_composition-1k/test_list.json',\n", - " data_prefix='data/adobe_composition-1k',\n", - " pipeline=[\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='alpha',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='trimap',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(type='LoadImageFromFile', key='merged'),\n", - " dict(type='RescaleToZeroOne', keys=['merged', 'trimap']),\n", - " dict(\n", - " type='Normalize',\n", - " keys=['merged'],\n", - " mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225],\n", - " to_rgb=True),\n", - " dict(\n", - " type='Resize',\n", - " keys=['trimap'],\n", - " size_factor=32,\n", - " interpolation='nearest'),\n", - " dict(\n", - " type='Resize',\n", - " keys=['merged'],\n", - " size_factor=32,\n", - " interpolation='bicubic'),\n", - " dict(\n", - " type='Collect',\n", - " keys=['merged', 'trimap'],\n", - " meta_keys=[\n", - " 'merged_path', 'interpolation', 'merged_ori_shape',\n", - " 'ori_alpha', 'ori_trimap'\n", - " ]),\n", - " dict(type='ImageToTensor', keys=['merged', 'trimap'])\n", - " ]))\n", - "optimizers = dict(\n", - " constructor='DefaultOptimizerConstructor',\n", - " type='Adam',\n", - " lr=0.01,\n", - " paramwise_cfg=dict(\n", - " custom_keys=dict({'encoder.layers': dict(lr_mult=0.01)})))\n", - "lr_config = dict(policy='Step', step=[52000, 67600], gamma=0.1, by_epoch=False)\n", - "checkpoint_config = dict(interval=2600, by_epoch=False)\n", - "evaluation = dict(interval=2600, save_image=False)\n", - "log_config = dict(\n", - " interval=10, hooks=[dict(type='TextLoggerHook', by_epoch=False)])\n", - "total_iters = 78000\n", - "dist_params = dict(backend='nccl')\n", - "log_level = 'INFO'\n", - "work_dir = './work_dirs/indexnet'\n", - "load_from = None\n", - "resume_from = None\n", - "workflow = [('train', 1)]\n", - "\n" - ] - } - ], - "source": [ - "from mmcv import Config\n", - "cfg = Config.fromfile('./configs/indexnet/indexnet_mobv2_1x16_78k_comp1k.py')\n", - "print(cfg.pretty_text)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "P04K_cv-dIew" - }, - "source": [ - "Given a config that trains a IndexNet model on Adobe Composition-1k dataset, we need to modify some values to use it for training IndexNet on the dataset we just created." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "model = dict(\n", - " type='IndexNet',\n", - " backbone=dict(\n", - " type='SimpleEncoderDecoder',\n", - " encoder=dict(type='IndexNetEncoder', in_channels=4, freeze_bn=True),\n", - " decoder=dict(type='IndexNetDecoder')),\n", - " loss_alpha=dict(type='CharbonnierLoss', loss_weight=0.5, sample_wise=True),\n", - " loss_comp=dict(\n", - " type='CharbonnierCompLoss', loss_weight=1.5, sample_wise=True),\n", - " pretrained=None)\n", - "train_cfg = dict(train_backbone=True)\n", - "test_cfg = dict(metrics=['SAD', 'MSE', 'GRAD', 'CONN'])\n", - "dataset_type = 'AdobeComp1kDataset'\n", - "data_root = 'data/adobe_composition-1k'\n", - "img_norm_cfg = dict(\n", - " mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], to_rgb=True)\n", - "train_pipeline = [\n", - " dict(type='LoadImageFromFile', key='alpha', flag='grayscale'),\n", - " dict(type='LoadImageFromFile', key='fg'),\n", - " dict(type='LoadImageFromFile', key='bg'),\n", - " dict(type='LoadImageFromFile', key='merged', save_original_img=True),\n", - " dict(type='GenerateTrimapWithDistTransform', dist_thr=20),\n", - " dict(\n", - " type='CropAroundUnknown',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg', 'trimap'],\n", - " crop_sizes=[320, 480, 640],\n", - " interpolations=[\n", - " 'bicubic', 'bicubic', 'bicubic', 'bicubic', 'bicubic', 'nearest'\n", - " ]),\n", - " dict(\n", - " type='Resize',\n", - " keys=['trimap'],\n", - " scale=(320, 320),\n", - " keep_ratio=False,\n", - " interpolation='nearest'),\n", - " dict(\n", - " type='Resize',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg'],\n", - " scale=(320, 320),\n", - " keep_ratio=False,\n", - " interpolation='bicubic'),\n", - " dict(\n", - " type='Flip',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg', 'trimap']),\n", - " dict(\n", - " type='RescaleToZeroOne',\n", - " keys=['merged', 'alpha', 'ori_merged', 'fg', 'bg', 'trimap']),\n", - " dict(\n", - " type='Normalize',\n", - " keys=['merged'],\n", - " mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225],\n", - " to_rgb=True),\n", - " dict(\n", - " type='Collect',\n", - " keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg'],\n", - " meta_keys=[]),\n", - " dict(\n", - " type='ImageToTensor',\n", - " keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg'])\n", - "]\n", - "test_pipeline = [\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='alpha',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='trimap',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(type='LoadImageFromFile', key='merged'),\n", - " dict(type='RescaleToZeroOne', keys=['merged', 'trimap']),\n", - " dict(\n", - " type='Normalize',\n", - " keys=['merged'],\n", - " mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225],\n", - " to_rgb=True),\n", - " dict(\n", - " type='Resize',\n", - " keys=['trimap'],\n", - " size_factor=32,\n", - " interpolation='nearest'),\n", - " dict(\n", - " type='Resize',\n", - " keys=['merged'],\n", - " size_factor=32,\n", - " interpolation='bicubic'),\n", - " dict(\n", - " type='Collect',\n", - " keys=['merged', 'trimap'],\n", - " meta_keys=[\n", - " 'merged_path', 'interpolation', 'merged_ori_shape', 'ori_alpha',\n", - " 'ori_trimap'\n", - " ]),\n", - " dict(type='ImageToTensor', keys=['merged', 'trimap'])\n", - "]\n", - "data = dict(\n", - " workers_per_gpu=1,\n", - " train_dataloader=dict(samples_per_gpu=12, drop_last=True),\n", - " val_dataloader=dict(samples_per_gpu=1),\n", - " test_dataloader=dict(samples_per_gpu=1),\n", - " train=dict(\n", - " type='AdobeComp1kDataset',\n", - " ann_file='./data/alphamatting/training_list.json',\n", - " data_prefix='./data/alphamatting/',\n", - " pipeline=[\n", - " dict(type='LoadImageFromFile', key='alpha', flag='grayscale'),\n", - " dict(type='LoadImageFromFile', key='fg'),\n", - " dict(type='LoadImageFromFile', key='bg'),\n", - " dict(\n", - " type='LoadImageFromFile', key='merged',\n", - " save_original_img=True),\n", - " dict(type='GenerateTrimapWithDistTransform', dist_thr=20),\n", - " dict(\n", - " type='CropAroundUnknown',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg', 'trimap'],\n", - " crop_sizes=[320, 480, 640],\n", - " interpolations=[\n", - " 'bicubic', 'bicubic', 'bicubic', 'bicubic', 'bicubic',\n", - " 'nearest'\n", - " ]),\n", - " dict(\n", - " type='Resize',\n", - " keys=['trimap'],\n", - " scale=(320, 320),\n", - " keep_ratio=False,\n", - " interpolation='nearest'),\n", - " dict(\n", - " type='Resize',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg'],\n", - " scale=(320, 320),\n", - " keep_ratio=False,\n", - " interpolation='bicubic'),\n", - " dict(\n", - " type='Flip',\n", - " keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg', 'trimap']),\n", - " dict(\n", - " type='RescaleToZeroOne',\n", - " keys=['merged', 'alpha', 'ori_merged', 'fg', 'bg', 'trimap']),\n", - " dict(\n", - " type='Normalize',\n", - " keys=['merged'],\n", - " mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225],\n", - " to_rgb=True),\n", - " dict(\n", - " type='Collect',\n", - " keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg'],\n", - " meta_keys=[]),\n", - " dict(\n", - " type='ImageToTensor',\n", - " keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg'])\n", - " ]),\n", - " val=dict(\n", - " type='AdobeComp1kDataset',\n", - " ann_file='./data/alphamatting/test_list.json',\n", - " data_prefix='./data/alphamatting/',\n", - " pipeline=[\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='alpha',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='trimap',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(type='LoadImageFromFile', key='merged'),\n", - " dict(type='RescaleToZeroOne', keys=['merged', 'trimap']),\n", - " dict(\n", - " type='Normalize',\n", - " keys=['merged'],\n", - " mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225],\n", - " to_rgb=True),\n", - " dict(\n", - " type='Resize',\n", - " keys=['trimap'],\n", - " size_factor=32,\n", - " interpolation='nearest'),\n", - " dict(\n", - " type='Resize',\n", - " keys=['merged'],\n", - " size_factor=32,\n", - " interpolation='bicubic'),\n", - " dict(\n", - " type='Collect',\n", - " keys=['merged', 'trimap'],\n", - " meta_keys=[\n", - " 'merged_path', 'interpolation', 'merged_ori_shape',\n", - " 'ori_alpha', 'ori_trimap'\n", - " ]),\n", - " dict(type='ImageToTensor', keys=['merged', 'trimap'])\n", - " ]),\n", - " test=dict(\n", - " type='AdobeComp1kDataset',\n", - " ann_file='./data/alphamatting/test_list.json',\n", - " data_prefix='./data/alphamatting/',\n", - " pipeline=[\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='alpha',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(\n", - " type='LoadImageFromFile',\n", - " key='trimap',\n", - " flag='grayscale',\n", - " save_original_img=True),\n", - " dict(type='LoadImageFromFile', key='merged'),\n", - " dict(type='RescaleToZeroOne', keys=['merged', 'trimap']),\n", - " dict(\n", - " type='Normalize',\n", - " keys=['merged'],\n", - " mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225],\n", - " to_rgb=True),\n", - " dict(\n", - " type='Resize',\n", - " keys=['trimap'],\n", - " size_factor=32,\n", - " interpolation='nearest'),\n", - " dict(\n", - " type='Resize',\n", - " keys=['merged'],\n", - " size_factor=32,\n", - " interpolation='bicubic'),\n", - " dict(\n", - " type='Collect',\n", - " keys=['merged', 'trimap'],\n", - " meta_keys=[\n", - " 'merged_path', 'interpolation', 'merged_ori_shape',\n", - " 'ori_alpha', 'ori_trimap'\n", - " ]),\n", - " dict(type='ImageToTensor', keys=['merged', 'trimap'])\n", - " ]))\n", - "optimizers = dict(\n", - " constructor='DefaultOptimizerConstructor',\n", - " type='Adam',\n", - " lr=0.0025,\n", - " paramwise_cfg=dict(\n", - " custom_keys=dict({'encoder.layers': dict(lr_mult=0.01)})))\n", - "lr_config = None\n", - "checkpoint_config = dict(interval=40, by_epoch=False)\n", - "evaluation = dict(interval=20, save_image=False)\n", - "log_config = dict(\n", - " interval=5, hooks=[dict(type='TextLoggerHook', by_epoch=False)])\n", - "total_iters = 50\n", - "dist_params = dict(backend='nccl')\n", - "log_level = 'INFO'\n", - "work_dir = './tutorial_exps/indexnet'\n", - "load_from = './checkpoints/indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.pth'\n", - "resume_from = None\n", - "workflow = [('train', 1)]\n", - "seed = 0\n", - "gpus = 1\n", - "\n" - ] - } - ], - "source": [ - "from mmcv import Config\n", - "cfg = Config.fromfile('./configs/indexnet/indexnet_mobv2_1x16_78k_comp1k.py')\n", - "\n", - "from mmcv.runner import set_random_seed\n", - "\n", - "# Modify dataset type and path\n", - "cfg.data.train.type = 'AdobeComp1kDataset'\n", - "cfg.data.train.ann_file = './data/alphamatting/training_list.json'\n", - "cfg.data.train.data_prefix = './data/alphamatting/'\n", - "\n", - "cfg.data.val.type = 'AdobeComp1kDataset'\n", - "cfg.data.val.ann_file = './data/alphamatting/test_list.json'\n", - "cfg.data.val.data_prefix = './data/alphamatting/'\n", - "\n", - "cfg.data.test.type = 'AdobeComp1kDataset'\n", - "cfg.data.test.ann_file = './data/alphamatting/test_list.json'\n", - "cfg.data.test.data_prefix = './data/alphamatting/'\n", - "\n", - "# We can use the pre-trained IndexNet model\n", - "cfg.model.pretrained = None\n", - "cfg.load_from = './checkpoints/indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.pth'\n", - "\n", - "# Set up working dir to save files and logs.\n", - "cfg.work_dir = './tutorial_exps/indexnet'\n", - "\n", - "# Use smaller batch size for training\n", - "cfg.data.train_dataloader.samples_per_gpu = 4\n", - "cfg.data.workers_per_gpu = 1\n", - "\n", - "# The original learning rate (LR) is set for batch size 16 with 1 GPU.\n", - "# We reduce the lr by a factor of 4 since we reduce the batch size.\n", - "cfg.optimizers.lr = cfg.optimizers.lr / 4\n", - "cfg.total_iters = 50\n", - "cfg.lr_config = None\n", - "\n", - "# Evaluate every 20 iterations\n", - "cfg.evaluation.interval = 20\n", - "# We can set the checkpoint saving interval to reduce the storage cost\n", - "cfg.checkpoint_config.interval = 40\n", - "# We can set the log print interval to reduce the the times of printing log\n", - "cfg.log_config.interval = 5\n", - "\n", - "# Set seed thus the results are more reproducible\n", - "cfg.seed = 0\n", - "set_random_seed(0, deterministic=False)\n", - "cfg.gpus = 1\n", - "\n", - "print(cfg.pretty_text)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "cI3uX5RqhFQQ" - }, - "source": [ - "### Train a new mattor\n", - "\n", - "Finally, lets initialize the dataset and mattor, then train a new mattor!" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-03-19 18:04:51,382 - mmedit - INFO - load checkpoint from local path: ./checkpoints/indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.pth\n", - "2022-03-19 18:04:51,502 - mmedit - INFO - Start running, host: root@df5395ef5373, work_dir: /content/mmediting/tutorial_exps/indexnet\n", - "2022-03-19 18:04:51,504 - mmedit - INFO - Hooks will be executed in the following order:\n", - "before_run:\n", - "(NORMAL ) CheckpointHook \n", - "(VERY_LOW ) TextLoggerHook \n", - " -------------------- \n", - "before_train_epoch:\n", - "(LOW ) IterTimerHook \n", - "(VERY_LOW ) TextLoggerHook \n", - " -------------------- \n", - "before_train_iter:\n", - "(LOW ) IterTimerHook \n", - " -------------------- \n", - "after_train_iter:\n", - "(NORMAL ) CheckpointHook \n", - "(LOW ) IterTimerHook \n", - "(LOW ) EvalIterHook \n", - "(VERY_LOW ) TextLoggerHook \n", - " -------------------- \n", - "after_train_epoch:\n", - "(NORMAL ) CheckpointHook \n", - "(VERY_LOW ) TextLoggerHook \n", - " -------------------- \n", - "before_val_epoch:\n", - "(LOW ) IterTimerHook \n", - "(VERY_LOW ) TextLoggerHook \n", - " -------------------- \n", - "before_val_iter:\n", - "(LOW ) IterTimerHook \n", - " -------------------- \n", - "after_val_iter:\n", - "(LOW ) IterTimerHook \n", - " -------------------- \n", - "after_val_epoch:\n", - "(VERY_LOW ) TextLoggerHook \n", - " -------------------- \n", - "after_run:\n", - "(VERY_LOW ) TextLoggerHook \n", - " -------------------- \n", - "2022-03-19 18:04:51,507 - mmedit - INFO - workflow: [('train', 1)], max: 50 iters\n", - "2022-03-19 18:04:51,509 - mmedit - INFO - Checkpoints will be saved to /content/mmediting/tutorial_exps/indexnet by HardDiskBackend.\n", - "2022-03-19 18:05:14,448 - mmedit - INFO - Iter [5/50]\tlr: 2.500e-05, eta: 0:03:25, time: 4.576, data_time: 2.703, memory: 9012, loss_alpha: 0.0236, loss_comp: 0.0000, loss: 0.0236\n", - "2022-03-19 18:05:40,543 - mmedit - INFO - Iter [10/50]\tlr: 2.500e-05, eta: 0:03:15, time: 5.219, data_time: 3.349, memory: 9012, loss_alpha: 0.0208, loss_comp: 0.0000, loss: 0.0208\n", - "2022-03-19 18:06:04,926 - mmedit - INFO - Iter [15/50]\tlr: 2.500e-05, eta: 0:02:51, time: 4.877, data_time: 3.027, memory: 9012, loss_alpha: 0.0202, loss_comp: 0.0000, loss: 0.0202\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 7/7, 2.2 task/s, elapsed: 3s, ETA: 0s" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-03-19 18:06:32,649 - mmedit - INFO - Iter(val) [20]\tSAD: 4.4941, MSE: 0.0152, GRAD: 7.4875, CONN: 4.0191\n", - "2022-03-19 18:06:56,870 - mmedit - INFO - Iter [25/50]\tlr: 2.500e-05, eta: 0:01:40, time: 5.480, data_time: 3.634, memory: 9012, loss_alpha: 0.0168, loss_comp: 0.0000, loss: 0.0168\n", - "2022-03-19 18:07:22,340 - mmedit - INFO - Iter [30/50]\tlr: 2.500e-05, eta: 0:01:24, time: 5.094, data_time: 3.225, memory: 9012, loss_alpha: 0.0177, loss_comp: 0.0000, loss: 0.0177\n", - "2022-03-19 18:07:46,750 - mmedit - INFO - Iter [35/50]\tlr: 2.500e-05, eta: 0:01:04, time: 4.882, data_time: 3.032, memory: 9012, loss_alpha: 0.0163, loss_comp: 0.0000, loss: 0.0163\n", - "2022-03-19 18:08:11,291 - mmedit - INFO - Saving checkpoint at 40 iterations\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 7/7, 2.2 task/s, elapsed: 3s, ETA: 0s" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-03-19 18:08:14,809 - mmedit - INFO - Iter(val) [40]\tSAD: 4.3920, MSE: 0.0152, GRAD: 7.3852, CONN: 4.0367\n", - "2022-03-19 18:08:39,360 - mmedit - INFO - Iter [45/50]\tlr: 2.500e-05, eta: 0:00:19, time: 5.535, data_time: 3.683, memory: 9012, loss_alpha: 0.0167, loss_comp: 0.0000, loss: 0.0167\n", - "2022-03-19 18:09:03,816 - mmedit - INFO - Saving checkpoint at 50 iterations\n", - "2022-03-19 18:09:04,137 - mmedit - INFO - Iter [50/50]\tlr: 2.500e-05, eta: 0:00:00, time: 4.955, data_time: 3.046, memory: 9012, loss_alpha: 0.0141, loss_comp: 0.0000, loss: 0.0141\n" - ] - } - ], - "source": [ - "import os.path as osp\n", - "\n", - "from mmagic.datasets import build_dataset\n", - "from mmagic.models import build_model\n", - "from mmagic.apis import train_model\n", - "\n", - "import mmcv\n", - "\n", - "# Build the dataset\n", - "datasets = [build_dataset(cfg.data.train)]\n", - "\n", - "# Build the mattor\n", - "model = build_model(cfg.model, train_cfg=cfg.train_cfg, test_cfg=cfg.test_cfg)\n", - "\n", - "# Create work_dir\n", - "mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir))\n", - "\n", - "# train the model\n", - "train_model(model, datasets, cfg, distributed=False, validate=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JPRUWpQ1Dy8W" - }, - "source": [ - "### Understand the log\n", - "\n", - "From the log, we can have a basic understanding the training process and know how well the mattor is trained.\n", - "\n", - "Firstly, the MobileNetV2 backbone pre-trained on ImageNet is loaded, this is a common practice since training from scratch is more costly. The log shows that all the weights of the MobileNetV2 backbone are loaded while some parts of the model are missing in the loaded weight. But no worries! These parts have a larger learning rate than the pretrained parts (You can print out `cfg.optimizers` to see the pretrained parts with name prefix `encoder.layers` have a `lr_mult=0.01`).\n", - "\n", - "Secondly, after training, the mattor is evaluated by the default evaluation. The results show that the mattor achieves lower and lower SAD along the training process,\n", - "\n", - "Not bad!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "R73szzAYL4cu" - }, - "source": [ - "## Test the trained mattor\n", - "\n", - "After finetuning the recognizer, let's check the prediction results!" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 7/7, 2.1 task/s, elapsed: 3s, ETA: 0s\n", - "SAD: 4.4220\n", - "MSE: 0.0150\n", - "GRAD: 7.1011\n", - "CONN: 4.0517\n" - ] - } - ], - "source": [ - "from mmagic.apis import single_gpu_test\n", - "from mmagic.datasets import build_dataloader\n", - "from mmcv.parallel import MMDataParallel\n", - "\n", - "# Build a test dataloader and model\n", - "dataset = build_dataset(cfg.data.test, dict(test_mode=True))\n", - "data_loader = build_dataloader(\n", - " dataset,\n", - " samples_per_gpu=1,\n", - " workers_per_gpu=cfg.data.workers_per_gpu,\n", - " dist=False,\n", - " shuffle=False)\n", - "model = MMDataParallel(model, device_ids=[0])\n", - "\n", - "# Perform the test with single gpu. Saving result images by setting\n", - "# save_image and save_path arguments. The two arguments will be passed\n", - "# to model.forword_test() where images are saved.\n", - "# See https://github.com/open-mmlab/mmediting/blob/8b5c0c5f49e60fd6ab0503031b62dee7832faf72/mmedit/models/mattors/indexnet.py#L72.\n", - "outputs = single_gpu_test(model, data_loader, save_image=True, save_path='./tutorial_exps/indexnet/results')\n", - "\n", - "# Pop out some unnecessary arguments\n", - "eval_config = cfg.evaluation\n", - "eval_config.pop('interval')\n", - "eval_config.pop('save_image', False)\n", - "eval_config.pop('save_path', None)\n", - "\n", - "eval_res = dataset.evaluate(outputs, **eval_config)\n", - "print() # endline of progress bar\n", - "for name, val in eval_res.items():\n", - " print(f'{name}: {val:.04f}')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GGhi85oLtyvj" - }, - "source": [ - "The result is the same as the last validation! This is because we use the same data for test and validation. Next, let's take a look at the visual results of the test! The results are saved in the directory `tutorial_exps/indexnet/results` that we specified." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "GT21.png GT22.png GT23.png GT24.png\tGT25.png GT26.png GT27.png\n" - ] - } - ], - "source": [ - "!ls tutorial_exps/indexnet/results" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "G8FO7XljukjJ" - }, - "source": [ - "Plot the sample `GT21`:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABIwAAAFACAYAAADeROfHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAk6AAAJOgBgmMFHAAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9eaxl11Xn/137nHvvm1+9mudyPJZrcBxPiW3sDI4NZOgOEAtQAEEYxCACYehu0a1GCBB0C5D4AyFAIiCC9FN3Q1qko5/VMfqFBCdOCEmc4HIcxxVPVS6XXa/GN9x7z9nr98fea++173ue4hqd9bVc7757ztln77X3uVXrc9dam5gZJpPJZDKZTCaTyWQymUwmk8hd6A6YTCaTyWQymUwmk8lkMpkuLhkwMplMJpPJZDKZTCaTyWQyFTJgZDKZTCaTyWQymUwmk8lkKmTAyGQymUwmk8lkMplMJpPJVMiAkclkMplMJpPJZDKZTCaTqZABI5PJZDKZTCaTyWQymUwmUyEDRiaTyWQymUwmk8lkMplMpkIGjEwmk8lkMplMJpPJZDKZTIUMGJlMJpPJZDKZTCaTyWQymQoZMDKZTCaTyWQymUwmk8lkMhUyYGQymUwmk8lkMplMJpPJZCpkwMhkMplMJpPJZDKZTCaTyVTIgJHJZDKZTCaTyWQymUwmk6mQASOTyWQymUwmk8lkMplMJlMhA0Ymk8lkMplMJpPJZDKZTKZCBoxMJpPJZDKZTCaTyWQymUyFDBiZTCaTyWQymUwmk8lkMpkKGTAymUwmk8lkMplMJpPJZDIVMmBkMplMJpPJZDKZTCaTyWQqZMDIZDKZTCaTyWQymUwmk8lUyICRyWQymUwmk8lkMplMJpOpkAEjk8lkMplMJpPJZDKZTCZTIQNGJpPJZDKZTCaTyWQymUymQvW5vsEVd/8UMwCA4MEgEBiBVHH8nwAQERjhTHkP8Tr9OwHwsRVSbXA87uRcAsAkP1a0K3ei+A6DQAR4dUdKrSL2mdLrfD2ge5t7DXDqY25J+iz9oniAVUeJ9FizrQgAc7ATE8f+6LtQYRPpW7Avx7HFvnM8JxsL5avSZqXdAFYnKQvCU+iNYwKTbkm1Fd/2xOk1xTY5rYIgl25azgWruUO8hli9BgNMcAC8Ghsx4MW+jJG75buQ+t+rPq88s7QDx/vq40RIM5T+ZKwYZzEDlG1CVI4zHFOrk8N5zuV1KHOr506vJVk15SpX63JkTet1pe3DIz9BYtfwQq8TBuCKZwwgprjs9ZO42n1DT1d9jtR7+Rin55XAAIU7MrN+t2iFRt7VBtaW1XbXzyrHh0pe80hDsv44/QeQZzz8//0/Kz9AvsNEtPIJM5lMJlMQM9vfE/b3hMlkMr2ozuXfE+ccGGm33innNDm+TMr5o9GLwaRdtSDt8K3m7OZzMqx5MQtq5KNc/KLvcsyPtDJ6vr5SnFxgpP8CrzTVYRkrUCFAIUTHevReAmFc7JsnyjZmsUnwZBPooNIO4bpRS4Q3CqiEYOXReUlARuiAAmnpdYQOegxpnhWwKdolDcbE5hl8pHtrQ+qVQxlkyRi9sgupm2a4MLImoee1fC/wmIiqBNwhm8HHFh1xWCvMIJkHZQVSNhCtdk54me9DCFCzNBsBRCCnIWGen1FT5XmNAEY/NGmkCpnqKVYPYIAvykaqCWnOgXLTrNvNTxaToKD8HIpxCpjH+Xlk9b+GRGHOA6SStZeBKIk5I3COd2CCo/jMqTbzvMb51nOsbMJg1QdKa1i6nmChvKlhHI/iSpPJZDKZTCaTyWS6eHTOgVH+Zl9+LxhDip4YjRJI50Kc6eC0ybf6wf9S3/xT6UzGt5C/7w83FufNgdASgaJTT+DkSGoUsVrP8nEX2uQMd0gREemPRD3lyJYydomiHTyUo5ruQylCRkM18fMp3pNJOecRB6ThR41GdUmb0r9RYKJHLONzyZo5MkTho3whl/fx0GMSaDMC00YghwClNt6vkuvjMVkbYQwRqhAV0EjbCczwFGBPOCHDoxWwhfN6Y8r9SpEuFOaf4s18PCdENElkW44yEeAkQC9Fg2ljc14H0j0BS3mlc1rXVLQU36NsRy1ZlqTeCPCNkn24aC8/qAmC0IitaLU7jTw/7OONc/wbIXckATvOkJHVn6lNWtm+2I/UBwqpP0hZDQjtuxh1JjZN8DKE/oTPI87rXD5XpPF0bw3F1NM8an5KhqZ8TJ5k/WFjMplMJpPJZDKZTBeZzkOE0UhUSQINXLhzGfegcKIEFKg30g/WztwKhSMhDSe7qnIoAYwErDJkyW5zQBGSSiegSvxBUuPRxaAENCRwoh1NfY68Iw75yGjE+XWxAZ3eM3riqB0EBGnQwHEAkqIjsCxEWijAAoExZd9WphHFexTnhPY16GAGXIR1RaRI6reEqlBxf0Tg4mInWFspwYrcAkHgmYxDkSsEWKRtr6OLBEAJFArtCzDI9KpYcXFhSx9lTE5BATGSTr3TvZYIugQoVFtEYSUyKEO9OLZwviueAY0txEbElFqW+fVhEUTYkXoS7kwKlskK10aFrHUu7J/b1sYRhJb7rtdIMfsaHCvgE8YecaICrWktZkKEfJV6NuU1IdukMJZK6EzwKD8/WXFuWKKiEJ8lxDXCqc00ThZQHeFVDNdKiblcwiaTyWQymUwmk8lkuph07iOMShc7waOUCgIoUCDOZ4j2yXVdsoMp5WGy473ScU33ouzIYsXP0GJKBYqOfkrRSY4op1S6USgjTmnhPBdkINdFylEwq9CddKcciQIEG2VHGykKQqduJZtC6gfl0fEqr/O4NHArYZg4ytpOMtZ8OReRYmV9p1ynKjvpEjnEaUC5XkyEJgJpxB6c4YLX/WaoKJHcVyftx2tTtI8eOpd2y5AyO+9pHSiwo9Pakl3FDsgi9Qel8zOEIN1hFrsLtHAR5BStqSco4JNca0uLMgzRq4ME0IX3vHpawnMmJohpV5CIIgWdYsO6FliCfnJtPNdJxBUo1dnKz5lOKtPQcOXzVT7NJWDkAtTF9e0j1nURUEVj66g6hxytmNZwMJBK9YsRf3rSomR9pU8mva6kf+nxFxiYIau6bXoWdMqtyWQymUwmk8lkMl1MOufAKNXh5Vz/IzinuWyxTikJKlPDABSpa0Va1giA0YhEnFXx+XSkz2jUDCMXbC6jFrKDixWvcm9J/SZHxEENr3NfCpCQBxgL4qr+JVAk9nOpjk46Fp3dNt5DGtY1i1bWccq1aYrxq94Tcs2m7PbmMWu7awYy6v6ORlAEIEHwMbqJY//FSc99RtF+7qt45RnwCMzyCgblKBFOkSl5buU+4ViOCAtUhGO4UYCZZQrVyOCKuly5XfmDR+BmaSBPYe1LipyjDFckUqmMTssWDsWjR9K21KvRqDdWEDSsGU5ALkEh5Ho9MpYKCgAyF2mPYmf5LdQMyk9gWI8UCk0TVCogFUW/9bPARduqsD2r8+KEZR5DgKtGovzKyKvR6ZM1IxMU1qX+dInXjoAl+S0/apxPjOdKZF+K4EsgOoOiNOcjz4fJZDKZTCaTyWQyXSw6LylpAJSDld3n0gFEGT2TvqkfxTMrwQ9Dp61ljJAAjXbSo8MsBaZbUBHR4dJ5qdvp/VH0oaFFsZNZHFirxhn8Rhrp9wg4otzH1GYca1mkmgq7pqgIgWoFDMo1gXSFmkr6KXYSsEEhCsVBAYcIRiRSSttB0s+49PiLMzLw0G9npz8BNFL2YMQoM4FECjBwiQzzLLEiQmpPMtJgp4Q4Lt6zpdwH3R5FiJN2dlN3daO1c5DnIlmHit4VUEPGNlrTXq8jGUPBtOJxJ5bTtiksouyud8mTMQm/4fw+qWtppG8pfa2YZ1J9isCFR3pA6ikmDc5ycfgcKZifhQLdSHHsOMXM+TmWC4t1mYzFaV2DgSo+B6vNnFOv/cgzRLlRCGzS0VoyvNLmUGmkrJ7L8CJEWY6iLJPJZDKZTCaTyWS6OHTOgVEJfDhVNKERL4tGrtC7nWkAhBi5QBAgk08S9y1F5NBKp1A7o14BC7mhABFHOc1sJK4mXhtr1ahIBmIufk8pd6tYJXV7ZKuw0Ro52nnP0T+j16+sYyOgo7xbtmNOgypOKuBGmjsFKbSdER33YoYo20ckkT+egCqBwNCKFKv2saZSimpKA9LrJ8hJ2pkeudR5Sv0YmXNVXTrzSSENDLUjvVgWAtd8Zlaq78paarHmHdzU2oqtlbV/lNHVOwKV9FkZRoZ2BTIUEBUqBXBEZV0febN4aEbWeXFi+nPURBpOleuF8lqJc84AWnjUapwFQI0RdtnO2nLhTwbltEW1XnVEVLqSJKIxtCvwNcxR/lRKrccPnbCcc1RZBnwKvrJ67iIcC8FpnB8W1Y8U7ajGJ3W9Wtsp2WQymUwmk8lkMl2kOvfAKHpNI9/Fq0iV7EDq6AntLooPXm6nHoFMOjh64/ItDUeyuxiARQIBGoyofsnPMq1MR1/EkagdroKjmB3+XMdIHy8ddRl3bj8fyaWDkewxalOtYpvywrUXRzakcGVAkUeinfCSZ1HaDSzZM86vTissx8UxqgOo4phkHtOqSMxHJlT3M40Yuih2HmU5y0WUSbYWUmFi/VYCHKOWovJqymuEmcu7KlgR7JaxnrCDVG9Jrd8iCkzXkornunQSVuyWJvd3yFBUPzPlisiQU6+zhB6lmDdTmqd8JRI4WQGMIAXlg30c5/lO18f2JDquompk/kaAKkm7ZVRakc41Yqfcz8zA5DpS1+dVlV/kNqL15TODCHoVFhmzERZl0KRboQSz8jriCKgyTCXOtYsswMhkMplMJpPJZDJdrDoPKWmj9YjKV9qB1LAosQM5RxxGFTkj/neKWkpt6OiZfL9q5F4uXSWn5TYyGNK+YkYF+vhoSk2+b64MA+gUM1L9XImncoSOpPuoVpWHnSFDftOBcmQVa1vnqCxxaKUektTxKeeC4TgDEBmf7Fgm9+I0PiocdgGAucC1dER53sWoOQKQHJ2ibZlsJzlJiPMZnXGORasp9VkVImed+qQ7wxnKIMCgMEjlxcf2pD8SNabXCVG0Rczr0wCuaIr0uBQFUrOYgaK6kNT1kLnUq6y0lfQpH8ttZ2jEZeM0AmmQnyPdjbIWj6xvylBNhwYCI8BRPSMUazQVz626NPZf4JEUGM+rXn5HeuXUxTr9ssSnUjurxK3luih3gkM8swVSzSkpYF98RlC+R1hKUscp24LiC7GbG4kwNJlMJpPJZDKZTKaLReclJU27RE4cTnGC4/tpW3dC2goc0RH3yrcddWBlJ6zRu2rHFByjIdROWBpbaPezdGQ1Khm5syqgkpxn1u0GgOKj9z5aA0kc2CLyKBUMFsutAtpIjw75TEJRQJpzc0khIiTfIxeRznfIDjAVcyTOdwZB4tCjjLKgkTkttgVDvrBIAeTUL0mr8qlPEbaNAMPcx4gGOP+erRfuQMquurC4dvKpaLuMoMrdLaOLEpaIHXIauihgkyKN4pKRSKNyXa2EF6OrTtpNEGvEssF+EQ4pO4ymsMlYEaEGI3RSgyKBIRrRpPU78hxqUCU1ofJzRokaSeFthowB6t5ltI7cw6lq11IUPA8k9pkz/NRPj5zr1FrO/dTF6UeecHm807oI9nDKOjp6UGwqKa4cw8eqNNi8lnQx/tGISZPJZDKZTCaTyWS6mHReIowSLKH8M3/rn+GK/qZejhY7q8XzxSHVYKWEGxn4CISS9CsVE4ECLAEJ7GTHmXJfRpx0QFKpSifXKwS1GrTRRZnFY9bnlPVqchSLSy5wcDmLqAllmLKgL9RVJYjKNuYUBULq/+Rgc0YkOZ1MxlraSoCbQBmJxvEI0UA+3SUPmpJdZYI4wYvCdNrMHGdO1kW8LvUjkQ1x8BUIIxlHrE8kPVKhIqE5UqblNJlulH/JrxRSusI6Dq9BGdD52A5xWIstGPBlPSkd5ZN6T3mXN1mblDqRny9QXq/SwRxxk58rl561EGUj61WDMs8Mz/G+aR2QOk/vfafS6Fi9rwpop5Wq7CnPTn6E8shzFJ4qOp7Zy4pouPB7tCIh1ZTKzZY73UlkX2K+Yldt+wSgVN8iINZF+rWKsaWGR6Kb5LMEcR06mEwmk8lkMplMJtNFqfNSwyhDhZEDEGc9O6NQ5yXHlFa8E7+lz9VmguNNKe1M1/yRHZayU6gTelAwl1UhD1StF31evHOGAuHOTh0FQrRMCXEQa5hQca/QGidwpTebKlLCUIIFuVaOCLTJXjWtmAft8OedvLho0YFjAWNK9WpSnSc9IImwQUwhIi4iL1JEBThGX4Q6LgJwcvodw8OlLeFzUWof50/3VY1FQ5FidsqRuvRTLqAEOWQeMtzUaYaUgUW8f9ohjQFy4XjlCJULET01hferYjExvAdazxh6hncengHPlHeli2Nv0yWUIVayqYIfFHd6o9EdtzgNnfJwQxSUijjyLABFxhyBkQ/rmQXOITxfLSPUceKw61qAH9HOKpIugyO5UiutVKycTd3n+MxyxqQg+bzIa0yeTD3OQrwK3I2/6vVZdDlCxQwbE+XJd13ZXPosI4l8Q3yOpZWRIvXeil6bTCaTyWQymUymi1TnARgFJ1O2vdepGeI45TSW7FpKjZDUTnKyVFqZAklhG3aVIlKAGIrgI6falOQkRzqMRtvktkoc4RIviPEKHGM9KFdt8oUbqu4DcVTz+6mMLimslW4ZbaWibwrKVZyVayWJrYESlsj7CY7kABqo4JVYhDpel5xlZas0D9mWKdqFsxOuQU/qsoIWyQWX4sAj1uI0f4QKnIpUrwCMAhZIp/qFlEaKc8uUazaFaBBBjyWwlNXp4p1a5DUoNYt0keTaAbVzqKsAjSoi1I7gnEt1jBiA94ym9ei3DN96tJ5jymUGaGl0CiZ4jnMQoY/YuRIAFN9nVmNhZcu4LgUYpXRJNb8Cn+R+XmBanCTPAXZ5z2g9o+XQdwFH4TofU/OCFdNTztmuLOsJFOeHVdqYRAamVY4VTGU1+IMSMhZBazR6iU5H03NeYiOJMpIU1RxdFOamQFzEKeWOEIqAh6vLtV88k4wRyGcymUwmk8lkMplMF4/OSw2jShV2VYgHXjtLrJxlFbXgCGgFHHB21tVlqeHRmAU5LphD46cUlSLwQQrRStSBaogjGJIaReJ8lg4jFZErKb5AUYhUs4RSzEJhqZx+l8cvr6M1Cuc5gRakbBm1S1scjziuI37pqI0gY1TjSrajfA+pv5N292JpoywInsBDfK+S16RqxiQmEoECZUgoFgopa3pzc3HAOXUwADxSsK6EYQKH0r0SPQij9DLpnOclHY2HKgSA5iJUcQiwBiSRRUDHOVSVQ0WUoo06Vbwm0p7Ge7Qto9O0aFtG4z28j1E7cVypwLuMWa0hJ23HiRHLeAFA6RpOBtDrlAhwLsVrhbYZIAdU5EKElNP1jCgtWc+MpmUM2hbD1oM8o/VAxdGGYDhPKY0sAd8I6mQQOe2SY62qUfinIgAprwZAHh1OaWdyNqs2sMo65bSq5BT9IMki1k+d/JnXldiKKUcz6RXjSCKycr/L8eQFm5a9RRiZTCaTyWQymUymi1TnoYZRTh/TNCK8H+Qhjnn8nj8BF0EL2gkrQQ1l6lAcS3E+mkmp3CWBNz6dI1iJkzOnlcBJvE7DFDmenNx4f73teWJF8Q7auS0L55aRR2lUup04lmQHSZ+hfHdFnhK0ofJIdtIVEJIIozSKlDoYXV7K48v8JdeISZAhAp1QXDhHUPl0LaeOhCgQifzKVnyxFLQYRxQBk9odi3PdpNRUctxVdFdaJGo9QLY6L6EjRQMRAbUCQVUELwkgEaGq8nHnCB1H6DiHunIBwlCIdvJtiNBpWh8AkpeaQeFnMF2MFOIIf+I8VS60VcVxes7QhlywhRR0pngcAqFY1lGMSuKYIhVPrhyhUzt0KhfuQ1RAqZYZw8aj0zj0mwCN2jb0uY2d9Y7SDmEC7Jgk9S1LnlEZl14MuXC5RqYyZWoVpM8M3W6e08CW9HMSjo0WoE9XUsRr6RlXUX+M9FkhUUayzkl26kNYC6ygVkivzIXFQzcUuLIII5PJZDKZTCaTyXSR6pwDI51ykaFJ+u4f8a3kv5dJW+HnaJoYxxo4IEIbnTRdb0YcxQwwYvyLhjuUoU6Jesoiu7omrX6fIv/K4Eo5qAKBpE6PGk0KZtE2SaAMqDJukXdVehcV7ST4IhAggoGUNpMc7UDImPNOTwEGqXHJ2En3KhdbTgAu+tMyl6EgOAHKCdb2yuAqO+uQ+VAQITOcjISSkx1vmgFVWYNKojfSFuayZbqab00IEoSKbRXpktDzFcYc4BBiupkLqWYx5QwkKZUBEgkwqitCp3LoVg5VVSXQE6LOQrFpiSxqIzRqIkTy3qei06EAtQ8wzCFFLzERmD0aH+opeQCdeKwT8ssC5GAfaxJxSlfDyHiZObbr0O1U6NYV6giNiHLcWOMZnToAo3roMGhaDGOUFEfo5WOamoyx5QCLKqYEvoTJjKISggDWUQykmHAOBlLPSV4zyMslpWbKczoKoBIQUn3JzwqKsTMI5HLbuodhLsInh9TwkgEV7RcfArmYuclkMplMJpPJZDJdjDrnwAjJgcqAQJy/UCRZzirdOA1V9C5rqVUSmBGcL4miceKEkY6goQhyBDyMpB0puOChlYveJsDCEqGRd3ArilxrT5dyZIS0reGLnM7xXEBAFhQkIx0Ik/5M/afcCpGuX1SOMQMUXQuqBGLSl7zb1CrHVV/S+ZS3Ls8pVRlklXMXQk4CfNOoCgloyQrIgJFKuwIqrUm9prh6SIEuRSl1RBupOUuAEZxhkrRNCgC5GEVELhaQRm6XCBRrFnUqh27t0KkdunWFTu3gnAvXOR2ZFTrIHAthNx7DGLnTeB/s6BktByADQopeAgDPDp0InZyjUEMpRghRrGcUag7lKKYCHAl8ifCzUzl0OhU6ERi5SFpkLirvUbUejhwopq/VbYBcrfdoY5RUq/pNPtRtklmV2lICePMzocDKKEXRwEetAx6lr6Rtq2tVFU2tgJsZMsd21T3TKpF1T6OX53vm6mW6k3o9KfItYGqUjJlMJpPpda/p6WlcfvnlmJmZWfW49x6PPfYYjh8/juFweJ57ZzKZTCZT1nnaJa2EBgVTUT+LaAEKDmEFHU1QfrcvKV8awEhDAnXkmuSYrVJsOfweapBUCGlDaUemdF6GMnJdla4Wx1rBHoEzLO3ECBjxGVU7yf8U0FFE3uikPB25oONh8rhCplFM9hndnj7aSsZXFFhW0mk9su28PqWKXnAIJJFwDqcbUHYtI3cEJBVFzWM/JVJGcFHqR6QbCXzJrMY+eGTgk3GYBmoo2tE76BXrBuVW9JJqVleEbhVSy6R20Ggh5bAzWogq6tQVuh2HXqdGr1OhUwVgJBFI0q5EsDBCtNGw9RgMWwyaNgGetvXw8TUgUUYO5ASGhU7UFaFbO9TOwVUuAjig5Xi9Dz9bZnCr4BEybKsicKqrKkVDSYCXB6PylApauwjPOk2AW43cg3OkFFqk1es5/CEZpJyWssxbnpEMUXQqoX76NXjR6zj/XqZolueU1bbUOohG08CH8ipNd5cHovwMCesyPONyRCBzhuYJlsUhaCBrMplMr0UU/16RnSxNF4+ICJs3b8aVV16JzZs3Y9euXZiYmIBzq/8twMx461vfisOHD+Pzn//8ee6tyWQymUxZ562GkVPuVYrYgf5WnpPXNurkgXNkDitnEKkd7VKWNVzEFVVlqEEI9WikrorUwiHkwtNSQWkUtmQoxGnHMUmlSwhEQYpctinGzsQwpbwleGyTMuQorle/SMSE9JXSiBEDFvIoGUiwDSgjuUDaVc7vp2vSHJUOt0TtUGqPUhRKbpuKCAxWMyCt5t8zrBBbFCmA4lTHTmv3PvRB1ZGh0lYyXqnJFOZVLMcqqiVbUezP6h5VjNypKhcKWDuptZT+CADIAXXlElzq1hW6nSpE7FRV3DEtFMcWcCRQUxhD2zKGHYemrTBsc+SRwB4g3CdEK8m1OQKqUruyyRpItZEkAqjltNOZ9xx3OIuRVRR2dyMJnYrGiKwH7GJNKwpjqStCW2eo1TBj2LagJuwP2DKjiuFLDKSQQkkn9Wrx6k+G9IyNoBsoEMoCYmSe1ToCGJ7kM6ecV/1pQVDPM0nx87IvBVxirFiD+fMhF7nXdYmYAwjNY4qfSVK4e5VUTpPJdO5ERBgfH09gZWlp6XUBV9avX493v/vdGB8fR9M0uP/++/HEE09c6G6ZEKKJ7rnnHlxzzTXodDqvqHYdEaHb7WLXrl3YtWvXeeilyWQymS5WXegvhM5DDaP8OkQq5G/bgZUFnrVjBXHmiXKkCzgVkg5nUCpGnVJHODvMektzFaMDgtSeCX2SqBMX4YNsFZ6KMUPayZEuXhW/FWdUR0tkdzXaQsOf1PsRWDTiPBevYj6Mi44rYqpdso2CJho80ahzrO+NmMIVb8Kp4/ns0STBshy5vlGO/JA0p7SblQA3FXGVargQq/cp16CheDc1aek8DvWeivsrpTmQNpDnP8ODeJ+UIqfnIdoX6pijWNcnwqxURBqpqHXlHFwES0Qu7pAGuAoJ7MiuaRoYOQK4BuraxRSy0Lk2RhlxTF1zhHQPIoq/B8ijIRLF7smMsZei2kDrJeooAyXOQ47zIrWIlK2YY5FvQls5sPepPWbGsPVwQ4LnBk3jFVJR0WEq70sKROu1z3JOXIOjYFigJfIpKqIvz76DfB7k9RMiEqV+lqx+WSN597a8gnIaKmSuYi/lxPxefpa73GLML2N8+Qwm+ifR9UtoibBUj+FEdy363Sk0VMW+v7zjYDKZzo7Gx8dx44034i1veUv6h9dnP/tZfO5zn7ukodG6detw7733YuPGjQlGfP/3fz/+1//6X3jqqacucO++czU9PY3rr78eN954I2ZnZ7+tTQ5sYwSTyWT6zhMRodPpYMuWLbjyyitx1VVXYdOmTWiaBs8++ywOHDiAAwcO4PTp0+fl3y/npYZRgjXZE08YQrtoGk5kB7aMWJFaReKoa8cxtaEhVbpDBilO3TbBAFVYOmESHfh8fscAACAASURBVCmgWtQwxqvxlftrYeR1rNciUES1WYIi6XQYoERh5JaCEywuuEAvcX81lMqQLeMip94XOwUbULSl1ACKkIUlIkL3UMZZ1n4pjoywnGR9RX8owgECwVOO+kGEFpK2xvGckC4mBcxzhEaCe3Jf1jZWKUbRVvq5WgGJ1BgAxIeQEnxxBJBzgjYiwCCQQ4hEiruLEbkwf2qsjuK5kRJL+hsJVCJCVQFgl3Y184xcd0jGGKOVXIRYTtqI86jXFUPgXDB9KErtAihKwEjGGe+X/s87tUVjoCFG5SjWK3LB1rFWEjUt2AMD59OOcyTpe9GoEinoZTAjts/rZOSYfmYVpEFcE6TPztvgQT4P5DcX5zTYqbgqt8MoogZZ9z9RqnydA6MmxhyWsWnhOax94RB6p05gMPToux4GrgsPYKYdYGP7DSyO9XB002U4s2YbWjoPH8Emkwk7d+7EXXfdhZ07dxZO+Dve8Q4wMz73uc9dwN59+6rrGnfeeWcBi4AAK2655RYDRhdA09PTeNOb3oQbbrjh2wZFJpPJdK4kX5iYLj7VdY1t27bhe77ne/COd7wDV199NZqmwcLCAgaDAYgIY2NjmJubw7PPPov//b//N/7H//gfeP75589tv85p60CMdojpHigdegEt4QCKiB7Z9l4iUBAOo0IuRB0cP3HskM6RCJCUdqQ5BySCokwVGWE7qV8ZBiE1UiAuoUfpxgKbUDq4nPspo9EwSwCOg0RVZUAx+khL6pYGA6T6rCOwNPwgddcS26Cwc071QnLyR+8v0EmxLcgICRqU5LnTkUq60Dgg487gqy7GlyGdvPZpF7ywxbykoFXsUYPRpwp5hWV7BqgU5zZGuYzWk5LoKL1FPSNAlJbDQ+MkogcxYkh2UKvy/1WMximU7lVgqdyOQ5hdBWs8M6ozp4HlBQzXbgJBIpqQCmBnSFfOPCNMEMewNJKd8hQo8owSUKlC3BJtJM8byMP70I5QNM8AWo+agaYKRbFrR/BVSP4L+6UhQT0wh7S3aAKO75VrWsHF+BDLGAXeJdBXjLu0qobDsvuZrEMNo6RQO5Id87zED6a0jpK9AXSIscMtYc/CE1jz7JM4sUw4NLUVz++8EqfHpjGsOmhjxJfzLTY0i1h/8hlMPn0QJ+YP4fCO/TCZTOdOnU4Hu3fvxrve9S6Mj4+vOF7XNfbu3YsHH3zwkvwH9Bve8Abs379/BZSQLyZeqeq6xuzs7IseZ2YcP378krTR+VJd17j66qtxzz33GCgymS5xzczMoK5rzM/PX+iunFXt2bMHV155JT7+8Y/b5/lFpE6ngxtuuAH33nsv7rnnHszMzOCf/umf8Ku/+qv4xje+gYWFBTRNA+ccer0e9u/fj/e///34yZ/8SbznPe/B7/zO75zT/p2Xr7dHt7SXlK8SZKAACLJbmKSKyaEAQyS6ZBR+ZOm2SDmCCUYpJ5PUebyivVFHtDwHUlcokhPZpUwuKGMdNCbIIEL7tC2yM5ruT0BKf+KVbad2GSuiq9ILBeAoga0Spsn4E8BCeQ+vWURhNy09OtV/lIWNAaj0MnHK8w+BQ0AGVtJfDXREDoyZdoDrTj6LQ1Pr8K3eVIICEk0i0VgZ04U/U5QWB1gmY3ZEqGVntJhylsFkiCKqXQZFVYJFMTXNuTQGGb3Y1EkUi16LhJRmllY8A9x6bPz6l7E83sXxDZsCvJBaO1SCD92e3vGPJH1S7E0E4gCEPAQehdchVQ1pvMwU6yAB7EKMmgBdz3lNeuZQ66l26Pk6zBF5NC2hobBTG3mgle3pJV2MM8STNUxqHsJaV++Q7Ewowy7Xif68kc+V/CwxQA4SH5bXd/xd1le0bZgAleIW11rtgG3jA9w2fRw7zjwFqpewvH4dBjSL8XYc3E5gcTie1jYz4CqHjWtrPDF9OTC9C9sPfhXjj/4zTCbTuVG328W73vUu7N+/H1VVveh53vsXPXaxa8+ePS9aOPmVasuWLfju7/5ubN++/UXPadsW3/jGN3DfffdhYWHhNd3vUtbExATuvvtuTE1NAQAOHTqEw4cPAwCuvfZaXHfddS+51kwm08WvXbt24T/+x/+Iv//7v8f9999/obtz1lRVFT784Q+DmfF//s//MWB0Eaiua1x77bX4sR/7MfzQD/0QJicncejQITz66KOYn5/HcDjEc889t2K3zK997Wt49NFHMTMzg9/7vd/DRz7ykXPbz3PaelJ2zjg5obrwcGYaDnrr7axiScfoEnFaoc6VKAsGRyiVEQFhZZsJ8MTIg1xPSHmcyL5juC+lbuh7g9R25QXQIaiAjBVgSwMjOV+2G0/9TMSNi/HoPZy0jQJcUfhH9TU74RmdFM2Tbjk6vOIsS4Fksb3ekY1Y9cup8Zej1nOVatYkWqTO43ithiKAAj/huANj15ljuPXYEzg4twOHx6ZCJBrJ2DhF+zh1HQTOKBLlw0II6WGO0Inb1Ncx9QsUIppcrBtELoOi9DPkl8XooBCVRBxqT1GCijmqLNX6YQ2LOI2101/C+ue+hWd3XYXKuXStnvO0ftKyzc+c2DLNhzrHUXgKdMqbiyDIS0ROHAMAVB4g59I6DyleSLWYJFqJSNLmWoBacBsjmCjAJiKGYyqi4VLx7TiQFHGU4CYlIJafQc5gOe2MllZ1so5E5aV0TDlDLbtUUyod5/TsSJs1MXaMDfHWuRPYduwgTnxjHk9Ob8ThyWvw7HAGfe8wQS329xZwotfHQwtr0XgnnAtHBmM41TrwJAFXvQlXHfhXmEyms68tW7bgzjvvxO7du18y0uPMmTP4p3/6p0vyH84TExPYsWPHa2pjy5YtuPfee7F27dqXPK+ua+zbtw8TExP42Mc+hjNnzrym+16KmpycxPve9z5ceeWVaU1dddVVF7hXJpPpbMk5h7e97W34pV/6Jdx333347Gc/e6G7dFa1bds23HXXXfi///f/XuiufMfLOYd9+/bhR3/0R/He974XMzMzeOihh/Cxj30MDz74INq2xbZt2/DOd74Tt956K/7kT/6k+LLm1KlT6Pf7eOaZZ/DhD38Yf/M3f3NO/z4658Ao/J0aa9GsPBCV96lKNXsoRxuMxhKkwrkjNYbEwQywhWIyjI5UyrCkfF1CJ+1YCtTg9JqLQtryk1UrAoF8cjvF4c19HAVFOa4n9kGZR3YmS07uCJBK96fSRZYeFX2DzEbCFGnsHG1KCFElUnQ6H6V0XFKDAB1VRfrMsqA55RHKOblwdkxkS9Elqk5UbMypkaWIMTB63uO640/htmNP4oubd+MrM5vAjlCrOXPkUBFQOx2ZE9uKg6EIOjxzDEIhdCsKu53VOcUszTvllLUARnTRaUT4ESNwfBiXJ4BdBo2pG4jnKzsIMAGA2fmjGF88gU6yv145qih5BC56BQhsAXvUzQBu2Ac1DRhASw5+bAJUd0M0UZxTjhRIoIxnAJ7g4EEEtF7ZIdZ4qh2hJorPndgjHG6Y0UgoEmVAC+Ti6bJ+s03yehGoJOsszJ8qpC3XKNik1zVAqc6VThFMn0gJ0kUAmT5z8nsEwlTlccvUcdy88DgWH3waT4xN4MDGN+Kg24ylfpVqPREYz7TjeMvkaVy/5gS+dGJtOvbcsA7zRcCpsTE8fu1NMJlMZ0/OOdxyyy14y1vegjVr1rzkuQsLC/jYxz6Gxx9//Dz17uxq06ZNmJub+7av37x5M+69995X3AYR4fLLL8f+/fsv2ZpPL6fVUvkkAm3v3r0FLDKZTK8fjY+P4wMf+AB+4id+An/8x3+Mj33sYyuiOi51fdd3fRe2b9/+mr4gqesaMzMz2Lx5c4q0XFhYwKFDh3DixImz1dXXhZxzq0Ywr127Fj/8wz+MD3/4w9i2bRu++c1v4pd/+Zdx//3348SJE+maAwcO4MEHH8TP/dzP4cd//Mfxp3/6p+nY8vJyau/gwYP42Z/9WXz1q189Z2M598AofesPlS4TpKNkEhtQMEZDCL0t/GpFo0eja4BYkFrAkzovQxYSbpAjeliiP8KZusviwqbgmvgmFW0iObmy41dRzLnoYWmFDKWQ7qR3XktjJR07ku9ftlj2XdeHkSgvSnCC04UJ5hBW3HklXIp2jm+UQVCUwZ5cTXn7cwFAxWPEau81zaiKceZ+TDcDvP3IAbxl/nH8v5fdin9dsxlMDj2SNMEI7wioidBRxaLFTsn6jLxVIQE1hdSqbu3QqSt0qyrtcIY4W6kINSG268rUy3hMzMyIxaSTfcvaW1JDSKCWB1B7jzWHvwW0gwIiZlCUgUuqs4M8rcyMzqnjmD34Vcy+8CSqxdNYXhpi0DJOtQ5H57Zi/K7vhZuYSkAlFz5HqgXmHOC9A3mGi0CJkVcomNDGqKvArhiD1oOoTZFW8r/UC/J5KOq5DtRQahgJ7NXPLsVnVGDV6EIJUWfSdnizYsTi6SsBapovAtb5Blcvfwv9sR6e5ymcHDp4z1g/6fD23hHMPfIojs2fwYk37MK/Tl+LZ3hNKnyfngcAfRAeWprB+9c9hyf6Q8wvdRM0SuuPgPnxLkwm09mRcw533nkn7rjjjpdNCzpz5swlDYuAkAL1Uulos7Oz6Ha7GAwGK44553DHHXdgbm7uVQEQIsKePXvw+c9//pJO5QOAsbExVFWFnTt3YmpqCkSEa6+9tqh15b3HgQMH0O/3cdlll71mWMTMePzxx9HtdrFjx45V21taWsK//du/oa5r7NmzB71e7zXd02QyvbRmZ2fxn//zf8aP/diP4UMf+hD+7u/+Dm3bXuhunVXVdY13vetdqOv62/rsls/+D37wg7j11luxZcsWjI2NAQD6/T6++tWv4ud//ufxzDPPnO2uX5LauXMnPvCBD+C5557DI488knYzW79+PX79138db3/721FVFb70pS/hN37jN/DpT396xbwwM06dOoWPfOQj+LM/+zN84hOfwBNPPLHq/b72ta+d0/Gch6LXCmaovK6c5KROROnQ6TOKOjYoIYIuAp1294q/V2rLdIEyJXCioo8SXeSgQJe6l4ZXMqQEWYpjhCo1r3qsfrAiZKlgdbyO1MllQpaOeyj7AaysDVXAMSqPA8F5bYNpFOwQKLKKWF8vv1A5LrGbikbS8KSSO1CIMCGQ2rksAxlEGyVbxf7WYKxbXsA9z3wZN588iIXeBJ6anAO5Cr1Yc4hi1E8oJh23tB8BRp4F0sj/ub8d59CpCXVVoVvl11WMNMr/xsvgSP5IayamvEkEUtoxLIUhhVkMUDVQzWIHNwC9/hLWzB8Ku8i1TZ4XFjBEkEJAel6F1VXHj2PiH/8ey4eeQOXCX36DBqEeEQP9F05i7E03ARNTCgTKGPK8Omb4OBb2GZjp/laxEHfrQ1FrBqNhxtAzmjbspCY7rwF5xzQ9XnnuoI+RWmp6AY48O2mN6d/lchJrR5tDRREiQylyDm9d08eVnW9i/lSDR48OcHzA2DQ3CXd4Hv0uATum8MJii2O9DtAto+Z0j5iA3eta3Fgv4/5vdTLXYomyenVFaU0m04vLOYfv+q7vekWwCAC+/OUvX9KwqNfr4aqrrnrJz5CNGzdifHx8VWAkO7F8O59B4+Pjl9RnV13XWL9+ferzhg0bsHPnTlx22WUYHx9P4OjFtHXr1rPan8nJSRw8eBDbt29f1Y4LCwu477774L3HU089hZtvvvms3t9kMgU553DZZZfhv/7X/4of/MEfxAsvvIAvfOELrztYBITPsdtvvx1A+Ex8tdqzZw/++q//Gm984xtX/bycm5vDvn37DBhFnTlzBnfffTduvfVWnD59OkUEjY2NYd26dSAiDIdDMDOOHDnykhBvcXERc3Nz+N7v/V786Z/+6fkaQqHzkJKWaxZJjRsg10kBtP+XPMV4Ti607KKz5eNX+V7vcIbcjkTNMIUt5mmFG5edu5S6Ig5c6htGWs2entRn8VzutCQ7KJFqKN1ZwoaobDdHE2VYUyNGYKhIFj1OgSfaVEWx33RPVXdoJBpp9HWu95OvKfql5olAcU7y+DkNLzvkLoKatPNXZA9V9upDm6wiZLTi7lw+HhTI02GPvUe/hXceeQjXNPNwjjHfNiBu0anVDmUu1CASaFPFXc2qCIxCtA/D+/g/M9pIP0Kx61C8ulOF4tWOXAA/sd0AjvKald23ID+jPVIR62iLoph1tC0jp385Dv/L2lh7eh7VmfmQltWGD5bSVlIAnldZY4A7MY/F557E0sIyTg08ehUgaW3crQF4uLZN/ck1rGTOKK0Lx2Hds0OCRZ4pzWHrsz1aDpBo0HoMW4+WfYRz+YnMqZuytjiBy1GwmalRuJ9EIGko5GKnU1RU4k1q/SvC5RNJ4jg3jNnKY64e4PipZZx5fgHbxrtY6yrwc/MY2zqB3poujh4fYPqb38TVM2fw5GXX49TUBnhXp88SeWhm6hYT1QJ2jo+hrghDNSYCF8+WyWQKnx/d7sqou8FgUITQ13WNt7/97al+j0Rt3H777a+44PClWLNIa82aNenb3ZfStm3bsGvXLnQ6Hezduzc5CkSU0glerS4GZ2p6ehqXXXYZdu3ahY0bNxbHHn74YXzlK1/Bpk2b8OY3vxlzc3PYtGlTTnteJe3sfImIsHnzZmzevPll+8DM+PKXv4yvfOUr+LM/+7Pz1EOT6TtD3W4XH/jAB/Arv/Ir2L17N6qqwuTk5MumMl+qkqggAN9W1OK1116LvXv3vmRU62vdgOFSUKjR6pT/F/4t4b0v/l2xYcMGbN++Hb1e70Xt3el08OY3vxl/9Vd/hf/+3/877r//fpw6dWrFeRs2bMD69etx3XXXodPpXJBUyfNS9Fq+9Of8W/KrRt+TLeWDI5kBiAAiUI4AEmezqJWjol6kbZm+cM/wuwenCAcdJQTpA7ITm3dtotS3tFDUvWVMCdpI35GjbtK5oxRI9THbStfukT6G2jigHH0DbYfkJGtwtbKmS+67jsjKznyAKkKCAk3QUA1p/NFWqv5MJZBGwIsjUKgDHeFJOFdgDTOHuVbFr4lzwWghSjUY+449jfc//Tlc2VmC6wKLHnDtEHPcx0KnCsCodmnbe4nuEXBVuQxtmEPUS8uMtvVpO/kEhVz4UKikwHUyrkQOuRDNpMwixaMLW8e5D+Asrw4ZmhPIKden9xlbFo7CN/3Q4MKCbF82Ynfl+ChuRMyYPHYYCx2Pek2Fky94LPcZY1WYvoY8OtdcCWzakfpLLq9vAtA0DaqqCqlmjDQvAoxIvRbA17SMRkBR68EeCRSJLaDAFwmoigdZPZvpE0IVe9drXECR/Ls7pzwyxrjFjO9jzi9irV/Eeiygbvtg9hgCWKYOTldjWKCwm9my6+J9s0sYP/0cnjl8GgyH8a7D9p2TmOt10RCw0PeYf/4UZpxH79SzWPvwPA6t3Y6nL3sT+r3Z9Iw4EMaI8dTJLk73GxT75SUngctnymT6DtbGjRtxyy23rCjayMx47LHHcOzYMXzta19Dv9/HPffcg5tuuqn4x+muXbte1f12796NT3/602ia5qz0/3zrDW94Q5E6tZo6nQ7e9773rQrhvl0xMx555JELCo1mZmbw/ve//0VTurZu3YrbbrsN4+PjZ3XsL6Xp6WncdNNNCVg+9thjePrpp1f91vjVwqpLHW6aTBejvu/7vg9/8Ad/UNRwGx8fx86dO/GVr3zlAvbs7KuqKtx6663odDoAQjTQi9XXebHrb7zxRlRVhbZtg1+gPseYGQ888MDrsrZdXdeYmprC9u3bsW3bNmzfvh1XX301ZmZm4g7SHv1+H88++ywOHTqE48eP4+TJk/jFX/xFXH755S/bvtRd/Mu//Et86lOfwm/+5m/ioYceKs7p9Xp4+OGHcejQoQv298E5B0YelNM94nvi9DkQGiCk5KTYFuVYQdcuyvCoiHqJAIgSPMnRMtIKp4iEDIa4GcK7Gs45dWcUhalXhGtAivRKK+q6opV8VArcAsi1V9K9lEOcb5GMlHa6otVrNmlYMFoYW6Khcv0kBZ5i5xgZJqn91NRoxR4KFinwVaT/xNcVSYQOUDuHbkVxm3lKtXAkCqT1ASy0nlPUSAIqzKhjBEuIKmNMtC3edvwx7Okto9sDmpYwAKE3ZGxZPo4TvV1AVaEj94tgrQp5YAkiKX89RRa1PkMjQHZJQ4JNGvxQgkLRZpQBS1iLwf4ScaXnTUeGSTRPfvQlLS4Ua+9yi439eRxzgINDvbQA+BZcqbi5FKkkYAXpvuPHXwA98RW0HYC6NXiW8PyxPiYaxmxNaNZswMTtbwd3e3ENhYLVlOY4p9HpfhJxLlyF/IxxjCoatoxBE362nvOzQTFSECPtJcgrY1IgiBkOHp5cBsiSMsdABUYXHhUzOmCsbZewrTmFKwbPY1czj81YxGyvRbcbxtFv+ug3Qyy3Hn1mNI7AnQ5qV4EHFTYPp/CtY2dQdWqs3TKB3TdvxZqdW3HqkSdx6vmTgBvg8t0TmJ0f4Pj8EL0TA3SPHsTEcBnfvPo2LPVmYqQWo3It6qqPF/pjKiowf3bIWEym73Tt27cP7373uzE2NrbqM3HzzTeDmXHLLbfg9OnT2LFjx2v+JnNiYgJTU1OXZJFOqSXxSs4727Bofn4eBw4cOGttvlq9HCwCwj/wZ2dnz1ufpqen8QM/8APYuXNn+DdpXKsPPPAAPvOZz1zytZ5MpktZo5EgQABDH/zgB1dEE3U6Hdxyyy34xCc+cVFEUp4tjY+P44YbbijScnu93ot+YaJtRkS4/vrrce+994KI0O/34ZxDt9tNfw8//fTT+O3f/m0cP378/Azo21Cn08HExASWlpZeNE17YmICdV2nVMX9+/fjpptuwo033oidO3diZmYG3W531UhmZkbbthgOh+j3+5ienl713ymr/b3FzJiZmcF73vMebN26FT/zMz+Dhx56KK3ZTqeDTZs24eMf//gF+5LrnAOjtCuYIg1iKi+urXKkUv1lUk5xbCN71mVbUsdFF8YWh6yAJRRTaAggcgB7ANUqGWOjdUlUqlfGJSmqJ2+NLlEiqs8KEOnIiBWATKWQASESR9LvpK001gLujFQ4omxbgUKiFEEl4CNeoM9xsW8MVdcl3lJHRYnzK06vpF1VEdDUFaEXo31CsWmgA6AT9lRHA2DYyvWcHgoHYNIPsfvUIfRoiGfG1uK5ahJ9qjHFwOVuCWunHZYZcUt1wjgzNp55Hoe6Dm1dp4ggSVGSqKYQJRTnk3JUTM0h2qmtWjQtx3RDgUWhDf18ew7ggz3AjiMUjXuVUahH5EgBARX1s+pkIf9FJizGAZhs+ljTnsCpbgXfMHrDZVDbgF0dLvUe1bCPeukM3MIpYOE0Wgaa3jh6rsL0ww/ixMnnwB2CqxzmNvQwPV7h1JE+hkwY37MHvHFLjkgi+T+v2U5dx93TyjUHFQ2GGGHkIwQctj6AwNaHZ4FD9Jj3iZqksSYqmeBTOGVi2Mf00km84fRz2LJ8FE/NbMS/rb8WLVUgBnrcYlv/JK499TR2Lj2Pjh9g3Hlspj5m6yGmxh263QpjUz3U3TGgJiwNhmgaQn+JcOJ0i37LYUe9rsf0TAczk8DpEycxPV5j1xs3Yc3aLtasnwUNG1R1B66q0K0A1wO6c4x14w6n5wgnFyvMLS2gPvJ1PLptH5Y6E5irG9w+cwRXrzmGfzi2OT2P8hknT9logqHJ9J2mffv24T3vec/LplcREdauXfuy27+PavPmzThy5MiK96emprBly5ZLEhgBFyb0v21bfOITn8DRo0fP+71Fd91110vCovOtUVgEhLXa6XRw8803o2kafPGLX0S/37/APTWZXj9yzqHX68F7n+rArBZ5sWbNGvz7f//vMT4+ji9+8Yt46qmnMD8/j7GxsVU/R4gIt912GyYmJnD69OnzNZxzru3btxfRu2vWrMHExETapr2ua2zcuBFbt27FG97whlTz7fjx4/De4xd+4Rewa9cuNE2DpmnQ7/fR6/UwPT0NALjvvvvwxS9+8YKM7aVERNi5cyf27duH66+/Hu94xzvwqU99Cn/wB3+A5eVlOOcwNTWFG2+8Ee9973tx/fXXY2JiAr1eD9u2bcPs7OwrrvckqWoCpkaPvdy1Auf27t2L//Sf/hN+5Vd+BYcPH8amTZvwwQ9+EHv37sXBgwe/bVu8Vp2XGkaASl1CcDt98U6Otgh+lXIeM/YpnE11JXQaG1J0B1JZFw1q5DxXd6BxioZLHIFB8mNJ1VRhitt8j+xcNtqrePPRItSMPK70viIJ0k5IY+MUVcFAqr2TahUpMJX6q48jj59R2lXeZAKqeI30Taew5b4oeKTG4xSQcS7sRlZXsiV9gEUdB2wYnMGe009j88Lz6HvG8XoSz46vx5HxtZjvTqKBg2eGY8atp57G2x/7R7TDAbB+Fk+Nr8PnZ6/BoDcHDJYwHAcqBwzj1u8dIswsncQkWgw64yGtinJ0jECfAt5FQ0jxZucYaAGGB/mcpofYTh58BHEc0hrJxx3EFM4TGJXWZJqXDOGkI5S7olBg0GyzhGphAb5ltGB02j7coA/AoTpzEmsPfRNjTzyMpWMvoFnqYzBssNgwnCOsrwiDahnoOtToAHUN72qM9Vq4mRbOc7AvRjqazaQKWhdPKvRqCoA0QLbGewwbj2HbYtC0sci1NEsgcXCi3YVEhrWbPwdmBku45fHPY9vxpzHW72O6Bnaefg7O1WhQY2b5FHYsnsDWU89hrl3GROVBFaFTA2Mdh2qiwljVw/R0B52JCuh1MBgylhcGOP4CY2GJ0fQJ7bAF+wCNzsw3qDc2mNs1iU2XbUA9VqMdNFg8ehKdThdLSy0WTg2wOL+IpcUB2iGDlx3a5RYbJgm9DQ5PT8zC1104EK7vvoB6cBynz4yj8VW2n5BvbuDQwrN982z6ztXevXtfESx6Lbriiitw7NixVXP+r7jiCjzy47hSTAAAIABJREFUyCPn7N7nSt1u97ylWmk1TXPBnaher3fWYdHGjRsxOzuLvXv3oqoqMDP+9V//FU8++eRLXjc9PY3v//7vL2AREP5OPHz4MD75yU/i2WeffdX1JiwFzWRaXc457N69G/feey/e+MY3YmlpCc888wwee+wxfO5zn8Ojjz6aIjCcc/iRH/kR/P7v/z46nQ6OHTuGxx57DB/5yEfwzW9+M0UXibMur3ft2oW1a9de8M+6s6mrrroKMzMz6ffp6WnMzs6ibVtcccUVePe73433vve92L59O6amplLK2XA4BBElOOe9T5FXko5FRC8aHXyhtWPHDvz5n/85brvtNvR6PVRVheuuuw7Hjh3D4uIi9uzZgxtuuAE33njjioigl/scXi1y7bVI2nPOpSglIKROXnPNNThy5MgF/eLhnAOjVEhXR+DECAqvbayoiucMIwILopG2MngBcp2fDEdyMWZx/DXUkcgmAsXoiXAPATKSLiPRQ6HZ2AJlxzn42JxSaFS2DaQ2kpNzYgcrUCrknaKmBJbJS+gaLjJGFSFU3Cd1IdkvlZ4uw6ZGDJ3tk0c4WmI7A4wcWyIfqrmwsCOAHFA7QqcidJ1DtybUlcOYY1x94mm8+dAXMLt8Amhb0GCI7cMWVzTAye40Htu2D49u34uFehwVM7acfgETwyUMvMcYn8Lt1MeWI0fRTq3FrF/CyYHH2qkKcA4dT6gaxtrmDGaXT2N+chpQu6FRTCkjJ73nDBIlMoZCtFBVxQI+Xoqbh4Hm4t1qDSNH1YDLOSMOkUdClgS3JCZDGqRmhXvmSLO1Sydx5vhJLJxZQneih6rpwz/8EPzhZ9AeegrziyfR4SHgQ2rdYgv0Ow7riMGOMewyuKoxZIIkhlLHobNuDOOLA/SHS1iOhbCkSHmqLyVLMj5UAYIFo5CKCPIMNJ4xaDz6A4/FwRBL/QaDpkXjPYQLEYf222h4VitKg7Ng8wqdhWX0mj56XWB54NE9vYi3PfkvoJYxBg/ftAB7tBVh4IEuMdoGGJBH1TCGjcNwWMEPHPqLQ5w+NcTycosOCFO9GmMVcGahRTv06NVAhwA6PsRSvYTl+iSWBg16vbAmfEM4c2qIE0dOY7g0RNMwak8Yh4frODTLFba4Ab4H/wbvB/jKzD48M5jEV/t78ZlvMZ4Y9hJFJHiAG5Dvg3wflX/9hDybTK9Gu3fvxr/7d//unG4Z3u12cfXVV+Oxxx5bNSpm165dGB8fx9LS0jnrw7nQ+vXrsX79+vN+316vd07h3ivR0aNHcc0115xV52Tfvn24/fbb0xdNzIzLLrsMDz744EvCnn379q0apTA/P4+PfvSjaVecV6N+v48HHnjgdZUOYzKdDdV1jR/+4R/Gb/7mb+Kyyy4rnPu2bXH48GF89KMfxV/8xV/gySefTFF+sqvjpk2bsHHjRuzZswdHjx7Fhg0bVr3Phg0bsHv37pcFxpeSrrjiiuLv2jVr1uDnf/7nsX//frzpTW/C7OzsiqhV7z3GxsZC6RbmAmh0Oh3UdY2madDpdF40/epCa3FxEVVVoa7rBMHWrVuHP/zDP3zZlO3Vos9eyXmvVb1eD9/3fd+Hp59+Gr/1W7+FRx55BJ/61KcwOTmJr33ta2f1Xq9G5x4YAUWERYY3lCJfkN6TQA6FMSi/L7/ntldO0mj0jsQ2kbomgCBK0EDAkJeekHLjFQzSe67pjakyVMpS/Cb1c9UCt0VtmAjKkN8TOOGSe52jWCK/StEZ2s6hPd33bAVdW2d0RziKHaFIohwAjgWvw+5dZfFiilupB1jk0KnC9vVV5dB1hK2njmDfEw+AhiewiBbdmjAz1QHQgz85wMLxeVx24DOYPHYYX999B05Or8VidxId51BNEXpTDuO1xy5exPJCg7mpCsOWgSrEbtVEmOwAa5sG648/i+PrtsTImEBmQgFrl3bMKqKr4q5diDt/CdTQRpF0O4mSSfNEYexOQcmcupbXX1G4ecTOL8akpQvrlk9g8cwSlpYHaGqHTgXUn70fzWIfp4YNjrWMaceYqsN8NQyMjVcYWxoCLq46Hwort0xwDHRq2TUO6ExOYZlcSicMZmEwZ2jkUo84P4zxWOs9hg2jP2yxNGiwsNzgzPIQC/0Gy4MWg9ajje0xQsqosFHKy7GwDQFY6vXw1b23wx98CNuPH8RkZwAQMAOPsckKS8stloc+wCoKRcoZDMcBnNGwxcmFIRb6gKsYTBXqboWxXoUOMZg9lheH4C7QB9CtgemJCkvk8PXDQyw+cRTcddi6owZqh/5iCzdk8DLQPwMsD8PY124fw/qNHfglxmAJoDN93Ng+hoOTO/E4zYHBmB9koCxPHfshqF0CtQtgb2kKpu88TU9P44477jinsIiIcN1116VdYVbT2rVrsXHjxkvOMZiYmLgg3+YOh8MLsjuL1pe+9CW86U1vSqkQL6e5uTmcPHnyJesIPfDAA9i3b18qfktEmJ6ext133/2K7sHMWFhYwKlTp+Ccw8LCwqo1Ml5Og8EA991334qCpyaTCXjHO96B3/3d38W2bdtWHKuqCtu3b8ev/dqv4bbbbsN/+A//AQ899FAqPC+wQFKb16xZUxRu1tEiY2NjuPPOO/HJT37ydVF/zDmH/fv3F0BnYmICH/rQh1aMX8TMGAwGK/6OJiLUdZ0AkgD2+fn5ixJyv/DCC/jQhz6E//Jf/gve/e53Y2pqKoGiV5Imdq6ld1gbnZ+f+ImfwN/+7d9eNHXwzn1KGkoYpCODAL0lfL6irKqjfw8tsHLcmUt33CmQIgAozLlEeuToBuEKPt4lp3ypPmfPX9Uq4tSdDJFKREUjfQ1wRnqgIqCkqREwBv06jlOs4ShjMAFHeXcmjFhPxkFpVzVWdmKEmjsacciFOXKLYzHkUItGgJUjSjWLKnJxd7QIaQDMLJ3EbU9/Ftdv9mgXCc0Q6E10sGnLGvS6XRx+7iTc0QrHjg9QnTiIsS+fxoH978RzUxtA3Q7WrmUMwFhmxmQXwHKDU63DRBfgKqSitS3BOUbdDjF75Cm4XfvQ1F34aJ+KFCyLfU7zGbeEJxaABDBU+pDYkApWAqmBJEWxpTZSsFmGnqQnEGHCiTikK1IElyn4rERIXd9i5vTzOLG4jMFgiMEZxsyaGrOVR79mTHUqnF5qcKjP2MrAGBF8z2HcVRhzQ6COUAgBGDWVQ00edd0BLS2j2+thuONyoHIKFq38cOSRXxih3lPjPZaHHsuDFsuDFov9BmeWBjizNMRCf4hB4+F93lGtLQqFZzhK8kyVPApHp2bx2X23Y+fxq3Dloa9jw/GnMTy9iInlBhNTHSx0PJpBm3ZqGzqAHdAB4dSA4BZbdIkxPQlMjHXQqYFuXYF6BD/06IxV8G1Yt0tU4Tl0cHTJ48SgxeD0EFOzDovLhMWTy+gNHXpVhWEDLPSBF/oebQ1MTU1iSA06kx6LBLSLjI3DJWxrXsCJWgopUibLBLBnkB8AwwWgPQ60iytsbjK9nuWcw6233oqtW7ees3sQEW644Qbcc889qKoK69evXzXCSNIbLjVgdO21116Q+x47duyC1i8CgBMnTuDTn/407rnnnrTjz0tpx44dL5tK17bta0orOHHiBP7n//yfOHLkSFFb5ZVqcXERjz/+OL7xjW9c0G+QTaaLVVdeeSX+23/7b9i+ffuLniPP3G233YaPfvSj+NVf/VX88z//Mz784Q8XO0oS0apFi0VVVeHOO+/E9PQ0Tp48efYGcYE0NTWFvXv3pt91+p1Ox9Nq2xZt2xZAafT/tm3R6XTQNA0eeOCBC/5lwovpwIED+Omf/mm87W1vw0/91E/hjjvuwOzs7KprQNtDR1WdC+n7CGzT0GjdunW45ZZb8PDDD5+zPrwanXNghAgkhGhopxCc3eQc+wJod11+15FDPkVxxB3IYm5VSjOK15ZRJdKgQJCYgiUpN+p+I2WkEwyQfpS9KqEYgyOMUbubpV3aVKqbXLciyqIEB46QIj4kqie59jLm2BAjQg/K93jx6CyktLISF1GxTTkBIA5JfD5CJAEospNY5cKuaLKFPQHotEO85chXcfPYcdRNhdPLQ4z1KqxbM4mpsS6aMwsYawdYOwFQZwzLQ8bEwim4R/8Rp7bsxXK3g/WujxMNofXAjgmHU4stTi4OsG6qg27HAW0w0KAFOsstZk48h7GF0zgxPZd20Ip7swW4o7e1J2UTH+eKy7USbBwsWIA4khS1EhjlFMS8joq1nmor5YYKOErZtjPNMnrHj2BxeYBB4zFsG7jxIaYnuzg2HGJirAKTxzOecZIInY3TmOwA04t99HoAd4DaAeQAdg4OjG7lgDqQpHpiDoNN21MUGsmiwMjzEvsuz5bsbNcfeiwNGiwNWiwuN1jsN1jst1getmjbULtIYJHsPKefYbF9NgUVKZIEoF/VOLh+Kw6v3YhNp07g8kOPYtOzX0dvfhlr57pYcECfGS0xWhBqMGgAoM+YrglNzVhYHqB2jE4HGKs9xmoH9sCgBSY6NZ4D4yRXqFyFdpywddrhxJEGayYILzw7QLvIGOsBA2I0Hhg0jKWWMTfXQXtmAcNOjbHpHmbGHPo8hFtqMNueiTu7URx7/CaGPZgb+KYPbhbAzWn49syotU2m17V27dqFW2655Zz+Q2xubg533313AgrvfOc7cfDgwRUpQhdjzYWXk9STuBB9f+aZZy6KbzqluOqdd96ZvjF+MR04cOBlv/netm1b4VC+Gi0uLuLv/u7v8OyzzwIIjtbi4qv7IqDT6eBf/uVfsLS0hLvuuiuNZzAY4Otf/zqOHTv2bfXNZHo9aGJiAr/xG7+B/fv3AyijgbRGU0r/6I/+CP/wD/+QPrM0KNE/R0VE2L17N6655hp84QtfOCdjOp/avHkzdu7cWbwnMESKhXvvk33kS4F169aNZPxQgm1iUyLCoUOH8MADD5yn0Xx7WlhYwCc+8Ql85jOfwU033YQPfvCDeO9737vi749zVT9udO2N3kdHu4nqusbevXvhnLso/t4998BIyAatdERlBykdoyNOY4Yd4bccqUPqeL5GlJxOphhloiJspDupTSSoo6dpdLc1SaVxubXUp3R/ZlV0GsH5T/cuxy6YTGMnl3oU+pSigXJwTHG9BkFSUoZGBwIBP/EEzSbUWEdtSCMvnKti9AwlJ79yhE4ERbKFvXNSt4lx5fEn8dbTj6I343DqxCKoqjE+OQFmh+OH5+HQogJjkhjDiuGqCtTpYtvSMmae/BccXl6A98CZqgJRix1bx9D4ISpijPeAKqZW1Qx0GmCyS1i3tISZ0/M4PjkXIGUcYQBphErsppic7IimzSNwRD+7qXi5gkVEDuRCFFOGRNrmI/gvXqtBYZo7VtcDmBksYunYPE4tDzFoPRY9oz9/BnNrJjFZE8i3uGJjDzuunETT6aAzM43FE0uYfuIIemME1AHweRDgPIbcoKIKgIfr1Ghn1qMZm0zrKRgmRltpO8R1LuBn2DKGQ8bSoMVCP8CipUGDpWGDfuPRxKiiDItSTFGK9CtSRuN7LtqsTJEM916uajw1tx5HZ9bihpk5XP7Nf8bJM0Osm67/f/bePMiOqzz//5yl+66zaWY0Gu3WLi+yJWNky5aMDbaxCRbGCzGVgoKwFFUGk0CFkEqFLakkJFChUiSVFCEsFQLEDikKEkG8YOMFfhjLso1lC8na15Fmu3sv5/z+6Nt9+84iS7Yk2/nOU2XrTt/T55w+fbpvn6ef93kp+wF+s2TFA9Ew5KXAR8TSJmp+SNbzsY7AYMAYtICa0pSMoCOjyOmQ1R0urgk45mYY9kIOjBmUYyhmFSc8Q8UL8A10a4EWoPMOnoAxTzPYq5BYjh82qPIIMlfFCI2w8cxp/jCHDWzoQVDH+lVM+PryTpnBDF4JHMdhw4YNJ327eyYgpWxrI5vN0tHRMaWnzOLFi8lkMq+bLFaFQoHFixef83attQkpMh3Sb+5jg9TpMG/ePAqFAo1Gg4MHDyb79Pb2snjxYlasWHHStsrlMv/zP//DvHnzWLNmzbTEUWyAG/crTR45jsPy5cu54YYbXjZh1Gg0XrHqSmvNLbfcAkTeIulFxcaNGzl06NArqn8GM3i9QkrJHXfcwR133JGoLyYuvuNtUsq2xfXSpUv56Ec/Om2Wq5MpSLq6urj44ov/TxBGixcvpqurq21bOisXQK1W44UXXmB4eJgjR46wZMkSZs+ePWmf9P09Jjn27dv3urlHjY+P88ADD/DLX/6SHTt28OlPf/qshsZPxEsRUhPn5Nq1a+ns7HxNZHM9Bwqj9rCzSUPVXChOVMNEW+Pt0Wo89j0RNhKXxPsnYV2pKmMVUuzDE/fDJAv5FunSWtSnvUbalvqtv5qhRO31tNgFm1oQp/dOa6daRFir/1aQ3to2EK2+tsJ50nW1m3O3qAqZqqNFXImE+LKAtOm+N/9r7qfiukSrPiGiEDSdeBVFPkKx4kgCnY0KbxnaRibwqNZdrFA4xRyBFRw5Mo4OPYo5hXQVjiPIYxFKgFVRJi3fY7xsqR8J0NkAraA+O0MYWrQjCIzBFRI3qyMPIiy+D0UvpLM0DANLIpLPRFnmjLGESqCMRDdJrUSNFY9ZauCjC7ZJbViiELLmHIzVVzF5JmP1iEiZWqfni41JvwnnVsQkUTPBuogJv6hUZ22csbEKVc8QWvCBej2E0SodWQffb+C4ikwxg83nCZXChpaChkxegW4SNwEEYYiSEiV11I5UNLoHCVXz8o/ngJ14fTZ9h2xTMRSriwJD3Y/URA0/xA9MU1VkU9erTUIuW2Rta/YJbCs8MEVEtv90t1g1C9SU4pl5K+mvnaD36LMcLvv05lSzH5Z63ZKXEZkXNjPdKSyhH1KrWbQ1yEyktjrsS0aEZlZRYX2PrDDYaoCnJRWpCDoccrNCgnrAONDQhvxgBmfUR1tBrWow9YCeuUWOjhr2jxXJ1eocqxgy4/vpdPsZzvURM49SRFeTNR7WNjChhw0DrGkf8RnM4P8qHMfhrW99K0uXLj3r6phqtcrQ0FDiX5TL5ViyZAlDQ0OTyg4MDHD11Vdz//33vyY9GKbCq2EuWqvVpk3p67ouy5cvZ9myZcmb7P3793P//fdPGQp2/vnnc/PNN5PNZvF9n/HxcSDym1iwYMGklMTTYfXq1bzwwgv88Ic/ZOHChVxyySXTEkdvfvObWbx4MS+88EISarF8+XLmzZv3qpu1CiES/6SJ2x3HYdGiRa9Cr2Ywg1cf8+bN45Of/ORL3hPSJGuaWEq/ODiV352YSNFas2zZsmlDtl5PWLRo0ZThu2mlVRAEVCoVRkdHaTQaCfk2ERO3CSF47rnnTltV+WqjUqnwla98heXLl3PnnXcmx/VqqY7T8zcm4wCuuOIKrr32Wv7zP/9zUnkp5Tl9ZjknCqMkcxQk7E6s6og+Tz5BU50ykVqRp8mhtmxfNl023tQecpYqRhzK1d52K9hMQKL2MaI9nKz1/7j+1jc26WpEHUwVIha3m5ATicZoQh+nkA8JbDPbWzsSPUMywBMIsiaTkYyJsCmtVNrE2SZ9igczIUnSiqI0PWJBY1hzfCdzaiPUpCSsB4RK0hhv4IcBXuCTFQZHRZmp0IqMY5GqeTxaERqJP+5RHSkjawbXFdSb6hbXFQQmUmFJLZBCEgYhWQcyytIxdgRlAoxyIkIotBhhwYCUBpUKCUsII5E+HpvML2lJlC8T7yEJpShE6vy3SI943pDeLmKqsDX2rVlEQioJAbJUYqzaoBZYgmYfDZZyxUcbyBYdjNaE0kFKhbQhHUGDfE7i5gWoKHxKWYOwFiUsUsmIDDSCeu/ciNgxIulHPK8SQ/qmWbVtkkV+aPEDSxAYghDCMKUialYRhSkKsBIhDGESyxfVq5pzKlJaxVq55nxszvFE9RaPTXy+sFSEZtu8i7h6ZCcEVbSFnNY0agE2MBgHXCHpcjXGWGxgqIcBxhMEjYB6RuLnHLysQ4cS4DcQnQJndiejUlKqhhzaX6E0VEPkJKaQYf+wz5x+Fx1aQhl5QxUQZEzI4nlZyuUKQ4dPMFaqMzbeQFvB7OO7Ge/1CaTEComQDsVqDac2Rsl18MIaDWsw/qsvM53BDM42YrJo7dq152RxXq1WeeSRR7j99tuTbWvXruWpp56apCSSUnL55ZdjreXBBx9MFCkzaEe5XJ4ym1wul+OWW25h6dKlbYuzWbNmsWjRIu65555EQQQwf/583v72tyfZ1hzHobe3FyD591SRzWZZs2YNc+fO5T/+4z/YunUrt99++5RG50888QQXXnghb3rTm06rjZeC1ppcLvea9e+YwQxer3Achw9+8INTqg1PFk6WJnimCwU6GTEQ17FmzRoKhQLl8uvXOkAIMWUmx/T3sRo0Jqj7+vqYPXv2lL/VcflYCROGIb/4xS9eNVJNCJFkcouPMQxDgiB4yXvy2NgY//AP/8DmzZspFovnortTYuLcTI97Npvlfe97H48++ihHjx4Fouvi5ptv5sILL+R///d/efbZZ5OXLmcT58D0OhoIk5A67dRKTPi0yqeIlKSGVhBXSpOQLCylJSIFACVSIVsxj5EQBE11iW2RAjbVaPpySsiSZj2C2AS6qcwRkwkgrECKeAHcPgbtWqVWCzFk21jZRIuRpnPirFVCRAonaVv72iapEYfPJS23uJyWMkkQhR4lBEZUNt4vVonEZImFJtHSSjGPICETAiwKgcIyu3yciw5uo2Y9yGiCqkfoeQgtwZXRRawtvo6MkGVWgKvJOBIpAesSYLDdWcbLdcoNH+u4lDK9+P5+6sbQbSRZY8hYC47EzQoyDYOWIT3H97LgwHMcGFxBw8lGypjmUQgBQYpwjM3Oo7AykYTWCQlSSKxMZZOzLYIoPT/Ts3lKRVdTrTRRP9O6Fmx7WGTct1qNUj3ENxFJIVXUJ4NhvOzR5WSQSkeNKIW1imwY4GYVOiuxzWxgpjkjlJQIFalcjJOj0TPQ9LuyTb6oqYyLrw+bUmFZSxBawrD5bzzvmhnolDRoKTEWsAZlo4xtxhpCBLaZklPbkJ6gzNzaMTqqQ0jjI02AFxi8XCdONsOR3ACHM714QrdIztQ8R0DNWqpGMJgVaAw6kPTkXcbrdSp1Q9bC3LxD1pUIoahbQ6nuUw4sMucwu7eDzjAkFAFido56TlE2msP7Sow2ajQIoUuS75KcGGsQqoA9Bw2drmKgW6MMqEaIDg27d48xXrMcOlTCtRYbRPNg8ehxxsIGBzqLIBW5Ukj/sWN0KYPOOoRKcMCFg/7M4nQG/7cRk0Xr1q2b9qE1k8nged4Zfeic+Oatv7+fvr6+NvIiRmzE3d/fz/e///0Z0mgCrLXs3LlzEtmWz+d5xzvewfLlyyedWyEE3d3dvPvd7+ZXv/oVDz/8MMYYOjo6Xnb411QQQtDX18ftt9/OD37wgzZlWRrDw8Ns3bqVjRs3ntG3yMVikXe+853ce++9JzXWnsEMZnDqkFLyxje+kQ996ENorduIoFPJbpUuG/v0xEqa4eFhZs+e/ZL1XH755Xzyk5/kn/7pn14yHPe1CinltBkl00RFGIZorWk0GnR0dExL3sdjGY/nsWPHePzxx0+7X6eq3HJdF9d1yWazVCqV5KVFoVBg+fLlbNq0iU2bNpHNZhMVValU4tixY2zZsoWHH374pOFcsaLnbONUjzc9X2Pi6Prrr+euu+7ic5/7HMYY3v3ud/PlL3+Zjo4OPvKRj/DYY4/xne98h/vuu++sHsM5y5IWn440URSpe1panolkUVofY4lDr0RLzRDXKZq0h4jDf5qhKM02EpJJtNpN6k+t0iW2vX9ty/pmm7ZlzpsmWOKCadPoaEEeL3pb5EybeikZKZuEpbVInFYfWsRZVHEiJYzrEK164+OwsYpDtEommbBSZFD8Z8JpCtraF4KUCqf5nYXoGovUIo7xWXlwB+cffZ7OyiiNjIAwwK+FmEZIPi/QhAhjEEGU+UzlFFpIXCfSnWQ0dGqB1A6it0B9pMFoYAmVQ6k4gOQAfsMQWAisIBOrhTQ4jiTrCmbVaqzb/TN6S4d5ZukGym6RMP7hABApYiQ+wmZIlrURASKJSKPYuDwmKqxohum1sYQtxHOUmHRpUaJtcxCRPn8TFG4iatf3ffww8l8KLWAsSgmQEmMs1XEP3RuihCBAokxATgrcjIPKCmp+gB+G0RkXIJWMqybonoefKTJVNFTbnLaRb5HxA8TwCZzSKGHPAIGTR0qBoyRWW7AqmfOBBDdoUDywg+zQIequZmz+ClSuyOrhF+gc2oVfHsf3Q+LAzqyAjlyGjITVhTzHuxfwdPcqDruzohIT5rbUEk85GClwXIFXsYSNkIwSHA/Abxh0yaOnqOnKOWit8QxoF+Yv7MK1AU4RvLzmYMXn6J4xdD0g7yh6ig4NEZLr0uw7GjB23GfZApexEoyOhFQLitlaIcoe+CGH9lcZHTf05cDNaIZGIsmVtJYFpRInpEdDavL7SigToDOSLkIKGc1iC6MzIWkz+D8MrTU33HADa9eunfbhvFAocOedd/Lcc8+xdevWKVUsLxdpPwAhBCtXruTw4cNTPiBKKVm2bBnXXHMNDzzwwOsmPO1cwFrLc88917ZNSsnv/M7vTEkWxRBCUCgU2LhxIwAPP/zwWemfEIL+/n7e+973njRz2rZt21i/fv0Z9awQQrBw4ULe9a538cQTT/DUU0+dsbpnMIP/F5HP5/nQhz7EnXfeSX9/f7L9dIneqco3Gg1+/etftyVFmA5dXV186lOf4tJLL+VjH/sYu3fvPq32XyuYaKg8FbkvhMDzPBqNBvl8/pQyUEJ0T53qJcx0yGazrFu3jtWrV3P//fezZ8+ek5afP38+n/nMZ1iyZAkHDhzg61//Onv27OEP/uAP2Lx5M319fYlHVZoAs9Zy552ig4wAAAAgAElEQVR3ct999/GlL32JJ554YsoXQadDRL5STGV4PdGzyFpLEAQYY3AcB6UUjuPwnve8h5/85CccPHiQP/7jP0687mbPns3mzZu55ppreOSRR85q/886YRRZzDQHqRmXNplsaVfCNDelkDa6pknutEioie1FBNWEzFYAQkSL5Dg1vG3X+aTNpMWEv6Pv7SQ1VPIplQku8RNq/mtITRRIW8Yk5Et8hCZVXUImtLNbbaSPTX098fv0/yFSBiUKpOZ5SEi0trIp5ZFoehOJ1vE0+QuEjZRjrjXMG9rH5b/5GbNtDetIinkXjKEehNSJQoMkgqyNws8IwPghvi/QvkRnHZQSZF2BdBQBRYqzDaOepeF7VD1Lh5ZI32BQhERkhtQykv/oyAi7M6MQMmDZyDPonT6/XrKRcbdjwji2jt/EKikRXQwinqPNdHOyeR7i82US0i5q1lobhRy1EXE25dvTfgNKny/ZJEOibH1pYklQRyeG0UbIpL9KCXAFQS0kGKkjBwQmNMgQlJQ4OcCReI0Az0IoZGRaLh2MldgA6gPnYWSTVkykUFHvbKqjxoKt13GefZLO55/A9Wt4C1dy5PzLsfkuhI5IKNUM51NhiB9KjMwjO7opbv//6KqNMnhwBx193YjaCLUwiAisZqicMVGIl1etYoXA1Bv0l0pcVxni4XlXsC87p2U4TjTmPcNHcIMqQVaBCxkMw0FIGRCupBJYDrmWwZVdOPkM1gZ0ll06gIwT4rgWLyM4XmsgXMOcBQ4y0OCDGfFxAoMs+FC3dGYUjYZAuoI58xVD++ugoa9TERionAjo7HZQQoDQOHlDpRTgWku/gCWlGoeNQtc8AhFlWNO+QQYRwZXzZwijGfzfQ0dHB8uWLWPt2rUnlcNrrdm4cSODg4PMnTuXtWvXUq1WqVarbN++HWstlUqF3bt3n7b66ODBg5RKJTo7O4HoN3jDhg1Ya3nooYemJY2uuOIKhBCvK0+js41KpZKoZxzHQUrJggULTkoWpaGUYuPGjYyNjTE0NESj0Tgt0kZrTRiGLzkHXqrOWq1GqVQ64yansQfR3r17z1idg4ODHD9+fCbUbQb/T0Frzc0338znP/958vl8QmacLtKmzmlSQGuN1hrf909KisT7ZDIZbrzxRr761a/y0Y9+lF27dr3sY3s1YIxhbGzspPdOKSXZbBbP8/A8jyAITmoUHqtfjDH89Kc/PeWEEbNmzeITn/gEv//7v09XVxcPPvggf/Znf8ZTTz01rap33759PPTQQ9x4441s2LCB66+/ngMHDrB69epp+xif866uLm655ZaE8PvRj340qewVV1yRPCO8Gpg4t+NnjjAMMcaQy+WSsMLPf/7zbN++nSVLlkwiALu6unjb2952Vvt61gmjeFGcLJVFvD1CQgJBMx18S3ERl0mylqWqSk/9Nq2OAGFFsvBPWm6SJS2CRCTdsfEbSEviMxO3H/dPpBiHNv7GxmVa/j/pBa5N1RMTUS0OoelblFJQQKRiijuUjIdoH6s2pNRGk79r/dNGfqUULulaJ1JN6eOIxyHdB8eELDmygxW7niDrValgENLSgcHB4hQV3a5LzTME9RDHgINAOE0jZT+kUQ9wcgFYjbIhjnbp6XCR87oZG/UIjtconRihQymk8SKDZSEwUiCbox0KS8YRFHMSzxqM9Vkysp3wRXhy6ZuoZvLR0aYUZ3E4VhSBFfVHmNbZi6ghiU2Yx1YYpLAtBZtMQhxbnk+CWGFGG3EpiMtFf0RKNNEMcWyNtpfJo7RCmBCpIiWetAYhFEILREbQGG/glD3CTA63qSuzSmCEIMCCFJjYuwgIvJCGyVKbNTfyi2pOiFgMZbFgWqSmMZbCrhfI/upnhLUS1hHM2vM0hbFjHFu9nqNzVyAcGYXyKYEOJU5oMEbhLV6KV9tA8Vc/RVTLmANlcCQyr6LwRdkcA9X0xTImUg+ZAL8ekhk6wkXiSY4vuY6GdMjUylgsoZul0CjjEqK0QrqCnpxEWst4EIIv8KVhyYpO+hd3EtQ9/DHDLFeS79RI6VFXglIQ4hYVthEQ+AYJhK6knjUENUPOOOQ7A06UQnbtCRA+LB3Q5F3FifGAXFEiibKtzR90qVUM5YrhvAU5nnx6HGMsmYxijmfJjNc5FkbG5a6wOIElMIIAQS2c8oqewQxel3Ach2XLlrFhwwbmz59/0gf9QqHAVVddxWWXXZZIr/v6+pLvV61aBUSpxbds2cJTTz11WqRRvV6nUqm0PQwqpbjyyivp6Ojgl7/8ZeIJkEba0+i1pDTK5XIMDAxw/vnnT/ugfLYwPDyM4zi86U1vYuXKlckb6FN9Cw3R2K9fv55vfvOb/OY3vzmp6gyiEMILL7wQpRSDg4OMj49TqVR48cUXOXLkyMsyWa3Vahw5cqRtnp0pVKtVKpXKGatvdHT0NTP3ZjCDc4FMJsNHP/pRPvzhD1MoFF6x4iOt6Ig/u67LypUrTzk8CKLfhOuuu46vfOUrfOQjH2H//v2vqF/nEtZajh49Ou3xxsRYLpcjl8tx+PBhstnstJlM0+FoccaxUx3L9773vXz84x9PQpKvu+46li1bxt/8zd/wzW9+E8/zJu0XBAHf/va3GRgY4LOf/Szd3d3TJgiYqq9SShYtWsQf/uEf8uijjzI6Osrq1atRSiXZ4M6l0fXJxsoYg+d5yfPQkSNHWLRoUXIuNm3axIYNG87573+Mc6MwokniQNNbpUlIxKtm2yIwJhoFp8O/RGobtBNKbZnERLK+TxRENlWeNCmVUukwYdJECiPbInlsk7lMZRZLE2CtfrbqV60aJgpckjZFU+WS9Memxibesy3leav9OB17G0RMfrU2tI2haIY5Jf0SCWEwkXqKXXzibGTx+ZCANiGzSsdZcPB5CuXjVJTFGuhxVWQgHYbkCprcrDzdjmL42Dj1YQ8TgvQF2gWDIfR9vIpAuBohJUoq8o4g7NL0DhSol8Y5WlPMcbMIagSBJZBgVfPkaYvSAseBolTU6gIjFFYErBjbTrDH4TdLrqKWLUYEDy0S0liT+PTEGcGUAWsjx6gwcUCSCNHM7NUcXGtioqhJRDY/qObw2eTcpkMvUycp/tTO2QHQyHfSqRUKjcZGRKYxCNMcf0dgAkN4bAwxqxNpwIYhIRERIWSUSdAKUEISlD3scB2b62pmGGye7TQLGCuabDQfVa1G54vPUa6U0IQUMg4FNyQ/vp/8c3WCzm5OdA9iJGglCEJJaEyUlc5RNC64mM6h/ajdTxPakIJvMRWLzasoy56S6MSIOyLhlAVtLSoI6DmyjwUdv6XiFun7zWME9Sp+toO+epmsDFECpNa4Bc1AaFBS8NthnyVLiixd0YfxA0y5Qa5uGFjUibEepcClVPcJbEguK5G5HI1KnXxOY40l9DxMRuJZi9YWk4exE4agbjBHLT15RaHgUHeziPEyhYxCepauTJauDkG5UiXrCMZKIY2GwViLCiyOtRy3BukLrJX4xpBRopnNcQYzeH1DSsmGDRtYtWoVg4OD0z5spnHVVVexfv36l3xYc12Xt771reRyOXbu3HnKKcyDIOCFF16Y5GejlOKSSy5h9erVbNmyhW3btk15PFdccUVCGp0Lj4OpoJSir6+PxYsX84Y3vIFZs2a1mXueK8yePZv3v//9ydvOl4uBgQFWrVrFli1bUEqxZs2aKeu7+OKLueGGG8hms5O+v/zyyxkdHeWRRx55WeFfZ3rsrLUcOHCA++67b8oFz8vFmQzNnMEMXuuIQ1c/9KEPcd555521e5wQgkqlQiaToVAoTAoJmg5KKW644Qa+/OUv84lPfIJ9+/adlf6dDRw6dOglf8OUUixcuJAgCFBKnTQ5RTpD16n+Ng4MDHDrrbcmyQ7iNpcuXcpnP/tZ9u/fz09+8pMpCRXf9/nqV7/K+vXrefvb3z6pLyfrZ4wNGzbwgQ98gN27d/OXf/mXdHV1cfjwYebOnXtK/T8TeCliLTYdF0IwNjaGlJJGo5H87kopcV33HPV2Ms6NwgjbrmiJF9nNVbIULXPhVsazdn+d6PtoS8R1iCR7WVoJ00aCpPZNtxvv11L2RN+buF3RDDdK1W2hpSBKq1TiMukNqb/T5Fi6iJywf5vCJF7Hp0ijuP/GxuNlk22pw04MsCeySBPbV6Itv1lqjGz7MaRUWvG45axPf+kYcw/uYG7jGAM9lu6ePMFwlZyAHu1gQoMQkM0pclkBDmQLAkdrvEpIvWzINUC7USOBH0ClhmNt5I0jLY526F2YoVruYVexj6oTkh0awfdNpDCCqL9KoVRkfi0DTdYLCLQiICTrB6w+/jQozfaVbyLQ2WQgImJEEIQ2yqjVJEpCLFaCbdmqYzFNsqhpLi6bI2YsRqTOc/z/eI7b1ufWaKeQDHdLX4QJ8bVGCoUj/aZ3V3NeGNM0Hgfhgj9SgWrkd9TwfByhMULih4JazeJ5Fh34BOMBRWnpzNTxK2OMd/aSuEnbpi+YtdgwRJiQUEiy+3bj7d5BhzL05BWdeUW+4DBaqpGpn2DOkeepdA8QaEVoFUpZjJGEzbEMHUVj3RX0De0mKI8RWEuHsfh1A3mNowVaRQSsFQJriLyaBGhhcfFZ88LDjFhBeaSCwpKtjNCpBJkOgaMsQkVEY6ZgGJQhqkPTfeFsdBhixxqIMUPdGMbHStiiy0jdJwgDLBa/HpDptNClwBjCWoCQEgcwmRB/PCSLZf6gg2kYAquiMEhl8XzozyvmDWTp682Ryboc8+pIKxksQrUiqAcmytIXQlHAqBUcF4ITxlLUsKCoqM4ojGbwOoeUkquvvpqrrrrqlIii9H6nuihwXZfrrruO5cuX8/3vf/+UF9Mne6uazWa56aab8H1/kj9P3L/LLruMXbt2TfKu0FpTKBTatpXL5TOqCOnt7WXz5s309/efUZPol4PTab+rq4vBwUGef/75Sd8JITj//PPZtm0bDz/8MMuWLZs0jgAHDhxIHpQnQilFb28vmzZtYt++fQwPD59y31atWsWSJUtOufypYOfOndx7772nHJYxgxnMoIWuri6uvvpqfu/3fo+LL74YpRRBEJzRhXE6JM0Yw5NPPsn8+fOZM2fOKe8P0b1n8+bN1Go17r77bkZGRs5YH88GhBBJQomJv00TQ5qstQwMDLBgwQI6OzunJYzSv/GFQoHFixdP+fsJkV+R67p4nseNN97YpipNt9/f38/v/u7v8vOf/3xaleb4+Dh/+7d/y1VXXUVPT89phSoKIXBdl8985jOEYUhHRwfWWnp7e6fsz9nCSxlfCyEiz9VmAhDb9LM92e9vXC4MQ1588cVEmX02cE50TZN1K+3b272CUp9i/qJJ4KRDrwQiUiulao7JoBTv0h4LRPpzexa0dBhZTCbF7SRhaE1VjhC2RbCQWnc362pTGYn0kbX3tpXCvTUOafKrReS0E0uIZtha84tJPkSi9Tkip1rtxn2cOBwtKkO0jJ5TSiaJJScN/cEYyw4+jRqt0j13FrP6VnLC6ST33CNQGWf2vByqKvBDi5bguopCXtOwzWxdGjp6NEaHVMshnYFAZyShENjAYMMQggCrBY4r6e5xUcvy1A4fZ1wXyUkJYUQwNCy4CPANDRNiEATGRwF5IZF5TbUaQOCz5NAzVIv9HFqyDtOU81lrCYxFYPAxTaKjGUpmUgbhzTNnZXTuBSIxjG6FtEWTJj5nseIMGc/LmEGkRQjGf1qLCANUeYzsob24B3fTfewg2mughYmIGGEQEowEa5oKL1dgqiHh8TGEqxDKRONoDSeGA8oHA4SBnLI4AlwFrvDJlYcZt+c1j0+ANajAp3v4MLOO7kKWxxhVBcrP76RAnTmzMmhrkCZEWkPGUdSNoXB8N7n6WmodfdExyEhhpmz0b2gNZnAO4dyF5Hc/hx+EhBY6jKFeD7FaJOODFYShQZgo1C/E4mgo+h7laoAMQ7pdiasEWQEZV6AdidQClMDNavzQ0iUc6ocraN/QozRhxjB7IEtNK05UGvhBgDXRWApjsH7E4EspCa3FZiVSKFQjJKsDcr0aX2gaFUEwZnClwSsFHBousWCuw+I5ndSBo+MVfKeKzAp6VxQ43KgzerwRqeGIwgQ7FPT0OnQXJX5gGfHgUHaGMJrB6xuzZs1iw4YNp0UWvVwsWrSIzZs3c//99zM0NPSK63Ndl6uuuopDhw5NmUklk8lwyy238I1vfINKpcLcuXO58MIL6enpYd68eW1l9+7dy+OPP86+ffteMXHU29vL7bffzsDAwMt6kB0cHMR1XYwxHDp06JyFNjmOwy233IK1ll27dk3pvxMvSIaHh3n22Wd54xvfOOkYT5w4wT333MNtt91GV1fXlGPQ3d3Nbbfdxj333NNGGjmOw5w5c5IFT39/P0NDQ/T09HD99defcfLt4MGDM2TRDGZwGpBS0tXVxQUXXMBdd93FihUr2LVrF0888QSHDx/mPe95D319fWd0ER8v1qWUnH/++Rw5cuRl1aO15tZbb2XHjh188YtfPKOqwjOFfD7P4sWLuf7669m0aRMXXHBBGwF3smylF1544SmTda7rJj52aePoQqHAm970Jm699VZmz57N/v372bRpU3LvnUhWaa256qqrWLFiBVu3bp22vaeeeoqtW7dy7bXXAu2hhqeCfD7f1u5Un19txERYR0cHjuNECZB8H631JBIvHvN6vc59993H3/3d3/Hggw+etb6dg5C0VJayqb5nssolLtcyi25l+rKp/WKqJb1/uhEbK2ZS7UeL+cjbhZT6o53SahFJEacjUoqf9j6KZh9tunyqD8KmybAUEdb8O+1vI1MClIQgau6WEFSWuFOtPk7Qr6TVVaJZKOHNREv1FZFurUMOW9UiIPF8khZWZca53NlNuHs/24K5HFx1Gcs7QvLOKL8p99I9YnAQ+CXBeCPAhgbjCGpVn64gi7QRaWGlRQooFCRSgNcwuFmLyjRT2vtRVjXfCGQzg1p3r+KCapVGaRTrCKwE6ShCBI0wChMLhcIIg29C/EZA6IPqbNJ9oSXjVVj0/CP4HbMYnb8chMRgkWFzHIjmQ9gMTYvGxGCsjMbFxrMvzhrXUpzF6isDtF3OIhUOmSI3LU0FWxiA1yBz7CC555/EObyfrlqJ0K+DAM8YhLZIFYWVWWHRQhAEJuEhM64gHB4n152jY1Ye3ZmhUvHxhwJc36K1oqglWoJQliAM6RzazbHzLsEaizgxROboPpaYE2T2v4BXKjNa9gnqBlv16OrPMivvQBBS83w8L0BIgTQWWRolO3wEr6svCjm1ghCbInklZLOUL70at1ohf2wfJgjBQrexVBoGoSPjPBOESBGptQJrCQKLF1ryQjKYiwI7XR0ZZCsL2olIIifjoHWU2e5ELWS85JEd85m/uAfX98n1Kuo5h7FyZOZHGKIUKCnQVqPLgo56jobjU5EhBe1gqwY/oyh2ZshkFSMHLLIc4mpwbMiID64jGc5kGGn4HPFCdvuGfE1SxFKvGPKupbvPZehYA2uikL1ZOcWCbo11Jc9YywEUQTBDGM3g9Y3Zs2efdbKoUqmwfft2jDHMmzeP97znPTz00EMnNcsEpoz1bzQa+L6PlJJcLsecOXO47bbb+Pd///cp3252dHRw0003USgUkjfSUz1gLl++nCVLljA0NMTjjz+emEPH8DyPXbt2Ya2lXq9PS+L09vZyxx13nFLa5zSEEFxwwQX09fVxxRVX4DgOYRjy3e9+9yWNWufMmcOCBQsIgoBnnnnmpGM6HeKwxNi7at26dfzyl7+cVE5rTV9fH6Ojo/zqV7/i4osvbgtTiHHw4EF+9KMfceedd045v4QQzJkzh9tvv52tW7diraWzs5OVK1e2vTmeuM8MZjCDVxc33ngjd999N6tWreJnP/sZf/RHf4QQghUrVvDII4/wrne966y1LYRgzZo1rF69Ovn7dPaN/X4+9rGPsWvXLr73ve+9aiHLaWQyGbq6urj88sv54Ac/yGWXXZbcB09FjRMf20UXXTTt8UzM5uU4Dm95y1v42te+htaatWvXcs0113DRRRdx7bXXUiwW24i6iXWkMTg4yJVXXnlSr8JyucznPvc5Zs+ezYUXXviyzt3J+nC2cSpeT3v27Ek8/uLzV61WCYJgyt+1EydO8Fd/9Vd84xvfOOuKt3MSkhatbW2KOIHJ5E+sfGmVlskOIimUVsmk942+axEhbZU2S07S90yhzBHxd3FvRUp9lFYvtaJ52sLabDMDW2KOnFL7kOpBi6SirR8xyRX3Mta5JOMoUgQWzVC/Zr9MbJ6c8GSt7F5C2LaMXwKZUlbZyAQ5lcUOCyphqiz14SqlI7soz13C9v6LCaXiN77FlTCPMQg8HKWoC8F4aMhaqIZQqgQUSz4oCH2LDS0oUAKyRUWtBI2yxc2AcAReOSQYq+ArRXZWDm1ASEmxS6N9n3pGIWSTlVMS62ikVih8fOPhW4M1IY0GSFdiTRS6FhhLtjLK4LafEfT00ejqI4xH0lqskaAADCIMEaEBKZPxtXHYVvMcSBmRfTK+EafmY0JcJgRj81wksZCW8PgQ3q8fp3P4IIXhY8hqBcdahGPReYHMaWTZRqkVmyF6BoFopqsTYXO2OCAadZy6orNnFsI1jOz06fChJIgMswX4zZRrRhj0icPkdjyDefEF/L0vkgtq6D7FkZEaColnFJWaT2gMpboPYQYlBF5gqfseKutEfkqNOs6xfTjnnU8odRKzaEx8Y4wmo12wkPL1t5G/7z/RR3YThAZXWNzAMBqE4ETG4cLEyiRLYKEaWHKuoJARzHMUo3WD9S3WlZQDsIGgQ0k6ilnGjtYplUKyGcGC8/spNECKGn6+yImyT73aQDTDJKUQZKQiW3DJWInEUqpBWYZQClAeSKmRbgYjA/IdAaYhyYQ+QSCZ25mlFBj2Vw2DDcvP64qhYz7nVQ2uF2C1we1U9EmFmxXUPIujBXlXEAp4ylgOCBmZvsuZBcwMXr/o6OjgiiuuOKnfwXSoVqun9IawWq3ywx/+kB07dgDQ2dnJbbfdxo033sjSpUvZuXMnhw4dolKpMD4+nuy3dOlS1q1bl/xtraVUKvFf//VfHD16FMdxuO6661ixYgVz587ljW9845TZ04QQLFu27CWPJ35TOjg4yM033zwplbExhnq9jrWW559/ni1btkypwNm4ceNpk0UQETbxvjG01ixbtowXX3xx2ofVbDbLm9/8ZpYtW4bv+4yPj592JqBCocAb3vAGrrzySg4cOMCzzz7LoUOHpiyrtWb+/Pns3LmTsbExfv7zn3P11VdP+VZ7z5497Nmzh4ULF/LYY48lmdoAFi9ezIoVK5gzZw433njjafX3TCL2l5g4vnHY44wX0Qxm0I5Vq1axdu1afvzjH/OpT32KY8eOkc1mWbhwIXfccQddXV3A6StIXgrxdRpnSnsldcyaNYtPf/rTbNu2bdqQrDgkzHGcJGX92cCll17Kxz/+8SQraUzUQIukSGeMmw6xOmi67yb+ba3l/PPP5+677+bNb34z69ato1gsTgo3P1mbcf+y2SxXXHEFX/va16jX69OWf/TRR/nABz7Av/7rv04i/aa6B5/s73OJUyGLgiDgvvvuY8+ePaxfvx5rLeVymR07djA6OsqGDRvaFLcvvvgin/70p/nhD394TpRu58T0Ok3UxOE6sRojNpbGikSdEZtYx2SRIMqKJUmce1JqoRaTFJlFRw3G6zBLirxJ9SGtvoFWOFhMLMWtJaSLtc06m/0VrZA229xfJr1tEl8iDpFr6XbSxFOiLEr1wKTGKyaKWuQRSThcctDxscf9jPcX6WNsbRBNFivukRStcYnlRrbZ95h+K9TGmb3jKUbmLeJo5xJCE02bGoLf+gV+p3CMOcsyOEcD3EZIwZWEQD2E4VJAR7aOykjwIxlOFHZksdqisoJyyWJKIZlQUjlSx4bROfNGG2QvcMhmM1jfIFEIx0EIH+1olJbgRLITnROIIMQoHzSEdUtgJEIKQhMQhhZpDMWhA/T9+iGGrroJL5PHyugm6tiQ3PgQmROHyIwfR1ZLhG6RsXnLqc2aA5noDWisLNKC5ObbGsOWaq01k1LzLppImFqN+v/+iFlHd9GFQTUaSGHIKoF2BEpZXG3wM+BXbWSurUCoqK2MlEQu1wIpwfcNQbVBebTK6N6A2tEaVWNoiEjF5BnwkDiOxrGC8NAQes9/4jV8ZD1EZSUjJUGjEYWcYS34BiNgrBJwouLRk9P4IdQCg7Qhro5MwPWJw+jAQ2R0U2VEFBZnmmbiTbmR39/H+Po303/f96AyjgfMkuDXDeOug3U1IgjA2IgMMxbTvLIcrejSkkYYULJQahg44nN8KOB4VwNznsAbbuBkBAsvmUOnk+Hw7kPkF2Wo1UPqtXqUbU4KpBQUHYfBubPwhGFkrEzeD3BKAf39GqffZXifoXqgTt+FRcoYikpRKwVIT+M2BPmMRUjBaDVg13GfznrI7HKAciR2lovIKaS06NCQ7XUJvBATGIaF4NceHEmuf9vOeM9gBq8j5PN5brvtNubPn/+y9n/88cdZuXLlJFPqNKy13H///QlZBJGXwT333MOtt97KypUrk4w35XKZQ4cOsX37drLZLJs2bWp7+K1Wq9x7771tZqX33nsv69at4/rrr+fyyy+nVqvxi1/84mUdTxpTLUaklIkkPiay/vu//7tNaTR//nyWLl160gfbOJ3xRBhjGBkZaSOMIFpMSCnZsmXLpIfWXC7H5s2bWbp0KRCFcy1fvpzdu3dP+5ZZSpkQbJ2dnezduxdjDJlMhm9961scOXLklBVKvu/z6KOPUiqVeNvb3jYp3X0YhvzoRz9icHCQ7du3t3335JNPsmbNGm688cZJ+51LrFu3juPHj/PMM8/g+z7GGIQQXHbZZSilePzxx19R/WEYsuK+o5AAACAASURBVHPnzjPU2xnM4NXFsmXLeOc738kjjzzC17/+9SRTZa1W4yc/+Ql/+Zd/eVazQJ0p0kBKyerVq/mLv/gLPvKRj7SFuBWLRS666CI2bNjApZdeyuzZs9m3bx8/+MEPeOyxxxgZGTljqqT+/n7+/u//nnXr1qGUmqTGPN3jnagiOlkdQggWL17MZz/7WbTWUxJ80+07FbmzatUqenp6OHz48LT9s9byxBNP8JnPfIavf/3riR/RdFnSXk+qUqUUt9xyC4VCAaUUzz//PEePHqWrq4uBgQGMMVGCJmPYunUrH//4x/nFL35xzhRuZ50wEsRhVzYJB4u2twJ0BGAlzVAW0VTCtIgLa+PMU6LlyZwQIiLdWKLqSaZiQh5NmMSkSaIWuZI2tG71EoRoyumaEzCKDIvVOq064tMWK4JaxEt74/E+NvXBJF+LZh0kZFDrCOLvWiFlbcqtFAEUH1O7ykkk21riJBFlcxMWjE2dI8gGDZbtfpIw38nWOesIhIOrREKGjZFhu+1noc6SC2vMVj69Rcm4FRyrQ2kchoYb5LIK2TzHyiUKPTKGQApEUVMphUjPIyOjE2ZC8Eo+9ZE6uktiPMhkNba3QFgaR2tJJqfRWQehNMJAI7SIWoDIhISVkFoAgQnxfBOFX1mBCALyO58mX+zGX7cRhCZbHqb3t7+i9+guRGkcrxapUbqVpLr/Nxzvmc/w8ksoLVyONAblech6GRWG0NGJyOcRwkXQCla0cVY5Wn5Qtjl/7IkhescP05+RBOMNcspiFSgFUlukkk0jaNsMdWvdtJUC3VRXCWub/keCRt1yYE8NxxgcDT1FRYcx+Fg8FAJJiKDUCGl4HmEYXUgOAhtCtW6a26IZoSVoHc1iE0DdixROWmqE0hgLYQCqNIZuVLD5QpM5FUhjCBAtPygRnffyosV0LL+Ujud+jvUDQiy9CLzQUM1ICEUUbyZAStA2uuEbKSgjqRiD6wdksRhHknEleQGVQ1WkhuVvXEDv7E7Gdx0iM6ipa4nX8JDWgowUc506Q38+SyEQ1Coh4xUf/7CPKVuUNvQszlA51oBeB1W0NI75lPZ56HHI+JLOgqJzcReDVcXObcfwy4YVOQdvrkvdsYTCYCyI0CeT0SgEo6FhRyjYGsB4U4KWXH8zhNEMXmfo6Ohg/vz5rFq1ioULF570gSwIgkS6PhGn+sY1rSqJMT4+zpYtW3j/+9+P1hohBJ2dnXR2dk5r+vjss89OymxjreXJJ5+kUqkghDhnmW+EEKxcuZL77rsvUaBIKbnyyivp6OiYcp+enh6WLFnCsWPHpkzrbK1lz549rFixou2cOI7DJZdcwrFjx3jyySeTB/VFixaxadOmSRmJ3vCGN1Aul3nssceSB9GOjg7WrFlDLpeju7ubZcuW4bouzzzzDI899thpvzmfSPA888wzDAwMsGHDhknzaXR0dEp/KWstTz/9NAA33XTTq5Y9xnEcbrjhBq666ioOHDjA6Ogo2WyWNWvW8POf//wV1R2GIY8++ig/+9nP+M53vnOGejyDGbw66Onp4Qtf+AI7d+7kk5/85KTr+sCBA/zbv/1bQh6/nMX+2Q47StevlOKmm27iT/7kT/jTP/1TSqUSa9as4dOf/jTXXHMNPT09idLUWsutt97Ktm3b+Pa3v823vvUtlFLMnTuX+fPnk81mOXDgAIcOHaJUKk2pPp0Ka9eu5fzzz28ji6Yifc4WYmVtut1TJYkmnquBgQEGBgZOShjF+/34xz/mu9/9Lh/4wAcmKTzT9b5WSKNTUVlJKenr68NaS61Wo1AoMG/ePBYsWIDrukgpGRsb43vf+x5f+tKXTqocPhs4+4RRYvrcRu1Mq/YRpFU08eSjVVa0SKdYATRJyZG0QRIiFrdjEU0/mYiYihto1dAiqVp9STFQTYZINkO1TFJvs4+x0CTpfaszthkyRrPXpkWLJcRTq+9ich2I1PGkaC0RN5xWU8XjJhLiKSrbVEIJWiRcUi7KDhaHpSkbct7R7XSOHmD3G96OzWXJSkleRgtdY2xk/uxkeK5rPZea++gu+BTyCsdCb7fmWJ/L0NEafi0kp5ptBBBIS6DAZiB0wBQdRN3DcQRaSjAC2TCM7h0n7Atx3QzZjgzZWRkqjSicTmdcZMYBJVChwMllUDkPWQ9BGyqVgMAG1BsWP4j6W/GhahuYJx/Hdvbjzupj7rMPUDy8B1Gvo6zBNdHYdFhLsVHBObQTWezGBAGZfS/gDh9FVUsoY/ByBfzZ8xBXXosdmBMRo1ZgkjOUniMWMT5G5/YnyHp1auUaWWFQGgIhCDRIR4CMiMDQkYQmhMAitEQBQgocLZBE5t9KRGF+1ZrAbfjkMhLlahxrGa9HJtN+CDU/xAtCQh9sGPkMCWtxYg+hEAgtoQFERLA5UkZeP1rhGUE1hKrrELgOhAYVBAQND+k3mhnkojrDpobQGAhTV6rVihPrLqd47EXEiYOUtMbVCqkjo+6G1hAE6CZ1GlrLcR8Oj3h4nqEYWrSOlFYZLcg6goyKUk0OLO1k9op5lF7YT2a2wIxLAhOiaGZjsgK3CtkxH0YMNheQ0YqckWTyWcScDCOmxNBhD3/cwwrL6ItVFA4MedjQYjU4s1zCbIGOoRJaCnIF6FuUpy7Bb5KTQRCirKaj6LDzaIVHAtgdSrw4JDGGbRHSM5jBax1aay6//HIuu+wyisXiS/oWhWHIQw89xLJly1i0aNEZ78/pSrDjN9kTEYeIvRxorV+W30/cbhpSSgYGBqYs67ou7373u+nu7uaf//mfp61z7969+L4/iTxxXZfrr7+ebDbL0NAQuVyOt7zlLRSLxUl1KKW4+uqrWbJkSXJs/f39k8yn9+/fz49//OOXJYVfsWIFDzzwQLIoit8aX3TRRXR2dp5yPTFptHbt2rMyx04VWmu6urqSUJozgdHRUbZs2cJvf/vb14RHygxm8EqglOLuu+/msssu4/bbb582acH+/fv5l3/5F+66665XVTn4Uojv347j8L73vY8XXniBJ554gn/8x3/k4osvnlJp09HRwfr16ymXy0ko8Jo1a+jp6UFrzdjYGL/97W/5whe+wAMPPPCSfVi1ahV33XUXuVxuSrIo/nsimXI62cXORJmpiCLP8xgeHsbzPPr6+igUChQKBfr7+0+pb/V6nS9+8Yts3Lix7SVRnDUs3b/XCml0OsjlcixatAhjDEqp5Lfuz//8z/npT39KtVo95306JwqjiZ+SkK0UbHOxKRLNUVwy2T3aakWbRw9EniRmQvG2HSf90+xLioiKe2RFe3mbtNFSS8RpzluUAMmnyFC7TZuUIsTi8LVUCFmqE8lxtQ9U0reknnT/m82kVVXtGql47JrEUEISRTIHLSP1Vrzgh6gPGktX6QQ9e5+iITSZYh6R0bhaolUUCBgRRpYjppfu+hE68cjnBbgCZUEWNZ1K4Dsho8calDyDbID2IRAGtMCRgkBGZsZaGhSCrAZHKlwpGKuGVA+Voc/i5iS6oCHrEFgQjoR8BuEorJVkhcSt+1QrPtbxqZVDGqGh5gkCK2kIl/FshvGOXup987BewOCvfkrh+F5ygYeSkAG0BhOCDiOFj1vsRh8/yuLnn0D5HsZEGdVCQNcq+PkCtUIxmZs2Pp8pmVs0dy3Bjudxf7MVU66jTUguG5mNm2b2tdBAEBpCITFW4EfcF45p6vOERDsyCgkzBs+3lGsGNzTJdKgHUA4sVd9S90MaviEwNFVWUSFhLUq2TLnjyWNCCJuEjc44ZDs6KQmf40HAuKvwcy4IyGLJRxUhsIkBuCEaAyOSi7SlCgQaxQ78gcUUhocI6gF1YajXQCgQRUEoJX5gUIGl7ltyxtDhCop9LuOVkEotxEVQlAKlBDnXoTiQY+m1qwlO+FS8Bv6JEp3dmUgJZyNCWYUaV4MsaHRvB6KnCIfH6Biq4q7owuazjB/xaVQ8vDrUhyLSqG9NB+NKEoQhFQxqrMGinpDlC3t4uuTT06voGSzSCAxBYAi8ADyf8ZLHk0fK/Gzc54QfjQvxvSN9ozKpzzOYwWsUXV1dvOMd72DhwoWnbHAdGx9PRUoAU8rnTwcDAwMvyzvpTKBQKHDxxRezZs0a7r333tPO2GatZfv27Sf1akjjsssuo6en5yXLlUqlac20XdflLW95yym1p7XmvPPOO2mZarX6sn0TpjpvIyMjPPjgg2zevPm06jqXb1jPFay17Nixgz179pyzDHczmMHZguM4rF+/ng9/+MOUy+VpU6cDPP/88+zdu/eshqW9FKZSKU0kXSqVCqVSib179/LMM8/gOM4ksmgiSRGnSV+5ciXXXHPNJEIsl8sxOjrKiy+++JJ9FELw9re/nbe+9a2TFD7THdOrSZqEYcjw8DDd3d0YY9i2bRsPPvgg8+bN49prr03CtU/nmWDv3r08/fTTbYTRdH5GryfExxCr04aGhtiyZQt//dd/zY4dO161Yzs3V2RTkWObpItIbY+ZkEgRM0UWNNtSCUH0Od5hoiInvSEJ9aKVHj1N7KT2an3XVkXrm1jRI1J1kirTssgWifoJUiSObSmG4u2RCqmdBY0+tJNktrlfOrNZiz2Ly8c3J5t4HrXGOO5ji7oSTYJIS4GrItJGKYFCUBQBCyix0juILb/ItvII8woul489wWOdG/EyBRwV5UI3NiIhpDH0l4Yo6IBQabSWKEcQSoOvBUpCZ5+iERoagWW8CkGgsDWLGjPUZEB3p8ISKXsyUuBqCVZgagY3IzClGkGXRuUEOuPQ8ENwFKKYhawL1Qb/P3tnHmPJVV//z723lrf03j3dPftujz3eMB5svGHghzE2m40VkCIwQUoQEAWJKEoUISV/ABGKUEKkiEgkIDmJooRgdgE22CCz2dg48QZje2bs2Xum97fWcu/9/XGr6r3u6RnPjKfHA+kjzXR3vapb996qV6/qvHPOV5Z8qgO9tGJQc5pURMxSZn54hHjDRURrt9Aq9xKVqphUM/zT7zJwZB9VpekJBIGAEo40aVtLnJWJS+anGYgnAGc30tYWFeU8pWhvvQRTqrgjlZ3knQuz7RAyFuLEIOoxg9bQo0Dh2rIWTFGmzlWCMwI0AplYTPaFsZQuiygsSeJ2yrGJhGZd4wlHss1HhkRrjHZKl0S7IGmR98G4U0ZJgZAZAeorygMlGlN1hHVkWCIFnvCJrr6Zg088itYzyGqA8DwCkxIIS0katO+R+sFC8pIsXI9OALy1nfdYX6DoV27csTV4xtJOHXGW9HjoFGxiSY0lUNBfkYwO+1y0rZ9GS7DnwBztZkw/0NvjseWWzQQ9JRr7ZxkYCTk8aRFJgh/4gEdqBJ4RiFBgyz5to+GF43iNNuXVPYi1A8RtjQh80qmYVtMQtw2JtdjnGpBmB09KrICwT1Id7eG2PkXJM/hI9FwTm6YYq6mpgJ9Ggsdqltk4Iw6FXXC9c4SiU2GtYAUXMtatW8dtt93G2rVrz+iGU0p5SpJjeHj4lPlFOU62zzVr1rwqhNHY2Bh33303Q0NDwNJ5RdDJLKrX6ye81mq1ePTRR0/rxq9UKnH55ZejlEJr/bLHwBhTrHc61XHOBnEc88wzz5z19lNTU0uO/WTWNt/3UUqdNsH2aiN/oJybmzur7YUQXHPNNaxfv56HH374hPymFazgQocQgqGhIa677jre9ra38da3vpXR0VEGBwf5/Oc/z0c+8hFefPHFJbe95pprTigacCos1wP04najKGLv3r089NBDPPTQQ+zbt4/9+/djreXf//3fT0kW5chL3p/s9W9/+9tLWo6XQje5cqEraNrtNn//93/PH/7hH1Iul3n44YeZmJhg586dhWU9juMzrvSltV4Q6N1NjL3aJNkrQZ5VNDc3xxe/+EW++MUvcuTIkVeVCFt+wiizmeUEzgJ7GQszgDrUThetIxYqZmSx7kKLW2d/nR8d4icjW0SudhCL1hWLmnBLjMisOyfsyVmrCqtRNgaZKUyKjpNpg0RRkH2Rukp0Rp2TZpkMyS5oZuH2eWh4Pjf582hnkosRFz022TR42fZK5oSRJPQEg1LzWnuYG9SLjCUTRFGNh+damDhhzbBk/PizbBjezqHqNqQElY3JehIvNaxqHCP0BYl06hWrLVZDikAbQzKbokMwnoDAoKo+TQ/mjsW0o5TAM6g+ScmTlCslPOURtQ06TVBVn0BbkpkWXsXDL/s0GxFaKEQ5RHgSpCBJEmJtqPRVKQ9pxBw01l7F7GvfgClXia0gSg1xbFh17Hk2zb5If8nS40tKwhBasBoaiaGtnWUwSTQq0Qjhyr1bC8ZmleuEJFY+6apxjHCqKosrDV9U0cvVNVmgj9UGKwQ6U74YIzDWZRgBCAkitTiWx7h1tAUrkVLgB4pSycP3BfsOR0wcT1AIjJLoVoqONdJaQtl5F0lE1m9HdnnChWVLJdHGMikMvcbiydyuKNBAksSIeo1WHBP4LnDcl9ADVIzBSwyiUoFyR0EgbCerKSeprHFzludp63KFRIKVBptaPCw+UG1bWmlMJC3KQqgEJeXITCsEfVWfrRcNsGbHALufnSKeqDN25SjVjaO0XjyOMA1oRwTWIK3CxilSKHTDorVG+e6gmOkWUlvCzX2wvh9GBoj3TdBqa5rNlHZLY4y7XrTnNNITeL5CeRKpFPW5FiL0KbcianMxSSt1VsLBCnHg3mFXlyusGennN1NN9k7XmYkSEm0wwpBdEtx1pPDFrmAFFxZKpRK7du3ixhtvJAiCc37jNTo6+rKEjxCC6667jsOHDy8gXtasWcOll156TvtzurjiiiuK8rbWWm644Qa+/e1vF2RGuVxm586dXHXVVezZs4eHHnrohDampqaKjIJNmzZRqVRQSi1pwWi32+zdu5eXXnoJoPgmdik0m03uvfdehBCUy2XuuOMORkZGztHIO3j00Ud56qmnznr7TZs28d73vpef/exn7Nu3r1iepinGmBPOi8HBQd70pjfxzW9+8wQp/s6dOxkfHz/rviwHarUa//3f/33aD35LQUrJ6tWrefe7311UA1rBCn4bMDQ0xHve8x7uuecerrrqqgXXrCAIuPnmm7nppps4fPjwghB/rTW+73PRRRed0f66iYLuqmD5a2eKpaoeAnznO9/hL/7iLwrrb473ve993HTTTS9LFi0mNBYrmLTWPPnkk6etKlxqvZMRCq92Kfm8oEKpVOLQoUP09fWxceNG1q5dW3zuTU9Pc+jQodNu2xjD9PT0gmXdc3yhk0UvR/60Wi1mZ2d5+9vfzq5du/jBD37Aj3/8Y/bs2cP8/Px5tyqfF4XRQrLELen+uygsZTuESP4z3z5nQfJtuk+Djiino9KxiCygussChlMoubbdOmap9op1OvSVXnTeFe11KZByW9FipVLRB5upLxCF4qATitxtXVuocTK5YsN2xiK7qqWpbA6L+RXOAlOIkESxVzeNUiCFexD3lWCTbHO3eYZLm7up1+aYiyIaieXo8YTBkqTXg9ZMkzXPPUpp4hBYkxFqCh1WoLePgWQO60EzNU6dkxgio5EDHja1iNRijHs9iiymFaENhEIQ9AV4JYkXGgaGq5S2rIbIUJ1q0XO05QiaskS1NPF8m3CoRFJ39h9PAK0YtCZJUtpxChqqfSWq/QmeTkmCMrGGOM0CsKOYDQeeZdSL6PVcJpOvLWhDZCDVbi61BbTGk7j8GRzpYqwjdlLAhCVM3wBYd5yKsPOc9cuOOxmRItdvQfX0YeenSTM7Uh5ujRUYbTMhkMsT0hqEJ8AKfN+jXA4plRWVsscVl4TM1yaZPJ5gIoNODRIIJFR8dxJKmxWnyxhIJZziKz8ntYCWLzgy12adlQxKTWAgLnmUeiTiuSfw4hZ+b4nQk/QqywACYgM1jdo8xmwYFgHXTk1ks3lyKiJtnFrIGEckRUIR5ROZnZOesFR9SZpaEmNQSrhjKwRCCoSvkCWPREBvSbLj4gHa6yoMX7me5Pgcca1ORVgajYiygtRYtLGYJKE+YfHLFr8soB25/K4NvTBSQYwOoBsx9dkW9fmEJDboyH0Ih0ogfYFVAum594vnKWYnYw6+cISp+TaRB+FAiA0U5cRSGqigQo9q6LOpz2Ntf4nLVvVwtB6zZ6bBgbkm9TgpVJMX+gfaCv5vIgxD3vGOd3DppZcu2zm6fv3601IIbdq0iTvvvJMHH3wQYwyVSoU77rjjtCxa3diwYQNPPPHE2XYXcOHPl1xyyYIb/ksvvZRyuVzcuK5fv77IYfje9763ZDtr1qzhox/9KOCIuZeT4T/44IOnlZVkjOHYsWPF31/96ld5//vff0qS6WzwSkvFe57H9u3bWbduHY8//jiPPfYYs7Oz7N+/n1qttmQW0LZt23jXu97F17/+9WL/O3fu5O1vf/sFlXUSxzFf//rXXxFZ1I0gCLj88svPSVsrWMFyIg/z/9SnPsXtt99OqVRacr1yuczHP/5xbrnlFkqlUqGmOHjwILt372b9+vVnte/un69UibFUO9VqlYMHDy4gi8rlMvfccw/lcnnBdi/X7lJotVqnXXjBWsv999/Pxz/+8UKpezrByufznjPfZ/4lwLvf/W6klEXlr4GBgQVfRu3bt2/JAgenwlKk2W/DffXpnJ++7zM4OMjY2BiXXXYZN998MxMTEzz99NN89atf5Yc//CGHDx8+b6qj8xB6DR2FzCLYYoVMTbOQSMofsjvHfqGFrEM4ud8K21u+R7FgRwVx1U07yQ6zs2R/hcgrn4msf531F5BawimMEBQVsrrVVDnh1T2+/F+hJOomvoQjozoWM1HMD1AEZgtBkZWTkxXd/TqBZBOdOfSt4bJkmvfNP8Hw3Ascj5vMpDDd1CQaBkuSnZt6KUVtlDEMzu5h48w+Em0RxqmHjBBIFD1CcwyBpw0aZ4fyKoKqBq+qSGY1zemUZmyRwgUWByWBqEp0xaOiBFobjJQwUHFqloZhTRhQtyCqHkIJopk2KIEIPaJ6m1KUYKME04rR1pAaTSsy6BT6+wN6ZibR9QZNv0KSGuJUMzI7ydjUi/QH0OtBYAyehShxhI0QjstItcAHEgqnGVa4vB4tJSAxfYOYsivr6OyDtghTz0nC/DzGAv2DpMNrsXPTpDhCSGfbGZHtG4H2JJR9/EDiN5xM31oLUiCUUwj1BJbNa0ocPtImTVzOlhCuGpjMz9ts/7kjSkmB50Kr0Nbih4JBz9IykrkYBoQgVJBUPSp9HgPNGrXAxwt8BqRgJLD0YpiLNaEnSMuKYOoopjpAEpQxUjmiyFhS7YiiVBtSbTDGsUotFVI2FmUsCvAESOWCwgcCQTuChrXuJJYgfYkXeojAQyiJSYBUs+G1GxGxJpqZp6oUjYlpWrWYailEBwqRGEzbkLQNKFfqWCmJGitjQg98D2sEyfEarVpMGhniyFXTK5d8RxQbizWWJLXY0JLGFu1bJiNNEvqoskKEPl5Jge/RaCa0JhvuGuIJwmrA2HAfvZWAODVUMEynAYcabRJjsCsKoxVcgHjjG9942mRRbj0IguBlq5vkKJfLL5uR093+5s2b+dCHPrRg2ZnikksuYffu3WcdcC2E4NZbb2VgYOCE5Vu2bGHLli0Llh86dGgBedMNpRTVavW09322wdq5kulcEUbWWqamps44s+lkKJfL3HDDDezYsYMvf/nLxHF8ym9Nt2/fzgc/+MFCzTU2NnZBkUXgjtXJjvsKVvC7ijwj7TOf+QyXX375Ka/Reb7d1VdfvWC5tZY0Tc9JftG5Ig261UY7d+5kzZo17N27t1h+9dVXc/3115+TfR04cIA9e/ac9vovvPACTz/9NOPj4yeoq/LxG2NotVocPXqUMAwLK/dykiqLCYzcNtbX18f09DRKKcbGxhgeHi4Cv7XWJEnCzTffzDPPPMPRo0dftvqmtZbjx4//VlvPFkNr7RwRmeI4DMPiM9HzPDZu3MjIyAjHjx8niiJefPFFnnrqqfMSgn0eFEZLV/uCbiKoWLJgLSvEIpVRl02tq1GRWYGQoisMO9d5dJQ7HZKpu+R9h5zJ11/ck45tLlNAZY3ZzFsiyAiabEC5+mexBS3ff448l6gISnbsV9aM29J0kUBFcDVZJlTWK5srmxbN8ALbnuj01QK+SbmusZc3zzxJPH2Y/SaiYWFfzTJdS2jHhovWVhgd8QhinzRK0bG7+CSxxaQWhEJJkCalVU9IjUVGAiMtXgAKSWKcOmY+CzEOpMD3IShByQcRgvYsoXAP4416RKXWxK4ZASGo+B5RkjgrW9XDl4JkqoU3WqZRi+hrROg4IUkMxua5PIZ2miKFZYgGweRR4qH1tDVobRif3E85bdBTgV7pFFpRDHFqSbG0jaVtJWjt5j6Tdpn8EAtnkRJCkqxeTxqEzmaU6c200ch226nJdArWor0A64cYpUjXbkLvfZpaRk7ZQCIDhfU8lC9RoUKFPjYLtrbtBKR7P5hME2eBmamYuf0NBn3BTBbQnRNDmswGlh1xJRxZJPMyfRKEgbAskcIyGGvmjCQWAg+LiTWlULAmLHG4IVEY+o1mQGh8a6lrS28VzMQz+Mf20AgHmB/dwuyGndR7R0itINaWNDUk2v0zxiCMy4ZKM0lSHriuJGjj3lv9nkcjTpzCK3R2u6DsU+0toTyPZqNF35oBwt4KjQPHCH0PO1ujPtOmPZ/QP1qiUqmgZ1o0Gpo0NRBbpLD4fR6JsY68CnzsTJv6sTrRfIyuJfRqSWmkH89TCGNIUk2zFdNoxrRaCa25BKHc8Sr5HiUf+tf1MtVOXN6UUlR8iRJgpEc71kwdnqHaG7JtqMyBehubROwcrLKv0aYWnV1o7ApWsJzo6ek55Q3Y6Ogol112GVJKwjDkkksuQWvNfffdV1inTgbf93nzm9/M8PDwaffnXMjLwzDkxhtvZO/evWcc1pxnylx88cWnDCkOyQAAIABJREFU1Q+tNb/4xS/OOhT6XCFJEp577jle//rXv+K28pvzr3zlK0xOTp6D3jnkhOOtt97K/fff/7Lrjo6OnrN9r2AFK3jlCMOQj33sY/zpn/5pQV4shdNR3+R5NhcihoeHueGGGzhw4EChMrr55pvp7e0Fzp6kygmWRx999IRraxAEjI6O4vs+1WoVKSWTk5PFlwE//elPFxQzSJKEKIpIkoRms8nk5CSHDh3iN7/5DTt27GDVqlXnnWTvzt/zPI/x8XEGBwcZGhrC87xCYfvGN76RG2+8kYMHD/Lwww/zr//6rzz++OOn/MIkSZIlbcwXOk6mhIvjmMnJSXzfL+Zn8XbVapXbb7+d73znO9TrdW6//XZ++tOfnvYXdmeL81AljYKt6VbTFGqfLAW7CMXtrN5lyco2Ep1lnYDszLeaUz6FqicjimxOqnSIm+6+dYgop8ooSB3bURt1b1AIAgSLWuvat+0QO6JrZZkpV3JiyJBVJ8vWyRVN+fgEncDg7qyn7rnIzHeuMtWCljrjQjhCq3t5EDXp3/0oM9UatBK8KKWNIJ7VlFODDAU9fYJmHLkH7UCihCNlPGnRiSBNNBZJMzZoa5yNKs4UMsYRJ62awaSgGxpfCfAsygeZ2aI8a5HS4hknSW20EoYaEcpCOt3Ek6BSQ6odESVLAqU90rmIpgetqTo29GjHKUniApuNNVhhiU1KiZh1v7qf5vBFpGsvQpZ6WD31EsIk+EIhrCGKLY3Y0DSOCGlasNpl6xjhCD1jQYiMxZaZ7ssPSTZfjBayqPAnjEHsfhbvf3+JIoEkQqCxpQp6aJR0fCNy5hgIg/AFwhdOnRIoUALle1hPYlV2gKXEKgnSYlR2xqYp9ZmUfb9pkrYNQyWBtjDXdn1NgSSze5lMqOPJPAsoF/a5+SxVBL4WlNMYjaVuLG3pvqno8xXjwwP0HWzgmTb9nqHse7RarkrawFgP/mAvcRzTrB1l7rlDVF/6NUe2XcexdTuIhU+SaKIkIdVpZmWUhcXSCFcdz5FZEl85JU/Jl4SRpKkNJd9DCsHAQBmQzM+10UlC7+q1NA9NEQSK+RemiY/XqM3GlENF0jLo402aszHzsynGSpKmxabghRqjrfuASiTpkVnah5ukxyP8hnHWM5lSCS09PSFBpYc4NUzPNpibbRFHKUmiiZOYuBXTqAtaseHnrYQJX7CqP2BTT8iwp+j1NFUpMKEkiTW6Ps9VFcFEuUJNGy4eKLOn9upVAlnBCs4W09PTvPjii/i+zy233EKlUkEIwd133/2yNy2lUol169ad8c11nvFgrXv/ns0N4vj4OLt27eJnP/vZGcm4t2/fzlve8pbTfpg5cuQIu3fvPuP+LQe67ROvBFEUcd99951TsiiHlJIrrrgC3/cv6AfG00EYhlx55ZX8/Oc//62u1LOCFZwuRkdH+eAHP8jo6OiC8OHFOFl+T/5aNy4kxUg+nnK5zGc/+1muvfZa/vmf/5mDBw8WZM0r7W8URdx///0LrtdKKT760Y/ysY99DCEEYRji+z7T09M8++yzPPjgg2zdurUoJZ9XYYuiCK01URTRbreJ47hQtOYWrvOhyskVY1LKIsS8p6eHbdu2FYUM8uM+OTlJu91meHiYiy++mIsvvpi3vvWtfOELX+BLX/rSkla1vP3fZizOsRJC8OMf/5j/+I//YPPmzfze7/0eV111VUEW5uuNjY3xuc99jq997WscO3aMrVu3ct999y1rX89D6HUXaQRF6HRH+ZIHTHc2cZYqW5BGeZZQnsuTEyU5vZT/XnAxdJErXcSNydpauL+FCqRik5z86dp+AcEk8mWLaahu5ZQoCJ2CJOv66cbUMcrR9bpd1OBiIi1vo1tZlP+0hepJLBh/zkgJYWmHFfb0bmYgepqBsV7swTmqwjJYhWYE1795E1uvGCPac5jWdIO0FdO2Fh0ZNJbUWqLUZPI5Nw5jQLj8aWwMjbYlwOJLnPpLOtbMkmf2OJUL2mBSg9WWKDa0ppqUS3NEx1vOTpU6xYsJnG1JlCU0LWmkmT5Wo7qqh2biiAB3LZRYqYkkaJEy0JhgzZFD9D73K9TqDQy3DgDWVbSKLDq2tIylYS21rGKX0AYlLFrk4Wmdb7nd/ErS1Rtpja51mh+LI42sxR44gD2wH99qPGXwfEeK2KMHYPf/IK3BSFAWpLWQGsAifAU2QWgFvsB6EiPdT2FThLUoo0kaKUf2R7TmNUq5zKJhKYhSiLUtyMM8M0tKR8zkljWkIMXiB4JSIEg19AaCVAtKq8rsvGyM+Uab8YogimKqtKiUYKDHxwJxO6WnJGn5PtJYqqFHv1dhoKzRh45iHv8uojbHS5teQ2wgilokSctZwqSPTiNSIBCZ1U9AyXfzaq0h0JaBUCERDJcDRDvlyLPTvKSniK2lf3UPh+ZeJJ6tM9bn0TpSwyaGcigZWddLabBCkkDbziFa2tkKI0HcdmHWuqUx++fgWIzyQvqqVYRQGKVRgVMICsDzFNWSoM/3CXv78EqSdjMiasdEqaWVGNptTTxV47LYZTs9kaYgNfSEYEIGPU257FHxfSo6IJiPGLYtIiGZ9wK2jy5dcnwFK3g1EcfxKW8o0zQtSv8eP36c3//932doaIienh62b99+zvtjjOGZZ57hkUceodVq8brXvY5du3adMWmklOKWW26hv7+f5557jhdeeOG0tstvcE+3r4888sg5I2peCaSU50yRo7WmVqudk7aWQp4H9dsOpRRvfOMb2b9/PwcPHny1u7OCFSw7JiYmuP/++7n44osXkABngguJIFoKef/Gx8f5yEc+wl133cVTTz3Fa1/72lfUbj5XTz75JA8++OAJ+7z66qvZvHnzgs+6VatWcdFFF/HOd74Ta21hMbPW4nkelUoFay2VSoWhoSHWrl1Ls9k8b3Oc9+XgwYN84xvf4C1veQvbtm0D3PWxVCot6Eu35Qo6c7Jp0yY++clPsnHjRj796U8vafW90M+bM0WpVOJd73oXQRDwV3/1Vzz77LN84AMf4Pbbby+KbeS2tXXr1vHHf/zHtNttjh49yjve8Y5l7dt5yDASnZAdnKqgUN3ksiMyS9cSkh1brLswL6iwY+FIE7V48y72Jz+dujN+8j7YrpUWkk0L6KOOZa2LgLGiY4HLt7VFYPXCymZA7grr6jcn/F8YjsRCIqjb3rZAadQ1xs44FxJTnSBugRIuM8ZKn/0brmRgT53L9BH6Nw4jjs4xiGZwfQ+XfvD1BEmb3rhFLUmoS0Gz1aIZaVLtKnel5ASQO8TSE0VFLm1Bxq4KlJWOSDKZqkhmncsJFh0b0hSC1BJpw8xkk1btOKk2yFS7imuJRiuVjckpjYy21OoRXiUgzo+SdVYxKSXSl6QBeB70KINsTzFyfI6gpDDa0Iwk7bYGA20Ls6mlkYJOLZWMaNFCOFVYfvLltkM/ZH7HNcReCMblMhXn1PZLSZ/9H3R9lkBaSHDEk82UVUoifIUVzrcrE4M0IKwGz+VDWWsRqcLm84s712SaMj2bMDud4itnwRNSUJKWwapgsu6keql254OXVbSTIrNS4tZHW8Jyh9D0A0VZSLZfuorXX7OOF/dPUp6sc2BqhmqPYqCqKIeKWlujjEH0lZi2kuaxOUppSllBpRzSX/FJp+tsfv7nWCRPjm4natdJ4hpSgO+ViNMWhsw2JyyecuXqlRKEoUK3NX2+YE2lTK+1zDRiKtWQ+bkWs82IqZkIHfrMtRIm0PiBoK/k0Rd40LYIT0Gi8YRluCKJ+jxmphNMLNBtTbvZIhkowXgJtX6IHgVqep40ijCJxiQaHadOGSY8LIJKxWdsvJ+5+Sa1uSYi0dgoxXgCG2hEbNkSGcJawtGS4vFEcd2AYSCwGOMhrPs2ZeP6fg4dg/pMm6FSmx3rVxRGK7iw4HneGWXUTE9PMzs7W5SZP9ew1vLoo4/ywx/+sPg28Qc/+AHAWZFGnuexa9cuLrvsMvbs2cMvfvGLU1Zm2bRpEzt37jzt9huNxkmDS5vNJp7nEQTBabUlpaRcLtNoNE57/91Yu3btCdlKK1h+KKXOSQ7LClbw24A4jvmnf/onrrjiCt7whjfged6SD/K/Kw/3QgjGx8fPWXXGdrvNF7/4xRPUm2macu+993LHHXcwMDCwQJ0lhDjhs09KucDilaOnp6cIFs+vS+dDXfTss8/y4x//mNe97nULLFiLVTXz8/NEUcTo6GgRgp0rpvr7+3n/+9/P3Nwcn/nMZ4r8uhyvtu37XCKfl97eXu6++262bt3Kz372Mz7/+c+jteaaa65h1apV9Pf3Y4wpPmeq1Srbtm1j69aty9q/Zf9Es3SqhMESdqluSmiBuqabEDoRJ6hqEJl8qSNl6g64djnUnT1229dOaDcjVzS5wmlxvzub5gRYR++UWW66xl2EIGfKD4HtsqItoW7qpoQEqKKMXEYc5fY2coWR7VSay0ctOv3uJo2kACElUkC7p49fX/om9NFf85r2c6ze6NNXhrU3bybYNop4cQIb+niVErqZoAVYLyvRbixGCEfmWJCeREqFSQw6tZBavEyhk1ugRKZusrnSBUGaWDSWViJIY/CkYXIuJpCScjuBdooxGhuZTGHk5i/PExLGMnO8ht9fRkuZZQxJlOc5ZU/Fx1ZjVA2UL+ivuNLyqbbMtzXNyLhsI5zQJ0mgbC2hois5vEtdZJ1GrT28ltmxDWidhVxnZBgCWL0GffkuxC8fIkojtLb4IrNeZYoqHYNViiD0EFKRGo2MLSI1CA9EqhEideSRsZhAZtlCluPHLQk+njQIZdz7xghKnqUaCJJMoSlFThhBd05WXjK+XJUIa7BGIJTLnFI6ReuUIEqZOV5HDYX0VD36MluVlFAOJaU1/SRW0Y5T4naKBPp9D5VGDAlBqNuw9zH24zMblEnbswihsV5IlDTd+1OApyRKOSLN91xmmU4FVgvCNCVqp4wNl50qKo4oW0uSpAghCaXHTGwQsWEwMKwZ9il5Gjs5g1KCgZJhaLCXSa1oJzWaUwkCRWm8QrihF3aOYsMS+sg0iTWkWmO1ya4BrjpbThUrKSiXFJ6qYrRBRjFGCeJMrYW04EnWtDX9UzFh2eBXfCpDAamQIANn3Wu3CQLLFGCOzFM1ba448TK0ghWcdwRBwNatW9mxY8cFVZUpTVMee+yxBdLzNE154IEHkFKya9eus2q3XC6zc+dONm/ezLe+9a0lLWTr16/nrrvuKirgnA6efPJJ5ufnT1hureX73/8+Q0ND3HzzzSe9Yd+wYQNjY2MAjIyMsGHDBr7+9a9z7NixM/7mvre397TJqRWsYAUrOFu88MILfOADH+DjH/84H/7wh+nv73/VCKLlrAh2rqqwdePXv/413/rWt5Zs8+GHH+Zf/uVf+JM/+RN83z9hTIvtf90k0uL2usma5bYACiEYGxvjtttuY2xsrOjn4v3EccwDDzxAGIbcdNNNxRillMX6/f39fOhDH+JXv/oV3/jGNxb0vV6v/05af6WUvPa1r2X79u14nsfExAT33nsv11xzDUNDQ4yOjnLppZeSpinNZpOenp5lz3E6P1XSunKEpO0mazINTveyPK8nW3aCcgin7OlsvZA0MiKzYi2VNZSzs3S/3CFj7IK2Om0vJnScaEoUTVoWriAKpVBHUbRoVoqfsntfovN7t8kuz2tyD7K2a0wdVYss9t3dfsc6h8jVPe5fqGAkSBkfMIxu2ESfLdE7+Tx9MqFv12ZEO4a5JhZJKgQpEuO5QGZjNdq4g2kFSClQQiIspNpijbNb5VKnNFMS+cKxWLnSRWdKGuvBdCqQRtKfgkgtVdsmSTUmNfgKiDS6IjPiI7f5ZQSLFTDfxlQCUCojIyS+p/ADH9kX4k9GqIamWgpIIle9qxFbGomlnlq0FSgEnjGUPJf5k+ZKKJnpuoSrhKeFz9SWK2iqEKltZi3Lc5kESAWvfT3J/Cyl3Y+BTopMIUmehwRpkmJSTRAowtDDCmjFBmKD8HxsqUpUHaTkKfrFcYIQjk21ONYIaCcQ+paewFL1YwQGKaA3FCTSIqQbQ0HCWrdfCyTaUqpIwlCSpmC1xgiJMa4s/dFDM8THavjDZUp9HspaBAarDUoIvMFeWuUyjUZCKywRpJpqf0jUTgnamorvMdnSNOvTjIr/5fCa7bRpg4mwskk9agAWKwU6OyecNc0SeBITSBq1lFasWTNcQvmKQ1M18pD5dlOjkwivHFDTlrKFSgnKqwJkSYHviCgbBSSxwItTqlWJSTzCgYDKWBl/sOxyo+pN4nacqSAlUgEYlK9QUmCFIk1Syv0llJSIZkx/XwWv4a4MSWpIpcBYg8Ti+YKqhEtamuBFTSIgHamS6JiG1lRDGBnoozx9jL2eYuqA4Y6lLhErWMF5RE9PD3feeSebNm162RLvi9Hb27ts6qJTQWvNCy+8UBBGWmsef/zxQrY+MDDAddddd0qlRx4gefnll7Nv374Tvq1ct25dEWh6OqjX6zz++ONLvpYrj1588UVe85rX0Nvbu+RNer1e521ve9uCm+x77rmHp59+mh/96EfnpRrKUgiCgNWrV59RFZ9TYePGjS8bkL6CFazgwkelUmHDhg1s2rSJl156iZdeeumESmmvBnm0nDk956LdPJfv3/7t306q6o2iiM997nOsX7+eO++8syBUXm5u87Fba4njmOnpaQ4ePIjv+1x55ZXLejxyAmfz5s0MDg6eNAjdGMOhQ4d46KGHWLt2LSMjI1x55ZVUKpUFldxy8unP//zPef7553nmmWeK5XEco7X+rcy+Ox1is6+vjz/6oz9ienqa3/zmNzz00EP84he/YNWqVfzlX/4lg4ODHD16lE2bNhVqo+XCeQi9FlkVL/eXFbYgSQp6o0s9k2cLiczaZREnEEPAAkWNe9hbRJUUxE338txWJgriqpNF1NUH19NCldMJk+6ilEQxurzDi8gmW6iTbKZwcvu0RcbQwnlaeNIUDqgFBFu+z2KXmSXO/dFNeMluoogOWRRKy+Zyiyv7G+zoq7Gtr0ZfyVLp9aG1FhFIxKpeODiJPTxJMlMnSlKssKgsiNkqEJ5AWadekSikUOhIo7XNyrpnxJZ0hJHOQnV86xRTQrp2jIU0Ncw3nf3LRoYeE5MqZ2/zBPgIYiuIU4uQ+fzZjFkzSCswxhIKiS5LZ4HDlUf3lMQvefj9Pr1auxyaSJMYV/q9nhhik+X9GEvVFwQeBdEiimPr+qMNtAZWc3R8C7Fxwdg2J4xs1wHzQ8wN/w+0pueFJ1AiAWNdCHV2bgpcQHcSW9AGP/AIlUd9cDXTO66lPbIaXakyeOwQ2/fdTztJeW5/nVZkiaxBRoKGVPQEkuEeNw++AD9wZeo95eY+1Vl5eAstDcdahqqEYSOQQiLRSCmQViDjFDvVoNzr4Q+USLGO2NIWqdwZPRuWmG+kpKnFq/j09w6QNto0jzdpR3A8SphLDKkQBBOHGKg3mV+7GqMM6xtt+o5Nk6Qpngciy7dSCkfweWBLElW3eMK9PjffJEpT/CBgLjbMa0OoDFNzbXwpUKGkfyBAeK7UmlUSUkgbhnYrJm6l6LYmqEhEKFwlunIIQmBSV8nNAkJJd44GHh4gratRqHwFaYzwA7ySRylJiWNF6An6SgpjPIwFk1o8aUCBkRYbSWZ3x9gDxxGrKsiRMnumWlw7PMjmVWVmEo0NNCtYwasJIQR33HEHW7ZsOeObSN/3ufnmm+nv71+m3p0a8/PzPPnkk5TLZQ4dOsTDDz9c5CEIIajX67z5zW9+2ZvJ/Ju6Bx54oFAy9fT0nJHSylrL//7v/zIzM7Pka//zP/9TvPa1r32N97znPfT0nJhhNj09zVe+8hXe+973FiGy5XKZa665hn379vHrX//6tPt0puTfqeD7PgMDA+esvfHxcWZnZ5mbmztnbV5I2LVrF4cOHbogsqxWsILlQB7w/sEPfpCbbrqpeGg9mSXtQkG3IuXVVkHt3r2br371q8Xn1lKYmJjgE5/4BEBBGsHp9f3555/ns5/9LI888ggTExO89a1v5ctf/vIZtXG26Ovro6+vbwHxk4/bWksURXz3u9/lpZdeYmxszFXhTpIlFUNKKXbt2sU//MM/cM899zAxMcEf/MEf8OEPf/h3SkV7srGvWrWK4eFhduzYwWte8xp++MMf8v3vf58rrriCgwcPYq1lYGDgt5swclYwseDhu5vY6CZZuv/uJkYKcqmLPOlW/Zj8ZOwOGMrQLdDq0FZdap4u4qm7T4spndxClXeo82dXftFJ+l8QYgK6jXL5WvnrXc6zTLUkXO7PovOn2EfXZBSkV8ESZYSVcERHWWqGVML2noibV02zrb9GVUYInVCbjonmJCVP0LNjDDFbxz53CH14hsZUjcZ8m1YzIU412rjBSwlWghQSX0mkFSADmvWWy9VRrh9FSXoLzbbF9wTVEJS0Rd6RiS00UrQSiLKg1XLWrUAKfCUREpotTVzx8L2MTOywjmiTDbuR4AuJrfgY60qnK6nwPIXXGxAYjSj76JojiVqpITVgjavW1u8LQt/Zj3TBQ2ZEUc4geQEHtlzNvFdGaYu2Bs+4svBkFiZstq1fJr7u/0GaMPDiU/hCgzVF5TIlRVE1z1iDTjUegmqrwZyAqKcPKyStSh8pAS/um6MVJSTWEGmLRWKFwRhB2Rf0hBbPy/osQXqgNCQmq5ymoRZbIg1pzfCbAzGDFYEwlpa2pNZQsYb+qoKycmFXxlncDICQ1DyfSenTtoJSYBjwLO2pJjOHakQ1jTWGsKSoWIi1QFnLcNzmYKLROmX4eI3yTAvr4SrACXeOO+mbe4+UfUlfyVU2q7dSImsIfEUYhkzP1JjWljgWJBZKiWFYCkTbkMzHKF9gG5aoLYnaKa12ykxN00gsXq9C9QraqbNNqnpCVG+TJAaZya+kUigJwlqwEiEFMvAdmSQlwkAQKvzYQ0WCQEsqvqAdS2JtECqrtmgttmwRRmIjiPbV4EiDyuqAucF5KkHAxf2KY62VnIsVvLq46qqr2L59+1ndOF500UVcffXVy3rTqZRi06ZNTE9Pn3AzdfToUb72ta8VQavdN9159pEQgje/+c0vqzS64oor2LJly4IAzkqlclp9tNayb98+fv7zny/5+mLl0b59+7jvvvu46667Tkoa/eQnP+Ed73jHghv7devWnRFhdCbZS6eDjRs38uSTT54TEuSxxx47bSvB2rVrL+gH0MUQQrBt2zYqlcrvLCG2gv+7KJVKjI+Pc+ONN/KhD32I173udWdk2301kV9zjDGvugIqjmP+8R//kQMHDrzsukeOHOETn/gEpVKJt7/97cVn3sv1e2RkhDAMef7550mShKeffpparcbQ0NCyq68W2+UWX+8fe+wx7r33Xqy1rF27lksvvbSwVi3VNyklmzZtYmRkhPn5eT7wgQ9w5ZVXLrsVa7mw2B74csdDSsmqVau44447uOWWW5iamuKJJ55g7969xftv06ZNy9bfZX9aye1H3bawnNzoaIi604a66RRnPsoDsW22YS4oEmSV0zoin8wC51REHQLHnpCX1K1Jyt1TNuuNLJRIHYKn6H7xX2c81trCOpf3vDugu4Dt3rSLHeoifRaQTl2rFOeR7YwhJ4bynKhu0sgRUS7kOpCW63prbKy0uW58jtFwnrTdZr4REcWaOHEVzsaHfXqUwD6ym2TvMWqTdebrEY1GQrudOltV5m0SOAWLAvfTCnIDYa5myufDAsZAlEA7NVkwm1O06MzCVhJOURJWXDn1+ZKClkX4klBYZmLJC2IL28M61egYUhtHHOUDNxBhkPUYP/SIukg6aQTRbEw0n9IzYjFSkFhLoi2JsfhIBnxB6AtnfxMu50go2ZnXjACZGtzI/tHNRAaUtXgSEmlRpnOumWzQBhBBieSaN6LmphmcPoAnZUZGOO2cFKJTvQyD1RrRmGX08R+TKJ+ZNVto+SUOTQr0bAsPjcFmpITGYIiNoJ0K+qvufMilbcZajLX4vR5pAmE7ZVg5cmsmsszPJzRrgsATlHzwAsHqkTID/QGtJCVKU4yGqKmpTzZJWpqZkWEMkrJOGJSG5lTCvrkSutSPP7mXYQUlIZhNDe1UEI2sp7Z2C/ghtjVD3dYop2l25XG2NKUkVgkSLJ6QlBVUqx4JFuOBTKG3EqKEYlXFAy+lBswnUJWS4bLCJJb52QghXdW3qGVIIk0rtTQjiA3EHnipRadgEkPciJmfa5FECcoaTJLiCad0C72MCBXZBUcKJyELAnfc2xqZkZm+r+gvgycEjciijQEjMNYSGe0sdz7ErZRoj+a5wy/hDYXUy5Za+Ntxk7WC5UelUmHdunWAsy8dOXLklN86niusXbv2rAN6fd9f9ps1KSW33nprodJZak7yUsGLYa3lkUceobe3l+uvv/6U+xFCnJH9rButVov7779/yXDqxeoipRTlcplyuXzKwM6nn36aa665hg0bNhTLtmzZQqlUOiH4cykMDg6ydu3asxjNybFz506ef/55nnrqqVfc1smO2VKYmpqi0Wic9fFZwQpWcG7geR5veMMbuOmmm7jrrrvYunVroSjSWjM/P0+j0WDVqlWEYQicfzJmcajyYkRRxFe+8hV27tzJVVddddJ8neXG448/zn333XfaxPmRI0f4sz/7MzZv3nyC5W8x8teGhob49Kc/jdaaL33pS0xNTdFsNl8VG/liTExMsHnzZq699lpuv/12+vr62Lt3L81mk6uuuuqEe4unn36av/3bv+XZZ59FKcXs7Oyy5lW9mjjV+SilpLe3l56eHsbGxrj22mtptVr85Cc/WdY+nQfCSBTKmdyx000a5fk8xWmRkT3ugbubXum8oUzXJGZCloVkTcYaiRO2XEDX5DxDhw0tupA/+ncUQLZb3dRV9c0RJF2V0GDR1l17FidIgDyAAAAgAElEQVQSQgvX7iif8hVEMWlZ34Rg4Vuoo1ASQhQlwfNS8EoIysoyXk64afw4I36d2bkWc3MtZpswrQeoqyFKaZN1oyk8f5T4+SPMTzZpNCLazYS4pdGJcaXPcFW8HOHhLE25gqzVSBzx1k3oGacAMlhSNwAiDUECKIvVbtC+FKgsgghrSSXUezyCFFIEs+Vhfr3zLRxL57jppe9Rjqez8RukkQhPooFWkiInm9AfYpXCpIbW8TrpTBsdWWamEwIl0ZbMqiXo9SEMIPDcudPUMBlBfwWnLAGMFkRBP7/Z8jrmVYjQBikEqekmfHKpZXG0EAjSci/zO6+l5+cTeLqNkqAQpMadfzJTbEkBni8YHhlGCw/x5M9ol3vxUo2dn8ITujg//IyUU7i8Ij8USN/NpbGW1ILRrgflPp+0ptFtSykQjFjJfOKqw0kBvZ6k7AnCimTt6l6C0AMLs8ebTB5s0JxskWpLZajKOgu6HnHgeI1Jo/GVx8jmzcwNbCTxDNHUIVpoIgSmVOXI5dcz0zuC35jHqIDjowmV2gwWd64I5RRG0nP2QeUJfE9QNiCMgaokrRuMlfSUFKMjJQaSFC0tbW3RqWUwECitqU06xViUWoQSRIklSizK9/AqEutB1EgwvRblBxg8EiNpxxqpNUJrjLQuzynVGCXQyoWchyUfGQSAcco15UL5lBCEvsxIVAtSESlBkhii2JF2+fkvlMUaQdwyNPanJIAIXv7BbwW/+6hWq9x5551s3boVIQRRFPHMM8/wve99b1mrgAghXpH3P0kSjDHLThoFQcBtt93GRRddxMGDBzl27BjPPffcaW1rrV1WlUez2eSb3/wmExMTS77eaDT41a9+xcjICJdccgmXXHIJPT09J80wymGt5ZlnnllAGI2NjfHOd76Tb37zm6ckjYQQ7Nq165zL06WU3HbbbcRxvGRI+HJh//79/OhHP1r2ssErWMEKTg3P89i+fTt3330327ZtQwiBMYZ6vc4vf/lL9u/fz9jYGG94wxsIw/CCfJA/dOgQn/zkJ9mwYQP/9V//dc6qnZ0Jpqam+PSnP33Sz42TYd++ffzd3/0dX/jCFyiVSqe1TX9/P3/913/Nnj17UEqdU2vxmaBbcZRb4W+77TbCMEQphRCCyclJnnrqKdatW8fQ0FDxZVaj0eBv/uZv+M///M/inuPBBx/klltuoVKpvCqE37nCYqXb6Y4lt6vn58Ho6Oiy9RHOA2FEF8FhbUcRIhFZTlEuXVu0ne1kB1nrKnLl8TDdQdFFbExOtGS/yy6jWGfdhWqhxcqiost0GI9iH10Knu4Mom6bW3ebxdo5mWPtgspl3eqhjk2tQzsVYxT5PnK11SKyqmv+hMjbzsuou59KwpaBFht6YyanWszOtZho9XIgHUMHIdt7plndmKb8bIOpyeNoE7lsnzh1+S6pxWoDGqSGKDZoC5XQdyoLDTo11JoJWDKFhetPnB07IwRWOBmOsU7lkWYTpnBKKCRY48rZJ22NHlBMa/BjQ623TNsLaM60mZ2oEQ5mR8lmIduA8BVaSmrtFHs0QveWmJmOaE428JUFH5rTMXJVCStxfQQqvkB5LvC4bQTHEphvG6oVQagcWZTKEs9tuZ4DA2vRBqS1CGFRoqPuApAUkdwoqynHTUbnDtI/8TTCs0jtnF4qI3zizArlCYnvS8bGxxkaHqetDdHRGTb8+jG8Vp1KVAcXzYPWgpJwlj6BJQgFfb0SGYKxgjQ2pKnF6PzcN5jE/SaloFLyGEwsB5sGIyDWhoqv2DLWQ29PmUatzZ7fTDF5sIH0PXrH+lm/bpBj8wnP7Jum1/OJowgRSA7PztPfeIKtG/ch1peYWzVGPF+nPBAT+YOkI6vwVZUyAqwmmC8jentI2ilCJAgJRoLyJYEn8TyJlYJq2cP6Fll26qmjMylxYhgqSfrKCimtsw6mlqRtaDU1kXDnZaQhRaIVlMs+QdXDCxRRmpLUoba/RiMMqa4ZwBfQ1JYoNpBolDUEwhJIic5yoHzPQwqBj0QYS5xYGo02UZwQJxphDCJN8Q1UhEUpSK1THMWpINEGpQVWQmodmSSsU04FjZUMo//LEEJQKpW48cYbC7IIXDbEa17zGpRSfOc731k20mhkZITt27ef9fa7d+/mW9/6Ftdeey2jo6PLShz5vs/FF1/MxRdfzPPPP8/evXsXVE47FZbrRrLdbvONb3zjpORVmqY88cQTbN26lTe96U2Uy+Uz6su+fftoNpuFNU4IwY4dOwBOSRqVSiV27ty5LOOuVCq8853v5P7772f//v0LyLi8FPJy4HRUVRcSjh49+ooCyvPQ86NHj57DXq1gBa8MUkquvfbagixKkoS9e/fyq1/9iuPHj3PTTTexZcuWZc1SORMstkWBy75rtVoMDw+fdyudtZZms8lnPvMZHnjggdPeLgxDNm7cyK233sr73ve+gkg5HXJBSsn4+Dif+tSnUEotaYM+H1h8HJaa++uvv56rr74acCrUPIdvenp6wZcUOUmZpul5+dLqQsFSxzv/e7kVuMuvMMp/6VLTdAxVXcRJTnZ0rV8QNDZ7w2dKH0OHMDJd6+YKoE4GtiOZOnaxbK3iR/5LQQstoGFOfAt2K5cW2uw6S1wHciVQbhcrW03JpMyrhRLNQhllO+10E2GiS3LU/WrR265O5nOhRGd9BbxuqMENq2eIG21qjRZH4hGO2iE2DbaoilnMsRnmDhyl2Uwx9QalEpg4QUiBtk5RIRFZJSsIpeTodEpDJVQqCukp0GCExBqXIJ0KsAqskgglSCKNtpYwcHObGovUAk8KcodBqAQ2K/luEgNpQuoLGrGlFlTwohZjz/6M1uQMc9qnf7SMs+RZjM7kMtIjRlOfS2kcmSUxUPEsNnSB6mlkaLVSrJK0TIonIRUwm1mX6onFRoaCyxSCNgHPr93Fs6svIcqYSZWdj0Z0LJUuwshQ0jH9jSlWH3uByswBbNyERo2gLPCtxLcWJZxgK1evKSz91V4qvYPMRTGR0aTGUj64j572HJ4wRR6YL5yVLX/zSsALFcIjCx4HrS0mdflFzZYjkAQQKMH64V7iZJ75NCEVgkqv71RF5TIHDtc5dLRObX+ToK/MpqtWM1QKOLJ3mqljTWRq8HoMgYSZWpNGK2VyOuKlw3U2jAYYz6dc9RGhxC9HbJ35JcH/Z+/MY+2oDvv/OefMcpd33754xTY2AbMYQzBgnCZpWErIQktCFilRGjVqq6pVG7Vpq6hV01Vtf2q6KE1VpY3aJlL/IItSUaDNwhJS4kIdAwGMAeN9eX773WY5y++PM/e+97yy2AaCv9KT/e67M3NmuXNnvvNdWMK4rWKsplWOCbUhsMa3zwlRtNCBDAVBqLDOMd1K6B8pUe6pkc5MECvN4UbGjmmHKEnKCNbGiqFSQBwo2sYfqw3taBpP+vbXAqq9ETYQqEqJ9kxC2kyoT0J94jCjI7PIqiSVjsx54kYKR+4cqXBEShKHChMZJAKdJagopJnkNNs5rVZOrr2NUOeOVu6ths6AMaC0o+b8OhoJCZBYb8PTRUr6sflk5/HmQKf149prr2X16tUMDAyc8CJgw4YNOOe45557zgpptGnTpld1way1Zvv27TzzzDOsX7+ezZs3MzIyctaf9K1du5abbrqJ73znO6cljYaGhrjqqqvO+BistTz++OOnVDrNzs5y8cUXv+JtMjExwcMPP8xNN93UvSDukEZKKR566CEOHDiwaBopJddff/1ZvWGrVCrcfvvtNJtNGo1G93VjDPfffz+HDx8mDEPWrl2LlJKDBw+eM4vl6wX1ev1VZT0NDQ1x44038v3vf/+sqgzP442HjkLx0KFD53S5Qgje9773cfvtt9NpqHrmmWfYvn07y5cv58Ybb6S/vx+lFNbabs5OZ9rXCseSRocOHaKvr4/f/d3fpa+v75yNrRP0/MUvfpF//Md/POX5oaP+HRoa4uqrr+YDH/gAb3vb2xgcHKRarXYz+05HlCxUrGzatGlRvtC5wIkIu2NfW5jlI6XsPiBZGJA9PDzMX//1X/Pwww/z2GOP8aMf/YiHHnqI8fHxN5VV+URqpHOFc6AwomBFOo1iYp4bKfgO2T2A5xU6Qiy2pFHE55hi0B2xUldVxGLbWFeHI7qTL7K7ue7rHYVI0YvmFuYuuXliqTtP0V2gFD7MuTP/DnEwr6oSXfJm1DR4V/1pHu67gj1hbZGkqjsPsWD7LFRNiYUJTN2FHWN6W6CfWvD3ijL8zIppYpEzPtfkYKMXHdS4ojZFWm9xcG/K0NQhzHDMdKWELEuCegszk1JV3qblAtHdfsJ5xVIlkozPGeYSS0+fwllHmhmkdQSKIsDY5yglmaWdWsJQEEmB1ZbcFflKoULnDiO9mscVbV44hzAOrEVJR3hwFyONlOzQHuasQ83kRHFAdTDGOUPW0uRZTpZassySZpYUQRTig5CFwCkwxpK1NDLyoc5t7dhTt6RFfVlZQGAdRnjbWjNX7Bi+gu0XXEUiA//hLEhLWew7iaWW1Omf2kd1bpye2SPEzUlc2iYxmkB02tcEsqyIcosSfj1T4xVXgVT0VAdIc4sJJc08I5WGJLDEEirFsW2sJwSD4sc639zWSqEaFDY35+dtjENraDcsVgvQDh05apWQ9Sv7aeyfo2V8JtJMO+dHL84QHS0RBoq+kRob1o8w2NPDxME6z89miJJksFdhREZjto3WhpKChrXk2nFkNkcGht5A0b9shKQ6QjUQvFU/zfZdEDYd9ViQhBLR8vlKCG8fE6FEBooglESBIo4FQyuHmRtvo42hr+Iox4IghX2JwUnJVBusFpSURGtHy4IrK2LhLXtGO7LMIsIQZS3OQnMuZ65lOZhZdh9tsqQ3or8vRpQEWhqkchghIA685cx4JVCWZKggxGJotzWteps0N7S0xTcrSlJnyHK/nA4TLLQldAJpHaEtSGDrFUhZ54N+Hm8qdIiiyy677LSS8g5pVK1WeeSRR9i9e/cZu+keGhri8ssvPyMXjmmasn37dvbt28edd97Zbfc6W5BSsmnTJgB+8IMfUK/XT/g+pRQ33XTTGZdqdxrRvve9753yfUNDQ696OT/60Y+48sorGRsb674uhOAtb3kLS5cu5etf/3q3nl4pxU/91E+xZcuWM9qQdiIIIejp6TnuafWHPvQh8jxHStk9vnfv3s1dd91Fu91+xctbtWrVqxrv2YJzjunpaZIkQQjB0NAQURR1bRYvJ6tpIVqtFv/zP//D4cOHmZubO8OjPo83MlasWMEf//Ef86d/+qds3779nC23v7+fX/zFX6Snp4csy7rB9VdeeSW1Wo04jgmCgDRNsdZ2FZVSytecOFp4c/3Wt76VL3zhC2zcuPGcLb9D8Hzta1/jz//8z0+qPlRKcfHFF3PzzTezceNGrrrqKtasWdOtmgdPzFtrFwV3ny7PyDl31r8TTrX8l/raiYik3bt389RTTzE2NsZv/uZv0mq12LNnD48//vhLVhm/XnCyz8ErIX6OneZs2/LOPmHk5jeMPUa5Uwg4FuqNEKKTjeOJpHmixL9LuQXTd/gR5+kSH/K7ePGiUOMsIpY604h5kqlLuyxQKwknFhBLC4RILCRzjlmf7tgECkvFaqpOEwAjzaP8rN7GV0Y3M6PiBaqrecVQhwTzY/Ojd/g2sU5SkhOyu14LRtf9b2dszjmuHmxzyWCd1tEGsy1Hgx5WVOocGc/Idx2ltz3F8AU9TFmJdI60FJFEEcaFpFNNehNNqMD6LniEdWAd1VhSqwhkOaKvt8S+g3PUWzlSCUoISkpgjEWnllQ7gkhQ6gswde1vqAEtvSpJBwJrMr9+nZ1ii2U5EMZRTWZZ0pyjpR1z1ss1oqmMnlJIFChEBnmqcbkPPdbOK3jCAGQgPcvi/DY1dZ+xk2lwxufLWAFx5/gSPhi6mQn2DKzl8bWbaUflbv4WxXEKjkreZvnh5xja8wSuPoVwmsD5k3nkLCXpiAJJHEkIJC5WmEZOaAxIQSTBWkmtdwgRlsm09aRWIyPPc1p5ToxgNPB2Jmm8FSuUjlAIcusDy5O6IQ59TbyzwucXWZ9t1FOWTCdecRQ6QW8ppFwus2umTTqV02pD6iDPLL2ppTdUzIWSRx49zGi1jAkdk3nKUEmR5DnNNEcFgiCUuMSQakelJpizlqzpOJK3iS5YTrl2AVfG4ywPG+wvD7LvhRal/buJssRbGYVFSK8wCkJJXA4JQkUcBURhCVUqM3vkKFk7JwggVII1VcGaalC0tzmUcEShQKDoDxQyVDTrXvnTahim0oR+LLG2mJYhUAEVlRGEUArB5BlTUxqpFFEoKJUVYVWilCMMoBRLQJK1LcalZHmbuXZGkuRkxpJbh5Ci2G/eBmg7KiPrfOyXBWH8sSWL81wIxALa5x1pbyqsX7+e97///ZRKpZf8xS6lZN26daxZs6bbxLVnz55XfCMK3rLUsUidSUxOTvLNb36Tj33sY1Sr1Ze8js45siw77gLoVBkYUkquvfZaLr74Yvbv38999913XOj06tWrF1n9zhRmZ2e5//77z4nyI0kSHn30Ud773vce97eenh7uvPNOJicnAX+zsWTJktfsxgB83tTCmuNDhw7xrW9961WRRQAjIyOvdmhnFHmes2fPHqanp3nooYe6x94VV1zBbbfdxvLly6lWq6+Y7Nm9eze7d+8+gyM+jzcypJSMjo4yMDBApVJh3bp1/P3f/z0f+chHXlLL1pnAzTffzDXXXAN4heXs7CwrV65ESsnY2Fj3nB9FEdZanHPMzc3RarUYGBh42ZbcM43OskdHR7nlllvO2XI7ZNHDDz/M7/3e7zE1NXXce4QQjI6O8vGPf5xf/uVfZsWKFUgpT9gYJoToWrFKpRJBEJyWLHgj5PuciDRxzvHVr36Ve++9lz/8wz9ECMGuXbtI05S3v/3tr/qhzE8SzvY+PicZRh10hHMCfF013gLSzQcqgng67V7zmTyeSOiQPV1CqTMzFhNGrlBYLPSOdeiVohW+a2tbqBBaqB7p/OtwLHqeW4ypowDqrs8CMix0lrH2DJfN7Oai6RcZCNqUhqoEegrVOsItMuJ/Bi/jSNiHFh211eLt1CW26FSvL0hLKkiNzjgXWtMWihOrynLLyoRYWQ7umiGPSqwb1Dw/HsDBWcZaR+lfFmEiS9iyGCy502gVkY0OkvT0oidnKU3VCYRBSeGze4qN1xdLZE/A7EwLnRkoVC2Jg0w7DKCkoyS9NS6fM9jcddVlaeYwGHIpEMKC8+tki/sgV+wg57kVSoFXiDU0JAiGBirUgpA002SpJsksrUSTa4fGIWNFEIIIi3p0BFII0tQyN5n59SiOASX9h6GzXw2S/fFSdqx/O0m5Om/JK/ZFaDRjR/cwtu8JShP7kCYlwqKsBWcRAuJIUooUpUghQolTEiUdRkncbEKIt5YJUaJc6iPVhsxYnBIkWUaW5GhjmDMOQoEwDiU90RAWMjjphM9EcuByh9CABpuDUIJqzdsFRW4JhaQaKnrigB/tnWF8ro0MJWnbkOHHe+nqPrLZjKnM0K5KntRN4rahHAmskF1SUCC9wqZtSYXj4lU9TLXh+T0tqs4hG1OM2wt5Me8jdA02jczSyjQvqhLtoxY7keLw20kFAqlAhQoVB6hAYBAkh+YQLY3T/rPpCT1BkloaqUNEAkqCuXZKracEgaSVavK2xiYGl1iUhiNJm1KUolCo3FCyjkh5ylUbgXT+wia1EoH0x0EOM42MdiywUpBmBp0brHGk2qK1wThPCjl8q54V3l5pi/OIdg6L8IHXCDQCbfyJxVlPXr45XNfnAbBmzRre//73vyKSRgjRDRtdvXo1O3bs4Lvf/S4zMzOvaCxXXnkll1566Vm5wBgfH+crX/kK119//UuqvHXOsX//fv7jP/5jEQEjpeRd73rXKVVQQgj6+/vp6+ujXC7z7W9/u/vEcWBgYFEt/ZnE9u3bT6pqOhtYaPtaCCEE1Wr1dZMXciLs2bPnJ6Za3lrL9PQ0zz77LM8//zx79+49jrh98sknueCCC+jp6Tmnx8h5/GSik91266238uEPf5jly5eT5znDw8MEQcBf/uVf8ud//uc8+eSTZ9XyWavV+Pmf//muojAIAjZs2MCePXsYGRmhp6ene55WSnVtae12m6eeeuo48v7lfvecTIHxar7DzgWJ0sl1+/GPf8ynP/3prhp0ISqVCj/7sz/LL/3SL3HttdcShuEJt9NCdYpSijzPyfO8Gxj9k4QOAdZR037+85/n2WefZdWqVTzzzDMopUiShDiOX7NMppeKkxFhL2W6l7NftdZn5Xqng7NOGAmxIPS6+5pv7+qqiLo//nfVfb1jD/MMQ0dpJAUFodRpCBPd+Vvrn/DbzqsFWdRVFbnFNrVCMNMljEyn1ci5+RarBRakrqqoeK3jKJHF8kbb02yZ3MFl489Sbs/QxtI7UKE9nZKFAaLd4PIDP2Rd/Tn+b+RqHqtdxIwqYUVBZomOuqmYoesEXc+v40Lr3rEKJ4ptFwvL5t5plqlZWjuPML31MA0J5i0SayPWTu4ijAxxDHNp5gN9A0GSOpLMkE+1iE1Gz2CJ0sAIjQOzmDxDaIu0RfaKc5hGgnDOh/2GkjaQC4fNIcJRxasqrAYUCCFxDnLrSJ1DYkA4KpHw6h/jsN7nVajCXFcOFiiIrSOXguFaSIxjcqJFKzckuSGzfp8ZwEpJKezsd8/SSwQoqOf+hj0QXoWk/NCQxXGghCANyuxZ/1M0+oaY38L+eCwnLVa/8Cj9e59EZS1i6YOSQwlWgbWemIojSRRKlJIgpG9llwpZFqTGIlo5USDA9aBzR+IyRCBoZZrcaLT1ipWWdmTOj1cIQSggDvzY8yIkXDqBTSxZim9NU4K2sSRtg5CSGAhCRV8pZNdUixemml1ytRQKRsoB1751OT3VmMefHGdk9QCHGwmTkylZwxCXJYPVnDgUhBaqcUCUWazQLB0rs/6KpTz34ix7DyWkuSbY8wKlgV5eDCIGqi1WVmZpZxnlOIcq6Al/sOpCxSeUIogCyqUAnWiSzBBOp4z2liiVIUty8kxTr1smGo6e/oiVy8tY4WhnlnrqyNC0WxmqoYmFJIoluoi2arcd2miUsVhXhIfbgjAWIIQlUI4kt0y3clrG0cwtOgBVVigEpdyTVkYJcgmZENSNoOQEVWv9WaawVDogB2RVUhqJEDhabZia86SmUJJcCubeJEF95+Gfap4JRU8Yhlx++eVccMEFfPe73+2GAa9ataprvbLW8tRTT5EkCcYY9u/f320068zjbF1gOucYHx/nP//zP2m1WmzevPmUpNGBAwf42te+dkIlxt13340Q4rQBzkIILrzwQj71qU8teu1sKW3ORHbIuc4fOI+XDmst+/btWxS07ZzjySef5Lnnnjtl9kjHrnjppZee37/n8YohhGDjxo18/OMf5/bbb2flypVdYkBrjdYapRR33nkn1113HV/60pf48pe//LJbt14Koijik5/8JJs3b15ECs3MzDAxMdGtpl84dvCk/8DAAFdddRW1Wg0pZXfcC9/3avBKbDjnmlxpNBr8yZ/8yQntgytXruT3f//3+fCHP7zIdnYqG1cn36hDynW2wRu5KexYLFyP2267jY997GNMT08zOTlJlmWsXr2asbGxcx5afiIsJPJOds7vEIcdG+FC5VgnCH3Hjh0MDg52VXsLt4HWmiNHjjA+Po4xhqGhIRqNRlfZOjk5yRNPPMFnP/vZs7aeZ50wCuQComPBj68Rn1cTKelvsqUUBEXtOAWp1OWEiptLiX//QqLJL8PNW8YK0qiTfeRwXe6hw8GLjvupQxpZh3YObZ23mghvKelM39URCf+7WPA34QShNWzatZUt088QYWk6R8sKcl3mqaENTFX6GNW7WDe5g+H6Ed7lvsul7Z18v/et7KisoCXDefudoFASeZVRl2xb6D4r1rETsC2gS6ZJISmHCpu0mX36KHFmyBPD5Pd30D9URqd11LIySV3jUIhAUwoUkTPUJ1uU05zR5X28ZcMFNCYD0t5DNJIUjCafSdDNFLQ/+MvCEfUXUqlQUO2PiFSIbmryRJPmhrZ2tDQkiSbTGkthJzLGK8Zi0MaR577uXoSe/HPadZVGSK8EqjpHNYCJRkae+zBtg/BV8hQ5V7FAKU/+Cev9aU7ATMMwO6eJxfz2Aq/QoQiTlkDW08/08HIQAlWoRJSDnuY06556gOrhF1A2pxJCLP1xbpwjLQbhlD8WAwuRcwhnkUoSK4kKJNFgmaZxSKsQMiIzBkNOmjuOtFrMphklo8gyjbOW1DkC4XyekxKESvjl5N6aJpyj1XIk1lEtS6Twdrt6w6GloSIUzgkaRnBkskn/aJm5Rk5zOmVkIOaqK5fQNoZde6excYATkqlmk3qS0koN5VwhCUE4ImuIJaSpYbZtWTrqP5MD/REDAxHjkxl5s03v5F5m+0d4Imkxl1h2T6VM1xMGGo5Vzgf6CAFSKUrliL7eMibLyYHp6ZRwLmdpb8DoYJmpCTg6Z0m1YGhAsWRpBSktmYZ2YpE1iWkb0pZG4QicI3ZQigIyBbX+kNxJTG6xmSU1htw6tINWZmjnliS1vp3OaXQoCSohUegInUNYg8lBWpAlQRAJbEXyv3mAJmCNtawMHS4AmzmaqeWAcjR7AzYMlrloSPDEIc2zQtOq+Is+J3320Xmcx8uFEIK+vj7uuOOOk77n4osvBvzN78zMDFNTU+zcuZOdO3e+5DreV4NOALIQguuvv/6kpNGzzz57UttOlmU8+OCDrFy5kr6+vlMur6PCer2jp6eHNWvWMDIywg9+8APSND3tNEuXLj0HI3v9Qkp5zvattZZt27bxX//1X684H2Pfvn2Mj4+f4ZGdx5sJURTxmc98hg984ANd1YBzjqxENVwAACAASURBVJmZGb7whS/w5JNPcscdd/Dud7+bVatW8bnPfY53v/vdfPGLX+See+45o7lX1loGBweJ47j7WoekHx0d7YYUnwilUqlrwdZak6Zp15r2SnONFgY+vxGIkn379vHQQw8dRyasX7+ef/iHf2DLli3HEQQLyYQTofP+19J+fK5Qq9X41V/9VZ555hnWrVvHW97yFsrlclfJ1uECzjVOlCF0LDoqu6mpqe6Dhv7+fnp7e7vfaUII2u02v/Zrv0a9XufOO+9kw4YNpGnK6OhoN8/u3nvv5YILLugWSXQeBDrnSJKEJEne2ISRt3540gNX2M8cSFkojAqiSEnfmBVIWZBHFGqZeZWR/6eoLJfzYdUI0a0znxeDuOOIIlPkvXgF0nxItMUrTozzpIC01mfFdNRKrpjfAqWJQ/q/WYctgo8C51iiW6yIvGpjIoU5XWHriht4dHgdqZDEvauoV4a5Zu/3GZYJF6hdfFAf4cnJVTwwdD1He4YxBVm00PJmu8tlcWA3dLdLJyxcCLBC0HAl4iRh9sCsbyiT0KszmvvatEKoxTnDgaIUO2yuCaSjogTTrZSoFLDiolH6hvo4sHMciUUoRdQTMryiD+UcSSMhbaYkzZx2PaM9l5M1DVkzQcW6uBkWqEpMpVZGi5jpfdO0p+cQzhEJ0Q3Rxgm0dmjjSZ5QeXtPZ9+Bb56yzq91nnsSBfwXhXE+t0hbb0GLSgIpfT6Rdg6rLdbC4aMZtqgnE2KxrVFCl7y0ShXsZtHghaDSmmPd0w/Rc+g5QpNTDgWx9OSNkH5M2viTRiQFoXPEoSAoSU+ERrJojvOV6+WhmHQC30aHITOauXZKM0lJncVZi3UWgyMDeqRXF3Wum43x6547MNq3qIW9AbmCLLPkQjCbW3KgKS2RcUzWDX0VSX9NEZcDImG57OJRDrcy9uyboSpiVg6PsPtQgzx1hKEkDn0W1cEjbYTyCqy+CAIHTeNo5IajR2dJjaW/FpAkhrmWoTQ5RV9NsHsupd7U9JcUhxs5fakgFQta4oREhQopBam23pZnBEdbmnq9TRhAo2mxRlCpKsaGYqS0tDJDveUoDYdkSqJnM0QkyIxDWOe3sbOUVUi9ZbE94Cr+mBRG0G5pDk1rJmcztHPIAGQpQFZCwkpIgEPkGrQGB6mC0IA0DmlAWQglTOJoDMfsCqCdgi3B4SSnjSWwcKjteH5vzotzPvOIQCCELFR0559An8fZhZSSwcFBBgcHWbt2LTfeeOM5u8g0xnSDoU9GGp3uQm9iYoKvf/3r3HHHHee00eZMQkrJsmXLWLVqVTck+dlnn31JZBHA8uXLz/IIzx5WrlxJFEWL7IZBEBAEwSIFz6mwatWqc0KaOefYtm0b//3f//2qw1Rf6r491VjgvBLtzQqlFMPDw91ztXOOer3OH/zBH/ClL32JNE259957+fSnP81v//ZvUy6X2bJlC1dddRUPPvggf/u3f8v3vve94yyTryRsV2t9XE6SEIJKpXJKsuhY0mNhEP5CkudEQccnmtfC97XbbeI4PqsWnDMFY8xx330XXnghf/d3f8fb3va2RYTHy/l+eyN+F74UnOict3r1avr6+hgcHDwhQXQuScOFYzuWvARPEuV5zvj4OC+88AI//vGPmZiYYHR0lL6+Pm644YYu4dWZplarMTw8zA9/+EN27drF0NAQWZZRq9UYHx+n1Wr5aI445vnnn2dqauqcfy+cdcKoEips57bIdYvm521pUnTVRh3CSEofOiyFKDKOfP5MwQ11M4w6N/2L6uULsqUr0ilsNx1CKC8sT6ZjWyuCpW2h0hDWIYT0DV6FRc0WO8UTUGI+s8QJrPCEhLemKVrVQWSyB60dh6jx6Jrr+L+RdWQyQAC5jPi/FRvoEZYrDjyCUi1qpYTrxHMMH5jgiep6JpZehAJEliGNZqyUUNMtrBPUVZWJsJcpWWGGiKZTaCexXYJNoIAQR2l6kuzAbgLjUM5ijaU3UpSVJDGOxv4Mk1hWXtRDKBwBjpI0COuQUYQTMPnUHubynGkiZNqmlvsMm0qsaM1pZvc2yaYT8lTPZ7cAJjNEPRGVWkRUVdjQkjqBjWIaKiDIc4y1ZEA5EH6fWEeu6VqlbO5VMjjfeuWK8GAd+zYwY1xxTBTKMOdtQKVIEMbe4uZJFz+/RtuRJnaRtVAyb1OUEqTyhJxqzlKemyYfriCwVBqzrPvx/Qwc2Qk6w2dY+0avQEKaGUxuEM4HOasQCAWZgrwgBZS2KOdb2JyzSAUy9KoybQxJlqGN9hlIxnrlmPBh8QbXJVKl8nYq4/kyFA4h8cRS05HlkBqHdBA6R+CEZ7lVQJhpVFUiRJm80WawN+LpvRPMGoPJBH2VkEaiOTw5h8USlCEoK3JtsRk44+ipKsrC0TSG5Stj4t6AI5NNCBSBcKxWZVrKYZvQmGmRJQn7heWyoIfRpkHnFh1HWJsRBIJSKaCvr4TAkVrfcDc9nTIz3SYGSkKQ5RZKimU9ITIQ1NOcRsvSMxTTM1ZlciohKgXkucMaTZY7GsIhjaOWaoaqMdMtR11YZqTj2YZheiKHehHgXQlQJYWMFTIMkMU+ENZ2/Z+5hZZ1hFYQ5A6VW3pDy0EtaKWaNIeBSsATRzO09XV2AkldW44aiRUOIV1BRDokxT48j/M4RxBCLHpKfCJcfvnlVKtVjh49yq5du171Mo0xPPbYY2zatOmEhNGGDRv48Y9/zPT09EnnsW/fPv71X/+VD3/4wyxZsuRVj+lcYnBwkE2bNjE8PMzDDz98wgyLn2QsWbKELVu28OCDD2KtJQxDbrnlFp5//nmeffbZ004fxzE33HDDOSE5rbU8+uijp7ScnStMT0+zdetWhoaGOHr0KJ/73Ode6yGdxzlElmXs2bOne0M5PT3N5z//ef7pn/6pS7Q2Gg0+//nPo5TiN37jN6jValSrVW677TY2btzIV77yFbZu3UqWZZTLZaIo6qobjTFMTk6yc+dOdu3axcTEBBMTEyRJctyNqFKKkZGR0+bRnQjH2nCOHj3Knj17KJVKjIyMLCLFXg6CIHhF43ktsGzZMjZu3Mh9992HUoqLLrqIL3zhC7zzne887TqcJ4w9wjBcpDI2xrwuspump6d54IEH2LhxI2vWrMEYw5EjR3jqqad48skn2bZtG3v37qWvr49bb72Vnp6eExaWhGHIpZdeyt13302SJDQaDZYsWcLOnTsXZZM1Go0TFoScC5x1wqgnVvNZNIhCp9Mhf4o8os6NsFhAFslOhpEsAq5FVz3Tsaq5DnFERwwiFj2v90ty3RBs4xzKeNJIFnk3zs4rhzotWAIIZOc+UXTH7xyFQql4ny1anlznNcVTS9fzjpnnKGcNtq2+lkdXbSQTkkDMK4JyGfHwyqtJShWuOfAD4tYsPYOCTQNttlR2oeRh7GRCWm9h0MgSlEsSXWTU2CDC9ZZp9gywp7yUp+USnkz6mLARnWdiK8ws75l5jLJpoHNN7BwRrpt5EwkJWtCa0UgLsTTeViUFaf9SxmUPAwfrVHJDwyjScoSUYNIMvaeOnGwhZhNcbsB5NYdQAhlIgmrA2Np+VOSVLzo3JNoQ5BoVR7RKNVRQx6YZUjviQm2ijSdCkCCszxUShctQFvtDSUgkZFLgjMAZixSepNIWjAQVSK8uKhLOO0Rfq6WRzvljR8znQSmK3yU46ROvlE7pmTxIVu1jeM/TjB56hv65g7gs9weBEwhtMcLhpPCNWc5hitYvIwR5IMEKRO5lUg5wxiCMJ4xCJYhNCIEhyTNMkYMTKEHoilws6XDGEYUBYQQO61vdjMVYTzooBUSeXOsGY1OEeTuBswITCRrOMlASOBWw4/k5lDEM9AYcamnCnoC07egZLTPTzGhlmkQasBBECiuct5c6R5A76hiCiiBSjtmJFJcJ4mpEbBQ9JqA/tAijyQ80CKVj30CMSgQlqZhtJgzHjrAkiUNFf29MtRSiWxm5NszOZkxMNomkIFISZbxKajBWhJFgLs2ZbRqqfRFja/op9fWAm8MahwKazpG1DZl21AOH0IZKI6GnFEAa8Hyq2Z5ahi0MxhIZK0RJIkOFkLIgiYoPu/NnB41vQmtb6Hfe5ii0pSewGCvYW8/ZPBYy43wGWKft0QD9IZT6Sjx1QBf2Sr8fHRJ3bK3jefzE4uDBg2RZtqhB6vUGKSUbNmzgoosuot1uc9ddd/Hiiy++6vm2Wi3uu+8+rrvuOkZGRhZd5A0PD3PNNdfw7W9/+5TzmJmZ4b777uOjH/3oaUmv1wsuv/xybrnlFg4cOMA3vvGNV9wU9lpfFL8aKKXYsmULQ0NDtNttent7WbduHUopXnjhhVMqeaIo4j3vec9Zabp7vePo0aNs3br1tR7GebxG0Frz1a9+ldtvv52hoSG+/OUv81d/9VfHKdeazSb/7//9P2ZnZ/md3/md7vl12bJl/NZv/RZZli1SZHSIlg6Ro7Wm0WgwMTHBzp07ueeee3jggQfYv39/t/p948aN/Mqv/Er3u+tUgczHYvv27Rw+fJibbroJ5xz79u3jgQceoF6vc9lll3HrrbfS29t73PxOhIV/7yiLOkqjU2X/vNbo7e1l8+bNPPPMM/zCL/wC733ve9mwYcNLJrxeKmn0elz3l4MTWfI66KjTOo2qs7Oz9PX1vazG2bOBqakp/u3f/q1rNc+yjP379/PEE0/wwgsvEIYhK1asYNOmTWzYsIF6vU6apsdZMoUQrFq1CqUUxhiuvPJKDh06dFyQ/dDQECMjIzzwwAPnfF3POmFUjYP5yOYF+7Tgfbrh1h3Cp9uQ1rGciflw7HlyaIHaaNGMO//OGz06kdsOrywKJEhpybWXZxgKq5qPuen+f97+5or4JNG1uNmu3a1Tbj+fo/TiwFIeGb2UK3Y9yqyMMFL5daQTjO2bkzIV8L9jlzFRHebGgw9xXTTByPAAtq5JDh5BtxJqgxFhNUQWshLTo2hOZkQVRWl9L862WN9+hlvSHUxU+nlaLWNbPsqPs3422klWR21yLQicIzI+zDfRjjBQBEoSSUHuLKHWyEhSFqAChewd5sG+G5gcf4Irkh0kYYCJqsT1lMqeCYLZNtYYcnwuUBhK4kpAZaxKdbRK3mxT7g3JMq86yo0njYK8RSUowchqTDZNNrWfcq4JVSdbSmCUIML4evtCjdFpoAOBxmEz4+1feEIvjhRGW4zw7Vp5qskDgQyEb6OiCCHObDc4WoiCTBLdgwqhKPxxILWh79Auhsf3Utr/DEIajBI4bZAOtHAoBc56a2JmLVqAUZ70zIRCaIHBeqVU5nDWoZxXewkcRghEbMC/CxF4gkxoT85IC0iJc4ZKJIkLZVWWe5JCUARexwKjHM4VTYG2o6AqtlooSICeyH+ODh5O0NZb+A7NJRgFtcShE4dYCZNTDTJjaAuDakvIjFdzSUFPENAyhnJZgIW5GYNTAu0ceZpT6Q1Rc5YyllKkCKViqRCsy2BmaYVsLiOcyajkglJVUo1DBvurhFJRb2UkrZTZyQSbG6JyAKHiyEyOCCTlimKykTLRtvT1hgyvqBDFIUGoGB7t9eSytrjMk3I53uJYD8BpS9DKCYxjaRRwYbOFzC0qFIjAE9Qo6be/MUgcMtcIB8ZZUheQG8tUKKjis6msdfQWqkTjBI+P5zR0hjH+rCAtWGPZPe0I05w8NZ5+dp22RsNLuAY4j58QHDhwgJ07d542wPm1xIoVK1i9ejUA5XKZgYGBM0IYpWnKtm3b2LNnDx/84AcZGxtbtA02bNjAY489dkqVEXil0datW9myZcvrOrtBKcXGjRuZmprirrvuYnx8/BVblNatW/eGzzBSSnHZZZcteu3KK6/EGLMouH0h4jjmtttuO2VL3hsdWmumpqaOI1HP4zwAfvCDH/DNb36TT33qU8zOzp7wHKKUIk1TvvjFL7Jjxw4++9nPcsMNN3TzbTqhwMdadjqKnyAIiOOY4eFhLrnkEm677TYOHz7M9u3b+da3vsX3v/99fvqnf5ply5a9onV44YUX+PVf/3X+6I/+iA996EPdTKPly5dzww03LGq4OpYUOdVnQimF1ppt27bR19fX/V5dGAB9unmcKwRBwLve9S6uvvpqfuZnfuY4ZczC8Z7Mqnc6vB7W82xiIUmplGJ8fByl1DnJYzzZWJxzrFq1ir/5m79hbGysG2xdqVSo1WpccsklDA0NIaXkyiuvZGBggL1791Kr1VBKdR8gdriPSy+9lFKpRLPZ5IknnjhhDtkLL7zQJVjPNc46YVSKZJET07nl79jKvKpj/nfRtZF1FEQL7WdSdP5eqIZEJ9PoGEsaXjrS/Zh1PkQObDFPg8Q4i3Q+1LqYI8b5jJzC6bSoVa2jUDIdO9uCbB2Y/78WkkP9o1yIIGw3C0vR/HrOT+OVS7PVfuKVK6jpNsl4CykNutFAxgFhxasd8pbBKcX0nKZVd/RVDNFUGzVWhloFJQRLm5oljed5e7ibIz0D6MyhwpA4V2TjDVotTWrAGocJQcaKUMHKkZCBkqBhPXEUyYilMiGLKjyy/HrskYh1Rx+jkhgG908Q5Tlt59ACH+JcVtRW9tK3so+oFCActJWg1UgRkcJJiQoDRO5wOqUkJFU0h8YuoTQ7BXmTKPDEkwgglhJjPIWiCnWHfxIicNaR4LAGAuUY7AtothwiLCRG1s8nzy2NOShXlSeBCmZRIrwSqgguEgKE9EISIT1J6bx0DSkdfRMvYpOUxGoQXn0limUEUmAsKO1/194PiCsOMuMcmREILdBth81NN7RaKgiVJylSZzAmx0lQygdskztvwXRe7SSED28ulSXNtiPPLa3U0c78ZyjS/gRmsd6qZudD3IWAthPE0tFbCZhoWgyCNDE0taFlLeVIMloSNLBMzyU02zlG+yB3Zxy5drRwtFJDWwuySDCYOSLhq+1V2ZErQbmimM1ztNEMxDHVSFAOFYEU9BrHc7uP0tcwLHUxfcJRi2Cot0Rvf5W83iZJcmxmsG3NQE8I0tFWGhsKlveGtPOcybYh7glYsjKmXFYIq8nnGuTWEcYwsqRKf1nRnEqZm9M0M0OeapIAgtyRNHMON3IqqUWrjt2VghwWCK19m58/GSC0JZESLcA6QRYq2s5RxoB1xIVaMcUypemqGcHb96wUHMgFon6MsqA4IZzni948sNby2GOPnZE6+3K5zNjYGPV6nVWrVjE4OHjcsp599tluEGKnSeNUqFQq3Urfs4XJyUm+9rWvceeddzI2NtZ9vVqtcs011/Cd73znlBfJ1loeeugh1q5de0ZyfTohssYYhBAMDAy8pKe+p7pI7e3tZcWKFezdu5ejR4++onF1xjI6Osp73/veU+aEvFEhpeTqq69m5cqV/PCHP+Txxx/v7vsoirjtttu44oorzmkuxeHDh2k0GudkecYYHnjgAR5//HFuv/32RSoqY8wZIWrP440NrTVPP/00QgiWLl3aJRY6CiHnXPfcZYxh27ZtHDx48ITzOllGzrFEUhAErFixghUrVnDLLbdw5MgRtNav2I62bt06kiThM5/5DBMTE3zyk5/kHe94BxdddNFx59FjSZ6T5dIs3A7VapV7772XCy+8kFKp1N02ryd0ih86JN2xOJbkOt34f9LJoZOhs42CIOCiiy56XVgSwzBk9erV3c+jUgopJb29vaxZs4Y8z1m6dCnLly+nUql0g66VUkxPT1Or1bqk7pIlS4jjmGazedKHZwcOHODAgQPnbP0W4hyEXks6ycyyE9K8QBDUUQ11VEgd8kd239e5sRfMT1bMUOCVIm7BCYZ5IoqFFrjiFStcN0hbSoGy3oZknZ+uk2VkXRGG3bGiFTk4/j5y4Qe7M/7538dLvdRLNaaGlzESGcbClKptgrNo7TDGKxJGSXlH+zmW1ffRCFKC2KHqGTmFDaepIQjQFpK2JmkajAYlJKKR4oZKiIEIeitQihDaEWrD8mYKcy3IKth6BpMhSZaTN0BZQWYtjUwTxzA6GBAYQ+ggTQWRNIzYlBKWGRWzbewqlrg6a599DIwni6yAOJRklQjecgGDyyWqkE1oY5BxSDbTQgUSp/y2l5FCpoJS1qbPzPHswHXMXPLTDE4fZO3U00hSwuJgaFtJiiB2BuF8CLY2jtyCEV5FU6kookhgjCA1hkA6bO4zr2zmSPFy27gaoEJvcwxDQZ4KpHJd1ZE/AJ23o6kOkwnCGnSm0cb41rXCjpU6rxDDQWIEYUFoOlHYlKTACk8kaWEgF+TGB1gL6XBKEpYkJenJu6N5hsNRqYQLyEQ/PmMtbW0JhCMKBK2GZmY2p5ka6trRND63yWWglPTZTbiCNPLHsJae6FxSVczkDiElLjW0M68Q00BJeQLJ4piqt0kyjTEWq/3fm8bS0Ia2c7Qc1GohOnWgIapAUPM5ZXNtOLCnxWCoGHWS4VJELZQo4egvh4gZA+0E57yQqyQDBvrLKCGoNxLyLEc4y7I1FYyxOGOZmtT0VCWRhAONHFENWb48Jq6GiEj5fasUykAQWlw5RA73MHKBJZ/VTBzN2b/7KDbNsYHf5n3WoUPBUawnCH2IGhgNFIHWmUZor2JrO4mzkGSWpoMkkgTKHw+BcUjbUXyJ7vnCdc5U0mK7pFRXa+nPZ9IV5OV5vFlw+PBhJicnGRkZecXzUEqxefNmNm/e3JU/O+eIoohVq1Z1L5g3b94MwNzcHNu2bePIkSPs27fvpE+pb7jhBtavX7/o9csvv5wdO3Z0rQlnApOTk9x///188IMfXNQSsmHDBn70ox8xMTFxyuk72RuvhjCy1mKM4bnnnuPuu+8myzKklLzjHe9g8+bNp70QvfHGG5mZmWHfvn3da4HONiyVSjz44IOLQp5fLrZs2cL1119PGIavawvjq4WUkrGxMd7znvdwxRVXdLMdyuUyy5cvP6c3Rs1mk2984xtn9Fg/Gebm5njkkUfYunUr1lq+8Y1vcMcdd7Bq1SoajQZbt27lf//3f8/6OM7j9Y8dO3YwNzfHjh07WLt2LRdccAErVqzAGEOe5wRBQKvVYnR0lE984hNcc801x5FDp1LbnMpWFkURK1euPOn7T4Rj1T2Dg4PUajX27t3LX/zFXzAyMsInPvGJRQrRTsvT888/z7p1615yVXqnTODb3/42zWaTjRs3cuutt55Rm9KrVSp1tseJFLELt1UnN+2ltEG+3lvhzjaEEK+Jsuh06OyXWq3G+vXrmZqaIooi1q5dS7VaRWvNzMwMAwMDCCFoNBpEUUS5XO4qk3p6epiamnqtV+WEOCc9pV2iR8wHXnfVQcUfO6HWuOMVR13LWneG8+RRh1DqnObcgtfBdTNw6JBAdp4E6sxbCkEwX4qFFsK3GXXJgW7KERKQwvn8EcAVC5h3GTrqcZX9S9YxuGqQt/bWCXWbRmrotS2GmWHETdEj5lDtDD3VJA8MmTZkUymqaXFOgLS0lSAsgcwdM1MJuQoJnSQUEjebwuEmIg4hNiC1Z9kihYgqMFKDJEUenWO4N6Z8ZI7KrhlmxhOaDUsz0VRiQSyBxBIEvlErcxqpc2JnEQjaMqKdlJHWkjoQShDGAc3+EroWcLC0nJJpM6wnmDs4RzKT0LuyhiyHJPUEVY08GRgowjhCpgl9tAgFHLjwKmxzNeKx3UQuRwrIdPHUxELTSiIs2nibVab8jg4kVCveCiaUJEssrdQSCkkplCgJWjvSxOHQlKrKEypliW1qv5+lwEoWKdUsdMmfJDeFbRECAZXieJEIciSt8iATb7kGE0eEjRlUUkelLQKjUViU89lKgUhRrSmfW2QdUhiUjzYC42gD0klULrA42tqQaIsRkBhH0xr6pKBZzxC5xhQ2QFX85A4S68itAS3oDQTVADrJ3m0pGY4liVI0WxplDc2WJnMWIwUXDJWpOkMj1RgJTZtiQ0He9llJqYXE2m5IfOKgP5bMJpZKj6I2HKFCQauVs3tfmyyxzJUcA0mLFRVFUAoolRShMCyrSUwWcGA6JwRiKSiXI1pHZ6nPNjGZ3zelksA5SWsWdN1RT3OmhENHilX9AZFzpI0UJQWhkqhYonoiVBR5UqYU41qaPJ1ACg1KkbicxDmmcTRdkeUVCJz0bWVYh7AWKRxBrpHWt+olSmEEuNygjcVIQIt5RZhzyCILzXakjQUvJABn/TnBiIKRxs6rmhae087jTYGO4ueVQkrJ29/+dm644QaMMXznO99h+/bt3QvSG2+8keuuu25RDfng4CA33XQT1lrGx8fZunXrceqFTZs2nZAoWb16NT/3cz/HPffcc1q72MvB3r17SZJkkR2hp6eHm2++mX//938/7fTPP/88GzZseFnLbLVaZFlGmqY8+uijvPjii9Tr9e6FujGG+++/v/s0+FSkUW9vLx/5yEfYsWNH9+JuYGAApRT33nvvqyKLAB599FGefvppRkZGuOWWW7oXmD+pCIKACy+88DUdQyfL5Vxgz549PPLII93fW60Wd911F9VqlSzLztk4zuP1j8OHD7Nz505arRY333wzAwMD3eyWSy+9lGuuuYZSqYRSahHZcKLzxenIj1NNczqczEYVhmFXtTo3N8fExMSi5eR5zuzsLEmS8NWvfpWbbrqJm2666SUTU7VajUqlwp/92Z+xYcMG3vnOd54VMuHVEEcn266dnyNHjvDP//zPzMzMcMkllzA2NkZ/fz9xHBMEQXf79fX1sXz58teFsua1wuvpe/DYbKmOgqxWq5EkCUEQsHz5cnp6ehBCMD4+TqPRYMWKFYA/9jsZfkIIwjCkWq2+JuvyUnDWCSNdBAJ1iBmvHPJWmQ45BPMEEvh7vq4SScw/mC/a1+kUDc0zRW7hfVpBGtnuk37n5nNDtPVkRKftTBQCAwprmpTeYqKsb0UyVnQ/1IYi3NqJRcSULYilDhE1F1aZXHMx+3QZ0WhwcTzHqNWIuFK/+gAAIABJREFU6RZBfZw4P0JQcsTVgHwoYHoyZ2YqRbYN7akMFUqqNUHbZcjJHJda6rlBlx2rBnoIlESWIogCmMtAJjAS+vTmqNiAWQ6VEmJYIkoJPXFAta/EcNMw/txRynNeYno0l1TzjGogqArJbEuTWk3gLCGOkbTO+qM7EM4RhBITKpr9ZXQsINeY+hzbshGu2PkE6WSLeDhGRQOISJHU22Sp9gyPABlKgiigpDPKJilawASlWBIZ38SV5wajfTB5ZiEVvr7dAC6U2LahVJU4AaZoh8uAuraUAkkFT2o5oVDWIQOJTi0STamsyCNZpEHjCQMhcMorcjrHlHGO1PjfLVDG19lbB0IFtIZWcWTjO2ksWYmVEmHxzICzvmnPOYSzlFpzjD3zCIONGSQK6RwCi9Y+ZMg5Ry4FylpSbWhrw1yuaaeGSPrAZIE/3toaKpFAalAOQuHH1M4tmYPcOSIH2gp0FCAUGKXImzk6Cqg3HaZlSHNLYiHBHy4la8iNIS/C39Msx4iQxFoc3qIp8RY5hSN3jum2wThHpSyoVgVzdc3sZI7LvWrPZLBPaybnUkYqAWUZ+DpIMpYMKFJjMQlEgcQmOXNzTbJcg7EIJcBahHWkLUcj1YjAN4yNDChcmtM8kFHpU5QDieyrQG8JMdwH5TKumeHqCdOHZ5gcn0PXE6w1TGlLHgjaJcHhhlcvqUChBAUp7BvRlDaeLJICoyCXAozDGle01fmDwiSWIJQEeGXZgjI1YGHqlocnjgpzqrNFMprgfOb1mw+v9GawVqtx7bXXsnnzZpRS7Nmzp0sWwXyFfbVaPaGVR0rJkiVLeN/73ndcC1QYhietvF+7di0f/ehH+Zd/+Zczqr440Y3IsmXLGBgYOC05dbIL8L179/LYY4/hnOPKK69k3bp1gFc1ff3rX+9W0Z6sBauzDYHTkkblcpmrrrqqu+ynnnqKu++++1XXqYPPfErTlKmpKfbv38//Z+/NY+046/v/17PMzFnufr3vNjYmcYAkNAFa4xAUsfyAUCJCkSgSFRVFrWjUqqgLCDWlqFHVSq3Uov6B+gdf2tIWpCiENiFsWTAJZCNhcUhw4ti5tq+Xu5x7zmzP8vvjmTn3Xu9JbMemfivOvWfOnJm5M8/znHne8/683zfeeCNbtmy5oG6WL+HsoG5jZVkyNTV1wZXTXMIriyNHjnDvvfcyPT3N8uXLWbZsGRAeBKxYsYJWq3VcGfHZHCde7racc2itUUqxefNmbr755n6b996T5znee8bHx9m6dSsPPfQQ119/fZ/8Op2aJooili1b1lcnnolC53Q4VR88G+qeevvOOZ588kk+85nP8K1vfYuiKPoEm9a6721Tf3f/9V//9Um9pI4lLi7hlYEQAq01rVaL1atX9426ISQfrlmzpk9odjqdRQSRlPKCDvQ454RRaX1lIROMhmXFEgW1EX3GKBSPzSuQavpnXl3kq23M/06ltlgIXz3lD0RRxeIu+L2OIw9eRCwoN6PPWqn+PWJV4uRCGRp9omoxOSU8fSWTA6yOaA3HHOpqpInZ/tzPaDy3h0Q7RsYV0yommzMUU54D0yWxUiQiYspDMpQgrKHrJU5pEikp5no4IM0NOvLohocEBAZQEEmwFuIEVASJgrIMLEuiQbZColu3pDkUsfa1Kxk+2mNy3zRTqeWIj2l0HC3hmEtLRJLx/3UfZkY1GEtnWSmmEAOaVCtyW9JKSnwjAjR639PomV3YrEfpPWNrhnBK4KwnGm6RTnfxaISUoARRoogKy0jZIfKejd0JhnWBd8GbpywcpXGYiiRyPpTwGQ8itVjnGWkI8jKQQRbQSjKcKKKGmi8xQ2BwOCsYG29S9Ary1JJLSZ4btAt+RFEkiBMNxoXEKgGFrdREldItqUUoUcLsxqvY97rtpO1hat0Z0hPyuXS//bWLDsufeYjBF3aReEOsBVEkKZGBPagYBuscWV6QFoJcQLdwdI0lEQKlgsl1syHRSYJQBnyJjgROeJSzSCFIhKdReTRJJel5gbOQ5QYtJZ3C4+cM0kBDKZQWJAAqqGpKERLm8J6iNIjKFL0oXZUiSJ+wFULQ6QZF2u5Zx1FbMGQd01OOOBb0XPB2OuQcj0/nrB+KGU0kcVORekmiHEtGNNPTjjhW5L0UUxqk81SRiXjn8C6op2IpccozPKpptQErEIWELkROokcHESODMNDCZyV+NiU7OsfUbMrMXI7LQqpdE0GaW4YHFKOjiv0z0KnK0YQAUVq0cUg8RkqslhgvcIUL45FSuFiRxqHc0FrwLnhiRXjC2V+MxZQR1bhU3ygE9eOlkrT/e3jqqaeOK/06HYQQvOtd72Lt2rVkWUaz2cQ5d9yNrTGGH/7wh1x++eUnvXF+sTclQgiWLFnCVVddxc6dO8/KhDbLMh588MFFEwMIXkZXXXVVn7Q5EaSUXHHFFYuWGWO49957eeSRR/pJZLt37+Z973sfy5cv7xtPnwmstTz88MP82q/92hmXg+3atYuvf/3rL1tZdCJ0u11uv/12fvM3f/MSaXQOUROyO3fuPC6Z5lxACMG1117bJx0hKI3uvPPOC7Yk4RLOP44cOcLjjz/OD3/4QzZt2sQtt9zCxo0b+4TCiXAq4+TzPX6MjY3xt3/7t0xNTbFx40Y2bNiw6P1Go9F/YPHBD34QY8yLIn2klKxdu5Yoil6WuuhMvtfOhqH2QvLg9ttv5y//8i956qmnFi0/9ntk/fr13HbbbbztbW9bRLZd+i545bHQaL1+3Wg0aLVafY+xuk2vX78ercMD9N27d/Nv//Zv/MEf/EF/W1LKc+oh+XJx7hVGVWJQUBgFskguInqO1QbNOw7NXwD6P+tJKws6iq+2GTbhK2VErQYKpENNGPXT0HxNBM0fa00s1SVmvp4p9wmscHTOzyuafEU21WSRQ1Ai2FO0MF6wSqboA1O4okANSHwrZuZQxux0wf6ZkjmvWDoUM5QoJqZSIuNZ1pQsXdNi+balDMxZDu/2pKnD9Awu8ogmoMErD84g5ubAFZAnkMSgNcQRtBtVbLdBDDTBeMTRLsrD8Ggbbz0TB2YR3tObLWmPtVi+vE1nJmP9xCPY0jIQCXTDoRtN2g2NzHuY4Sa5Fczu6TJ3MMMrRUMrtLTIwbgqIfO4WCNbDUxeQCRCyZeWxJFlzf4nwTje1P0pkTB0jQ9EUeXv5JQALShTQ1mGcighPK1mGCwLE864qxJ5ldYIqXFSkcuYXERkIqZoDNDJOtipA8zNldVE3ROJIHyKpSeKPFEiUJrgX2UcqiIkJZX3ltRMb72W51+3gzRu9q+9EIQSwgUtxAuP8ZJUtkhGV1P2ZmiUHdotSyqgyASUEuEdkfd0q0ZYAtY6LJB7F0qfhEC3JKKhaCYJpCllt8BhaUaBpMhsUGQ5D9I7XOlJHZRKIJVACQUaYuHRKsjpjIck8YjY0UtNSJzzAuc8tihoSEEkBCmS0ge1nhKgIsms9wwrWD4kyQvHvo5D2JC+Z3KHF1AgeKxneNXRnJFEMqgcqkqtSyJPO5FEKqi5XOXSLVXIEdRa4jwkg2CmBHEiGGqH/hsVgobSDLUaRHETMouf6sJcjslKep2CzmxK2isogkQQU3X0pVpytGcZGNIsbUvKLJB0wjhU7vA6KIqsqIzXSxt8qRoJpvQ8F3t6sUKaMnxJWI+Scn5Moj9oVO1BLBrVfK2WpL8QcRzNdAmXcDyWLFnCww8/zJ133tn32hkeHj7hummannWVghCC6667Dmstzz33HIcPHz5lHPrp4L3nBz/4AUII3vrWty7yMqqNp082aV+3bh0bN248blvf//73F/3daZpyxx13sGrVqjMmi14qnn322VOSRdZannjiCV544QW891x99dUvyoMpTVO++c1vsmHDhl9JT6MTtdfzPRlSSnHdddcxNjbW9/w6mRLt5UJKyTXXXMMNN9ywaILgvecDH/gAX/3qVy+RRpcABAJh165dTE5OsmPHDtasWXNGk8qFfepkBNK56GPHbrPZbPLe9773pOsvTAxbWKJ8ppBS8uEPfxiAD3/4wycl0l7Md2Ltceec6xM4MzMzzM3NsXbtWkZHR1/0cS6EtZYvf/nLfPrTn+bgwYOnXb8sSyYnJ3niiSdYt24d4+PjxHF8HFFxCa886hQ3qDgH5/rLpJQIIej1etx666185zvf4fd///cX+Vz9n1YY9UrXVyeEnzUBExCIlyqRCQiUSyCAxAKzo5ojEpXqh6qkjKrUbWFf8RUZZFlACnlw+D6RdGzS2TwdVL3ytVKlUiExX5rmKqVAvd06Xc3XZsVe8It8gFh4XjPeY91bl3Dw+7PkhWVif8ozL2R05wy91CGAvFcwOpTQHmrRnUlJWxHJ8gG8lsQtDSgwnkgqfFrStSmiU6DHYvRwjFQekUhE6sAZGGiBdfgMyj3TiG6JXjWCWD4OQ22Y6VEc7DA52WFoSZtWI6KZxMRaYzJDHMfEcURvLsemJb20xE7N0hqIYCSC0pM+N0d6KKfwHnRCe6SB8j1MaYkihQsnCdWMQ4pYXuBEiJyXStI4uIffKCYZGdB0jSXNLHnhMD4kS7nK9dwJQemDGblvNBhvO4yxlA5cEI9QqpgDW7czN7yMMmmSxy3yKMFKRfOXP2XwkXuQeY5CoPHEQqCEJ5Kh3TjrSHuQtBVai0COKHBWoKo2ZqWgMCUq7SJ00lem+KptOuZVZkJA2Whz4PXXcchZGmmXy3/2PdqzuwBPFIHWkqLrSQrXV19pCZGF1oCjNx3aVKsp0SOaGWVoxRrlYmTuSJxDS0ESgUwdqQfjPUkiSdoJk4WlITzGCvRAk1SUZFlBJBXGObx3LF0ak2Y5pgeFC+Wi2guM9bSaCmkF1lm09yjvg/LOOvCeK9e2aCQCZxwH2p7nJ0NZXG6hzEOfnxFw11TKeAzrTER7UGC1CAl+mQUsxYCkN13gcksSadqDmsHxOCj1ioLJAc1QYlECBnTMiG4xV3i8lngf09k/C9MC3WrQKyzd3DE3m5JlBWVhEKXrqwwjKRhBUhaeRiRppYbShg7uhMcISWk8xlms9URCoGOFLT2HC8t0O0JXQ0OkBLbwFIXHuMAE+QVyR+9B4ZBChvJXEchH19cdVUrLCzcZ/BIuECxdupRms8nu3bv7y+6++262bNlyXo8jiiLe/va345zj8ccf5zvf+U6/DACCymfh6xUrVnDDDTcwNTXF3XfffRzB5L1n586dDA8PLzJqveyyyzh06BAPPPDAcaTRqlWruPHGGxcZiHa73X4Z2rHo9Xo888wzL/pvraNwzxQnMjRdCCkl27ZtY+/evTz22GMMDAywcuXKF7WPhef2Yob3nqIoeOGFF/rlme12m507d/YJmte97nVcffXV592rQ2vNlVdeyetf/3oefPBB7rnnnnOyn7GxMTZs2HDCUqKVK1fykY98hE6nc072fQkXF6y1PPbYYzQaDd75zneilDqpuuREpJC1ljzP+0bQx5pcn2+i4UQJaMeOn8ce1+nS0jZt2sSnP/3pMx4vvPekaUqSJMftO89z/vEf/5FHHnmk7yfW6XSYnp7mYx/7GLfccsuL+ntPtv9ms8maNWuYmpo6rTJ1YmKCP/zDP2RoaIh169Zx66238va3v72/rf8LZNGFXHJ3MtVZXZ5WE0U17r33Xu644w6iKMJau6hE8WQP4pRSKKXOiYr5THHOCaNuEW5yREX81GU+tWqnr+oJL/veRfX6x6qLguG16L9f+yMpRDA3qgkcN68mcgs8jLwPahXr5+PuFzTDeTNa0T+kcJwVoeUrIspXpBO+JpSqCaMIKo+xfIarlhe8tvkstsgYXNrkmcePsrtT0LOew7nDWo9yniXaU9iC7oEUKQVHZkH/fJqZ3R0OeYGdy9FxjLMFZaawSqOjGLQizw1+qkuUFuhWjJQC5jJEpCC3TH17N1HHMLSsjdq0BLF+KX7VGL39c+AgMhZdSkzWDQqfwpLnBTK3NIWjNRJjhlrse+YwvcIxsSclkjm+GxKlnBDISOIbknJwJZm1uLkM2Ygqcs4hYh1OfmERUpAkilUrm4xoRWkteWopyyoS3gtKoDQOl1ny0uOFJF/zKvJl69ATP8SUKcaDweOdwCjJwRWbOLRkXTCtJjSqZP8e9I/vo8i6REAkPFpArEKpk1bB70iIQDyZ3JFZSW4DOVIIQc97VihBS3nWP/8449MTHNzwWibXbSNtDuEXlieK+XbkAKdjDOCkRruiKpcT9buIWJAWgUATlaLKtS2ldTgf1EFxAgWejvI0bMmAFzQiiVQapUAUlm7hUBYirVm1bIyoNUDvyEHKMpy/vLBkZVkRW8GLa6ApkVlOnhkQAivDORfWkwuBF462UkhT3WBUciojPA0pKHKHBNqDEUOmZLAt2XfE0IglWUFIk/Owq7D8YDpH4Rk2EhUrio5jwHmkFBSHe3jriNqK0ns6UzkjTUnSkowOaQbnHJ1Zw1hLs3JolHLOkaZdcm9xbU3PdrExRIM5PopIS0eeG8rc4G0oqbPWo2uiUnuEcRQKkkpd5KwjhZBmV7HQsRZoD670zOQFEwMxVoQExVIE0to6QZ57ypq8rmthq7Z2mRO0peBJIUirL3W1oI0sTE27hEs4EWqy6Pnnn1+03BjDz3/+8+PWF0KwcePG0xIYLxX1k7KrrrqKLVu2LLqJ27dvH/feey/OOdrtNjfeeCPj4+M89dRTJyU7vPfcf//9rFu3juXLlwPhxmjHjh1AMH+uS8xWrlzJBz7wgeOe7hpjXpaR+LHYsGEDN95444sqi7j22mvZs2cP+/fvP+H7QgjiOOad73xnnyhrtVpcc801ZzzJWbly5Tm7rucL3nv27NnDnXfeyczMTP/mOIqiRWqeAwcOkCQJr33ta8/7MdaT6te+9rXs3LmTbrd71vexcuXKU+5/dHT0ZasYLuFXA0II1q9fz/ve9z7e8573nFJheCLSfGEAwkLC6Hx5ZZ3J5P5Ex/Tss88yNDTE+Ph4/71TkUb1OHoqQ+96+48++iiPPfYYH/rQh45TNTnnuOeee/j2t7+96LPveMc7+J3f+R3iOH7ZhIXWmt/6rd/iLW95C//5n//Jv/7rv7Jr165TXpNut0u32+Xo0aMXZELY2cRC8uVE5+TlJtedK5zMBHvh63379vE3f/M3zM7O0m63OXLkSP/9PM+ZmZk5brtJkvDJT36SNWvWcOutt57VAJIXg3OvMDKuPyWqgqePIX1qn6FA3fQJIxY0hgWvRd/nKPzuFqiOanXQQgVR/a/vZcSiqpE+/Pyu+iqR+fmc728DHybctfcR1CVpok9ASQQtUfKGzsNMznQZa1kOTWTMlNCOFL5paUjozEGiBEuGI8bHEw7v7dHrOWTPkO3tULQjioEEa8GkPVqRR/YMakTSXD4CYxH59DRpluN6OXIamlrR0uELwnRyXNqj8JJep6D1wlHUdAf/iybpoQ4yLZnLCooomA9LISkKR16nVUWSwYEGndSigW7hyXoOo0JyWGkchRTEIwI30uSRldexyk9x5dGHUKZgbiYjL0rioQZRK0ZqkA4iBa2BBGeh18vIc4txwbOo8JBVqpDSVaVTjYjelqtpmgxMgXEeIwSFq6+nR5Z5UPxUFzCe3MfA9+9EdacqtdoCFZkArQVRJJA6+ASVxnMk99jcIn0oV8vxHLWeloJNSiCVZ6w8zPI9P+Bw5wWe3vQmjo6twgoVUs/6jakeOMALT2QKdDaDlwLpPFYIShM8hqwHqUAmAt+U9CJHeTA0pCQJJVqduYJoUKAdtLxktK0pCkeaW7Lc4ZwAJVi3YgkD7UEmOz2kEERK4UzB7EyKqWsnq5SuQe8onMcgKKyjW4ZUsLwUlLEnaTiskQgj+syqHpY0I0hTx+6JnFXLI3Jh+Mm+Euc9mfEY70grUgogBX6UWra2PaQe1bEMSE8USbQU2NKhmgIXh/I6WQrKjgEnSJoRK0c1h71Cl4rJiVnStEAIRxJFlL2CXlliE48WAq8tTkqKvKTMDa50SOsrYlAjI4W0Jd5J0tRhbfDakt6jYomQsm9cLYzDlp7p3PDLdsScqozWgVQGgloJ6DgoxELT/aBSXIZka+GY7eWoAY2UohqnRB1gF/Z1fu7ZLuEigxCCrVu3snnzZu68885TrltPBuI45vWvfz1vfetbz7kyQ0rJ0NDQomVDQ0Ns3boVWHyjZIw55Y1w/fS2Joxgvjxo27Zt/RuoZcuWHbdPgOeee+6slQ6Nj49z0003MTg4+KI+NzIyws0338x///d/n5Q0gnCNduzYwU9/+lPuuecesizj2muvPW2M9NDQENu3b7+oCaOaLPra1752nPH7sdevLEv279//ihBGNZIkYXR0lF6vd8mI+hJeMXjvWbduHX/6p3/K0NDQGU2WrbV9VUNNVh+LC2WyfexxeO+ZnZ3lj/7oj3j1q1/NX/3VX5EkyXFeMafaxqmQZRlf/epXGRsbO+G4G0XRou+imiz6p3/6J5YsWfIi/rIToz5WKSWrV6/mlltu4brrruPzn/88d99992kffoyMjLB+/fpF2/pVxcU47i4kjY71m5qenuazn/0sDz74IBAU0M8991w/oTbP8xMqS9/85jfzqU99itnZWf7pn/6JqampvnqpJjBrr6RzifOQkhZ+inmLYKgm8McME32VRj2JEmI+TSj8F9KahPALPjX//75qyVUeRMz7C/X/XykIgidOvVz0xQF9wsgvXL8mi+YJCrfgM7U3SZ2QhIAGszz8g12MCUlUluRHe8RtzdqVGr00Zrbw7N1fks2UtJcO02uNIAaOMuRnMJlBCLDeobVjOHZI49BKMBx78slpGIhoX/4q2hGkeyfJS1uVV3mcVTQs2Lk0TMYjKGyOm3SowZjGMkl5dI68m4MEowTdWUOa2lASZoMKo92QuNzTzR1p4TlSeLomJIAJIRBSkDuPm7G4ZIBfbFzFfpZyuX6GZTMHmc1LjHDkR+YQRyWNdkKzGTNkPWNJzKG5AmMdXgmsgLnSkZfBZNhWKXVxJGjGCq9iRid+gjMGIyB3nsKH4kVnQ1lZ3aKEM7R+9jDtqf3oqq1JAslVl495Ecrc6vLC1HkOF462DKVhBZ6egznn+WlhGVCSTZEkihUkMNTdh3r8f/n5ZW/j8OrN8yWRPpQfeU9f7ZRkc+iih2jI0HYd5N0ixC8mghkhUUOKaZ3TKQ1JoUJkuwq9pihhaiYHBetHB0jamk5RMJc7SudpNjXrxkcZHxzhwEyPzBl63tNNS7qlxS5s+yK0XyWDwfZs6pnOHD3rSaQgd6ClYGyJpkgkWWpJpacnYMY4yopRccIz6jyxFBzqWXpl2IfyHrSgPaBw2uGtJWpp8qRB5KAhDJEMRJp3YQCS1oc0RSVpDGjK1CFjj4od4y1N5GJmjxR0rEcknlhB6S2+l2PxGCxWlvjI4ZUMRt1mXv0HkkY7JissWkm08yjhsdahjcfUZE7Vfb3zmMIxlzv2thTTTQ0KlAyqKOMElMHnShtPogVztXKyaoWrnMBlBiFCet4gmhVKsCLSxKUlz0ylkLv4vhAv4dxDCMGmTZt44oknTrleFEXceOONffXJ8PDwK3YTWd/AHIuxsTGSJDlletjevXvZvHnzIkJESsmyZcv6qUAnQ6fTOSs3lkmScNNNN70kH41aFXLzzTdz33338cQTT5zUg2khkfajH/2I173udacljFauXHnSdJyLBd1ulzvuuOOiiYyP45gPfehD7Ny5kwcffPC8GGFfwiUcCykll19+OSMjI6cd2733zM3N8dhjj7FlyxZWrFhxXBnahYJTHdOBAwd4+OGH+dnPfsYnPvEJNm3adNb2a61lYmKCd73rXSd9sLKwVDSOY37v936PDRs2nPa4Xwzq7Witufrqq/niF7/Irbfeyhe+8IVTjjXr16/vqw9/1cvRFnoA1X+nMabvB3Qh4ViV3LGlaVmW8Xd/93f8+7//e19x7b1ncnKy/5mhoSGWLVvGvn37Fn32/e9/PyMjIxw8eJAsy1i9ejVvfetb2b59O6tWreqXWO7Zs+ec/o3nnDCaL7oI8g9XkT2yKnFZvE5d3hXeCmVgFRvjReUBEtau04agUhBVv4sFy+rXx5ae9T/pK8ckMb/AV0SQW7Cur35ZqCIIvJOYP/ZKZSCBSDjeODrJVOSZOTjLgAAbCQZiGFuRkGFoNwQrVyjSAYkdW85TA1dhxRSv2fUtWpFlOBGMtATDsaNR7WtkKGKwHdGbtXSeO0zPFsTLm/S6Gc47Wo0YLQWl9VCWSOcRDRVINgPZbIY9XHJoNqfUFpyl6Dm6BuKmpNEOREWWO7KOoTTwy+fnsF5ghSB1kBcWgWAwkQyPNik6JVEmaJQZS02X7fkuXq179JSikBKRaHTD440j7aTIrGDZ8hHwIeOtEJIugsOpIcssWgmEh9R54kgwkAiElMTdGVrT+7EeSiHIfCB8hA8BcXWHC/yAwi1dQ/LLR1HeVpHwoIJVEFqGfRvjkCqQBanxIWxOh3KqzHsyPIUMbeFpY1ljNYNakTQjEuvJunPsz6aZFuDrtiyCsbOvyEiBYGDmMMrmOBQlMJcGCkdLkNYhpSAeicjyHmkHEgtxIpEVw2WNC6qqWHMgK0l7MNu12CJ4+ywdbrFs6ShHpjJSLLO2ZO9swUyvYNZ6RpQiURLrAuFqvaOTh/LKqcxSeE/UFqgWkEOSQDIQcVR5dh/KmJWe3Hrm5lzoF0HQRDlVskErOs5TEJaNjGgGlyY47Zg+krKsIXnL8AhbVEIry9DSob0LcfTVOBBZjystXkpiL8J1qaLblLI0IkHWhMw7vBAIVUmQLTgn8MZhc4O1Hl95T/nSIVxQ+xUCysJhS0cUBUWZlBIdOWThQAuUD2WsBih6lqJwTLYVRwZjRCSJdFCjSSlIvaIswgghHLS854iQiEreFgtorQ7cAAAgAElEQVQYLUJJp29qtmrNGq0Y1oJECYzxOBWUTWbBOHYJl1DDOcddd9112klqWZY8/fTTbNu27YK9cRwfH6fZbJ6SMPrBD35AHMf8xm/8xiumohFCMDg4+LLO4+joKO9+97tZt24d//M//3PaJ36Dg4MnNS9fiBMpqy427N69+4yl9EKIl0TcnW20222uv/56ut0uP/7xj0+7/oVaKnEJFy8ajQbvfve7z8gM13vPL37xC2677Ta2bdvG5z//+T75cTG1Sa01mzZt4mMf+xhr1qwBzi5Rs2rVKi677LKTbnNhpH2e53zrW986pXH3yzmWupxudHT0jIIQtm3bdkGMjeca3nt6vR7GGFqtFlprnHNIKS84suhYHNuujDF85Stf4Z//+Z+P8yDau3cvzjmUUgwODvKa17yGRx99tP/+yMgIb3zjG1FKMTc3x4033shv//Zvc8UVV9BsNhcZbJ9rf6NzThgtDJv2oiorO2aOVJM5dSkYlel03xPGi35JUVD/zJM+tlrdVT8BhAjEz0LFkFy0p8X7DrsT1Alri0mmeXKqLmlaSHDVGxGevjfToCy4fGQacd06Dj+1n8O7Oygrgzn1oGekFbOsqTk0WbAvL8lkg1Q32L/qClYe3s3KA7tIlAxEh4hQGAbaEYPLBrDOokqLtY6jE7MgSiyOOJKU1hFLhfQgS48TEh+p8Lc1FEoIihlLr5NTCk9zQJOXBXnXoCONUhLhoZVImlFMWToa3lBaT1p6lPUMRgIjBLGEyDtEYRls5wzaQ3xg5ntc2ZolaUj2zKaYylNKCBBKICNNZCGWmpnCMl1YDuclR2ZzenkgUZSDzIOOJO1EICU4UzDyi51gZvEyGFA7R19G5jw4qfpXVjrHQKzRSiItxFKgK+WQDLFnfQWarY7PeYi1xGjInCd3YKBfOnkQx6POsENBosAaFwy0GxGxMHipQUjwYEWVpFc14MbcFEJ6SueY7Rry0qG8R8jQtoSCLHL0MofJgom7jAUoiS09GI/Vgl7pmMhy5nKLq1Q5Aw3ByIoRjnYzZk3BrCk5MJsizLzXjgGMCwl0iuDpdTgXNCJBDqiGwL3KM2kdSVewrBHzXCflmVnLfmXJTei7WoJ3gsx5lID9Pceh51NKgmIpiSStJTFWOw4e7DHo4I0jw7y5PcBSPNZpvDVID8qDdB5vK+KosFinKfAI56Hw+NQQi+Al1FCSzBsyGfyWBCIYT3kwxuOFw3nfLzNzNiSc4T3OCTozWegjSgX1mg1eVqqy1xLeI72gTC22dMwOKA6OJQgpiKr1VCTQSlB6RTFbAIKy9KG0UcyPLYMIRqwlUYJlDcWWROJ0MEkXWmClopAuqC4vopu4Szi/OFNFw65du3jggQe48sorGRgYuODalJSS8fFxpqenT7qOc457770X7/2vROnVgQMHzsiketmyZae9Xlu2bOFtb3vb2Tq8VwwvRqGzYcMGrrnmmnN4NGcOrTVvectb2Ldv3yK/iRNhYmKiPyG9hEs4G1iyZAlbt249rRF0rcaoTZS/9KUv8d73vpft27dfcN8Jp0Ldf/7+7/+eK6+88qzHjDebTT71qU8xMjJy0v3XvnkQlKd1Itm5hPeeTqdz2mu1devWC54wORtwznH06FHiOO6XiNfECly4BOixPkbee+677z4++9nPntCf6ODBg/31a5X4Qqxfv54tW7YghOANb3gDV199NVEUHdf/hRDnPGHtnBNGQiwmXAR9YVEf/pgX825ECxYveCHwfQWQo1YiBUiCcfJiEkos2FbtghR8Vvq5aAsTjlhIYlWvhJ8nqoKkaNFR1mSRAAo0P+1t4NqRA7zmKpgYbzLzkxm63hA3GhyZyhgoPaNLlzNnJbOtAZa2BRMm4Zk1VzM+uQdrUkSkKFJDoqDxqnHUZUtxz05iS4+dS0lTg+tqZEPi6sIj72kJibSe0oERofwOKdBDDSQllDnZnAUNTgWFTjZriRoeHQuUlCglKL1HyVBeFetAzjkbkudy4FDX0GxKWpFjsOnYlBxBGMH+wylHpnuUQzFS2VD+UzrKqYJpodg3k/HCTI+JNKX0IKsJt/GenJCS1tAhqUwAUniavosUHqmCN5CoSwKdQ3hPlKUkcx1EErPmuSdY87Pv0fWGTARVSKSCZ5HSskrPC1o164JiJVISIyCTjhKBVSC8QFVEAkKwuzBEMz3eFGlA0m016VEgi2lk3AKVIITEC4H11Xm3jsbcEQprSecceWlBhjbpAKcEJIrmYELnsEMWAqFFSOUzHltYIgGjcYPRRoPObMpcaQNRgmB4oEEvs8zM5swZS+5hoBWDDMqsbmnIrCczLpRqVuVyM4VnsBWR5Q49KJjFcGQGrPVM+pxiGtI8tA0rAnmGCNdC1f3DB68wCX0FzuGjPXLjiS1sHIh5S2sJy6MmA5HB4yiLAucs9XTQGI/zHik0ZRfciAx+Y7kLSiJhAY/yEAFparEDCiGD75ApLc6F0i5fzc+E84iKEbTeUxhPN3VBuSTAGuhZi4+Dim0uC324MGGd7oBick0TrWW1naqsURE8r5qCslZ+eY/QAqU91oQxYlhIWkIinMV1C1oqoRFLiBW58KR4REWGLnBKv4RLeEkoioLvfOc7PProo1xzzTVce+21L8qw+VxDa82v//qvMzExsehG/Fg457j//vtZu3YtGzduPKMbwvop5NnApk2bzoqZ6PPPP8+PfvSjk04wFi5fu3btaf/OsbExjh49itaaJUuWXLSThUajgZTytMTR+Pg473jHOy6oNjw+Ps4111zDXXfddcL3vfdMT0/zjW98gzVr1lwijC7hrGFmZoZHH32UNWvWLJoQnsj7x1qLEILh4WFmZmb4whe+wDXXXLNoXLtQJ9owP9luNpu84Q1vWDTWna2UrLp8+FTb2LBhA1dccQVHjhzh4x//OLfccgtKqbN+7vqVEd4zMTFx2kRPrXXfJ/BXHVJKlixZQhRF/XZxIZainQ6PP/44f/Inf7KozGwhJiYmKIqi7zN27D3Sli1b+gmHC8/FK9GPz/mZr0u4RLWzhURO+CeqpbUldjgJ1TytMptmQeJZIC48ooq1n/cNWagfcgu378H5fjZV8K9ZQPfUdJav3p9frz7yag+VQiqYdleKqfrIxXzpXc9HPJqupitG8bJB2snQCJasbRMnEb4riETMSLtkfMSxpJ0xJgsiCd0lK5lbuQGvNM5ITBHivoOrskCNtpHjbXwzpkgd6aGcfKYICV+5YSYNChbrofRghcRKhYsULpbIoYh4PBhQz805jJS0lmj0UJiou8zhSoszDmMtslLnREqgZDVpVj4MdNYy0NKQaKSIKNKSp5+fYs/BDoX1GKLgL1Ra0tmS2VnDZKfgyf3T7J3tUVakjY4lOgqeSFaEibSWQc2hlSBOFM1EEOmKhHEe4RxVrBqYktGH7mLdXf+Pyx74KhueuBvRm0FHgciw3mN9UOSEjuYruSn9f81EYnGkNlBv7bZmZDSh2dBEKih1HPCLuYIHj8zxs6TBD1avYn9sML1JyI4gimmk7aBcl8inJBQ0bA/dOUQ3s3RyQ+odDoeMJCKWWC1QQwoiSbfnkWWIWrfOk2UWa2G8kbBlYIQR3WJ0cBgfReTGUhqPEJqj+7scneoyVxYYDV4Jgld1UOrV/cYRTMSt92TWczRzZNZTNDydzJMXkOcwPQtzWUUWVf0NAbWoq+5vqurTkRREcRjEyjkPBcQSXjsyyKr2ICNxg6EkYaSd0IwksZB9xWDhQtKdEjFWa4TzGOspSk9ZumDCnlts4YiVhNxTFhXZJyweG8gi54MflnHgAinmrcd5gbEe64KC68icYTq3dGwgeyId1E5l6YOSbkBxaFMLMRyRNBVJQ6CicE0CQenJK98vC6AEQ8ITJ5IokehYEkeSqGpTxnhmugVz1jLVy5np5vRyQ1ERo6px8SopLuGlYWZm5qyZNC/E9PQ03/72t/nud797zs0PXyw2btzI+9//fgYHB/tPbE8Eay1f//rXmZiYOKMnusYYnn766Zd9fJdffjnvfe97z8rTbOfcSY/dOcePf/xjyrJEa31G5WgPPfQQX/ziF/niF7/Iww8/fNF66WzZsoUdO3ac8oY/jmPe//73n5Hy6lzAOUeWZWRZtug8p2nKc889d9LPTU9P81//9V9MTEy8pL4nhOCGG24450+IL+Hiw8zMDF/+8pcXKTRPNL7U/aUsSzZt2sTY2BiPP/44P/nJTxa1Ze/9RWEmfKrUs5d6/PW2TjW2KKX4i7/4C775zW9y11138Wd/9mdnNE6/VHjveeSRR/jEJz7B7bfffkrPqZGRETZv3nycgmXh7xfDtT0d6nPQbDb7Dw7OFmF4PvHUU0/xyU9+kscff/yk6+zbt6+fxKmUOu6BX5Ikp00APF84DwqjWo0wn5AWEKik2pS6TyQtKEOrMW9nXBNMvk9EHVtgVquZxIL3ff+zC0rQFrw/Tzn5WjwU1qlL3PrLxKLXC38utPQGwfNmkCNGUz4/w8ShhCXC0pCO0s2x4bIG+bTHdLrEhSUf3ETmWmwQXbSf5oXX/Tp6YpzR5/ewyk+TxD6ka03MkmlPJgTx0jblnpT0aAYdT5ooVKLQiWRs9SAohQUsArygdAIRKYz0GOWJRzXlEUOaeloDkjgC1QBKjy8crgxfMHVlgKzKjpQXaAVGBJ1W2i0oEo3qWPJyliMzOc56rJM4J7BESGtJC8dc6SHymLyofGiCgbnSwbOnsA68R0mBqhQrWoCKJVaBKaEwHpzAmUpV4kIpYVJO07SztMoXcFRR596jvCdzIeUu9lQ1sIF/y5zHGIeOJMSS3IeysXggYmCogRSCRiOi2ymCmssFNczT3RzylMwcgW6ONnMUZhgdtbAqRkoNUqN0TDzbgc5RUg+zTU+z8CipwIF1jrQhaIxGKC0oCojwgUQpLMJ7WkqydWyYQ9Nz5AIY9aS+JFKCpYNNmlbTTQMhUQImy8hLR68w5NaRO0fpHdZ7PKE8LQGM9xxNDUlFfBRl4N+8B2cXq/vqpr+QLKr7kBahPQghcCaUiCkBQ4nk1e1hRlUDZw3Oe4QKZXZSh8HfEIgh5UNpl9KAtYiK4MoLh/YhCdEYTyQlzVjR8Z7SgJMOLzzWhfK2us9KKr8zP6+ECt5N0E0dJR7fkAgCORnrYADejQWHN7RwgzGxEljnoQSPw5qauBYUQpBpSau0KATrreBIJJiOw5gSWUXUKVkxEnNoKsNYz+xMQdLW6DgQdloKkkgQJRfHF98lnD3s37+fNE3PutQewvj24IMPsnTpUtasWcPAwMAFEcErhGDz5s18/OMfx1pLlmV86UtfOqE6aHp6mq9+9at85CMfYWxs7LTbPt0NchRFxHF80nj0yy+/nPe85z3n5TzVce0TExP0er2+P8eJsNAo3HtPWZZ8+9vfZtOmTWclred8QynF9u3bKYqCnTt3nnCd9evXs3LlylfkxthaywMPPND3j7j22mt505vehFKKxx57jF27dh33mVpZtDAdL8/zvtfGi8GhQ4fOuQfFJVyc+P73v8/evXtZtmwZeZ4TRVE/Ba1GrUCYnJzk5z//OevWrcNay+c+9zluuukmtm/fzvr16/v+PBeqYfLJjqkmvWoy4Vwef6vVotlsHpeWdi7gvednP/sZ999/P8YY4jg+aTnz6tWrWblyJcAiM+hfBZLoVKhTVy9UA/cTYe/evfzxH/9xPxHtZDh48CC7d+/uPyR53/vex7/8y7/0A0/q/grH3+ucb8+8c+9hJOgTAzU1E/yua6Z3ft2FZWM1/7KwDKxPKs1LexYQSfPr12/6+sNiniCCMPGtvZX6u1+0LbHodV+5JBZ/ZtGkuo5Kq4xvE+mQacYLL8wRr15K/nSXdH/OwFCE0jC2vMm+p6eYnXYos4fe8EaWRLP8UgzzTDzGY+vXM758jjfM/pJrOg9iE0k+OceUdshEkTQVqq0ZF4LJTkExXSJ8iVYCtWIAr928kkqqMNktHIVxOCFQLUVbQH6koMhAtyVaC4TyqEhijEOkDlsnzlWm41q4oNaqOq5UAlc6js6kiDmP8RWR4z1GaER7mLYpKI68gKh8YOpOL2rFloQokYjcIU3YjxCgtCAikChpaskLG/ZtQwpWrT4TwtPSkEQeL0M5V1l6TOlIKyNjRCCRVOXa3KuYyhA/77HGkVXkhLOePDXESfBFUpGkgabIgneUcw4mjiITjxsxWFfgyi5GJnihQCqkioh0QvLCAWzaZUobnlWWpVLSdIrMOJyAqUSwLJYoKZEOus6jS0uCpKEEKwYTWlpy2DsaI5r9Qz3MXsuasUHGG026WUFHhjS3EstUr8RlgURJraPnHIVz2MCr0fCeGEGBwCAY1IJMepwJDbpvDVU1bu9DauHiklCqcxc8oYQMBB4uxM1rCUkjRmpNbi1ZWWAxjAxo4laMxZJlnrQICiohIM8sjZZAeoiUwHiJ9ZCXgQIuS4ePJXEUI2yOE8EA29hAIiaqOnYTyBhvfd+byvlAGzugtB4nK9N9gnquoUM528HVTfJ2jJKyUiD6eRWanI9eLBF0Gpq4W6CkYDRSrBSSvBXOTjMVxMIxmAi6scRaBwpEBDpRRMGNu1IkXVIYXcLZhXOOr3/969RJa9dff30/LeeVxEIj41pafTJMT0/T6XTOiDA62cR87dq1vOUtb6HRaBDHMffddx9FUbB3716stWit2bZtGzfccMNpyaK63KM2KD2Vx9Ly5cv7JSHHQgjB2NgYH/zgB/sS+xNh8+bNbNu2jTvuuGPRTaIx5qJVGEEgjU5FkmmtX5GSA+ccDzzwAPfdd1///H73u98lz3OuueaakyoCy7Lk9ttvZ2Jior/s2WefpdfrvShjWu89TzzxxK/8xO8SXhoGBwdpNpuUZcmhQ4cYGxuj3W4ft54Qgssuu4ypqSn27t1LHMc8/vjj3HPPPWzevJnf/d3f5aMf/egJFTMXqmF7fVxHjhzh0KFDrFq16mWlgS4kWM5kG+fyfNREyLvf/W6+8Y1v8LWvfQ1jzEmPcceOHQwNDfX9qo4lDS9UEvCl4GRE2IXSTk+m8qvNpz/3uc9x9913n/b7Ok1THnnkEd70pjcB4f7hox/9KH/+539OWZasWrXqhPcJx6rJzsf5OA9F4gukOP0LvVgd1CdkgL7yiPl1JfPlZYKFJJOo+Zn+dhCLt1uX0iw8lXIhG7ToSMU8OeXr176/3YWHuFjxRJ+UkiIs2RwdQj7/NGk8jBteQ6cF8YFf8swjORMyZWxZhIwF3f0Z+S+fQ796L99dfy2p0LhqknqgOcyDjW28Kt7DC0d/SSN1TNsCNagZHkxoNwSDKmJwLGLXni5l1xE7cLmhlApjHYUDNEihccZTlLZfDoT0DA1pOrOWvOvQg6qKcq8GsqIuEfR44UOpmA8lXr7ypvIO0AJnHUUeypeCP4/g4MhrmNrwWt4jnqV3+BA2K5FyniiUIpT99RPMJFjhsV5wOHUcyh1LY8nqAUEDx1QZyqq8C4lW1ofr1IgEcST6CpjSeMrCknuP1cFwGO9JrcfaUJ6GDJ7J4FEGCheS2awKLEM3LclLi1IytAcliBKFMAJbOigN8b4ZTKwoGw5bZlgrAqHkPVppoiimceQIqbUcbjq6HqR0LC8tIvfkkWTKOpYiKIwnQmAqFdcyKdk4qBlf2qQ0FrxnxaoWBwvD6hHJqiXDTE1nTDtLRzn8kKKTlRyaM2BCA82tp6yIMQ00qzbuRCgZywTMGk8sQ4+p0wZrA/laoUNNGtVtviaLhEDWRK4LywAGEsnVy0YYbER08pJYSBKhKfFEA018YSiFJTMGXZG7SktGBmMi6bBOUuKx3pGVlqJ0GAcYkFrhbWiLzlfeWKlDK40XLhyME2hRdWIZ2goCOh5m8cQeWlWHjSREClpCQOEpi+DRJSpZlXNBoSeC8VRFqglmYsWQBe8dEYJVPcdkS2NiSbMbiKbCVp5qQqCkJx5KyJWgACIckYa4efZVJpdwYaN+OnwuUd+kPP3000xMTLB9+3be8IY3nBNV0ysJrTU7duzgG9/4xqIUtuHhYd7+9rcvIiduvvlmnHPMzMz0b7bPJKr68OHDPPnkk+zatQtjDOvXr+cd73jHScuHBgcHueGGG7jzzjtPmgx3KsJJSsmOHTu4//77/88RCPXT8/MNay0//vGPF93cW2u5//772bNnz0kVXXv27GHv3r2LljnnXpJS6P/atb6EM8f27dvZtGkTe/bs4b777mP79u0n9bJ5/etfz0033cRnPvOZ/vhjreWnP/0pt912W/+7AC6eNuec4ytf+Qr/8R//wT/8wz+8bEP8V5ooOhbj4+PcdtttHDhwgO9///v9cWjp0qW88Y1vpNFo8Mwzz/DmN7+5/91xbFrYsaVprzSh8nJxIf899QMkOP67vCYBa6Xp6WCt5cknn+wbeksp+chHPsL//u//8r3vfY+xsbHj+qlzrr/9oihot9vnJQ3x/BBG+Ir0WSATqn6KeR4plJH0VTyiT8x4UdtUL/holZwWVl6g+amUMFT7c1UkW/2548vY5o+yfp8Fk+O+Eqr/2WpyXe/TAyL8fa7atsKTz1l2/7LgwNY3MyvH2DTSQ+5/gcNHuwwrSzFTEmtwpUcUllU/38m69kqeXrohnK3wRzIrEw6PrGHo+Z+ie5AXHtnLMJlhuCXIpkrWrx1kJrMcnTGI0lH2DGVpSXEUXuClRcWuMmOmn1InlUTHluEhweysI5szJC2FEiG5K04EZRnKBqUKf6P2wRtJ+JAC5r3HmyAT0VqilcQBuYGMmERpxg/s4aCCuWodLytiIpJ46aAEJQRKChyemcIzY4NBcZo6tPC0YkFmPLpicE1VZhZJ0FpiahWMI/jfuFC6V1iPNSaQWz60iRKwxldKKY8voJSQAlKG47DeU2YGAdUT5VC+lDQkPpIUuYW0pPn8FGrVAGkpyJUgdw5hDaXylFrRcSUNDd0EIq3oYZjBMpIpuhq61pEWBm01ipDc9WvNmC1S4ZqCvTancTSjsJ72aMLQQc2KZpOp6YyjWUZXOsRQzKE05eChjCwPRFoVBkcTT6Py3LKuMi7Hg5AIQhocdp4wqtPn/IJ20u+HzPcLSUWOVgSt855YCoT0XLV8iHWtBgeigtI4xkuFKzzeG2Jn8BbmSjAWtBJ4rWgPN2gniqQRUzpH6T2Fc6jcYIUhKwvyArKsAOtIfCC+ChM6q8kFsqEQwvVLJ11Fjomqcx/SMFXCUgEt59EIIgmxFiTCE6WGInVILQP51Vcnhb4uazmsgJlEsUxJfGnJ05K20Sw7mLJ/VRtpHGXpmZ4tyEqHkR4nJdp5UueZlaE2e2NsGWxeXAZ+l/DysXHjxhM+HT5X6Ha7fPOb3yTPc6677rrztt/zASEEV1xxBUIIHn74YSDcwF1//fUnjCiu44tPh6Io2L9/P0VR8K1vfYvJycn+e0ePHmVqauq4a7h161ZGR0dZsWIFl112GZOTkzz00EMvmjyo1Sa7d+8+6fv1zeqxT5gvZqxevZorr7wSmH96Wk8UXslShOeff540TU9o2G2MOe5mPssynnnmGa699trzeZiX8CsMpRRlWfLggw9y7733snz5cl71qlcdRxoIIYjjmI9+9KP88Ic/5Gtf+9qiNnv48GF27tx5HGF0oatU6uNptVqsW7fugju+hTgVCXei465VKRs3/v/svWmsXdV9/v9Zw95nuvPge309YPvaxg6kwRCGhEDmMjQl/YNLS1tFbUmrSlHTSFVTtWqVqpWqVKla/aIqzZuoedFGaQWkqdoMECApUoCEJkAwGGIwnoc73zPuvdfwf7H2Pvd6xIBt7MSPZN9799l7nXXWXnufs57zPM93PV/84hf5x3/8R+bm5mg0GrzrXe/izjvvpFqt8vLLLzM2NnbMPbF4vtfKebqQx+tMcKH13znHiy++iNaajRs3HvM+XCiHV61adcZ2wccff5y5ubnuFxPDw8N86lOf4sknnzwmw6h47iRJSJKEI0eO8Nhjj3HdddexZcuWc/6F4HnJMCpkQN1qZcLnapxC6bKk6Fkie/yxSiKWLGX5pm5aUfEUx5BI3d2WCJ/ugcIjfFAnyWV5SAWKdgMJdDzHJbph17Lbj+WtexSeNTO7OVIaY39tgsvFEeLeEr42yGI8gph/JZRktz6ESUce157j7TsfZaHnTg7XBgI5JYJqZqoe0XvUMBg5SkMTTFOiPTtFpdRBWoVsWlb3axYWUqJIcXQqJVUeVxI4ndvHlAEl0ZEC7/HWoYBISmQEvf2SxmyGlg4RCyINQius80gdKoVJ79FKEPkQygzgiwGXAlR4LiQICav2/IDm0ed4opJBrPGVGI9D50HUzjvmahntGEYWNCUjmWkFG5kN0wTjYbrpqDkZsmxy9YfLVS6RDqQQOSkSyCpPB0HLhNyeLtEhQhl554PKTItwnBEhzyjFY1NPYiHWgSTCeTwWiSCKZCgfX1JEkaTTzBCNjGhfnbl6hq5psuFQEcv7EBqeGsNsyZGqnFxTgpnI0dvRtCKN9SaUu5cCJQRDWnLtYAXajrpwzJQdW9YN4KbaUNGkbc9iOyOLMkyPA6E4MtdiarqNslAiWDHLXcJVUNECpyTtLJSaV4ggvilJlPMIW3xAz69DvxQ2v1xN1xXTLed9w2nPK795rl83yNtXDuKFZ945XlmcJWpkXKYjxvD0S4HKLIuNDOU9mYfeUoQEkk4G3iMVWBVsH1aBjiReGOabhiNNw2AMfUic8CSpy22G4AzEZdldaAQLZSAAvRB4LTlUiRhqZCgCGaSEIJICJQKhlnYsUhVv4kFBJAjkqlICpcKcb0WChd6IgRmLlxJfVaQVjXUiD6jPM6EAUZEs9JQpWeiUY15oZvxCyWMcdFqvXXr7En62UBAc5xPee6anp8/rc54OWmuGhgNY6mIAACAASURBVIZOmSvU19d3xpYeIQRXXHEFV1xxxQnb3wjSNOXb3/42P/7xj0/5Ye9kAcg7duxAKcXw8DBCCC677DLK5fIbIowK8utkjz366KPdANzJyUne//73X1AVxV4L/f391Gq1Y8796tWr+eVf/mWEEMzNzbFr1y527NhBp9NBa822bdt4xzve8Za9zqmpqZNuX79+Pbfeeivf+c53jrGtHTly5A3lGF3CJRwPrTXvec972LlzJw8//DAAu3bt4siRI2RZxtq1a0+YZ0NDQ3zmM5/hpz/96TGBu9ZaXn311S7J0Gq12Lt3L6Ojoxd0LpoQgo9//ONs376dFStWvNXdOSnOhBg4Gbmz/LitW7fy+c9/HoB6vc7i4iJjY2OUy+UTst2K34siC8uVLj8LuUanyu05HTl2vj5XCSHYtWsXjzzyCH/+539+wpy01tJoNM74HLz00ks89NBD3HPPPTjn2LdvH//xH/9Bu93uWhQhvM5Go8Gjjz7K5OQkP/zhD7nvvvt4+9vffl7O+fkLve6SPkvWsuUv7cTq0sdZ1vKDC9WDWE7UFAtdin0KK9kSuSOOaTlsXN6X5fqhJQvcsjaLfiIQPhwlhF/2mpb6NizbVGcPwOAA87LKT/waRHWcd/YcRQ+tZv7FFpX2ISpYtAQdCWIBtZlXefvLP2DxivfTVnHot/D0Zy10x1KpeEaYp7xygvmFUXxyFN020HGMrqiyRteYOVjnyHQHIRxOC4gFREtWuzgOZIcQedU5IBKBPFGxpNNwVHskKpI4lSe/iKVz4Ah2IEWw+sj8ZCgBQgVSxwUBCy5LsPNtFmWJqL+EqsXY1JK1E0RmUBaGmzEvk/DSYIdRIpgDJQU6PwFOQMeAzujmHRkTzlYkBdaF0GYhQ19S6zESOgVZlPengCxUJSJXNUUKISW2Y1i0htSDEcHWJowLxIoAJUIVLefDTC6XNKWqpt0w+HaGchZTt0S9ClmNqXpPQ0LSJ+nYQDLEKmTj1L3h8AgseIU3FuuWCI6BkmRssEZbZ1ibokuOUn/EkBC4smKh3qGmoTIi6Cx6pg4uYpuWMQ81LVFS0PGOuvHUfVAbtQw4b1GxQmSOkhRkEqyEaiSIpeCIyxD4bkU17wtibelnV9DX/T385jxUtGByRZX3XLmK6ZkG9VZGs5Uxu9gmSQ0HopTYeOKWZUWk2NRXRjc6eCUY0Jp2s0OGo6QllYrCSoGXArTGGYtzgk7mSI3lsAnXm1bQsZ7IQckVZ9ehhEQWIUs5KaQEDANWC4SSCGGD1cwJIjxGwLwQmNQFQpliHHw4/5EMT0gorWq0YGqwgqhnzEvP3EBMPdJ4CwoXrGjGI6RAxpJqLSZSitl6wlhmsQ1PfaBM+SJ/U7+E149KpfJWd+EtRxzH3HjjjXzta187xrYVxzErVqzgwx/+8BnlFxU4mx8Ud+/efVqy6HSw1nbVSEeOHDlrfSrgvefFF1/s/n306FHiOObmm2++4L6FPRVWrlzJ3XffzRNPPMH8/DwrV67sVsebnZ3tVipbjoMHDzI7O3vOyDGlFGvWrGFubu51HVcul7n22muRUvLtb3+7WyHt+eef54YbbmB0dPSs9/USfr6wevVq3vnOd7J//34efPBBrLU8/vjjXHPNNUxPT1MulxkbGztBcbJp0yY+/elP84lPfKI7r6WUrF+/vtt2pVIhjuNjig9caPeRoj+VSuWieO9cro6E0H9jzDEl0U+G4rEiT69cLjM4ONglnkul0gnqIgjntMjXu1DCkc8Fzma1vDcLIQTr16/n5Zdf5tChQ13CqOjPwsLCaSujHY80TfnCF77Atm3bOHjwIH/3d3/Ho48+CgRV3fLXrpSiXC6TJAnXXHMN69atY+vWredFhXvOCSNFsG8VZEoQA/hlC87lfy+RL8sfhTzvBpYpiJZNFHGM9ignOET3+RGF7S2QQt1MI7G08D2+R0s9W4LP2/NiydhWkEsi74cHyiYhdbB76Aqk8BwVNWTsebW6krFOnekN1zD0/ENkrkWsw2vq7ZGYBIb3PMXk4AQ711yJEyH0uT9tUvbBjiZSw1o7zchojEuqzM3MYzJBBcHWD72dbK7F3E+n2PfKFPsPLpJ2HEQgotBJk1giLYm0QCuJVAKbj1epJGi0BC4VeB0UW7iQTyPysS9saMXABDImKJD0sgHzuf2poTwzrQ6u0yFSkrJWREoitAbjiDPPwELEvmZGayClf1yjD3uUFcGWBHQklB30RpLUOKwPeUeeUJYdASGTWIAQOB/sakLkeUv5+dECektBJVRk8AgpaWQOj2NESayXtAZ6aVcswhpILGnb4jKHcI7EhDDtasXjtMeUPKhgh5LWUZGeioCS8/jM0mxlZM6HbCjvkVJghaRVMaQmJrZB2ZMaQyzgneN9bJgc5fD+BrQa9MQZdZMxPlbj1flFjiYZfT0xiwsd5qY8i3VDVRR5QsFu1yyyiwADIfTagjKeSApiBT29EcI4jHf0DyjEdJpnQ3WzncN1kp9qwxIpqwWBbBGAFDjnqJUVN1+5kmbHMFNPWKh3WJxPSIzFCUE9NSSZJcssUUdQ6S2xpawZG6iESZQFZU9mLOUshKlneJxxaCmJIhXyrgS0jeNQwzNQURgHVkA5NYBCxYJyFOazc76rIhR4yt4zkDoi5/EqvEgXUrGZU4KGEHgTIvEdgRz0eV4XuSpNSNm1udVLms7kAEQKJ2So1uYBr8L804JyLKlEmjEnWOxkzDTaoCTGKGxqUPrSN9CXcH5wutyctwKbN2/mYx/7GD/60Y+6KpwtW7awZcuWt9SCVHz4Pps4mZ3pVOjt7SXLshNIk5OhKMl89dVX09vb+2a7eV4ghGDt2rWsXr2aJEn45je/yU9+8pPTHuO95wc/+AGbNm1i3bp1Z71PUso3TO5IKbnmmmtYXFzkscceA0KQ6SOPPMIdd9xxUSxyL+HCxcqVKxkZGeGrX/0qnU6H+fl5ZmdneeKJJ7jyyiv5xje+wW/8xm8cE9xvrUVKyW233cbv/M7v8PnPf75LWizPCZNSMjk5+Va8rDeMi4H0WFhY4JFHHmHfvn1orXnuuefYtm0bV111FWvXrmV4ePikhR+OJ5SUUt337VPZ2SCo0N6owuliwmuFYJ/P1zc5OcnHP/5xhoeHT+jPiy++yAsvvMDAwADWWur1+mu298QTT/CBD3yge41DyLs8viBHuVzmpptuwjnXzVE8F59ZToZzThiVtOx+U19kqzi/LEdoGQt0TJF7v1TGeykjaAlieYn7vJlgj1o2aMskQqFKm1+ykh33jKJbjm1ZVku+UOx2yLOkXOpSUr7bD0/ezySjRYk9pQkSwgl1UnBwZJLyU99g/hc2M9e7iv7FlwGHyGUc/QMRJrVsePkxpgfHmepbQRmHUGVqZYWIPa2WYQRBzVoaaaiO5a3H1zv4Q/NE1RpDtTJqfICeSoWX986y2EiQmUdE4GRYlHsh8MohIxFsahK0lJRLCusEnYRgv7Eel7mcgAGplsgJ4fLwayEwUoYFdm6jMyLY1lxVU6oqWh1DPTF0rKe3rKnEGlVSpKnBOsWoq/DT2TasdOgOmDlIHCR4SisEad0TC0gL1ZgIWUqZ992Kd6W8D60ikyc3pAkEWkBPFIgyqUROfnmMc6TWoglh2r1C4ao15mtttFJECmIPtm2wbYPrOJotw3w7Y2S8TE9NY7yj3UxxVoaKYPMpLSkw3mNSF4i3Yn6IUPTdO0ckDIggJ82Mo6QEb1s3SmX1KAuLLUZ7ehlXCYtZhyO2ycFWh7ksY/d8g8tSQZ9T1IWk5S0RIVOoZRyJD5XhLIHg1DnREqqfeZoG0vkMeiXRGsWrnYyFdrD7eb+UX9RV80H32hUikEqe4psO0FqwclWZQwtN5g+3WFhIabYtmfOk3tNxLuRGASiJkIKnm22u6K8CkmarQ+SDBbWiFdZBZm1QjgV2inKpRCnOiBOBsYKmhaTj6Y0DYWWdpyxlsNwpiXeeojKjEMEiKJxnTTujJES45nJWLPWC/VpigBEnqBnJPm2xuZrM+0CAOhuq6UEIw3ZSYJREGplf/xJvg81OaUGkBVGk0DKm1bDMNNpo4ylFFiESrDfUfcwl/HxgYGCAvr6+k1aoOdcYHR3lxhtvPO/PezoIIZiYmGBiYuKt7so5x+TkJKtXr+b73//+KYOwIdi17rrrLn784x/z4x//+Iza7nQ6XWXLxYQsy86ILCpgjGHv3r1dwijLsmMq0VWrVarV6hvuz9atW3niiSdOaZM8HaSU3HDDDezevZv9+/cD8MILLyCE4I477njNKnyXcAmnQrVapV6v82//9m/dhaS1lq9//evcdddd3H///V3L5nJrmjGGUqnEJz/5SZ555hkefvhhoiji6NGjFyVxcKH3dznZ0+l02L9/P1/96ldJ05Rnn32WOI7p7e1l7dq1vOtd7+Laa6/lxhtvZN26dSfkUMGpyZ0LfRzONopxLcbWe9+tFrqcLIrj+LyOTbVa5dZbbz3hizhjDI8++iiLi4v87u/+Ltu2beMzn/nMayqOrbUcPnz4mG3OuRPIpkJtVnypVtgRfyaqpPWVJDavaGVdyKQx+Tf7nkL5A+REgPdLKqPlxE7xf2EcW7KwiS5lE44TXfJGiKXHu8RSrnYqSCGfq5OWHj9W2RT+yCcqLJc4dcmkoneFTilqzTPXTLCFHy/vU6NvhPlSL9GRPbyy6d0MPzNNv58PJAaekoSBXgXNObbs/iGLV/4iNe2ZLg+yqaTYs5DRFp41maTUG7N4sMGIysvMp469//cyfZetoj+KsF7QV4m4/up1/PjpPSwsdHDWIzVILbrVo6wFYywqkohIUNaKtO0wgLPgMrDWkzlAhoV2US3NFSHKIjA4hW3QuTwPB09P5hheMUjLOg7PNJldaJE2HaORYqSvhEbT6WT4juBAM+PgfMb4akWWCkw7EBXZkKMtBI15ReKCQsw7QhU0IBaeXiGp4Jj1kOVzK4iPgnWtN5JIKXIFSB5dnhMB3oJwYfIJqRGRREmPFw4nZJDUaI0oSUzDkBiDt46WNfRoTZo6pBaUIok1jtR5hAul7b0PuTdC5JlY+YRPMk8sDZn3dLKM2EgEArto2fvSFA8eOMT/t2Yc7zyplAwOlDny0wWa1tNKDJFVXNkX0Uw0Mx1H3Xuc9XTy8ZFAlCuPiqlqfagQ5xyU+iXVyZgDScLhGUM7zccivzCWW9C6094vu14L0kXA2tESWzaNMnugQV+m8JWIQ3MpDecgFrgejY1VsLu5QEJOa4mqlmg2U9LMkuAoIcgEaOvJ8vOXNlOSzKPLiqp2ZKUgLcvwtD10ZInYpGTW0yMFwoW+SUHIFsJ11WjCQo8NOVxKSERuAzziYEZLFIKWc6xoW1ZEgkNxrrLKB6IgjfAOJ8BKiZQgpQ/jLDzKCzIhUGWB6tWkCOppxvRiRjs1IZBbCbQF1/R06q+tIriEixNF+fXJyUm2bdvGmjVrTggwPB8YHx/nrrvuOuGbsEs4OVatWsWqVas4cODAWWuzWq1y0003sX79eh566CEOHTp0wj49PT3cddddrFq1inq9fkLVrlNhYmLidZVwvxDgvee55547Y7LoeKRpyre+9S2effbZ7raVK1eyffv2N0zIDg0N8ZGPfISvf/3rZ6TuOh61Wo33ve99PPDAA12Lz/PPP0+tVuP222//uVvoXcLZQUEoNBqNY7Y//fTTvPLKK1x//fV84Qtf4LOf/SxDQ0PdhWRhVRofH+cTn/gEzz//PFJKdu7c2W3jYiSOLgZorVm/fj233HJLt+pZlmXMzMwwNTXFj370I9avX8/nPvc5LrvsspO2cby97LXO04VW+e1s4HjVTLPZ5IknnuDgwYMMDQ2xdu1aIIz3pk2bzlvGXUHUnKxSaqvVYs+ePYyOjrJz507+6I/+iE996lN85jOfed15htZaDh482L1Oi/FYHrJ9Ps/pOR/dwaoks2ERb10IejUu/B2IhaVy6MUiH7/0e7CGiC6R1LWb+WA1KY5bbmMTFGHVxYAuVVmj20aAzDUo3YOXYxmLVFiyik3LF5Ji2e4KMK0Wi4vzDPg2RmsSJzFe4KOIxtha+l95lkObr+aVyXcz8vJ3qJAipAjVn5QD61g5vYPJ6UmaK9YwMbef2fmMV9QoPeNruMYcoF5vY72l1XYczTylkmB+ocXu6Ve57rpJStUS00cWEbWEsZU1Os0Mbx3Ci+5CWQlBpARaCqQDhcAr0DLsY0w4V87RrUomdZioQgbVVtfClNvAnAmEhfGQKoGoRUQRlJWkv6/EQidjerZNO7EYYxkbLBOXNVXlWGVjflLPOCIso6sjkj0eZSSdlqE0pGjMgXOiq1ZLHdQkrNSCcn4eY4JFqSBmIqAvCrlFrrDSBaawSySWlMRah0OgoggXg8YTzRh8LMn6dFC8zSe0WynGOaT0ZM5iXFCIiSLBXQT1m83nN/hgYypufLmVy3iBsBbrRbDZ2UB+7V1o06o7Di4annx5msP9gt3tNk1nOTzXom08NgViSSlS9PQIplNLZg0N65YUc4TrqpOTatbnCh+gMuDJJj0vLDaZm/OQhjFx+cW0TGwX5nQeSp9XmKeIB5IyXBd9fZpOmpFlKa3IUteGhnEYDVF/hKtEeB+IR29CdbJ39FaoOkhSS5JalApZVC3vEcqHRbWHZsfhnaUiTbAUxkGx2HaOhoF25rBomi5jwDqkVlgfCFghJYhgaQt2Udcl04SQaByZBRnHXKciFiw87RMOlDxjHUdTwkIcLIyBHPPhW43iJiUEUoTKgJGUCOkxCDp4tAalLToSzGeCBeuJMo/DI1CUpCAyhp74wrIJXcKbR6VSYevWrWzatImxsTH6+/vfUjvYzMwMc3NzlwijM0R/fz/bt2/nK1/5yinDjl8PBgcHueGGGxBCsGbNGu65555jMkMKFN9AQ1AkrVu37oRKaXEcH/OhU0rJ5s2bz3l1lLONmZmZboDv60Hx+r/1rW/x9NNPH7Og2L9/P/fddx/33HPPG1IaCSG4/PLLueOOO/jOd76DtZaVK1dy+PDhrrLjtTA5Ocn27dvZvXt3d9vmzZtfd18u4RIgXN8DAwMMDw+zbds2nnvuOer1OtZa2u02Dz74IPfeey+f/exn+fznP8+f/dmfddUHhepACMGHPvQh7r77br7yla+wbds2hBAcOnSIXbt28Z73vOeYReclEunNQwjB3r17OXr0KEIINm7cyMc//nEOHDjAv/7rv7J69Wo++9nP8v73v/81PxucCVH0WrlIPwtIkoQvfelL/P3f/z1btmzht37rt5icnKTRaNDb24vW+pRjdS4qxp2qnUqlwqc//WluueUW/vAP/5BPfvKT/PVf/zUf+chH+M///M/X/BJICMHY2BjWWqamppiensYY07UdLg84P55UPNfX7jknjPrLkiwniIwNxEPmgl3J5j+dD8og730oj55vK1RJGRxDKi2RN6KrFBH5Aq5AcJz4rlqpayYTxyUo5YeJZdeUEGFxvUzEFH4sUz+JvNJaQVCVbMZg1mCLOcwK+wrPmkU+Nvo8AytHmE0j9rSrvNosc7S/DI1pKrMHeWXDNsbqh+lbeBqlHd56apFnbKRCPYVrDj/O4Zpi9OhLHMzgwJU3okYnaB54AFODTgodL4kSQ6tpyBJLIzUcPDjFSE8fqcpot5tEcQlrHcpDbEWodKYFWgU7USlSRDL/RkJAIhyx0mAtRiq8sHgPxnq8d2itcBKsDxlBJleQOcJ5zryghWdBWpK2xexsk1hoZZ75jqGdOBre0k4sswsppViSWIMvWWpSMr3oUEOG2rDEHvLYOUEy7JB9EjG7lDujgQElqR5zUwyEVUEM9ChBVYYS64XqLJCUPrAA3lPWCqtjOlGJRk+JRpQQL1j0kU7gUkZiMulJ0hRbyG8I/TDWdZlE74qwu2VztHtB5xYx7/EyBEUnxqGRtBNDqWNIveOASGhbx7SzPD3fYLi/n1IpYraVUm9ZjIGagM19JVLnmU58sANaSdvnYcuA9YEcybocWSBNK1pQWS3ZNW+YmQebFrk7dBVEnqBOssWxy3g2SVCYSQVCBTJpYqyHnkrMYWXpW19j/45pEuWJ+2PSaozxIJ3vXmMDSnJdX4XWdIt2J6NjXFCvaYmKQuB5Ij3txNLvHL1aUMmfXOTWwoYBb0MIthWKI6lnoOzojRTGOKQr2DuJlg4dK1wa8q8yGwLMUwQNK3Cpp5y1KUvJaE2wrySwEYwnHik97bLq3gO8c3i7dB+S0rNSSd5RKdMW8EQ7pSnB5oo724FKyzMqwEYhx0Q7T1kKYg291UsZRj9LGBoaYvv27YyPj18wFZKyLOO73/0uk5OTF81CIEkSDh8+3L2v9/X1MTg4eFb7n2UZjz32GLOzswgheNvb3sbGjRtRSnUXaW+WMCrmw9jYWHfbmYS3lkolfuVXfoUHHniAvXv3UlRdu+mmm/jOd77DoUOHkFJy4403cv3117+pPp5vGGP41re+Rbvdfl3Haa2ZmJhg3759J5BFBQ4dOkSz2XzD1jQhBFu2bGHDhg1AyBD5n//5nzMOMBVCsGHDhu7xbwYrVqy4lH/0cwgpJb29vWzatIkPfvCDbN++naGhIf7lX/6FmZkZ9u3bx549e3j88ccpl8usWbOG6667jn/+53/m2muv7arZCpVRlmXEccxv//Zvs3PnTm6++WastXz5y1/mu9/9Ll/72tfelJXz5wGnI2ROhjRNKZfLjI6OMjc3x5133snv//7vk6Ypt99+O5dddhmbN2/ufkZ4s+9rr0UaXawoXpdzjqeeeor/9//+H1prPvrRj3LTTTcxOjpKu91+XarSc02qxHHMxo0bWbNmDQ888AD//u//Tpqm/Mmf/Anz8/M88sgjpzxWa8373vc+Pv3pT/Pqq6/yiU98gl27dpEkSZcQO13fL/rQ62qsAqlg/ZKyyBeEkcC44rFAPijncTL8LnJrUVE2+5jLwR9LHnWpoSJ3qJAj5dko3U1d3VHejFi2KwVxJHL10hLJIJYaCOocDyWbMNxZYF1jP1uSfaxV0/RHTdI+2F+1uN07WOV6Wd+vub6/ysHpFo9NT/GsSlg9t5PFNSt5aet7GHvmKBNmP0L6nDQyuEhTKR2lr/4T6rOLNDKLaDeJMbhKxNCmETp79zFaUejM0k5C0LGwjn17Zljsb9AhRdqIzuFFIhECl/EenwWFSLkqiWUgi7QK/iLvQUWCJDPhMe9Ihca4EN5sLWTWIbXECRFIPx9CkTMHbQuz3jAnHW3nME1ITaha1jI+VC/LFSppyzLX6WA9NLwn6oG45FEOZuc8esjRl2ma8xbbcNgRg5+X9GVh/kghqMql4HHjPe0uAQklKehVEi1DiLF0gWC0OWnkfaigJYWk2aM5OCDJRIqxnqp1OBcIAVdPSEs+z3kit98FVii1LpcH5gTLsnnSnZP5voIwr3Weu+QQed6zp6QUCbC/1SYThsXMsKAcV+IYqJWZTtpkWRi7lbGiR0n21S0LHUvHO9oSMrukrivUQgUkAgVUYmgqaLYDGcuy/YU/tkKgJ1clFS8hf1wKUDpkXPX3KFZP9NNMLKMrysw2DXNNR2lAIwZLOCQ+c2QuWByF86yvKoadYD5zTKUOXVJoJTEOSk6RSckRA9PWcbUX1IQgKiyfMvSpr6KYsoZmBpkL7Yx1LKWSAiMQ3oXMIRtseHGkEMIQCUHbe8gcqRUk1uNIUQKk9lSkIipLUuFpx7C+aTjQq0hiibMCk3msD7I6iWB9pLlpsMpQT5mjCymxgJZ3zHYEMs0tgB4i4VExKKFCRUJnKcUi2EMv4WcCQ0ND3H333cdUrLlQcKaByxcCOp0O//3f/82OHTu622q1Gtdffz3vfve7z4pay1rLgw8+yP/93/91P2jv2LGDkZERRkZG+KVf+qU31b4Qgquuuor3vve99PX1vaH50NPTw913383CwgJCCIaHh1FKcc8991Cv15FSdrddTMiyjOnp6dd9nDGG//qv/2Lbtm2nXBxZa/n+97/PrbfeelK7wJlACHHMsR/+8Idpt9vs2rULa+1pjjw7UEqxadOmS9lHP0dQSjE4OMjWrVv54Ac/yK233srGjRuPIcnXrl3L2rVrufrqqwG49957SZKEcrnMPffcw7PPPstf/MVfsGnTpq6qrch28d6zdetW/vZv/5aJiQmklJTL5fOe+3Ix4vWqN4QQ7NmzhyeffJINGzYwPDzMhg0bUEpRqVS45ZZbTtj/bOBn+TymacpDDz1EkiTce++93HbbbUxMTKC1plKpnFGGz/lWzkVRxPr16/He89hjjzE+Ps5f/uVfsm/fPnbt2nXCe1iRd/dP//RPjI2NsXPnTkZHRzl69CidToeenp5T9v9U1fHONs45YRTrsChWUhA5j3aiSxY5D6nNWUTr8TYsRqHISlkanKDk8d28Ii/8cY8WBE9umymIocLnl/93/HAWqodCPbGcTRJiqcKWyBes0lkGmnNMNvfyztJRtvQ26I0XsK5DSlA8YD2bRxTP7jjEQKdJ/4oSvdUK7E2R9XlS4Zk8uoNbjzaZGljH4rpNJD89TFXYUIGrZOmNFJ2yxs/uCRWmnGVk3wtMLryC31yCtkFmhkpV4lNN4i0iDgqi1kJG1g62J48hwhOVFForokhhjSPpGETdIkoeEQusEKhYYXPbmsXRsVCrlshaIbLYu5DEnuYLZpsHO0sZVEvBUgRTztJ0nsR4Ukv3Z5ZLVrQQRD4oW5yARAXrVGrA4JEKbAZzTU91haPsBI0mlFY4WjWBzAQ1L4KlrpudFH628wwfJQQ9WiFkUMt4wKuQt2QlodQ9wVqXecECIURcS0EkIJMCIkg1ZDH4QlWTzxVnwnNaF4xOzgXLW6HIsbnaSArRzf9xeKTMy9QvEx8YBzONDm3nOdLoiw9t4AAAIABJREFUEClHPXP09im8gjhSdJoOm5eTLwtBI7UcaBqsD8RcA4cTHumXLGWCYLmU+bWgBOgSLBiDKdaPYhlB5Jeujyxvx+Xbl2caKRX6L6RgfKSMkIrEtDkw12D/wRQpBXFVkuhgdbQyb8cFMnBjpGkudtjXTJnPHINCMdhboqQU5UijhGQDinUVMJ0WLduhTwo0npIM1dPKStNTkTRthnGeOjCVOPoTi65ElOOIZjMjsw7r8twzKajGEps4WtYTCY9QEpmHpFs8rXKoxldynor29BmIZ1KatYh2JEl8yIIyPsyrt8caFptkNiPqeDYlCeVmhk8tHRXuLEpCpMJ80Qqq5VApsBQJskuE0c8EhoaG+NVf/dULkiwCWFxcfMttaUVuzZ49e9Bac8MNN9Df33+CHeLb3/72MWQRhOyC733vewBnhTSy1p7woc17z9TUFFNTU2RZxmWXXcauXbted6B0pVLhve99L9u2bSOO33iovRDipGqkWq1GrVZ7w+2eDN575ufnj1H9aK0ZHR09q/PZe8/OnTtZXFw86eOdTget9SmzKGZmZnjuuecYHR09pfrrmWeeAeC22257U+NfoFqtctddd3Hffffx0ksvven2ToUtW7YwOTlJf38/69atu+hshpfw+lEqldiyZQt33nknt912G5s2baK3t/ek6tTjr8Pl94FbbrmFDRs28I1vfIM9e/Z0lZLLj42iiLe97W1dkuj222/nAx/4wAntXojvX8fjrVLTFCXuX+u5du/ezdNPP83IyAgrVqxg7969ZFl2wjV9MYz1hYAsy5idneWqq67ine98J0IIrLWv6x55PsZ6OXHTbrd5+umnWbNmDWvWrKG/v5/NmzfzxS9+kQcffJA9e/Zw+PDhLtk1ODjI3/zN3zA+Pg7QtS0ODg52FVRnI8fqzeCcE0Yyzz8RIpRvL6wxRXquFIHmcd6HqlJ5Pk3uOqLgjcKiOzeh+aXcoeXh16L721LWSrHNH7dPsa07vksNdYmm5fsK4aklbX5h75Nc619k03jCyNpBotFBbNMxNyOYOrxIZg1JYhkYVJSrMVPW0p5vI+vQankSD1jDgGjR2LGTvtqrjAz30umN6DQyylKQpZ6o6kgSRdt4ZqwFDZvaBxkvj/BUdD037Hsa6S0IiY8jNDJIRoTHGk87MVT7YnoHSkg8i0ebaK3IfLD/2Egx0zYkGmqJR+PQxh+jTkmtQSIRWhFrRWbyDJjCsmcdI7FiaKjCohQcXkwwxpB2CPlHGRjjERYqHnqFYLCimOiLgoIrsxxoePZGwS6H8l1Fi3DQbsEhYdk8rmnPC1odT2XUY+dDmPNgFPri8eAFmQ9VuTyenkjR11ehlabEzqFVCLzO/BIB4kSIKW87mPPgjScVno6AWIPr13SyFF2SYZ6KYKksFDfBohcGzDnXLcXuivkpRNca53Oy0+cBWtaGbCiVv++1OoZajyTznjnjaBjHhr4aSE9mLK3EdHOzlBAcbDvqxuF9qIompKS/rJlvJxRVBaGweobrT0mgLGjbMFU8+TXmwr9CRVeojFg2Fwoln5SBMBIKtIbBgRKzzTY95RiBJmklSCXouEAGLrXkQ+UyB65j2d9KOAis6qlSVhGp0JRjTRzHlKVEeomOJAuxZnouQztHfxShpKdUUdR0CZV1sNJQt5a69xzMHGtcRE2q8NxaYjKPkfn5UoJG4qjGinrmyXBUSwrXzJBCkAjPxKKh3MmIjAvjYT26CdW5kLMU5QHmTgic8OjUUSpLpM3osZ5fSB1N70gE7E3CvBsvK/qUQ2mIYkG5IpGRAiUQ6sKwLV3CG0d/f/8Fqywq0Gq1aDQabxlh5JzjmWee4Zvf/CZZlgEhc2b79u0MDAx09/Pen7KaiLW2Sxodn7txtrFr1y6uvvpqrr32Wh5//PEzPq6vr49f//VfZ3x8/IKdC8fDe8++ffu4//77j6nIorXmlltuYdu2bWfVXvncc8+dsjzyc889x8aNG4+ZE8ejVqtx6623cv/993fzHY5v55lnnmHDhg1ceeWVZ+U8RFF0TpVcV155JR/5yEfesCrqEi4+jI6O8ld/9Vds376d4eHhE+wmx+eunE4hUSqVuOKKK9i6dSvW2lPut1xRtHHjRvbu3cs//MM/8MlPfvK0Coafd3jv6XQ6tNvtrurr+PNRnK8sy5iamuK2227jyiuv5JlnnuHJJ5/klltu6YY0X+zjfKZB3Gfjebz3zM7O8tJLL7FixQqiKOKrX/0qd999N+vWLVWYO12fjrfsnY/+Syn50z/9U1atWsXY2Bhah/XN+Pg473nPe0J151yx6r3vqv4K9Pb28pu/+ZvdPl4Ic+bcE0aQVyILq04nwArfVV0UY1AsXovcokLtUFQfEj604xG4PLS5q4gQxcK4MAEV6qLl2iO6a9flldDEcRuK9mT3uEA0lEzCtQd+xJ3yaXTN0GlLdu44RMvtp55YDs8YMhSlgT6kTZF44kigEKx0JZI5QzOxeDyXj2sGBkO7JuvQOtzCOUnSsvQjyKSjR2dEsULpmJbx9EvJurJmX88Kvtt3BWMv7GQMiRMSR1gRLyzCYt1TLinWbhxA+Axng2oJJWg0EiqxwjpPM/E0U0tlTYW+1b10plq0ptpk7bDIDefD4b0NKp1IUpaKjvV0vKedOXoyqFUkTS84OtNmNrFMm5SShU1CUPcwJ6BvMGJdj6AvhkjrkGlTUSQdhxYZRxoJkQrnQOlAAmU+KM46dThQ5MY0oHcEVE3gG+Ecpc5DGXTqWbQhbDuSgmEh6I8VB1b0kMy0WAWUCGSFITxHQew0laclBcY4eiMRMm6cJzMGqYMySMugFAp2yiDPCSHuS6qhgmgssoyWxSQtzXPvwQqMDcRej5ZEUQhWLvVCq5VxtCPJjEALQZJZykqTGdclbTrOs9AxdHKSygBtZxmKykSdlMyHcRCEEPZCPZd6T6KC2svnpJcDWHa9FbazAgX56nxoS+dKKy2hVpb09JRIUkM1lrRbWbDxCYnXCnLbX9GuICjIHmklXB/HXDM8iHfQTiwaRZRJSloSRQqfeMqxplOW/NB5KhIqkaZai6iVIzIf4Rc9+0yL2Y7BGsthJ6hnjh7nUSiElOgYnBfU4pjIJyRJm2ZqUTl51TEpgqB+Mwaq7dBfk792l98zIiHoQxDlIe8GhxWwsJjSbAqqsUBriRYCHUlsHgifWUeKwJc0vSVPXApEGJFEaIE/T1UdLuHcYWxsrPut0NnA5s2bux8sd+/ezaFDh44JSS6Xy0xMTJwQiHwhY3FxkQcffLBLFgEcOHCA//3f/+WOO+7obhNCsGrVqpNWEYNAGj3//PPceOON5+XD6qmUMKfC2rVrL2ji8GSYnp7m/vvvP+G1ZlnGQw89xMTEBCtXrjwvfVmzZs1pbVhSyq7N42Mf+xj79u3jvvvuO2ZeQTh3Dz/8MJOTk2ctn2X9+vW89NJLb8qWVgQSF1XYent72bBhw5uy0F3CxYeenh7++I//mHvvvfe0KrhC0fJatqhim1LqBGVRcdzxKCqmfeELX+D222/nHe94xwVx33oz6qFzEW5ctFVYpX/xF3+xe48/2fk4dOgQTz31FNdffz3XXnstg4ODHDp0qEuCXwhj/GZwvomX4kukvr4+1q1bh/eeK6644pRKvFPhZDlP58qmVqiDb7rpppM+/lrKqNciiN8qnPPVyvJMlyIhWgqBl55ILC3CuxWs8t28D1W7CrbHLWvP+2Bn84USiZxwOi6lKByzzLqWE0siVzXJvFLW8swZueyYIlRbCM/mIy/yS60fIkptFhYMrVhwuJVxcN5weMrgHNR6YuK0BSYQIEIrVoxWWT3cw8HZeax1vGOsBxFVmTUNVBTorFIWAq9bMczPZAzHisyAJKEkBSv6IsazUDb94KsvUxt/hSQVGCQmg46xHFlIma4bVqyssWKkjLMpSZphjMOnwT7T8dBuGzIhqCeWzMPsbMLlVwyzZrhENlji1d1N9jVTepzAWUi8IYoCYZdmnoZ1JDiEEqSp4EAzo9WwRFriKn2sW5gjsZ51saBTgpXrexhZWeHl2UU69ZR2yyCUIvYGj2Koonl72/CcsyzYUCELIYiVQBEW9XN1R0UGMqmROPpGJe0GTHuYkHBoGAZmPCYVQXmkBRVAtlPG+iocVYLDjZSVtRgVSUTmAhGZh3UvDGhkCcgcrczRrzxJK8NIj45kN3NLdKdK+D81nixzRLHqKtgKDV2RcVSQRlKKXH0kchIitBbCxyUlDY3MMdP2pO0MASSZwxpDX7kU8n8AhOBo5hBZUON5AqGTOZhLUmIlyTKbVwlcmve2LIlLiqhsMNYGVZFfsq8tJ1W9CORQofIrSFdEIIuK0OuhwRJKK2LpiZQkfI7Oc6KkRBmD9TJY45RARAJnoBxp3r5mmEFZZnGhTQ2FygIZEyuJ9hLrQ9D6XJKyI02peEm/1lR7a4hyDB1JxyfMppa6cWgvWHSeo4ll1Asy51ElTakk8Zkn0RHNpEmShdAtJcK1bnNFo8nvF877riqssBNWpaCmA5klAKwLuWquCD6HhcxTqkF/WSGEo1yRDMUSl0BqHPVEMNIrKZUlcVkjI4mOFeiLK3/kEk7E6dQQbwTr16/nhhtuAOCGG25gfn6evXv3dsshX3311YyPj/PlL3/5jKs3vdVwzp3U2nV8mdmioszTTz/9uq1grwdaazZs2MCPfvSjkz4exzELCwuvy4LU39/PjTfeeMGEnZ8p5ufnT0mMJUnCCy+8cF4Io6I6zKmglOLmm2/m+uuv734gX7VqFXEcn0AYQSC8zmamwzXXXEOWZXzve9/DOUccx6xatYpVq1YxMTFxRm309vYihOiO99jYGD09PRfdnLmENw4hBL/2a7/GH/zBH7wuy+TJFpDL/z6VOmn54865rppBCME111zD7bffft7KkZ8pvPfdylCnI8jORwWwYvHe19fH5OQke/bsYcWKFSftg7WWr3/96zz88MOsWrWKF198kW3btvG+973vZ8pimiQJaZpSqVS61bvOFbkhhGBoaIjf+73fY9euXezevZvLL78cKeUZWwRPh/NJzLzWvD3V9Xyh4DzcJTzdsfF5OW4R8k9AoGWotKSlJFaeJK9gZLzIFRB+yS7WVWksKZGsC4vlsAjvGt66KP7yx/0NoSz88v38SY4rAq7XVzpcFsGs9diW42jdUreCwd4KWZYQRxHKgxcGIyNs6hFCsaZWpjzez2ovGFpM8UDqQSnBPE3woCOJLgl6KxqXOpLMUysLhINBZxgoa6yz7GgkNNKEjT/+FlEPHHWWjrfM11OarYzVq6pMrKyQJhlpJyEzHpdBo2NJrEXFkqxlSbzDSUGWOObnU2bn2lR6IrzJqGiwkaftI2TdkhmPtJZatYTqGBLriGJBLCVp5GllUBaaBeto+oxMK8reYBDEseSKtT3IWPFMK+KJtsHHCVVlGDcR/aki7Xj6Is2GDuwxsCAcTofzVVISdF51zIKznkYdSgOOLBLMWugRioby7K8Y3p5qLrMhHwkPibH0Jo7dxvJSkvKhSkRJyiWbJNCOJO2hmJJ1IC1JYqlbjzcWpxxaKEQ+qwpiU4ig9PEu5A+ROZSSgfSkUOWEGbVs6iNEUJV5PC63PKq8NH0lVsw3De0k7FuOJYsdQ0UHgrS4dhDBQqfcUqBy0dZiahhVkii3fBYWtlhJqkNVsprCqQa2E8gYmZNF9vh7V0EiLdunsIUKHa5dpQSjg2Uyaxgol0itodlxeAdWCWJh0EDi4nAlqXBNVZTg3UM9DMcxaWLwmaMkFUJBZEF6gUs8SmkWsoyXpxfY1+ywIDwr4ohKfy8qiuhYaArBjDFk3lPKx/1Q5tgcaWqViGpJh/NjHQsNQ5aFb4YLBVvmg+KxUBSBX/YthMALQRyFFy5jWfhng3IqP6feBbOhkApnJFnq8dZSrnlGaorSQEwj8bRbjlYqGO6VxHnIvNYKqS8tFC5mSCnZunXrWWuvyJoooJRieHi4W1Z5Oe666y6+8pWvvO5qUxcSTrZg2rRpE1dddRVPPfXUCY8JEUrTv9kPU0UlolNh27Zt7N+//6RExKmwevXqs6o0u1BwIZRlllJy8803c+ONNx6joIiiiImJCX7605+ecEwURWf1Q7eUkhtuuIEtW7ZQlDY+PoPrTHE6YuwSfvaxevXqE5Rvhf3m+Pn0Wqqik+FkxNLJ2hkdHeVzn/sc1Wr1glmgFv1YThadLuz3VOTY2ULRvlKKa665hmazecp9Dxw4wJe+9CVmZmZ48sknWVxcJMuybtD1hTLGbwaFRWzPnj1cfvnlDA4OnvPnW7lyJVEUMTU1xdzcHO12myRJuhUAX6/6bDnOJdH1Rh67kHHOCSOXl7cOCyy/LA8lp2SkQIoQNlxSnpINldSMC5YOm2eweECKpYV7UR7b2LB4zly+2PRLBNGxgda++/vx5JEXS/0K+y6dTAn0Ybi2r46atSTGMd22LCQw3lemnTrGqgrjHCkxLVFGlDRVB/0RDMYSUdaoSOJMRr1tSBzossZmFusswluElpQjzfh4hX2vtshcRNVLdMPSaRn2tjOe7xiskAxkLaY7ijQ1eB9sSRvXVumtKRozdVLnMFJirWS+2cF4h48Ui22Dd8EKNZ84tIByKpg50qRf1xCZJTGWTt0wKywjWiFyf1OfUlS1pGRBe4HPwMvwwc04T0c45htN6jh0SVBXgt5I4vc1qGqJ0oLMCg7VPZG37C9ZVlYEk6V+qgaGGi069SbewaJz2JxskSqoPHQssNaRpZ62czCsqB/xHHCOcgL7tSfqsWyuS7DhzHYs7MXyUjsj9ZDg6dOKzIX8ISGgMVSGikYnJgRYO480noYLMyUyHiUFXoa5HMKsizBoH2KjhEeqQBxY7/GiIBKW1HLde1UeFORziZyQwbOWGE+SODopVLWnvx8aqaEWaTpZRpKTHUJAqsDhQsA1gbiKl6n4tCgUdqGqGN6jWxlpv6aFxLll6rzcYlUc7skro7G0vei6lLkgRoaqY5VyhLOOajminnVotYPdT8eW3lgw09bdgG8hQsB4BeizgiQ10HH4zOIjiXSeuBRjjKcUKzp49i82eaq+yFFrOOrhG3N1Bnp7GY2qtJTngEuZco6y95icy5nyngUHI7UKQgliwBlPc7qDs0WSFBgRVFAd6zA58aZFqGbmCQHhJRXGoOND9cYeFSrNoUSw6YlCNRYGU6SOTubQCiIv8JlHKsdorybr1aSJRXiFQhGhUU4izCXC6GLG4OAgq1atOmvtlUolNm7ceEb7TkxM8K53vYsf/OAHNBqN0+67evXqtzTwularsXHjxq5KqujTe9/73hP2lVJy3XXXsWPHjhPIsG3btvGhD33onH/geumll163Ha2np+cc9ebcolwuo7U+paLrVAvZ84nLLrvspGHncRzz0Y9+lAceeIDdu3d3FwWVSoXbb7/9rJell1IyNDR0Vtu8hJ8v9Pb2cvPNNx+j6jnZYtY51yWsoyjqqoLeDE5GJL2ekuTnC6/ndZ5Pq5FS6pRVL733fO1rX2Pnzp3EcYxzjvn5eZIkuWgJglNBa83c3FzXWnsuUXyJVqiPpZTdPKA3W7XyZ+28nGuce8LIL1dZHKu5KIRDUgZ7iJYCrcmrqIV/Jmd4gspBIHMCyXpPagWpAWk9siCYcjLJdVfrdKumeYJtTXbvLb67TYjlCiOP8LkCBM+1/jCT9V0szLaZx9BJHBNW4+dTdC3YiXwCLnXYLEH6BKGASIKR4ByiHGGsY3auxf/P3pv82HGd5/+fc04Nd+jbA9lNcdJEmaJESZAs2VKs/CzYjo3EiGMLjgEDcRIgyCJ/QBaBkU2yMpC1F84mCycOAnhCHMO2/LXjGIoVx7H1/UqyQ0kkRUqUxBbZ451qOue8v8Wpun1JUTNHqV+h1ex761adOkPdep96nufNgcSmeC8U3iHOYbGUUUUriVmcT4iGIJVDebApdBZb3DpqUQ1hXkFWFBSlY7al2L0zJYkUg0FOiaBbKVnpGQwzHOCVZjx2FLnDSAAUeolmWIZk+eyZgr1LLWIveCWoCkQ8u5cCo+Pl5SGdyBC3Imyq2RxZikgTt1NyXzAqbTArd0KGxxuFa0VkacTaSBBX4StH1ylukJTIQlIpjhU5zyc575Mu7cLTNoZdu2NiDeurGc4FryqnBCUBuEGEcQYzO2F9TSis41BmUB3NEeXwM3BgYEhqP6NXCstaZtFKWPaOXWmM8RpfOTZjw+psYKFIPRmNUZjaTFoJWO8RpdG+oRJuGV97D1XlMWoL1JxozZVQ+4vTVLQOUsgappzSpFcOqnGQNVYecg/G+sDG05q8tOSVD5JJDZuVpxBIBNoo2gZ2xJr9HjJgPVI4CX3VqqvERQpKE0A7LWHhu6m15aeQ1Av5GCmCtC78rZjtxsRJhBKPjhTHX1jDVkK3q1CxsDESikoHMNY0F+ZQNS6vKoajAgYOyR3KQRzF5N7ivEd5Td9bHh9u8kSZMa6P/8u8onP6LAeyihd9xX+v9BkoR6ZDP3jgbOX5ybE1itJxcM8cLaPDWFUuSPjq60MeKawPXlVhvGDsQ1/FNTBmkiAZTEzwmPI+gKUWYSxCaf1kjOMamMtdAJfM2JNEEYwFcZZOy0CsWB5bdqHQCFIDjdtx7cZtt9120anmb0ae4r3n2WefJU1T7rzzTl566SVOnTr1mtvfe++9F72y1luJNE359Kc/zdLS0qQS1gMPPMDs7OwFt19cXOThhx/me9/73gTIOHToEL/3e793Waj96+vrb/kzvrnQX2OxZ88e5ubmWF1dveD7x44d46GHHrooFceAt/VE+tChQ69pOt3pdPjc5z7HkSNHWF5eBoIP2C233LKdEGzHVRef+tSnePDBB8957bUYQMaYdwQUvR47sLlevVNJz6WKdwoaXcx2THv1vFYJ92PHjvGVr3yFqqpYWlpi//793HTTTezateuSGuZfrpjugyRJWFhYmADyl3LuNGbwzUOn5uFGu92erI23Ole24+3FZQCM2AJuGqcXVefL0sjCwoVSq9qkVzcsoi020bQZkhCSt9o7lshB4kMC6GqZkG1YFHVGHHyOVCgV3kjbpmRnSGPQXTe8ZiykItxXvsBgZRVb2sAEGiq88uillI6BMvdUgwoZ5bQ7MaoVE9fG0XmVIGWJ7iR4pdgYZGzmjnQlI9oh+BjEBfNmXwpJpZgvYsphQQXITIxNNbZvWRg5TG3s3U2g140xEVjnGXtP6QXdSckroT/IcSisgrxwlIVHA6lWzCcRqShas4oV6xlnjuGwouc9ysBsaihySy8x3Hj7Xor8JRKl6O7o0u61KE5tsHx2jBuOEIQCwXqIjMJaKJxgpAF7goRJYoMyQlJ72jgv7PUdThYZ/0/32Z9EzNiIfNWRzTiIFbrwOBfKsouqfWVQ+EpwM57WguaVFaEcWtK2IveKI+Lws3CgbzCiyAYlRd2WU2XF4XYrSNEwnOoZ+pXD28D48bW00ekgFVISODZh+gY6j66lZo1vVlY6jDYYIxNgEkIlM9FboFFXGxbjFEfop1mV4iphrEqGvsRJTT4KhC6KIjCXxHsqJxR2i5lXSTAeLxSUCuJYMd9R7MiCtGoWKGpgtIWQKPCZRQ0sqzMxhjy0S7aqoDXroLFeathFjcdYc431PvTF0kILj9CKFOMq5+WzWfiADhXg8jKYqwfZVjiXjoGbujE7ex2cFUZFSVVaZrwjjyzWO0ofKt2d9pZHRwMG9VXDKRgi/Kg/Ih6MyWv/KacCJutE8CjmlGK9cPzy+Q3yrOKG+TYto/BVSDo9NYYbBwaQMmE8Kx8YaIkKldDiWNFKFGliUAKJAe0UrUgzyoWy9BP/KaUhjnT4MQaxDqUVIzTDkaVXQlUJnZbGa8VLmzk72p4FG6PN9pfXtRztdvui3oDs3r37Dc1vvff88pe/5P/8n/+DtRatNbfeeiszMzMXZBrdeeed3H777Vf8RqndbvOxj33sTW2rlOLgwYP8xV/8xSSxSdP0qvPamI5pY/JrIZrKdadOnXpdhlqWZRctGbPWviYw9UbxerKUdrvNvffe+06ath3bccmj0+nwhS984VXX+GkWXwNQaK3fkbfVG63Z6X1f6e+GixGX4xymwbtpgC/LMv7+7/+eY8eOsXPnTvbs2cP8/Dx79+5lNBpRluXrmvlf7XH+XJqZmeHGG2+8LN/HIoL3nk6nMzme1npy7/Nmx/3dMMevdFz60Z7StKipP0Nhslp2dB5Io6YZQTVbqMGMJDhXI1rhRIhNDRa5kPTZmqVROqnNimvvmVouhKiJ0S9N06YS4hq+mkh05ijZ2X+ZrAqVxdZHwgaKXXtbRHFEWQRJSitxtKOYLDWUzuNE4dKYs7lnT1ag2h1EK0oHNnNE4iiVptJC0tPBZ4YEMzCsDUuK0lMlhj2tiCqrGKzmGA/dWDHbMXRTQ6Rh5D2iFD6OwcRsbuZkpcMrRYVQlB5rwwknWtGLDV0TkSDMtzRrmaftNWdP53R2xYiC+UQzKhW9uS4j68kHOZ1eG2KDdcILqxmro5LIKOJEo2KD8oJYIWknjFxFKQrlhMi7IJ3yoPBB7lezvqJYc0PU5Wh/yInYsr+tmSfCKMOKFFijqVxou6vlX5EmAEG5sLgLzm7AhhWuE42gGDk4gqechYWhYjmrJvPodOVZ9Y5URZxoCy+HMlloYwL7x4Ny4ThxEqFsNamApglsucYIWUkAOMULRSlEkUfrMKNV2ACDoq01h7uzfGBpD/NJl35esrEyJFUJY2Pp+4oXij4ryZioFoM5CeDVuBTWUxtK1tcMHaVqc+Z6nRQIa044XcGC0bQ8xF7QtbRKCABU5D071wqyJCFSW5K06e8Bz5aMs1kPVrYAVevBWDAtw2wvxXmh3Y14pd9nPHDEsQreWFZTeVUbhYfBbn1AAAAgAElEQVR12NKKPe2Ie3ozLCYt4p7QixJeOTNgnJeUhaX0wVT9jLX80he84t0E3A0G1VAAhQ8m7EoFRpDSkEbQTiSAQIWmsvDMyyNeWcvZ3TYBuPYBOLRAojUuEXCQW493jpgAQKtaBikSgL/YBIlaFCm6vZiVdciGBZVVxDoYtOskIJpJW9Nrt0mVgsrh4wipHFnucNaTtgwzszGbkWI4qtg7c+3eRLzX463Ix95szM/PvyGT48SJExOwCLbYRvfffz/PPPPMBLjYsWMHN998Mw899NA1WYGpAQIuVbwbnvq+3fDe84tf/IIf//jHl9RcfDpEhKNHj/LCCy+8pc+1220OHDhwiVq1Hdtx+WJ+fv5V3xlNQvxWDHEvZmwn0m8+zgfwRATnHI899hjf+c53mJ2dZffu3WRZRlmW3HLLLeR5zubm5jUJGL3WXDTGsLS09IbV+y7GsZ1zeO8nzK5mDBr23XZcvrjkgFFDupDpv6d+6/qPhjukUBNT4fDKFmjkayPs2tM3GFJriD1UOlRZqjxEPsiXgil2XQVJFNoLptkXUwnzefNcNf8XmLMZaTlAt1JeWC3YtJ72jpjKhYN7rYhbQiSenZFhrDQvbRaMTYSXIEE5lJW05meJWhFl6YkExCgk1aA9w4FnTiJK8axby9AqWt0uiS+xwxK0ppUYcIEBZK3gkppxk8ZIHJOXlvW1MVXl8Vrjo8CCqJzgbeijjta00ZRGceDAPEeOrQKKlvWwaSnmI5QS2i1Fr1B05jukO7vM7epSZBWaiKOn+ry4WQDgazBFvDAqA2CnlMdbz0BK8sRugUUSZFFJrIPRs6qfqnjFLhXz/Mjx0kyJnteIibAumEr60uF9Df6JYERhUNgKoq5nx7xiY10RGRMYOSKMLTyjPbPdktIDNoCPfQtHy5KZbswpHXyylBfQDRAU9q0CjoCKAsRpa98ikQDEQM3+qYHH0noSq0jiRrYldLzm1qTHTa0Zru/O06LD+jBneW3AyvoAFUWUCtbGGS9XY5IlRSs2GK0obM2ecbA8tMy0CzQ1QDW9BsKpkQEvV55uArcojQMGCmwM804hNegWFY65dc9KR2PwE7knwuRcGl/nppx8w0DyQGXBeMXMnMFEBvCkCZx+aRTei8M+CmvwbosNmIri/b02v71jnr2mTZ6VFD7HWEVsDBuFBevZFM9xb3lGLCv4SeUytdXMrTWqQqW2xEC7Ba0WxElgP+VnPJSG3AtnMku/sKRaUTkYA5kT8pHFIURaU9XrPVZh3HWtLIkMgWUmClOvQYtiXLq6Mp3gCodShigWNIosrzBaEfdaaKWJY4X2EVJ6VGmxlVCVQq+Xsj7OOLIy5NbXvHpux9Uchw8fZteuXZf9uHmevyrJ996zsLDAn//5n0/eS9P0mrxJvVxxzz338Nxzz3Hy5EkgPP2fm5vj9OnTr9q28RO5FoG3C8WTTz55WcEiCJV1fvSjH71l6d6dd955yfy3Gp+Rpk29Xu9dM8bbcfXF0tLSBSWZryWrmQaR3mpS/noA1DZI9NbiQpI3pRR5nnPkyBG++93vsrCwwM0330y/3+fXv/41MzMzfPSjH+X2229/lcH5tRQNoAnnMqya6miX6pjN77Iscc69ik30WtLA7bh0cekBI6W2GDwTptFEnFYDQ9OTbiobVo2fyhYfyG9tsYXz6OA1NEkqa8ApmBSrABh5wTUgkmz5HDXsJS/nTjwlYJTwvsEpTDGksFBpTTcJJblzK+RaaKcJBk3pPTqG69OExd4M//fUBi4rWc8jlldzbtzpWN3MKStPRGDKKC3QUsSpwQ88w9IxVAmz8y32dQ0bGwWbmUWMpt2NqbIyMCA0FJVFpTE5is1+zmBQkucelYAYwdqQ4FsLxsG80cxoxch6rr9jntWypFIQV0LPKDZKx8ZGxY6Z4DvTNpq016LdSblh9xwbKwOWx44nTw8Y+wCwVE7QpWBLx9AFeVQuwRem8o6ycoRSnlIzjCAxARiJo9Df1oVxm1eGtaHlJDndVOEVWOWJYo0ut4zNvIB1QeaWj4WlRcgz1ZQQA0LlvKyWJPZ6CjsIPkGlCMecY7aj0BIR2+C7JI1xsQKvhEiHCRCkWKF9ufV4L0RaEWtqPy4mnjiV9cSRQYliQQx3yQwLvk1Sxbx8ekBWbjD0JSNryWxFkWWMrOdsUVDOeBZU8OVwtaeRqxk9/RyeWSkxDlLV+HDVc7QG10Vg4OBY6dGJYmQ8Z4ywby5lJoc481jn0T2IxBJXnMNUmq6SNoUhbRl203g3BW+mudkYL8J821CJY32jwgOxUbhKU9mtL9dUKw4lEf9fp8suSdjo5/THI1CWFoZ+bnmmKFgTx8t4zuAp6uN7tcV4omkPNVikIYmh04KkFcAqrcEhlG3ICx88hxC8KKyEedFI3rRAW4cys9YLhUCn9qLSsAXO1Z0SEby/ssJRVrYGuWt5ovcBINMK52CUV5hI0UoiKvEYgTQ1REmEHZdkA4srR1QeRsU7M+3bjisTaZrywAMPXPQnXG9mf91ulyRJzilJH0URvV7vivoUXWvR6/X47Gc/y49//GOyLOP+++/n6NGjFwSMRORdAxg553j22WcvK1gE55r4vtk4ePAgH/nIRy7Jk2QRYXV1la9+9asTc/WPfvSjPPjgg9uJyHZc9NBa88lPfpL5+flXvTctRYMLMzYuxpzcntdvPy4EGuV5ziOPPMKpU6f4/Oc/T5IkPP744xw7doynn36ab3/728zNzXH48OEr1OqLE6PRiKNHj7Jv375XVQK9lAURyrJkY2ODbrc7Aa601uewg7fn9OWLSw4YBXNXVXujyCT5pAGKzklW5VyJmLx6s+bzInJOwt4ktg3IFCnwdQU2I3Uy6YPnSQMYOWFilK1VSCynLweL1Yh7Vn8DRc7yoGD/3lnOnu1TaY2OYzIX9q2iCK8jTvkeUTthZ9ZnqbSsZxaXWX79v2cxVtNJEzrzKePVHJU7VBaSUqcF3daU3iAl3LzUxm0OGYzLIIMSIRHFTKKRypNXQtqJGJcwqkpGWUVeCi5ktXgHthJs5dEOFmNNz2jGXlEkoMYVZ0738YXHWGFDhSpTm0NLr5uglYTKZjMt3Kjg5ROr5IXjidWM1cLW0iXBeEA8I6DvwCqh9FAiFE5Qdout0njjaAVx4TH6vOE3wfQ8Gwp5JcymwRuGSDBeIy54MHkVQJVIFK4A3RH2XGdYz30N/tTSLSDk4sJsF9aHYaxHlWcGQnUy/BZziFBRTEVhElkfKvBFUS1HMorMBYAJ0UyuVzXbrayEyAh7WhH3+B6pMxR4xvmYPHcU3pN7RyaOrLLk3rNWWQY4Om1N4YRO7ZcjNSrayMbGWfAhipMtqeTkGlljqw5Yd/DLzGEU7O7GdK/rkQPRSkGyUbI853nJFnS8oqNh5KeYRUytMdnyMZJ6vcT1ktVaMTOTUDlPr53w/PoaeQEmCmaAxQisC43SAje0DA/0uhgPL65sMsxyRBzzSYIDitLxnHIcEzsBg6dBsdq7+5wwCtIY0hTiFugoNM76mrHYEgol9IFYhHkfqpk1LK1YgreXBWztCRbmluCb/vSKsq6QZ7RgnTDKLHESccdcyqDyrGaWUeUC08sJWnuSWCNe2ByU+BmhnURY76gqRyuJaM21oHQUeQniic4Dqrfj2oiFhYWLzi7auXMnDzzwwBtud+ONN/LJT36S73//+5RlSRRFfPzjH+fQoUMXtT3vhej1ejz88MOTvy9Unh3C08xrtQra+VEUxVuWhV2MOHHixOuWpD4/br31Vj7zmc9csqfzw+GQb37zm+f4N/30pz+l0+lw9913b8sdtuOixk033cQf//Efv8r3ZTrhnQYlXnnlFZxz7N27d7LN20mOtxPqixfTfSkiJEnCrl27uOeee7jvvvtYW1vj9OnT7N27l9XVVV544QVOnTp1zRZEgK1zXl1dZTQasbi4OJnDl9JsHMJ31XA4nFRJi+N4wpq+3PN62vT7vRqXHDCSBgESqZPAGjaq51jAjsJrDQg0RUaaKvcdTG1Fpsuaqwlg1EiWmmR3wkSYnGgtddOgvATpjQQAQsvWkURCcqlE+GB2kn32Ffq5o3SObsvwohe8FaIEvINhZmmlMaWP2Khihrse4L7lx7h+qaBaGZFZzyAr+K8nTrFnaY6lnTOsK81oPUesoEuFKE1RwXAsXDencZtDTq2NA+gigq0sPtFEBGDibCV0jUNHnqISikooJSS8VIFN5UtIlWapo5gxBhtFjPOKlhNWX9yglRgq7xk5jzEKIohjzWjs6RroRAbdbiEeVoeWzUHJc/2csulj1ciWhFIUpQhWhBKoRKioTaAnmkShMR0vgynRpGJYFAUm1LgeL5crNpwP5tAdg8SBoSS1B5V4EB8qhlUZtNrCaN1RVQEUbJhrCiGzoGNhtq3YHCuySijyEhe3sFYoS4dC0FENQhjIy5DMx3E9JxQkKJyB0taVtWovI2lYJgKRwPu788RrwsBZvLeID8ymzDoKPIU4xt4xsI6+OFqzGp1qxpUjaWmsbJlMN55CkdQEqoBVTfh5kzV23u9eAh9ZmOWg6aGcYDsJlStZsSOWxxXdKPRLwywyDaGvXleND/P090DzzzRRpC2NF4dVjrMbGXhIY01RKMqKxmGe1MBd3RYzTjHIC8rSUVlHahRaFNZ6nAgWhWOK3aReDV41K1QpiGJopRC1AsCn9GSK4QRMwzRTMFRhbs55RQfBqAB6RdJ8ZovvaCUAwJVAylYVOWeFM+OKJFJ0xXPnQko7MRQirJSOk/2KlcJRWqGoLJ00Io5gNK6wlaUdR+hIkTsHNbsu6rQY9S1etlgi23HtxIEDBy76jcP8/Dy9Xu8Nt1NKcffddzM3N8doNKLVanHgwIHtBPcixE033cQvfvGLt3UTfMstt1yCFl2aeCtGoYcPH37H5qbee5555pk31a9RFPHQQw9x3333XVIpx2Aw4MyZM+e8VlUVP/jBD5iZmeF973vfezo52I6LF0op/uRP/oRbb319AXqzPrTWrKys8OUvf5kvfvGLXH/99WitLymbYzveeqRpygc+8AHOnj3LwsICcRxPrltJknDw4EHuueeea56ZOjMzw0MPPTTxEpqOS+ldtLGxQb/fxxhDr9ebFBm5UmDR9L/fi+vw0ldJa8pWNz81cLQlIGreD7+9NOBCiEl1JhrPmAA2NeCRl8AscPVrXrZYSlvHbFhNEsyKtUI3J1+rmXRtpNSAUNp5bhy/hBXP6c0Ss6CJY4N1DptDFBkiZchsMNP2paMajhjN7+N/ux/lkPt3Fm3J2czinKfIPUdPrrJ/cQYRyGcTwNOdT8AaNl4YEYtjJta8MihYyQOQESsovcLmwob1jGomSmlDxa6idFivKMQjZV0VzkPkYamj6WnwRpOZcP6zRmG0Yv98yi/O5MSRworQTQxGKVb6lnQ+CsDaICfLHX2rWbEKqzWFdyiC8XTTd6kOJd6lhuo8ganhm76vx64Z62BYHDxjWpGinWisFwaVo3SQILgKilIQ65jvaUgUym4l91oFQ2KlFKV17Jo1nMz9xHtHiUzmzrCE2VToJAEwysYltCNaYnHOUXpF6hxUFTrSuEqIYj1hRzkveB/AhlBeXajq/qcGIcTDDe02S3GLF4pNxt7hjYIasCjEU4kn855MPDkeH8HCYszQ+rqiWDDcbkrcN+nf9BxWUzS65vWJWTwBPFmMNQuZUBRjYh32k0QGUQrrYC0P/kjNNbABWKeBp2ngtvEZ80CrpbDekUQxZwdjxqOgNfQC48IjNE8eYMeMYlc7QsbCqKqoSkskkIjBaE3uLeviWBVHjQVO5oeu99kwnZrX4gjaNbMoTpiAkpPLuUAnA1yQkJm2ocosfQkMwjZBvurrSRQBykMuWwBRU+m+sB4lgrggabNaEVlPO1HMtDWzWtGTiBUrnKo9kayD3FbMtyOSNADB3pa02hERhiy3DCuQ0kER1t52XHuxsLBw0W8Yjh8/zne+8x0+/elPv6HZs1KKm2+++aIefzsCyyuKorcsnbrjjjuuGdlBq9Xit37rt/jJT36Cc6+WxGqtJ74bc3NzPPDAA+/IINx7z1NPPcXTTz/9prY/ePAgDz744CU3JX8tSV5ZlvzXf/0XN99881VdlW87rp1IkoQ777zzLc3ppaUlHnvsMf76r/+av/u7v2PXrl0T35j3YrJ6NYbWmuuvv565uTmSJGHnzp0cOHCAj3zkI7RaLaIoIoqia/ZhznTFvvP9EC/lHGy8i44dO8bq6ipra2vcdtttV7RQxYUqGb7X1uEl/zZsWD8T8KZ+fYrYtwUCTQFCMtkipK5S/9d4DYnUxsA+JHOVsAUW0bBXwoA25tigEF0DRCpMeKNC4m90+C11YmksrK70GR5fYWVkuffm61jdHDMuHKQKV1gqDTZOqHJBxp6yO09rYZbNdInjrmB/9R/MrK9SWo3WDhSs98d0KxiJUFbCcLNEmwQtHiWedmo43XdslsH0txcpkjhUVxsYzQ3zBiqh0DAaVDiC34+3QuEFrUPp746CTqwRbejs6IDzdL3HFpY7rp/hxeUM60K/REn4TF54BqVwcs1y146I7MyQjWGJRbOpQUUGocIQJHzBIFmRaGFWwdgHmY8SNQEG/dSY6RpwSUXRNop2rEmNIjY1WKdhhJArQSR4PY1zwShhYd7QmokZbWRhZCUAN0pBWUCrE1hE6wPPjplQqW6U13NPKYaFMJuAtQFkS+MSYyy2sERKU3mLjqEkAGpNNDK45roQWC7BC0skgEWo4NWzP2qxupnRrypGzpF7TylBaqeVohJh7Bwj5xl5wbeEONHY0iMKSl8DRxLkc83s9wTJmSdIw+BcM2g11VajoKUUg3GBryxprGm1Y6xSDJXDC5S1Cfm0jPNCbKIGhGpkWkpB2tIIQisxvLjWp6rCe6VTWFGICa3SAokONKZBWbE+Koi9EBE8sgrn2fCWI7ZgIP5VgJVu2jYFnMVRYBbFtWcRegrsqs8nsdAa1m1sQbIUoVY0+bAkr68kkdTMNglsIzykSigILKPcC4PSY1AUgBNPZMA7YSea1ISxOjWoeHq94oVNS6elSCIdtk014xKq3NNKNLn1ZHlJkmicU5S5IxahF8f4a/M+YjteI1qtFkVRvG2adpNUvxnQaDsufjQlkd+KZOuOO+7gU5/61DXzFFlrzYc+9CEAfvOb3wAQxzGHDx/GGEOr1eK22267aGDJ2toaP/zhD98UCDczM8MnPvGJS54YOOf41a9+9Zrr9Pnnn+fEiRPnsIwuZHq7HdvxZsIYw9zc3Fv6zPLyMqurq3zjG99g165d/NVf/RWLi4sYY96TyerVGEopZmZmJkBeq9UKeeWUIfM7kRNeDXE52z3t4XX69GkeffRRNjY22LdvH4cOHboifdi0qaoqBoMB3W73PVtM5DIwjLYYJtNJIZzLbGj8WiYsIpjKhs9lKTXeQ1aoDZYDy6hJoiMdSmFHNUBhdGAbTANFkdoCjnQtUwmAUQA7Ii2oPGczc8SJZiGNOX5mQGUFbTxF4ciVxnqHWMV4DNx1O6amzK3vvx2lDTt/82Oi4RqRDiBHiTBUQqrAW4/LHJWuiJXHE9gveeEoPNhY0W0ZKifk4rlxMaathFHlEQvegoqhlYbM2XghTjUtgdgK40pIU9i/dx778gaj3HHwhhm67YSXzm7U4IeQRJqi8vRLz0YeTHpfTCqSV/qMSyH3wm82h2TiSQwYD3Hdn6gwFokKZcdFKdYLG8ZSgRZFTOhfMYLrBgaHz4Ss9BQq+MTomnGUxIoMAoOqBvf6uScZGzarglRqX6x6HmgfJkmee65bMOSFIo0dh/anHH/Z8sqmq+WKipESWklAP2I8g9xRlp7EeJwCo3VgoLFlht7MDzeRuQXQQREAS0WQQF0Xxbih5XRe0HeOzbIikyAVTFUAE0ovZM6Te0+hBW0CUj1hRalgmuwEnGXi4xWxxbgJFf621sP09bNh4pQIBZ62NowQns5GHPUl466drKHGn6gBjhpwaBosqu2gJv5GSkGrHarcVdaztlFiXdigqgAdoXxYW7Mp3L5jBjeC4aDEljWLyEBmK5y3vFiWHPMl0895J2t8uh0CSQRJAlEKUQLorTZJvf6dg6QI64KWpn1jzGoJ80mEMY7ceqwCLYIBYhT7ugmjyrOSVcQi5D5ITXMV/I96JlSiG4sgTugaw/G+5dfrJStjixVFZGBcCEUWTLcXlcY52Bw7WoVnvhtRlMJgGNiGUaKpUBgDm6PLazy7HZc2Dhw4wIkTJyYmum8nnn76abrdLr//+79/zd5kXqvR3Oy/2bjjjjv4gz/4g2sGLGpCa82DDz44AY6AS0b1P378OOPx+E1te88991zQFPhiR5ZlHDt27DXf997z3e9+l89//vPs3bsXEeHJJ5/kV7/6FRDkhw899ND2+tyONxVRFNHtdt9wvjTve+955JFHOHPmDM45/vEf/5HxeMzf/u3fsrS0dM0yVt5N0bBMoigijsOj3Ob3pTAsf6+EiOCc49ixY7z44ossLCywZ88e5ubmrqgUbXNzcyILbQDbCwG37+YHC5ceMJJGOrNVGQ0aJlFd9UmmJGeyBQ8FrKhO1FWDHW19zvng19NUlVIqsENSo0hNqNoUN4CRDmwiVQMdASw593fInkMbY+vRrqJ0MNeLKMclg/WMyAtV6clEyJWnKit8JlSzu5g5dBiUCnIXFbF2/R0Iwo6nHiFxm7TikJa7RKDyJC1NmTWspmBuPRoWjEvP2HkKD/3C0VGKm+YjEiOMCsfYObI8nHMkgvKaVmpII4VHiKpg4FwqiJOYlbUxo7MjFudjbto3w5FnNxiWHq0hNhoNDAvPehZYT71IcbpfEZsRaZzQ1jGdSNE2mrIIBtGaOqmXBthQVB7G3lNjCCQqyMbqYcR7RZYJo1TodiAeg7KCdqHvCyWMXAA8LKG8eVsHFtNq39LpBMbHPGBM2HcodR/2DcKhG2LWNi0becn7bkzIj3vWhoL3kFeKOIGWV8R4NssA+lQuVNwK8qdGPhfmgZ/yxQrgEJPZaX0wC0+1Yt4bNjZzXKzpV5aB9YzrfVmlyL3HAaVAjuDTMC9FESqYqQB++tr/p7LBzHm6LVuATmDcNWBKaHe9lYeVXFieFWxb8ess4/i4BAXz7SlpG1ufa3DZ89l/zXJofowBU18xVgc5ZeHD305RVgqvNHjPfEtz51LMniSh2hCK3IIXcoTCe6xV9MXzG1Wx2cjD1HkMxCmGkdFBfmbS4F+kNeewi1A1qCVQGBj2hCr1MIC8TMDArjShdCVWXDDwrsdkUFjmOymbhSOhkQUKuNAuk2haBgqgdMJy5vnf1QxjhFai2cwdZS7EhGQrE8EVDi8WpRSDHLLKs7Mb45TBIizu7uJVRHU2o7yAJGQ7tuOpp55i79693HHHHSRJ8qZuOkSE559/nqNHj6K15v3vf/8lkc5dzBARxuMxWZahtWZ+fv6qT4YOHz7M3r17iaKIu+++myRJrnST3lZcDi8I7z0vvfTSm9rWGMOtt9562ebrG7EA+/0+jz32GJ/97Gd59tln+d73vjepTHj27FkWFxc5fPjwVb2+tuPqiGlQ4c3E888/z9e+9rWJZLSqKr761a9ijOFv/uZvWFpaulRN3Y63Ec13wDZQdHHCWov3njvvvJM77riDD3zgA8zOzgJXrk8XFhYmYJZz7j0pV74sptdb/kMTAVpIhGvZUsMuCj91Sqy2ylufC+4ootqdN9I1aKIFVZsgpxG0o+CNk5otlkojPWv2M2lD87vOvpu03GuN1TGlD0yDk0dXycceizBWQr90lArKylFFPWY++Nswt1CbLtehNP29hxieOMaezf9LpOsS7rVfTdpWOKexY1d7mQhnxpbMCZVSbDqPtkIr1bS6Mc55WklEUUEv9hRlKFkvlceVDhUH0KYCYq9w1uNVBUWfVHsO3TCLrTzL60UYfK2IjKL0MKhCaXijQh+WTjhrHdfFinYccUOScKYoqGomVyWCIQByKMi8kEkweI5R4VwJoJKdGlvtw76LBNotISkUxgVmlDWaonA4UTgJFdesQLdGA9ZHYBKF8oLSQqID0yl46Aj93GNMxe37Up5bzVkfF9y4X5OfgFEeGuGdQhmPoGsj7SBpjL1M2D7Og6plaRND9mbO1BotrYIczgqUzjMoSyqrcGgy56nYYr1V4omVQhQUAlkCqNBPENaH0ZDZwIZCBbZMO63bEmYpDVDUgKmqBusmRDxCP6+WwqPrOVrnYbwkAGKcd51tmEYNSqPYkuBpttaJqt+MY4gijUazvDEO7VCKyunA8MFjRLiuo5gRQQ8U2XpO6YRMPFkqjBEyBydxrCETJpdMtWn6H1oFRlGUhOPriInXUXO+SM0EM8Hoet14ijF0rCOKHP3IMLPYpfPKiGGRhetRzRDbKB3WFQEIFKGlgvm6AmKtMEaRS2DDOVEc7TtaGpZamn7lGRbhHJSBGR3kfrnztGpWY6RCxcKRtRitKJxnZXnEzFybxHn0OZzL7bjWYzgcXpSqIWVZ8t3vfpfHH3+cj3/849x4440XfJK1urrK6urqRKbwr//6r5NKVMeOHeNzn/scO3bsuCpvXEWEJ554gv/8z/9kY2NjUu3t3nvvvaKg0cLCAidOnDjntSiK+PCHP8zevXtptVo88cQTbGxscPz4cR544IFLYoL+bgjvPcvLy2+4XRRFfOxjH2Pfvn2XoVVBOnrjjTe+oa/S0aNHOXLkCGfPnp2ARRDKaT/66KNX3FdjO66NsNYyHo/fUErmvaff7/OlL31pIheFwFwZj8d87Wtf4xOf+ASf/vSnt+fdVRLvFunZ1RRVVaGU4pZbbuG+++67Iuyi88MYg3OOPM85fvw4hw8fpt1un7Om383sIrhMHkaN5Eak9mKpqQdCCdQAACAASURBVAONBM1TS9caSgF15aYp1oHUejPFFgCktJpIZqwK6bSp/Yjiuky7Ulvmx00jppPUSUJcM5QmmyqDdHsoNNmoAh+YMM+PhWUsvR0pav/7ULOLdPbfRHLwdlxTYY268VVFoQx9vUC7UMxHCvEOZ0P5dy0hAbY6nJ8QJFyttqZbG1znIoyd8NxKwS0LMdoKR4aOHTHMiKLV0lSlQxzYMvgYVfV+tIVYSlyq2Xd9h14r4ujJTbwTWrGi09KUIlSyJYuKVfCPcQ7GlWB2trCFoRMnuKzAEQCpRAXmR1PdyipIDOwUhZTChg+veSU4wnau7pYExbiEgReSWEhbCp9oylLwOkiKmsp3lQu+Rm0dGD2DTMhMkK6JFdJIk0SasXMoL2wMBeVLKgfDgTA/6zlwveHp5xxSaWIUXW3QOcReU6lQFr2wEFdCGisKF8zGqQGk85e8p67GVssXSw8jJxinGGe29sIJVeJsMz8JINsoAhcFhpaoLcBGKcWwRuOMMBkPTw3eNH9PXY+a5dIAKNMMoaIemGZ+NzK7Zg1NM3maz0y/LlOvNT9JqojqPG44tiQmGIIXVQ1hibCQKuYTT39QkW46TKUgUZjFiM3Y8eTLJSUyuQ74847X/CHU6zwOYJFJwlpppGjSgGWy1e4qmGZRVIrcCcoLPeNRRjPoJuxYioheKhEJfmJWhFyg7T1RFAyqzRRYlMYKZRRl7rEWcjyxViy0NUMv9AsfqrbpcB627sixC21zXoh1AFWLTKjEgwM1dvhsRCtSODM1oNtxzcfZs2e5//77+dnPfnZBQ+G3EiLCSy+9xLe+9S3uvfdedu3axW233TYBU5aXl/n617/O+vr6pOTsdFK7vLzMN77xDb7whS9cVSXhrbVsbm7yxBNP8POf/3zibeOc45FHHkEpxfvf//4rAhoppfj4xz9OURQ888wzWGsxxvA7v/M73H///Zw9e5Z//ud/pt/vTz7z8ssv8/DDD3PLLbe8624Q32mcPn2atbW1N9zurrvu4oEHHrhsYx5FER/60Ic4duzYa5pfQwBu/+3f/o3FxcVXvXctl8rejssbRVHw4osvviZgNBqN+PnPf84LL7zAY489xj/90z+dM7/KsmRubo7hcMjJkyfx3p+zVt7Kdef8Kk/XQtWn13oIc6Xb/F41P76UISLEcTzxj5udnb1iYNz0GmkYuSsrK3zrW9/i1KlTfOYzn7ngHHg9ydq1HJcBMGIi6wlVzJhUN/PT4E2d/ao6AfQTwEgmjAfU+TTqABCJqpk7tYTI+gA0NABSY34tzc4bYy3qnTb7lrr0O4LTitGOXUTGUFUeX8GJ3PFU7iiN4ob5nSz99icwO3ajEZwyeNcwocJJSWWxSQdzy+24E7+gHK6hUOTWI86jUXgJCIGoYJJWiSdz0G4b3tdSHBs4Xik9q8MKiRRzLc3ZzPHMUHhgNmEuNcEwW4MvA3rgCKbCWEUvFubmE3bPJKyeyXhlrcR5aCUBGFFGBZPvmgUWm9AxXqA/rqhizeJiF6VGWBnzwsjRdzUAQe2tg6IdBxnccg4jgaLWCcUthfbCDZ2Ik7aicsFsOLXC2Ibkuoqg8sHjxjUV73yQ13kCgGS10NZBEpZbxWYWAKpB6eiqAExCAGXOjhymlgZujoSFWc+B6yL25zMcbHW4LukQG8Vzw00e7/d5vioZCYxzTys1WPHgNEZvMXiaaeIkVDKrajkkhPM3NBtrrPeUbIFBwbRacBHYWGpzaoWtjbOVBmUUo9xT+WBsLT6AF143Kkw1WScC5wBZMvXvZmk0fkbNa1EoNDfxnWLqvS0Z6LlAUQNWSb1dmgQJ46hwlJWjlQCisBUorekqxV17EmaNYzlzjOcsrVmNjSJWpOKFQUluA1h0zjHVVluFLeaUMcG3KEkhqsGiyXKtz2G63UVVez/V41UK5NbRiSqsLSjm2nT7XarhKIyIBPCzQpgTGNc7b8zZtQ78H68C2GlF0Y0VAyvkVhAXrk9JrImNYlQjci0lLLUNYweDwhMLJCoAi9e1NF2jKXJPpTxxb/sp4bUYJ06c4L777ntVgluWJTt37mRhYYGVlZWLcqzBYMBPf/pT4jjmE5/4BPfddx/j8ZhvfvObrK+vA0yqipwfr7zyCoPB4KoBjKqq4t///d95/PHHL9heay0//vGPueGGG66Y7KLdbvPwww/z4osvMhwOabVaHDhwYFLqehosgpDsffvb3+YP//APOXDgwBVp89UYIsIzzzzzhsBpmqaXFSxqYv/+/Rw8eJAjR4687nZFUVxQVnexEoGqqvjZz342uV7ce++93Hzzze+qROO9HmVZ8swzz5wDzkyDIM8//zxf/OIXefLJJ/HevwrEtNaye/du1tfX+Zd/+Rf+6I/+iF27dk3efzOgz8Vgvl7umG6zcw5rLWmaXlUJ+Rsd/1oA5K6GmDa8juOYPXv2YIy5KiTq09XiduzYwf79+/n+97/PBz/4wQkrdrr9lyquNIPpkgNGtk6iPFum1g1YJA14BHXyJ5NkEQlMl3DZfHUnqVpetgVC1Uwl59FolAjeK0xdzcsoQde+N01CGVoW/q/qpLwRIDkg272ftN3Fbm7w0shxsnK1BAlOr2wyv7GC2rkXr9QkQ2+8V4wTBIPzoNtd1qVNVHnGaZtiRqH7Y1zNKNEa8twx9kJJYOOYCm5bTDlkDMc3SzIrPL9Z4Tcgq4S2qQGA2NCOFCqvoDbOHpZbgNzcbMRNCzFJ5Tl2JmMzD9XXglmxptOKqQobACwVWFleQOkwNv9zdJn9sy2WWoYb5zpkNqPKbGCt6CBBKxVoFONKGDjBIURG0dmRIF3Dy6+MiZzFJODKAAh0UUgVpHcaRWXD+DdMKwhj2lwqrIOxBLmhR1jPFL0U2loCAKeC90zDEEEFY2M89Iee63ca7im77FEdlnQbX1mSJGXn7Bz/bzDksXxMaSEvPb1uxObA0U7CXPE1UqMUGKWplD9HR6UQlASJUwNyKQnm3IpQxU4SiGaC+XZVhg82FdEiU1cOq8LfldSG7SYYMAfAZmu2NmDR9KpomtPIK83UslGB5ENL6ipqRlHWDL+J91G9ffMbtfVerCAy0G5ptNKsjwt0DXQ5a3AWWonhurYw0xJ6WuHmE8qqokwi+qWwmpWsj7ZYhdPHmPgwTZ1QZCBOg8m1ibakpU2bzBRw5DxUORTlVnuba8O48rSiCmzOhhLUYsKsElyWU1UVHsiBPUaRGUM/tzVYHSSuTXW6wBhTQZJaQuEDwDwTKW7tRdwyaxhaoW004oVupDmTe/5npWSxo2gnhvWB430LMaPSc8ZCpRVit59SX4uxsrKCc+5VNzPOOX7wgx+8rul1URRkWfaWzX2rquKHP/whAHv27GFzc/MNP3O13HA18dRTT/Hf//3fr3tTlWUZR48eZXFx8YrdZEdRxE033fSmtx+Px/zkJz9h375915wB9qWK9fV1nnjiiTfcbnFx8YqAg0opfvd3f5cXXnhhIuN8K3HLLbe847VVVRU/+tGP+J//+Z/Jmjh58iSf+cxn2Lt3L+12+6pav9vx9kJEePTRR+n3+xMvlOm47rrruO+++3j88ccvyFwzxtDv9/Hes7a2xmAwYGlpCefcJMF+O22CawPIKMuSRx99lOeee44//dM/vSZ8484f46sB3LoaY7qfpkGXJEnOqTZ3NYRSik6nQ6/X4z/+4z9IkoS//Mu/ZP/+/a/yNHo3jvdlYRjBuYbXF+pCmXpdJDzRd9KwfqYYCVOAwDTNwBMYKQqw3oeEuvY1aoCQpE4CJ35INIl3fXSZ8qoB8oUl4l17yFY3GHvoKs1IhFIpkr0HMbtv3mJ+AGpSCl3Ae5R3WGeZOfoUduUMZQzjUUm7E0Masx55osIhhcdqoapc8EBBaMcR3W6HGe2Ym005vjxiVHoGlWeIcKAXocVTFpa52RQTadSoBHFElaLSkCG0E00EnFrNWB+F6mXDuryXFaFtPbYKleaMCr4r1nuSdsSgcNiy4uyapWxF7F2c4Y49EcnaiPXCIkYoxoJBKFwYo52Joas1G7MauxCjIk26EXFqWJGmiiQKYIbWMBcp6MSMKkde+trbSU28pQIZLNBPBCbMsdQEz6SVkWJvrKhqo58GDDS1fE0CCoi1wtmsYtAbcajoQJETG8V17S4pEdKCk1XFcVsyzITubEyUKBBfz98wf4K/jxBpVdd9D7MnUgHYNAhWAmAW2h9ATd0G3wsSysQJeRkAu9SoCXunrHwoUS9bcqtIKyokzNlmijaUPLYAo8l6qrdR560VBbS1Yh7Dvk7MbtXmsfU+p9zWU6wJs6j5/Hn5XBzVMkCBbFyRxmG95SVUopiJNLtnPV4c61mFN4qVzLE+LlEtz9gFc3phq5rhtBxuev1rE4CiNA2+RcYAOvRxVAO9kQ5AkfcBhCzKKSCtPhGlwDmF1oqiErRUbESKcsnQ3YhhrSKOFU4rNpWw2G2xmttJ34mCwguFE3ztqzUuA2jUmIWPBLoitJ2ipRTegfOKvPJBMpkqnIa5WLOzp5jrGPqFR3c0nVizufHGpaa34+qLlZUVlpeXuf7661/13uuBRRsbGzz++ON88IMffFvHtdbyyCOPEMfx60ppICQZDz300AXlNFcq8jx/U0/gnnzySe69995rqnztmTNnyPP8mgSMnHOcPXsW7z1zc3N0Op13fLN75MgRhsPhG253IX+uyxFKKdI0fduAzFNPPcWtt976loDF6WhAhGmwCAJj7etf/zpJknDgwAHuuuuuiTxjO67deOqpp3jqqaf48Ic//Cr5ys9+9jO+973vvabMMY5jjDGkacqf/dmfsW/fvlDA5zWqNp3PZLqQGfO1wjgqioKvfOUrfPnLXybPc+6++27uv/9+4NoAu95NcalBxuk5rbW+Ksd3PB7z2GOPsby8zD/8wz/wq1/9ii996Us89NBDk7XYnMPFaP/rrdPp9y5HX10G0+upVHCimwmMFF+niSH3Dr4+jQRIGsZR/SGnCGDCZMdMEvYmVJ3HK/Gh1DbUBsUKH4FyIYmPTPD4mWThSGhLw35q2Bdxijp4F6Nnj5OJDTIjpYi6Mywevhs6vZoVUTM/JhoZIapyWtkqTrrwxH9TZQXjpEe2sMTo5VPY2BOlmlYCzgZfHkxgRqUa7rlxnm5Lc+DAPCv9ipXNHBDabUOrCNIWNRaGw4peO2aul2AIptW9SuhXgSmVV8IwsywPK0ovrFlP7iBXQhkbrgMqF7yPUh0kV0orKoGRF/bMaXwpDCvLyytDdu3scmCxy8nNIa+MKpAtX6pQkc4QpSlrM0HKoxS0ZiMYVgwKIXHBVDtGMdcyFBqyMjCLnCjEb4F2qqa7NKwarYI3j1YBOOgXwkymmO+EEuXNcDofwDBP43UFoxye7Qy4Xrr0ckWExjmFtZ550dwcpzxXVWSVMB5XRFpRljIBXCwBrJmwjYCkNjk2SuG1YK3CijoHbVExyEwthwTSSKOUQ3yY16UNrKK88ni3BaYYE2RRzbJppnrj9TUNFp1zPan7QKsg2bMSwJUbkoR7W3OkBayPC262irFSrNS0omafwpYMrTmAKGilijQOZlupVvWVQ/H/s3emQXJV5/n/nXOXXmfXaAMhIRYbCbNFNiIYsI1tsDFeMJCtQlWqXEkqlVS+JB9TTirJh9hxVT6kysknV5K/U5WA7aRiYxtsFhsbsI2hzGoEYpEYbTOa0cx0913OOe//w7n3do80EloQSPa8xaCZ7tvnnnuW7vs+/TzPm2UQKs1EQ5gc0fS6KYec5lDu6JGjh/z6mFn0LLFBz6L+7hv4I/CeRXFZES0o+lRcU9k/4yDLIe2CGP/6StYmUNNFFT0Ho0FEO4hQojBWkDrUx2KS+YQ4UkwO15juZHR6KWGgfJW0wpdIlPJV/5SQC6TF+5krxi0ALJrUeO+pFGEO2BvDS87R05ZLVETL+YprM92cHkIWKfJ5g7WDk7cSZ0s453juueeWBYyOFsYY7r33XprN5ilJxMoqHceKc889l5tvvpm1a9eeleao+/btY2pq6oyTeB0LXDhbmSDGGB5++GEeffRRnHOsX7+eO+64g5GRkVNu982iVqu9495PJ7s/FhcX+clPfnJSgJGIsHPnTp544ollE4I8z8nznKeffpodO3bwqU99ine/+90n1c+VODNidnaWb3zjG1x99dVLQOX5+Xnuuecedu/efdTXNptNtmzZQqfT4a677qJerzMzM8OOHTu48sorlzBujsbYGIyzASwq+zgzM8NXvvIVXn75ZZRS3HvvvWzbtu2M/1w7m0C544nD19Vb/Z5dgi1lnGlgUTmf7XabP//zP+fmm2/mZz/7Gbt376bX6+Gco9frsbCwwMTEBM45oig6pWpqJ7p+Tjer6bTf4QwmoqX2pGQylEmgLpI7rRVKqwJlVGilfbZfHqQ0ojROaSwah0LQuEL8U/oglZXIjJMKDEmMr87Utd47p2c9KyZ13lsks5BY7/2TGSEzjtxCrz2Kq8WYUJNrRTNQrN9wHkMbz8eKlxWVxt7OFR481qFMRhY2kDdeY/HAASRS9NacT3rTHeRXfxhbW0V2COYWHF0087Ua0VCDoB6wejji/OGQ+nCdWaPYt5iQW2H9qgbvWVvjN8+tM1oP0MXAKoRWI6TdCGnVFCM1L4vJBQ4s5rzRMWTOM4tmMseiEzrWAzE9I2ROMAU7wxSv29/NGW4pajUI6uAiYS43vLZvgU43ZzyuYZ0fcytlNTuFs47AGEbyjJpYX3WtFRVgA/QyRSeBTi4cyBz753OS3JFZLylzA4k/9Bkygws1tYXsCJjtCqkRjMWDTg4y56ry9MZ6lokzsLdjeDo8yC7bZT6xTM93WeilJMrSto5GIW/sdR3ibMVE8+bb/hzWLZVQtUIPQBotGFUAn0r59RgoZAgk7Bu1l7ovrfzrF5Mca73v1iB2EAWqYDKV4+DFkoOG7QPNVT/gz3POqOKSc0LGG4qRQHFRVKdhFFmW0zMG7eAcG1AbeG9ZYjI/cA4F1GsQao1oYXhVQL2hCVWAy2FdGy5Y5cgD4VAQsddY5lwKDVAhJBn0kmUYURQy0uLcpWdRveb/DUK//SvFJ36PedNxRW8R8tR3VONBaI1CiSIOPKvqyuEmlzYanB9HbKgHbG4FXNyssabdIGxE1Joha9p1Lls7wo0Xr2LD6qHCv6iU//UBTPC+SKZgMmp81bsn5nKeF8ezbcWjbcXjw4o9axq4RsT6POCyWsxoMyJHOJA45oxjrutYSBwd86tzQ/HrFq+++ipJkhz38VprLr74YqIoOu03Q/V6nfXr15/wTXVZ5n56eprp6ekTur7jifXr19NsNo/r2CeffPKUjcPf6ti8eTOXXXbZEY8HQcAHPvABhoaG3oFenVo8+uij/PjHP67kLaXR+ls998vFtm3bOP/880/7eY4WtVqNSy+99G09p4jwyiuv8D//8z90u903PT5JEr7+9a+/DT1bidMZzjleeumlI7zbnnnmGb71rW8dNTksfVPm5+e57rrrWL16Nc45nnzySe666y6+8IUvsHPnziUArXOu2s+nOw5P9N/qGBsb44/+6I+q993777+fmZmZXykw5myIJElOy+dxeS9UVhIsHxu8Rzr873cy4jjm4osv5tZbb+Xzn/88//Iv/8KNN96I1pokSdi9ezdTU1N861vfYseOHW/Z/lgO9O12u9X7yduxH047w2hJlakBOkRZvtszDFQlpXEDmbDgmRlqwO22bOLwylBlu7bwRuozkjzLQItnzQTWlzD3CbwqgA6pAC01MLkihYymNYRtjYIxRNaRB5qFfXuprzsXHUa+DVWaePuMXmxGFtTo7NmNMYb1oyG9Rp2sPQJXX4+8+3LYswv98tPU9r7AqAqQMELHitWxxRjLbJKy+8UF5lNLe6SGQnBKU68pxFhqdUVuBJMZAucYbsa43FCPXCX9me45JmuOhUVL1zly8eDQUM0jESVgVno5OTyw1GwqVrV1n4IYeIZNx1o6M12GwoDI9RlfGopxFiS1TE47aDoW1wQQa9rDEZ3pzFdLcwrnPAhTMmcOJ8mULJfyeTUw31YgsZ5B0zMw14WJIc/2cMV6UsrL0hQeNIqUBy1erye0VUSQGZQVjBg6zhHnwkW1kF9kOZ3UgVYFWKKKDV8wjJxfp3EA7bb3j4oChes6OnkB/ICX0dX8uHmA1Ffvy5wHNrxkygOTTjyrxbm+uXsYeEZPqB3G+WsT1S8jX8rOlnLs/DhNtBWjbXBiWTWk0B3IE8t+6YCDxNrCR8hvTlegQqW30OCcuuKXWuwnoJc7OvM5a8fBiaKxRrOpBbG2LKgac65HTzKi2L/OCsx3CjPqggFoi2sZBAJV4OVncR2i2DOL0MVxxdyXbG2T+wp4Nu8DbyUDLVDQjBQTccCFE8OcNz7GQtfyyqszZFnCqsk6jSgky3J0HJBqS2YtY3FIO9SMNyL2BLowoMf7YxULsASklfKyx5qCyZangkldM7a6QZY6nIZubonmM0a1ZqwekEYaYywv1gPizBF0vfQtWbEwOmvj4MGDpGl63LIprTVXXXXVEabJZ0qICIcOHeKee+6pSqFv3LiRG2+8kXXr1r0lN2wbN27koosuOi5vm+eff57NmzdzxRVXnDE3i7VajY9//OPU63Wefvpp8jyvwKL3vve9ZyXLaPfu3UdIYfbu3XtCa/tkYsuWLbz//e9/R+dWKcW1117L7Owsv/zlLwG/D443MTrZ+f7hD394XHK9MspKgitxdkeapuzfv5+dO3cShmElNdu2bRs/+MEPSNP0iNeU9+AHDhzgPe95D2EYVmyG119/nb/7u7/jv//7v/nABz7Abbfdxg033FABRm/25cSZ8r66XJSMjkajwec+9zmuvvpq/uAP/oCnnnqKBx54gDvvvPOM7j8sZRmd6X19s4jj+AjZ41t5TVprwjBckn+faWN2+HUHQVB9KVeyj1avXk2r1SIIguPymTyeWA4Mmpqa4otf/CJXXnklv/M7v/O2+HqdfkkaFKXmfZSMhcFv7ZdkqVVi5s2CKUAfJUXltIFDZUCrUwJISjQWqdqQgjVSIk3KKnRlhF30R4MSKfhKPqmt+rrmXNTHfotGs0lTgThHb+8UM48/jFp9DqNbr6I1Nu4ZCeKvFWChtgq6i0y//jrDDhYTwWQWcQ4JQmRkBD00xLrebrL9jhBHq+YYbgjnTzTpOU1v0dI52CNXQm6EeQfBZI1mKMRKUa8FJGlO2jOkiaE5VCOMQ2oNRRBYRCxKoNMxzGaOXHmJUhyqwvgYeg56zhteG/HjOz4SsnldyEwnZzEvkDylUEUFtZ7xdKpB8E4JFdMKLNrA6i6oOcP8RMTQRI25+RyTOqwozwkr5qg02i4rnQ2uj3LdCFSWVUp5ICJ3XgZ3KIFmDZpxARgqKrBIoYi0b8U6YbrrONBIiWcDIlF08tzLwpywJlacEyp2d4vy51r1zdkLn+tQQytSBLHChYrZzEEGeQ6JdhXzCGAohEagyMWDDKWcrB5CknlmWs84AnTFXBL8uvRsIukDOcW/tlz/A0hRNUYK6hFMDPsJiQLFRCtGN+DQvpzIepA0s8778YhgD38/VoeBvHjwphYH9FLHoV5OqISZHjRiaA2H7FzI0VqzOD9P5gxB4AmBgh+XhYU+GFWZbKv+ewHay8/imq/EpgpmUdmGFOsyVCBGsTgvlF+mlYb5VqAewGQzYt1InXpqaYc19i0m7HjpIG4xxSkhI6ERepcpm1qCAOa0oa7hUKI84Ekh0zRCJtJnfilooqhFeE+zUHH96phouIayjskwoDbcYDYMeOCFGQ52BRV4eWQvs+yxMB1q4rrm/FzIcu9dthJnZ4jICSdyWusTNrs+mTgZH51er8fXvva1JRWhdu7cyYEDB/jDP/zDt6TSmlKKa665hl27dr1puXVrLY8//jiXXHLJGeVlVKvVuPnmm7nmmmsq4/ORkZGzEiw6nbF27VpqtdqySfCWLVu49dZbz4h5rdfrfPKTn2RhYQHw33S/8MILJEly1Gp+4Pfycmyz44kVdsSvZ/zwhz/kd3/3d9m7d29lVn3ttdfy93//9zzxxBP88z//M88///wSAFdEeO655zjvvPO46qqrKp+X0ug6z3OeffZZXn755crbp0xiTzdY9HZ42pTjdMUVV/C3f/u3/Mmf/An/9E//xA033MDatWvPOFDh8DjT+3e8UX6+na73rhJ8Kdd+OW5n2vgt5xFW/h7HMWvWrEFr/ZZ+GXJ4OyLCgw8+yJe//GXOO+88PvCBD7Bx48a35FzHitMOGJUl5l3B1PBcIdVPessoErXBUuRSMF5KtpErKCdCaYStlpyJgpGE+IVdtlE0MQBK9YEJpSi8jUArX15eKQ9oaBRKhajxNQWLyD8ebWrR7hzi1R/cz8E9e7jo5k/SGBkpGBSFIa7SXt5lMhbEYbM6zTUb/TWaFOccAcL8YgebO7rO0mpotmxoM1qLeG7WkhhDtHYIFroEnRRlhDwTGuMx8/NdXwlOvLxrbjHDBJqoXqNhcoabhlcXDJkVDqWOBeewShFGAa1QqCnBiioSYj8vpmBmTQ5phgNNN9R0cy8GEvHG0qL9z6IIHeew+OTeWW+cbcRXpBOtCB2sXrTUgoCDIwGjozHd/d701OJBGKWkAAb6bKWynHs5dYNgYymbUniQICj+nusKYagYtBASfDl75aSSQPZS2NvOSAVaJiCzDmMcSsNcYlkzojEIh3JBi6BV31dLaYVTwiHjSHvgsL6KmSuupZBP2cKce7ELow6GWxoCb4hdSso0hfeT9as5M9I3gVZlaXeFKwBRVYCn1g0AaQVoFGgPRilg1ZAiCDwgqrQvKz9cizA1g5n3VeQygZ4I80oo093KKHtg7Mpxj0M/pt3MkqZCc8hfX7LomHEpSS4EBlrc6QAAIABJREFU2hbAkmdzUcxvt6heJqrPFgsLwmAJAgaRZxXFsWca6aDvV1SOl3OQ9iDpCs4Wa64YR1FQDxVrhgJWt0KajYBaZpjdu8BBBdLLWLCOsYamlzt6vcyDYk6oB4q5mqNlLTsPWWwiZOLBRVOxIcv3A++p1mgpbApiweSOdiFfTA+l6I6l0QqJ552XhSrFga7BKIUKFZHy5tkmUkQhhOFKknm2RpZl3Hvvvdx2221nTNl6gFarxZYtW3jttddQSlWJ+5tFp9Nhz549Rzye5/lRzVhPJlavXs0dd9zB9773Pd54441jSp/27dvH888/f0axjMDfC7wdwN/bEadLRnfxxRdzyy238MQTTyx5fHx8nI985CNnBFhURhzHTExMAB4wOv/888nznF27di0BUAcjDMOTHruzUbq4EqceaZry05/+dMlju3fvZu3atXz+85/nkksu4Y//+I954YUXlhxTMt7KPZMkCT/4wQ+O8AkbHh4G/PvTqXinnEkxWNL85ptv5ktf+hJf/OIXefTRR/nUpz51xpoj/6rF6WAVDbYNVPN8+ONnWhwulytBI611xfR5K+4PDvfBGpyDyclJRkdH6fV61ReXp5uVddrfUcrEWMR5hgReiqMKVoouMlRHkRzKQEW1Imt1FEyPIkPuYz9lWqsqjxORPvCw1BN74I+BylulH00FQlBU2qJkInlBnBUPcylRKALizVsY3ruPfS8+w9zLz9O84n0orSvZDeLIFw7RTbscdIrJLe+j8e7LsNaQZT2syQi0Zu/F72M4F974+RPMtUf40IbVLM4cJBoKcQdTCBQmdwSBoh4JzhgiAhqBomMtaFhMHTPzKb3c0h5u4pT2FbuAOSso5826nVbU6xGRWCIlxECu+4l5hq8ANhQrVO6oATXlS4jrQrinlAdOyjVcJfSiiop23gPJOT9ece6Y6BhyEbrDMe1DOYcSL4kqy88rKTeFKv6TJf48g7K1aq6K5ZE5XzWtm0MvFRrFPWjJ1in9b7R4ICdQcMg61Ijh9T2WRee8RDFU5E6od4WJpkZHwmLPM3EC5dltuYJeLpV5c8mQccXyCjRLASEFc0boLlhGm5p6ROUVVVyqP95JxWAqQcygAFXiQNErKC4injlVrnzoM3VQ3ky83Sj8fAIPTIg1LDhFs6ZRYrACqSgSoFcAS1U5+4F/pRw3BbVIVX1EQAJIDVhbMOo0Rem7/loKi+Y6nXJfF+NSDJoUgFZUmFyHMf5FxWeFK/7nAG2hc8gDRqWlWbmjG5FicihgfDgk0h5Q65mEQ9qQaoO2EDeF8Wbggc5FR576dgMRQhcynea04oDdcykLCxmRUsTFXtAUpuYCmfHA1vDmkEsXFcMSolqapKaJA//ekWSG6amUtJvRDDRdK7zRsWgFG4YjRuOQV5zxctgwoLlEULgSZ1vs3LmTe+65h+uvv57Vq1cD3tz0ZPyD3qpIkoT//d//rZgRW7du5ZZbbqHRaLwj/Tk8lFKsWbOG3/u93+Oll156Uy+Xxx9/nAsvvHAlyT5NceONN9LpdJYkqZOTk6dMcVdKcemlly7rEXSmJgLGGB544AEef/zxNwVJsyw7ZkXEY8XNN99MmqZMTU0BHlxLkoTnn3/+pNpbibM38jznP//zPyvW3W/91m/xD//wD0cA6Zs2bWJoaAgR4b/+67/413/91yVrNEkS/uqv/oput8sdd9yB1rqq1gTLsxTKOFP3YxllohzHMXfccQfDw8M88MAD/OZv/iZr1qx5p7v3axmnc82c6evxWFHuuSAI3pLrOFqFww996EP8v//3/9i1axfr1q1b9ti3Ot4GhpFbwu4ppWCl4XUJADjxsiBTUEjKl4gMskZK0IgKSRgkGQ2ylgZUJIf90n+28i4qQCKk8FUaBJnKhLyQuSkpvI+aQ5xz/Udorj8HTIY4B1ov8ZRx1hJvfBezO1+G1eciYYRJE5Jel7S3SKgE22zhtm6jnmTIrh28+rJlRy9k4/kjrF6fMbU/oTFWI11QBNoQRwGq51DOM6KUhiyDTirkznCoM0+gNUnqP0hShHmBWClqGhyOHPETX9A4tHgASLQQhprAOXqZAuuBltKjqZyUQCushRg/l7n0K5eBwuCZQ04UWS6IzYlSh2rUaI/GdA/0yEuLAPEyMq0oACc/7AP40cB898GRQYwjdxAGMJ94cEPpAgihD0QioAp/ocUEVNvyWlMwPdBOoaxfXWEKTVGMNjRDw5rZxLGYCbPZwNoaoN+ogT4uKZCmqiVKChzoOUZF0SwMsBPx1eisA2Nd1a6IB0WC0PswKV0YquM/4O0AYBSoAqcp9tRwC4JAUEGxiJWvJoaxRDr0nkQOMhypEkxABQKVoFc17gPjX4vAFefVBQMod35cg8JnqO8LViyrAmBJkv6G0HiZmcMfH4ZFJbQICIo1pvosQw3oDObnIEkLkLDoVxwoJocD1ozFhJFiLs2ZXTBkufhKaBY2jdQ5NxLCMOb1g4bZQ4ZEhNypCkTsakEyYXcnZ183p04Jomkcfk1rDUEBMo8MaVQrRmFpaE+hDSJdyPAUOoZu16FECJWiHmly7asVxsYwAlwgsD9wLOYw11kBjM72ePXVV9m9e3eVYBtj2L59OzfccMMpgUadToennnqK973vfZX84Hji8Cpqzz77LJs3b+bKK69c9oYiyzJmZmaYnZ1dlm6e5zlTU1O0222efvppdu3aRRRFXHPNNQwNDZ3UTUr5mgsvvJA777yTe++9l/379y977L59+3jkkUe46aabVmRfpyEajQa33norURQxPT1No9F4ywDGt+vG//B1e7LnffTRR3nssceOW3bR6XSO61tdEWFubq4CmLTWfOYzn6kS/lqtxv79+3njjTfOWI+zlTh9MTU1xV/+5V/y5JNPsmHDhmXZQY1GgwcffJDrr7+eH/7wh8zOzh5xzDPPPMNf/MVfkKYpt9xyC6Ojo9X6DMPwlPfjiciR3mpAapBptG3bNp566immp6erL2rOZpDhbInTXfntdM/hW/U5sVxbR2v3RM9xvDLPKIr48Ic/jLX2bfty8rQDRraoxhXgTX9DXSSXlKCRT95M4eFibcFIopSUlayNcvBKkEgYeKgyzz2cMdQHlPoQwyCoMzglJRtl8PmSbXE4YhFoCBtN1r7nKpRz6GLCXJFtC4rWuRupTawmSf6HMNTYIjHPjaPbXUTyLr3eIWr1Fu7d7yFYPckB/RqqM00Wx0ysbvH63g7r1o1wYHEaGjWGx+sEymKnE6JACvmOIjGe2VNTYLEY8ebeuUBXFf5CVmEzhw48U6IWaEzqCmaVz/5Fg7OKnnFk1su+nCvlSj5jF/zk1ZSmrR1O9X2qFH2zZFXMk3UwpwxpN6DWiBlq5swvGvJBUEjK4/tslBLAK6MEGKEwli7OVfrjWOe9gep1KnaIrRhr/eOcAerQGtJMi0NsIQfTkAPGCknPMhZrRhuaQAvzmTefLr11yu91SqBlsN/VYwPAllUwlwmRVuQ5RUVAzxjyLJY+GBJq0Np/yJeV94JBP59yNYpvd6ypGGspdM0z0VQ5CcUC1gqazZA8zCH1czoTWJIB36Sy/2W7ZYSBB3ZKEDWOff/MwJevVbVD1WddgQeL0qxotxyLAnyMSrAoBAoJWlkU0YkHatpOk+aFTBSHKsZmpKk5Z1VMsxEybx27DyR0e5YG0Aih24UYxcRqaDQCds4lzDuHCYBIYa3CGg8A7zOWuGOJujm1ov2GVqRFxT6UKiRpvm9D6xokKHLnsAqC4j3BaUUSKlQuzOa+wiLiPYwSA3FNkzfgQGxJU0eeCK/MGLLuCmD0qxDGmCXygEceeQQR4YYbblj25r/T6WCMOWbp8jRNefjhh5mdneWjH/3oKTE+jibrStOUb3/72/ziF78Alr8JstYyMzPDE088wX333Vdd59TUFJ/97GcrGcTRwlpbUaaDIFgCfimlKiPsAwcOHPUm7Omnn2bbtm1MTk4e/0WvxHFHs9nk05/+dPX3mZ58iQhZllXr5dVXX+VnP/sZxhiuu+46Nm/efMLXkGVZVdXmeOO+++6j3W6zadOmo55PRNi1axdf+9rXKp8krTVXX301H/zgB6v3h3Xr1nHXXXfx0EMP8cwzz1Sv11pzzTXXnNC1rMTZFzMzM3z5y1+m1Woty7i87777eOKJJ/iP//iPZX3BytizZw9/+qd/yle+8hW+8IUvcOmll2Ktpd1un7YE+VSOPdprjtXXsbEx7rzzTprNJtbayiz5TH/f+lWIs22MTwfAVbZpjCHPc+I4Pm2gzXIA0qA07e2Unp72M+XOJ4ihglD5cteRVkuSzJIl4tNC8WXQRVXsIijYQAXNRRWPVCwOjmQSlXXVDgeHliMZD4jgPGtnoC2l+q+V0sukKLvtq55rlA6qjLqq7oVP3HWjzrpt16BbbZRY34MCHOj2OnS7szQaQygd02rU+bldz1WbItJuj9pwg0AgPZRAmoOyRGGDuRwMChc4FjdBvscRdTTW+rGJAy+NiwLFYiDIaoeZ95Kt2DlSq5iMQ8JQU0sdmfILcLQZMJNZMiukxptbZ+JNe630TalFQRBqAuOIa5oxEebFkZhSfuh/nPIG1N26ImkrbJoSBIr2cI0kseR5f9yd6o9dOWcl8NQMFI2aB79y4yVheilxDes8u6iXC/VaUSGtWF9l2XYRCMWzatJMGG4pphfwvkwlqKG8x0/uIMscTVFM1hUXT4TsSx1x5A3Cpxe9LKsEcaDPgBlkvVX+R0U/9veEWHtfIC0eEBpuaHq5v5oSSAXIjSUOFIHyz4kobAmslawdDUFNyLRQLxa90oP7wZeZn5tLCVXhy6XBalXJ25ZgoYNrH2/Q7asJKoLAP26lP15aD+yRgf3iBBY7S9lY5XXFoZegqaD40f0xkwKgXNXU1EPNizOWXur72a4p1o1HrBqrsWAML8x0me85tIORAIZjxdCwB40irZhoaV5fzEiU84btGsYmGoS1Jt0kJ+sZ8tRgc4fJHco5EqAp4gHuoJDiobDiCGNFfVWd2e4iYv2atfi1kjvB4egoy775DF0s3q5x1EJNDNBU9MSR547pQ47FxNE4uz57V+I4wznHj370IxYWFrj++usZGxurPuS73S7f+MY3KunA6Ojosjdhaeq97p544gnCMOSmm2466Zu1PXv2MDc3x/j4+JI+3n///fziF7845k1Vs9mkXq8vAYsAXn/9dR555BE+/vGPH/W1xhi+//3v89xzzwGwatUqrr32Ws4///wl13Ldddexc+fOZT2UwBtyP/bYY3zsYx/7lfHmONPibGFviQjPPvss3//+93HOVXuqZNVNT0/zmc985oRBo263y759+06oL4uLi3znO9/hc5/73LIsQBFh9+7dfO1rX1vCHLLW8thjjxHHMddffz1l2eiJiQluueUWNmzYwAsvvMD8/Dxbt27l+uuvP6F+rcTZGcaYo1ZWMsYwMzPDP/7jP7Jr165jttPtdnnsscf40pe+xF//9V+zefPmYx5/vGCLiJCmKSJCrVZb8p5xKgbY5WuttZSm3sv1qfwMDcOQTZs2ked5xbA424CMlXh7Y7n1eSogo4jw4x//mH/7t3/jiiuu4NJLL2XVqlWMjY0xMjJCs9kkCILjZqAOxqCn09HinVjvp59hBN73RynPvgFKv5eg+BcU1ftOMQip82Wty/rbxfAVg6SWgEQlcKCKl2ukqICmCkCqz35xlceRVO0sCeWf00VfdHnUQHuhGpDVFcBQ1ZuCqlL1TweMnreRLM/I8y55miAmQYnBWYPJfFZdawwz3I55bWGYCZdwaXyAekOzfk0DnSmme471m5rkSU63mzNUCzjUM+wazrHDwuR8wPAeTbLgKzwpBTWlyAyQKeZXW6JQCHNFlCiyxHCJjmiHGqs1RLBmOGJmxtHNFZkTUgdd672QLBSVzMAhxQ+8MqwYS2BENPVA6Bohsd7z6VAISQxJ0w9YXUHSS4lbDYaGI7LZrKrMdjibqGTnaHzlrw0TmpFRX+5+vgMHDsLBBemzoPDX3SwYPGGtD2CU66MCpAS6KQy3hTiEJOv7HJXgUslYyjOhmwlDkaBrQtdBLLB6RDGzIHRKqVpxkuW2cB9E9D+JA2ehEQrWQCaOru2DX17mJTgHY0MRmc3Icqm8gAajNJD2S1pVQA6qYH0pyK0jzTzgM1ZTNJxitXV0tZDR9zCqcKiyPQX12INFTsDiiKP+c4NgrVDs52LM0wx6hRytBIoEz1aqxWC1H5iKVVQ0W5qIdzLHrv2OTgJhqFgzErFuVUxc10zNZ7wxl2ANNDUMhb5/s4kQNqDdgiEdklpHD5/glvPabNZotBq0WjVMbsmNI8+N/z019Lopsz1Hy8FYqBDnL8rmCgLoWotWmpq2hCisU3Qzi7NCt2fYN2NIOg4thV+VUh4Md5CnQhoLkVJsUgGJEqbfQjPhlTizwjnHU089xa5du9i2bRvj4+N0Oh1+8pOfVGXr77777iNAIxFhfn6eH//4x9XNcHn8m0UQBLRarSNkLZ1Oh4WFhSWAUZnMHu2mRClFs9nkU5/6FCMjI8uWGj9Wlbg8zys/mPIc8/PzLCwscNddd9FqtaprjuOYW2+9lXvuueeo1dOeeuopLr74Yt71rncdexBW4lc2SrDom9/85lFZFp1Oh0ceeeRNk+TDY35+/qTM3QeZTof3dffu3dxzzz3Lysycc+zevfuIx+v1Ou973/v4jd/4jUqCc7aAeStxesMYw3333Xdcx4ZhyDe/+U2uvfZa/uzP/uxN19DxeB2JSCWrjKKoAjpPJcr2nXM8+uijjIyMsHXr1jcFjYIgQGt9REW5FeBoJcp4KyVoy7X905/+lK9+9at8/etf57zzzmPdunXV+v3Upz7F1q1bT4r9djr7fSpx+k2vi4Td4hkiQcE4KpNLKCQqSqFCvJxLQKzgjMIqX5moBIN8QiuV4sYVyIL3kimBosJPBak8ZgrLZnTRvo++J9Igk2nwNaoChaRqX0N1THWd/sW+ryXLAu9jZG1G2lug150nTbrkaRebdVCSU/KqQiUE5MSBcO6YUO8JGsOlW8Z5ecccjeGI8XPqzB9ICYZjImsxnYw0ETp1RXfUsn5CGNoVYPYq0swiIrhGRJqHNKe7LI45eg2Q2LHQFubyLueGmnEULafQThiNAzq5r5zWLcqK58Ch0LEIDBmfnLtC6pXVA3bXHBc4oZ4W5dG1N8ru1KDTKBg81hIGmkYIabdHu1Ej6RnmE1dJD6uPs4GxVQrmM+H5KUtzBsZHYNUoXHKBIskU+w/C3hmhm3gD7Lb4Re2snzOUIlRSyd/KuXcWslwYakCvqJrrxINJJeAixZo1eHaWyn0ns8AzSsaGFHZe6OVLMKN+WfoBoKRkO1GyrwpAwQjMdn0fnBRjUDCejBOMMwWgoiofoaUbrM/QKefE4VlBCr/HjBYyHKNhRLuoVW8zmHaGOdwSeV0FGhXzEYWKsJDP5bmjFVQYbuGr5A8sAdRyjyYpGENRAc8fF2gIQjAFM0mXzKLihCJ+XpTA7DwkHRhrR5y3usZIOyAX2LeQMJ86YhSt0JvQLxrBFGPXTRQmFoLAMNUzWDyg6KvLaaIwRCtNqEC04JTDaoXSChWDjhVuOMAc9F5ItUCToRANNoBe7g3ba4EmTRySO1IRrHEcXLTsP2hohmCcIivWojjhkLWMzgeEbYVohYkV9dDRWG5OV+JXKmZmZvjud7+77HNTU1PcfffdfPrTn2bVqlVorZmbm+Puu+9mYWGBm266iYsuuui4WTWXXHIJq1at4qGHHjrlfq9du5bbbruNiYkJut0uIyMjRwVzwCfcTz/9dHUDPz09zdNPP33Ezc+BAwf4yle+wkc/+lEuuOCCyltj3bp13HHHHXz1q19lcXHxiPadc7z00ksrgNGvaSRJwuOPP86jjz56TEkOcFLAz6uvvnpE1anjiTVr1iwrR9i/f/9RwaLjiXfKNH8lfjVCa029XmfLli3LJpwn40cjIhXDZxAsOpGEeBAgGmzDOcdzzz3H4uIia9asYXJyckkfj+YLs7JPVuJ44liS4ZMBZEo23NatW2m326xdu5YoinDOYa2t1vevUpx2wKgWKIyowoDYl1731aRU3+R3oMx9oCDS3vzaaC/DqWgTBXtokN0wGOXUFOSFii1U/l+VJi2KJcylSkJU/FJW6Sp/fLW0vu/SIDggeOPh8uAS2KIAH8Q5rMnJ0x6d+YN0FmcwWQdxFrE5ihznhJCQQGK2jqUoMha7OavHaoyMNRhbtcDCZI1e4hAsk+c2WdjbIXMK1dG4mkIkYJ9Y7EUwMRHRe85hUkFyODQa0ezGrN6TMbNaCMfrdJKMV7HsCizNUcW4UWxFWFMPMbnQKSRpFVvFwnMtR2aEjVnAcC7EWiNKIXHAa+OwdtYylChagRAqYW3mwYwDdV9hzFihFmqMMWS9hKF6SJJnZKY/lyW4Uo2/8sCPFW9WPd+DNw7AxIhwwQa4ZLNi4zrYs0/x2j7hUOZZM7UYmqGX0YVKURmcK8/2QHlmUaMOwXzfQ6tkIJXSrmpeVR/8cOJlSJ1cGG2BnYfc9J8rl0N5y1oCo5Rrg4Hz4F/rCoPxQZlXoIVmqDgo3nTauaXyt7Lt8osjoQSOPEjh2T4eiM2UYyE31I0m1opFcfScw/S3Qp+lV/yilfdS8t9y+oOCwPs8Ofw46nDAv6gYKw2kSblv+3MaRSBBn1VUPleOmy3YRS0VEIWKNWsi1k3EhKE3T+9mlonRJo2e4aB0sbljPpVirLzfUm7BZBDFQl150MpY/7jSCmNBEoMT8d4qxmGNYJzFkaNEULFCNzVyyMvQciW4HHIlzPYSmrHmYC3EzuY0PaJMJxWmF7wXlhO/nmpa0w6oTOalBkr8/uri6CDUVr44/rWPqakpvvKVr7Bp0yaCIGDfvn0kScLtt9/Oeeedd0I3HevXr2fr1q1MTU3x4osvAj5xuPDCC6uy4WUopWi320eV4ZSmqiXT6Nprr+U73/lOxSqq1Wq8+93vRkT45S9/ycMPP3zcTKiDBw9y9913c9VVV/GRj3ykkvOsWbOG7du38+CDDy7LaFqJX78QEQ4ePHiEt8/RIgxDtm7desLnOBmvi6GhIa699tplk9bp6eljgkVRFJ1wP1diJY4n4jhm3bp1XHvttWzcuHHZpPhUvF3K9o6WbL8ZGOWco9frEUURYRhWLLrt27dz4MABpqenGR0dfVPfvuOR7qzEr2ec7jWR5zlDQ0N8+MMfZnh4mLGxMUZHR1m/fj0XX3xx9QXg8fSzlFaXnyOD++pMAp1OO2BUD/pMCvBl6nGC0wonQlD4uPikUYoqZBAp/40+VjAFAuOZPapKTj1LQ7yUqUzy6eNEJbOh/7SAqCqxLd5qfEcHqQ4DsQQ4qo737I0lZr70mUeI4MQhzi8E6xxOvIQry1LSzhxKDLGCWDlEEhomo9eJeXEuZ+06YWIsZKgd88bUIlN7UmqxYnF/h9Fz6gSxxjVjHF0aXcVMWxhrNuhlKTNicROWVb/RYPapHrI/Q3UV6XhEbZfhvP3ClM5pDkcIhk5qyUVYCGC3zVgXGs6TgGYKykGsFSFQN4ohq3kxMuw1hvWiuEjXCMOQTOWYWsAbk5r4kGGkA0MCLYFzE6Fthb11zSHtAackg25uqEeKVqQwtpBbDTCLBkiwldSrBHyMg9k52B9oej3HeesUw5s0o0PC8686DnX93MShl6YZ1wcZSzYTAmI9sDTShOmFgmEjBUOnOKYEAEsPosHfTdFYuwGzi77xQXldeS1V1S/VvwYl3i9LKK69v4QrU+1uLvQWLLnx66360rToo8YDOOV5PHCiKgAW/B4zAqoONhQO9BzSEw6IIyvM581hIFTZXhD05WSpcVUHS6NxVQJbqjTq9n3LrWdkVUCWeDBHBmRoh5/POe9LFUvEeKPO+LCiFvqOJSnMp5ZOluIOeYPrrpV+RylMtLX3eMKAq/mGcwN55oGjOFB0ehalEnCeReecw2GRIEeL93gSPEAXaf+7Nd6832hhMc8xEvBqoJg4JyJNhTD1BvGtoZCFWUduhbpWtGsBoXLeX0uEZlt7gCu06KZQX4QaK4jRSniPnrKkttb6pMAigPvvv5+9e/cuYWCEYcj27dtptVpLjlVKsWXLFl5++eVl20qShJdffpmJiQmUUlxxxRWEYVjJaC688EIuuugier0e3//+95menj6hvlpr+dnPfsbY2Bjbt2+vvm2+5pprqNfr/OhHPzqiEtCJVItbibM/rLX84he/4KGHHjoupk6j0eCGG25g27ZtJ7R3rLUVwHq8MTQ0xGc/+1nOPffcZZ8vfVWOlrhs376dyy+//IxKCFbi7I1S4ptlGatXr2bNmjXs2LGDgwcPnlLyfDiLqNPp8NBDD/HJT37ymEUbjrWulVJEUYTWutojzjnWr1/Pxo0bT4q5tBIrAUcCRcfy1jqVtZUkCVprrrrqKi644AImJycr76ISBD3e8yz3/Jm49k87YBRr0CKE4qUhgSplXUW1MvGJqBTIi8J7fBD0k17t+hOulVQ+KVY8qGELX6LSYFcV9I0qb16SEBcitIHJ0NWL+mBQJTtTAxXYWAoaVb8PJPziHM5ZcpPhjMEWDCMFhEFEGNVICVhlEj6gY2IJMCHUs4yX8y77tUPZmKCmybMMJ4716xos7DE4G1AfCdH1kAN75+ilhqYBbYVeZmjENaw4Di5Y5lSP9mWKta9rpqYysnoN1w4ZnjfYg8IrsaHdCDEWUuOrqmXAS5nlNSzjDc2aVLPWaEa0RrUiqDmaGcxkhlecMKszRhLN0FCAwoHW9MZCZhuGqCeMpEIrVQwbob4g7IsU03UhChW9rgcWIg1RAJnte/2UMcg0GpSTgQcnVg1rVBjSpsb4cB0li8RhznOvWg4uCAs9GAllx9cUAAAgAElEQVQLsKIAOAaBRQTyHEaHYK7bZwkpCnnYwPpRA/iEK2SVSnupZS304FRvgCVfbfMBNLFaPzJQFa1cm9IHk8prtQJZBtp5dpQ9rKoZA+wiFZQMqEJSKb7yXWaLqmMROOVQKqTjHIuZVCw8O3CdJRCl8eMWFB3OC0P1ErkLdX+sgoJ5VJ630/UgS2k4rpUHi3TRnlMFE6ocTwvKKdo6ZqJZZ7gNYeBwTpMaxYFuymInRTIhMR4kVmVltXIcShQYD8zqwPvEZ7mfY+N8P3tJ3kcMlXiNbGCr/S4I2kDQg0Br7xHlIA6g1/I+WdZZFjLDgSBAaxgJA+p1jT1oUCKeLaYEHQhxM6QznxFoRWoUmTPUmw6XeNbROY0VOvVKLI3x8XEuvPDCk7pZEJGq4lkZWZbxjW98gzvuuIMNGzZUj5eA0TPPPMMrr7yybHvPPvss733veymNSC+77DIuu+yyJccsLi4eU6r2Zv390Y9+xMjISCW9K2/C1q9fz913312BRhs2bGD79u0ndZ6VOLuiLEP/4IMP8uyzz76pxEwpxeWXX8727duZnJw8Yc+fQW+W44mhoSFuu+22Y4K6mzdv5qqrruLnP//5EUnMxRdfXIGkR+vPK6+8UpnFT05OcvXVVx93/1bi1ysuv/xy/uZv/oZGo8Hs7Cy1Wo3vfOc77Nq1i/n5eXq93pIvDI7FCjpWolqaXv/oRz/iyiuvrACjE/2sKmU7JWAE/ouSRqOBMYZGo3FCxQ3OtMR6Jd6ZKN9nB99vB5k6yz1+slGr1diyZQv1ep0NGzYwNDRU3b+cCDvoVJhEywHBp3MvvC0eRiG+YlZQsCyC4rFB6+pSalYyGsIiqVamMOaFqvy4LhhHFbMCitLuA4wQ6XsRDUrYPDupnCDPKKioJFUM+BipPpDhU9KyipoUyXSRpJftiMOajCzp0ut1yNLEo+fWIDZFK0eohfc1G1w2I+hYIwZUojnXwZT0cHGCrI0Ixx1RE6Zezzjwyy5RBEMbIpxN6eaGjhFIFIEDg0MHASEhkShSkzOd94g2ODZMavb3DMlIRH3RMW6F13qWNDTUQkWgNWtGNdPzjoPzlp6BKYR9sWUqdlwQ1sjGIhZiqB1yRInFOuGgs8zOdBnuBmyYqDFUhy5Qa4R0VU6nJkjuiA1EKYRGMZR79sdQTTHb85PcCAvjahkA51Q5tn1wpwRyKOY6yx2r2w6daWp5i0bQZLg5z1XvCnj+Fcueg0K3ByPtArQYWB+uAGuy3Eulxodg35yXRFEyx0pTHwbYRWVFNe2f1wVQ04ggTalkYYIHnPreWP3KfVKs89QIg/fBJfgSBsWbm/Pr2DoQ59lC0K8eB/78Snv2TDPW5NZW4JNz/jpd8SLRQhgJYQxh7s+zkA2cvFrj/n/1yFfaE/Fywmbcb7fcLiXbrwSfxEG3158jwfdPlxI01WcWlYBZ4DTDYYOJdkC74bxBdKaYTy17FnqkiUVyX55eBx6cCrT/sUUfgoDqZqc8V5J7wM0a3y+nFVo5dFTsVW29FM1JIZNTBLnQnIcoBxMK9UBTF7CRYia25NZLBY1TdFMDCmYwxE6xWmnG4pCka2m2NAtWaLcjgtwRGOdZky0P5Dmn6BnHIb1ier0SS0Mp9Zb7MiwsLPDTn/50CWAE3mD3wgsvPCpgdDKeLicanU6He+65h82bN3P77bdTr9dRSrF27Vp+//d/vypFPj4+fgRLaiV+9cIYwzPPPMPDDz/M3Nzcmx7farX4+Mc/zkUXXfS2MNCiKOITn/jEEibEchHHcVXZ8Omnn64e37ZtG9dccw1aa5IkIY7jCuASEfI85/XXX68qKZaxAhitxNHit3/7t/nEJz6xBCi98cYbmZ2dJUmSJZ8np8JcCIKAdevWceeddy6RpJ2MqW9Z0KF8rdaaVqtFnudLgKszkWmxEmdeDIInzjmMMUdIGt/KddRoNLjssssqtlzJKD0ZAOhYldvOpPV/2gGjig4mfWPcQBffwAPgfCn76scnn7ZgAUjgX2elMJ4uEuAy4feJuBReQ+WgStWOLjLgypeGAVZCcWwfLPISIU9QKiZJBqVSqmITBap/HkUJfvVZRnmW0FmYpbM4h7XGM3DEIGaRQKfkFqQWkWGYP9ijFYTUIs1E4kgWMghz3FrFUBMkhMbqOr1DKfvnHHXlaK1rwhspaQ+GogBbaH60DnBOqEcxCkUnS+npnOGRLkrFqANQCzXNSGFCh3WKMAgYaismx5o8sWORxa439pVQsc/BjEto9RxDUQMXBsSBwoRCmoN1wkzXkOaWVUOa8aEaodY0ayFpbkmwdJUgoZf5hEoRR4qWgq4Fa4Q6ilV16FpFN3eIDHgOUVTaY0DOhTe4fuYNx9oZzfWTEabraDRCjBsmpMd7NucMNSyv73dYo2g2ILN9+VfRFNZ5ZlC7CXMdSIpqZYN2V6oASIJB5LBYh5ntA0mq6iSV/K30JaL/VLUuM9sHw8rnvBePwto+Q07woE0JLslAG2HFtBGM6xtYC0WVLgakcNrLPsMIxuqKBev/Ri1tt1zfceT3pBXBWs8E0xqkvGYK8Eb191NmvfyrBK2ULthHRVn7ktwjBYOrTsRYvcZwUxFoizG+yt2hxLB7PsXkDptBZrzsTCnfh6AAoZz4x0tA0Ipne1nxldpMVhigi5cn1lsetU7SnEhZnGi0UuhAUMbRnoUwg3pb0wojFBAHwv6GxeqCuWX9uq8Aa/F+VvsCy7AJMQK9zGGs0Hmjiw4U9ZpiPAjIcoOqac+AAqbTFcBoJd6eONq3xxdeeCEPPfTQMSuene4QEXbu3Mn//d//ccMNN1SGp2NjY4yNjb1j/VqJty9KVtH3vvc9XnzxxeMCKycmJvjYxz7G5s2b35ab6snJSW666SY2bdp0XOeLooibbrqJ97///YAHR5955hm+/e1vs2vXLpRSXHfddVx55ZWA9zO79957mZmZIcuyYzW9EitRxXLVytrtNu12u2LnnWhp7+XOISK0Wi2uu+66I0x9TySx1VpXxtmHRxRFR606WPZjJVbiaFGuk9NdWbL0dhz8e7nfT6bdY+3Fd3IfnHbAyFgoQZmyglgpefHATHlkvyIZCIFSRKWMRxU3u0pV1aN8KXVvpl2CCCUAVIJHwYBZdZmoQv+kqjq6YE6UIIWo6vESbJKBufGv61dqK1krChCtUFojTsizlO7CLGkyD1i0cihSNAnTNiRTARjnwRFrCRS0VYCWmOSlnOmRhOZ4SKAc45vqLCwE/GQ6ZZSQdc2Q0dGQPblF1zROtPcCch5eURZENLUgxkpIkqUEzZTORZrWwYA14xGvZympddTCgNRqDI4wdkS5Ii+NbbQHZ0wvxxhHHGiM+HHSBR3MOujkkB8Skjxj3ViNKAwICrQuwWCtRxByhNxAagomTgA9J7QCvzZkYLPIYWOrBvZQKUdqKkW9q3l9bhE7CiaqoYI6ToQL1ypGh4Rd+wwBiiiANJcBsLAAJ61fp6Nt2JsWbBT6jKBSRubEg0cl8KHwIEWa90GTChA5DCQqcRldAB6lOXL5XHWtBahTnttXIvMso8GCWg4v5wsLEEdpb/BdycsKAEXc0jXqxHlJIB7YcQN9q/pf9DMKPDDiKGRW4WHyzAIArsAyoJd4+ZctzhfoAixSfYaYEwhF0SJmrBXRqHtal7EKYxzdTNg9n5HlDpf78S2ZTOX1lv5KRrx3UYDCKE9RCwLPHMtSLzPEFaBSoLAOktSQmxwJffW3KNDk1lDvCmEO86uELBZGF0JA08GSNQpAagCRCzUoUV5+Z3xFvUNiaYWKXuYItMIAJrHsFe0NuLOQKNRYbXGBYy499k3aSvx6xtFuGN71rndhrWXXrl1vWinq8HjjjTfodrtHsHQmJye5+eablxhal3E8N10jIyO8613vqjyYDo+NGzeyadMmnnzyyWP60IgIzz33HPv37+f2228/KWnRSpx9UbJqfvnLX3L//fdXjLJjRRRFfPCDH+Tyyy+n0Wic8s1zCU7Ozc0tu/fq9Tpbt27lQx/60AmfLwxDRkZGWFxc5Hvf+94RbL7vfve7iAjGGB544IF3FLhdibMzduzYcVTA5vD30FNhM5TJ7Kkw+Uo2UQkMHc7IeLM+nEmMi5V4Z+NokqwgCE579by32hOpjOMBi97suNMVpx0wSq2r2BnV+1bhOVQiAFJk2D5xLsAI5Q2yo4KNJEUm7grxl5cwFSASfTZI6UVSeh1V3iTSlwqVoFDFPCraLbNloayStnTyy3OU4QYfq9pXaKUJghAdRIgKyHOLzbsgGYE2hKFjCsf+XkAtc0huqAWhZ5LgJTWB1ex6soucH+Kc0ESzq5NzSAnjgSKsKYY31dirc3oi1HSAQpFb3ytdgGtS6JFEQpIcXolz1p4LSSpkxn9D4PC/R/ikOo6LESiYPiWktmgMNutLnHQ5V8XopNaxf0HoZT3OnahTjzX12LsyJ5nBiYPC5DwKFBrxYJT4MvWerSJI4OVX5ZyV4FAJoDRCWNVUjDRhKBR2dHvUoxBZUEicIrUIJRE2FcbHHe1NEXMLjk7icM4zjVQBYDoRtHjpUqMGtQh6lor1U33USv8xcX3mWim9qgDDkmFULMqKnVb+TQEuGY4wTS+ZSqXpttaqMhgS6cvLyj5FhT9TULSRF0yokllUjldFoiv6Y5UH7GrKgx5ZAYKUUreSxROGHpAtq5eh+4CJUoV3kRpgUDnoJsX5SiCpBItU8VqB0IYMhRETQ4oo8pWQcitYK/QyYX/XkGQO7QpgsTxfAYyV1eqs8ub4YYHoiXiAWFzfu8h61RhhoImiAKcUSZ5RVt4LNWTWkmWWek9ja9CrC2MmINKKxdwy27IsKFNUn/NzEWvlDfsNBBmoHGwuHBTHcC3ApYqOAds1bBgNCOua/XMJzYbCHApoxAFjwzH7F1cqQa3E0jh48CBTU1Ocd955Rzy3a9curr32Wj70oQ/xzW9+k6mpqeNut9PpLMvaKA2tAR544AE6nQ4AzWaT66+//k1vgmq1GrfeeitKqcpzpYzR0VE++tGPsn79eq688kqeeeYZXnjhhco4e7mYnp7m3//93/ngBz/Itm3bjvv6VuLsizRN2bFjB4899hhTU1PHdRO8Zs0arrvuOi655JK3DFAMw5Dbb7+dn/70p/z85z8HYGxsjHPPPRetNVu2bGH16tUnnBAkSUKv12PHjh0899xzvPbaa0cck+d5BRqtVAZciZOJn/3sZ8zMzDA5Obnk8WOxFQb9XtT/Z+/dguW4rvv8b+3d3TNz7riDIAGCN1CmxEtIkaEoWhQZWZYsKinRVMXlyCpZSlUuL64kD1GVlby5KqlKSkmq/JJyKvlXKiUnsmyLsmzRVEiZiSWSsq4BSVAiCQEiLsTl3OfW3Xuv/8Peu2cOCICECIAAeRYLxMGZnp7du3fP9Prmt35L5A23AT9f3dbGE/ozqTPONvZ1aPTOjDOpz860Hi7EOhm/ri7GOny9a+xilW9ecGBUljUiEnxZbFACOIldpFIyTfzZR/osEjqfpWw6JeER4SQfJJ9Kxpp9BC8hI9ok6eMFH0nJoShr5l9l1D0rPi/tQGSEjWSsBM1IGlGzcUMLNGbLxmRYmyMmo3ZKNawRrcgyOJIrP3QDru96CqfI0GFp4cXhygo1QlV7Nncsw0HGwv4KU2Zs6nh2TFkWqgEHWhVdn5HVQq3gxDcSF6ehRMmaSDTUgLdUXnlFayZyJbdC7RXFY2zGalnhFEwObYRhBeoVMdIACJWwaELCHsoEvYvlUhJg0ELfUx4bsGtzi8m2pZ1nASJoTR27W7WsMNsRfE+pXOpQFlVmAkYlKFVU14A5K7Bx0rBlJoz95QWP8Y67t08xWCwZDmqK3FP7HJzBdT3FTM2WjcJE33B80VP3AywIEELijVrwIJqdDNAjrY/02kbHYND4EomRRfiYIM34NbtmqWnsukWCR9JsIRF+SPyHpsd0rQpJIwhtynNlpBQyJpbBja335Atm4v9sZsisY+igY4RqvLwq/iny4IuUytGMQCc3VBqwpiUCnDGY1x8G8KaMgZ0Eaz0Yb8hdxkw7Z25ascYHdVftqWrFeeFEz9EdugCL4hetCT5hRoomYllay4a5NyJUcW2VdeisVlbhZFgD7bbFWKE3LIHkPxY69A2rmszDlBN8K0BfLUOXxvmiZmWiJpPgw+9VEA8ZBq0EU0E1VKwoMxMZG41lFs8Jgarv2dQy7NxZoC2hMxTmlx3dHkw6YSgGJtdvetZjbWzfvv2MZVi9Xo/HH3+cd7/73ezZs+ecgNHZbiSMMdx2223s3r272efc3BxXXnnlG7oB6XQ6PPjgg1x11VW88MILQEjC77//fq644gogKJHe//73c/PNN/OVr3yFgwcPnnF/vV6P73znO+zataspT1uPt0eMK4qefvppjhw58rqm1hDW6NzcHHfddRczMzPn/RvWTqfDvffe23gFJRXEuYaqMj8/z/e+9z3279/P/Px848typrgYXmHr8faN5557jv/23/4bv/M7v7PGt+V0HaPGk8pTE81f5H32Qj7n9YDX+ufC2zfGgczrqW4uJiw63/v+Rdd3el5d1/T7/cYPbHp6+ryM63Rx4UvSymFQNhgJyhEjjSphrHomJNgijSm1SDohiteQJYoIKhZF8BoX0VitmGpI1/3Yvk9/KoKqJqiLRgl7XJ5RVSOxdC4aWsvINyYl4ElGogrEMi1NYCECIzE5IhneQV15vFNcBVp7vmsr6pZhdz8QE7/qKHKDZAYVsLWlPuEpF4Z0jw5pdTydtrLvxDI/7fbwZMxNFKETW1TvhLbq43MS5zPO2WTRZliXDKqSiUJZHkCrsPSqmpVeKM1yqsx2LIWFYS0Max+VK7E7FUImQOPBI/H8RZDkYLX0/OzEgF2bWky0DK3cIFj6pQMJJVad3FB1PKuD8ByvwWMoMwkcheNIMC+tk16t/HwRFnqeykEmju+9usz1Uzkt8bSt4I2jr8G7xgDOOCYmhO25QU4aFnse33xYxrVah25inRas9iOAYQx6JKVOWjUy+p0QAFZ6LP3QrO24XLwG76am5EwDrLFxu9RtLJy70ZoaV/ZA9DrKGc17BGBmDFxBVDOl41PAK604Ds1DKZU1Qcg0rnRqxXcGI4JzntCwQjEoFaMSsfQ63sNKP5SjNcoricokFayzZJoxM1kwM+kwVgMkckod//QqZWXoEAf9cqTcakrQEiiyyesJ2pkJx24tDADjqeoAruqoLsoNtNqWynmqukZMUPFN54aVfjjqjhdmvFA7OIGyPOGo3JCVtkNEyBG8ExyKweCH4KtQFlsXnrk5S6cwLA8qvEBrymIXLYf7Sv+VijwTpAhKJ+YKDrsC31J2Tqzf8KzHKK666ioefvhhpqamzrhNajV+LmGM4a677jrrfo0xbNy4kY0bN57TvlN0Oh3uvvvu13QyO/WmJ7Uj/+M//uPTKi5SzM/P8+Uvf5lPfvKTbN269Rca03pcWuG957nnnjsnRRGENbN7924OHDjA1772NYwxfOADH+Dee+89r6UHxhhardYv/PyFhQWeeuop9u7du8awej3W40JGVVX823/7b5mcnOTTn/40k5OTp1VBnAkKXa7gZR0avT3jTKVXqspgMGBlZYWpqanXLQ++1NfHG1H/pRiHvN57lpaWOHHiBC+99BL/5//8H44dO8bu3bv5V//qX12w8V4EYDQI3/6boEgpG8VOgjQjbCRjwMhEaNRsKcHQ2djQFsqpodaoBoh7aOCIRB8hIk+KUCn9mAyVhVC6FkCHxOQ/ZdvaZOepvK1JyEkQJvgeOUYlct57qtqFP87hncPX4W+NBi5J+dH1yt8UyrLCTb2aCmg5Q2Ez8okMqxknXio54UtWcRyyjsXSs3B0iLOG2UmbJgfRdExB5eOjmbjXMB+Kw4hQO4/3gkgL9SWZeDptw8l+xWpfMWIYVtAzDivBbCeZC0ucQGM1AC0E1VBa5n0AbLXXxoC4Vyr7Tw65ZnOLTmHIMktLYVA5NPpLTRaC857VIWFcjI6jcU4ek/OUHhZ6QdHhIi90wOF+TScTbpizwQuqDf3aN2qf3IZkvxDH1s0GsyAsrCgujjd1aKtrmO5Atx9+54jKEmFUZpaGE0vAnAbT43GoowQIlMogU7h4PBKBR/pisSnxykb7b7qq6Vr/Igilc0VGA4uUkR9TKBUL6qAEN1XD2q08DNRTAv3oyG0lgp54kQihHE2jusnHOZkxsOTCTYgxI+8kJYDG/iCCqDgm48F6i3EZViwzUzlFXlLXDlcHdY+LLuRDF4yu1UFvODrtGSMfpDwTMqsjiCQwdEpdg1YVg1g2V0dY5FxUIbUCgO32y1CmauONlDHkLcVVjqIUvELLC7kIw0wZ5gHCZiJUDowDUxt8bQI8bgs1QosCV1nqIexYUaYzoaw9WsG7O8JsBgeLguXpFs5kiLVkmmONZWXdo2U9Ylx55ZU8/PDDzM3Nndf9GmO45557+MAHPvCW1PWfbpuZmRkeeuih11UanThxgkcffZTf+I3fuCgdsC73UFXKsmR+fh5VpdPpMDc3d0ncNHvveeqpp3j88cfPqfRqenqa97///Tz99NONB5b3nieffJJOp8Ndd911oYb8hiK1Gt+3bx9PPfUUr7766ls6nvV4Z0VRFBRFQa/X43d/93epqop/8k/+yZr3yzMlzufLqPdCxniiPP53euxShwKXYlzsduznEmcqORsMBo3P3WAw4DOf+cxrFNCvp0a6VOJ0yr+qqpifn+fAgQMcOXKEjRs3snPnTvr9PjMzM0xMTGCtpdPp8Jd/+Zf8wR/8AUePHmVxcZHDhw/T7/fZsmXL5Q2M1IVv3HFQ6QgVqfrGlyg1pZcoWRARDDLyhQGMsSMjK2NwSNPxSnUMAYnBWAlwyRg8obRHIpCSlPwzAlIQoUfc17jCI4CsVLIjjZKDEdYIxE8DLKlrz2BY0uv3GfZ71HUVjagDtLiu3eIGm7MBQ115jriak7nwwgbPXL9m20CZw9CqFBWlxtIthIVNGcfLiqmpNhNDQ6+sQDV6FgXgVWTRxyg4jYf5UcWrwzuNMCnQCmsMg8qzcVJYrTy9HuRiKTLLoKwY1ErbjLpumWhw4yNQM41vTLpI40zGx3wsM+uVysGTQ3ZuzJlqZeR5AHll7fAouQoz7WBLvjIMbeaVMJcJlCisMR5XRiWNTfkV8EqvYkMhXLMxY1DVAZB5Q66GXBwmmlo5PFs2CdaGEjUUCmsY1p46Km5yG0qbYFSWlqAMMqaQi69fudE2DcBMf+vo74aBxb9Tt7/k8WVj2ZU10SEqejmNK/YzA612hDUygnkJegWQNjJlH8mACN25vFIT4FEuMGENTj21D8/PLLRyIc8MZemZbMPWTRmTmWHFe3JbB+8kMwJm/X6ENArqwlrKfAZeyDLL1FSO0MNVHi+Cj9e/aBjH0sDhauhFZVECs8jofIgJCjcxUAMtE6DQ8rKSK7gilPtVZTTbj/tptwyDqqauPSaPMM8IS8MqdI3Lwr4x4Ay42I0xMxKApAepDVUltDF0WgWmaGGzApvlGGOCSXivZGalIvNhXW/OlVkDU4XlwOQEZdbG2BybF7RtFhWO613S3ulhjOHee+/lzjvvPKsC6FyjKAp27NjB+973Pq677roLDovONZLS6PWg0f79+/nmN7/Jhz70oXVodIbo9/u8+OKLHD16lJdeeoljx44BoVPSQw899Lot4C9G/PSnP/2FYNHHP/5xvvnNb7KwsLDmMe99c5xvVVRVxbPPPsvTTz/N0aNH39KxrMc7K4wxfPjDH+aTn/wkV199NQsLCzz++OMsLy/z6quvMjc3R6vVek1r8dPFW/3e8EZiHA6dLuG+2L4yl2NcDjAF1o5zMBjw/e9/n//+3/873/rWt1BVPv/5z69pinEmX61LcR2Mg8+6rnn11Vf5m7/5G771rW/x7W9/mwMHDtDtdrn33nv5zGc+wze/+U2yLOO6667jXe96F3v27OGLX/wiTz755Brl4PT09JqubRciLjgwMigSPYJQ30CMBFnWyEeICqCkNEqQJypkAqDwiJig6vGxTbrSACMRg80Mai0Og4oJwEgEERs8YwwxyZNRYhpeHR/JhEI0wg64IAAKbUqMUitzr9HnJfrt1N7H9uaC2IIs75C3JqAesLktfMK2sAs9OhY65KhmLNUlL3YMP5nLGfZq5LijPVBoWcopxW9u8/P5kyy5ikHXIyaYx5S1x1NjrSA6kpqaWKcUSpo0qrAklq4lRYhjpfSUasmMZSqXACkUJjLP0Hmw2hiVqwJGgiKEUamVzUCcroEklYLNBBPnpFsqP5svuXKDZ66T0xKDMTCsQnma1jDTFqyBpUFQjBDVPWmnzf5lBG5EQrnRRCHkcaNjZcWGSuh2PZ3cYL0wHIAUATxYE/x5SlHm5sCr4diiD23sZfR6k63QYUuSIkhHappxeKRRGTQ7ISwNlH492iapg8YlRg1UihDIx42z+AQxsbTNB/mSTwbcmhRxQV3UyqPCJ445qZ8aJVycn7FDaureegNFTdpvUCFt7hgW+uH6bGeQ5xZVqGtlehZWfM1yT1AJgCWzIwWSeljpBbBiXUaOxagJpYuFpdU2iO/hcY0JtxLGWnlhcVhjxeAFvLpGxZU6ypkslqSNlaVJBEmFgcGksLIQfImqGuoqQp44YV6UqnIBckXglBkls0LpAiDzHRisgG95citYG9e6F+oymFtPFgWTnSmyfCIMpnlfUQyCZsrQhY6HosqAoPSqTc4AIasrjFZo1WNYOSYzMLJucvpOjlRa88u//MvnFei0221+8zd/k+3bt1+ykCUpjV4PGqkq3/3udwH4lV/5FbLsgt+2XFbR7/d55JFH2Ldv32seW1lZ4Rvf+Aaf+9zn3tJ1oKosLCycEyzasmULHwwUFacAACAASURBVPvYx9iyZUtjxH6phKpy8uRJ/uqv/opnn332sknE1uPtE9dddx2///u/z+7du5t7/4997GOsrKxgjOHHP/4x/X6fe+6557SJ5KWYTL9evB40Gv/5cjy+CxmnKrQuRcB26jk8fPgwjz76KP/pP/0nnn/+ea6++mp+7/d+j7/39/5eUzp8qYz9dHEmH6aqqpovwv7wD/+QvXv3sry8vMbLr9vtsnPnTrZt28bRo0cREbIsw3vPvffeywc/+EG2b99OVVXMzs6yadOm13TAPd9x4e+8mgQ/LlY0etWEPxBMqjWm0tGKJ3bHkqjo0BEpUA3wSEESLfI0YCQoLAxah6zSp+xSDGIEZ4K6RkwoW8OE8remXo3kmSPUEnLsWmi8gVLXsFTqkxQwToPiyXuPIliT02pP4l2F8RUtqfigbbOjX7MkGS0kdMISYdZabhzC9gpWTEG2ydM/MaSYzThcDDm4MmRFK4Yog0FJO8/IrFCrR2uoXfAuqp0ns0ElhIL32pQHARgxVM5F0Ka0MkvLWjITym6sNfSHdfDUEUPtPLnVBlYk5YdTYrIMksqTVFCjI0NsH5VjESgMSjgwX1POKJunCrJMcGowPtKY2jPdDoqOpZ5SJlfoeFoSuEkgIZVoGWBYKd2kjjHKi4sl3YEy17Jct1FQZ3GlYnJFRKNiJXRI2zAXoMXJxVFLehHYNCm0gRN9bTQgcbk2MIZ0rA68ha2bLCdXHN3BaF0kyVFaXqnLmRBVQz7BIsEYHZWBjR9nfN2WCZ3RWi3IsgBMxlVMQoAho7LJAGWMGFaGnkEdutENSiJwDWPJDcwUUKlheeCD2bVXes5jjVIplH1oZRqUPhK9l9Ic1ILF0LLQMm2KrKCVZWCEWkucWxn5McXBGoLicKms6TtFC08lo3LG9N6R2aAuaoBRuJSDh5EJyrZ2W1i0oHWAjS52MjMS5kkJv8hiV7nMhPcS66FVCfkQxAv9CcXNKDYTnAPnhLqCjm0xOTlN3prE2AyR+G4WS2fjUJHcM6/KQD09lErAOcWurGKGPdotG2Bl7XEeuva1pYbr8c4JEXldWJRaEL9eoj1+Q9JqtfjYxz7GVVdddUnfTKVI0OjRRx/lhRdeOO2xJmjknOOee+5hw4YNl8WxXehQVX70ox+dFhalKMvyIo7ozHFqB72zxU033cSDDz5Iu92m3++fthtaujYudnjv+f73v8+3v/3t16iefpHYvTsYzV8q52k9Lu2w1nLllVfyr//1v35NJ812u0273cZ7z549ezh06NDbzlD9bNDo1A5r658RIU5Xzue9x3t/ySmPUywtLfHv//2/5xvf+AaHDx/m5ptv5t/8m3/D/fff33xp9FaYXb/ROJ0PU1VVHDhwgEceeYQvfelLPPfcc/T7/TXPExHa7TYTExNcffXV/KN/9I+w1jI1NUW73SbLMn73d38Xa+2az7+L8aXFBQdG4bSNVCmGlExHYKQaFUBjagjvQ4coozG5loSTxkyGo8KD4NcjmqAR4BSHC8BIQcWEfcRs0xvBi8EaiSoNM6ZkoqEBXoPvkpVg1p38XaJ+pzFCDiwroCTvPQZDnhchGfc1V5TH+KV+xeTxLseHFRmC+tDm26AM+g6LZ9oJU9ZQG8vilHC43+d4VjM506LXd5T9IZUPrVfzLEMIoCjNrVeldr4pn/ME5QNoA3vQkLAW0Sw4zW4mNnryCIW15AZqb1CtEYn6LYFMTCjr8x4XJ8MIFALOCFUVIBV1OB8Z4E2ARt7Bq0vBTHjrTEErN3gfIY5AVXtmWwZVz2I3ehQl2KJjxTs6Us+oxrbwCpN5KKWaH4b1Nl86pgawo1XgS0uV1eQtMCaomVpZmJCNczAsYaVLIwFqGWHbRkGWPPO90VjUj9aexA5d3sCSV7o9h1iYmoLBIHTpGjegJj6vuS6SGkjCejJJZdRsl86bMNMWWrmlco5222PG3uNVR6AoWvOMrieBslIWl4PpdSph8yaaNiegJULlXVj6NsBHV3s6rXjezWi/ZmyMquCqDK+ezBi2TE4z1ZnA2ozjq0vU/RVMhEVOg9eVKDiBnnMMK2XgoXKKjeNL57cVS+Os1QCMJAp7TPBvEsL+Km9R66iGoWOfjq2bdh7mMSmSOk5oz1sGeDq5YFUYFJ66rTATXt+5AMHakjE1M0venkNsDmKw1jYlmKpKWdes9gcsLa8gVY8V6xhG7yxLOKaOGDrGI0ZQI7QmMtR7bGYY1usKo3dqZFnGLbfcctYbtu3bt/PhD3+Y5557jr17977m5iLFfffdB4SOGVdddRV79uy5JG6a3mgkT6OnnnqKJ5544ozQ6Hvf+x4HDhzgU5/6FLOzs2/BSC+9+MlPfnLWx7dt2/aWgJVT4410QgN497vf3cAiCEnw+9///qb1fIq/9bf+Fh/4wAcuyFjPFMPhkB/96Ec89thj5y0Rv/rqq7nuuuv41re+9Zp1n0oNLqdreT0uXMzMzPBbv/VbfPazn+Xmm28+42eHMYbNmzezefPmy8Kn6FxjHBol8DH+Hvd2Oc4LEc45VlZWWFxcZPPmzee1DP58RDqvJ06c4JFHHmH//v3s2rWLL3zhCzzwwAPNPfjlFKrK4uIiX//61/kv/+W/8Mwzz6y5lzPG0Ol02L17N/fffz/33Xcf73rXu9iyZcuaJgxp3Z/uur8Yc3LhPYzGVBskdRE+QKHkEURKbmVUfqTBQNobg0lZpNdYGjbKrFNSDEHtknyRgrQp7l9dADrJpBjBxWQ9gSJjAkDSsTK4MKQAkYxJQEkbUJFUEyDNmDRmqyIGMZarZZVr54/gDq9wrDekyCwdyZAstmIXcMbSH1Q4TFABWegLvDosKa6cZHauzQBH6ZWlQYBGWoYSGxMVJA5Qr6h4FG1Mw4PJcpjX0imlC7AozFuQqFR1NH4mbJvFY2kXQq/yeByVS7R+VJaXEnsTz22AFBLbcYG4EWBJt1a1wokVT384ZMeGgsmWRYyjrOPcO2VDJxgxz3c1lIUxptahEe2MjLgJSposgyOr2hg4T+ewOFQmBhXbJgz9gaHEUbSDUiwzoFkAa1s3B9+bbj94Fx0rPQsZlDKm8onLKomiRAETYIq3oxIza2ByAqqlsQtBopJoDNqkeax8UPkkI+m6DooaF1+jk1s6nTbDymFNhYlXbeP1k8BThEZrQVQowZuZEJa6QS2EBhWOj2q+LBf6opQ+zqMJ8FHd6NpNwMWOlYOph7IS5ldrhjXMFAUbp6eY7ExwaGmR1f48qA8eYzryYVKgVM+gDoWmmQlvRFFwRVqaJvkWJX8nG47N2vAc9TB0wqACddH/KoE9oGiBLYJCzGZBnaUVuMzjpjzDliAm+HJlYlAPVQU4w+bOFJNzVyDFZBiMRG2hQlU7Frtd5hcXWV5ZZjgcgDpUo6LLQtvCRJ7RzkI5bttCXTtwQqmOVgaCxawrjNbjLHH06FG+8Y1v4JxjMBicdhsRYfv27ZcdJDo1rLXcfffdqOppk+cUJ06cYGlpaR0YAcvLy5w4ceKMjxtjuP766y/Zb5FPjXFlUQpjDLfccgutVou9e/dSliXbt2/nfe9730VNdrrdLn/6p3/Kyy+//Ibh1+vFnj17uOuuu2i1Wmzbto3hcLjm8SzL2LVr12V9Xa/H+YsHHniAz3/+81xxxRWvgcCnKm7ejqBoPNLxpnlInxfpvW7dEPv0sby8zI9//GM2btz4GtPoSyHSeBYXF1leXmbjxo383u/9Hg8++OBl8Tl2qtLHOcfzzz/Pf/gP/4E//dM/ZWFhodnGWsvu3bt58MEH+dCHPsRtt93Gtm3b1qzhFONM4o287oWICw6MnCbtTSyR8gmoxC5bJOgBSGojPvLE8eqjUXMCRBHOmKg7SioZ9Y3CSJNRSkOSEnQIyaP3o+5ZJqp0vIQ/YlKHtuDoG0riBOelgVMpIdX4g8TtU6lO8K0JcpTjOknpZpl2y+QGdFBSaMVEbhn4HLwyKEuG6qkq8N2KrvUc15KlDcqE1hRVxdREm6F3DFxNr3LBK8kpVW1pZREQEcZifJhxI+moY3c0jbDLB1WXqlJreK7G2rVQnmdRUXJjaGcFxpc4ddROx3yfBEw61nASJdZaFQhWNHTGq8P5MGPARRVWBsrLx4ZcuaFgy2RG13myzGBEEafMdgTBc2JVafKGBAijMTZmBF6cwNIwetfEzbsVHFjyHF31bJ8Wdm4OZVLeKnkWjiMzSssK2lK2bYbDrwZwVBNURxLNnV2EQSYpteIpdmNt5I0N68UakFO6jiXAlUm46BzgQ01f02VP4ud/gj0uKqc67RadToduvUDRgsIGyJWO3UgEFSaAp2ScTVwP4oUNU4KIZ6Grgec18BR6ovhBeK1gvh08xlw9Uiplsna/6dIrB0Llldop7Syn025xrNtlYflVMuOpa6FyYZ0Ywhw5H+Bl2m8WX2MYjcONiaVjUU2UDMETDMviz7UK3VIYDBy+1lEZIAGSTU1GIGahVQjWKLUoZR7VXNG024oEU/5SyLxh2+YrmNpyNZLlSHyPcl7p9ge8euIER48fY7W7Ct4lTSOZhC5uST2pKgydoygMndxQ1R6JdXLeK7UXpNampG091uN0oaqv23VJVXn00UfZtWsXnU7nIo3swoS1lnvuuYdOp8Nf//Vfn5eSn7dzDIfDs/r77Nmzh1tvvfUijugXj61bt74GFjnnWF1dZe/evezdu7e5KT548CBTU1O8//3vv2hJxBNPPMGLL774pvdjjKHdbrNr1y7+7t/9u801e8MNN6zZrtfr8ZOf/IQ/+7M/Y35+nn/8j//xm37t9bi84wc/+AF/8Rd/wcMPP8zs7OxrSrDOFG9XcDIOjUSEwWBAVVWX/efg+Y5xmHjgwAH27dvHb/zGbzSG6Jfi2jh06BATExP8i3/xL3j44YcbD77TjfVS82JKUVUV3/zmN/mX//Jf8txzzzVfNFhrufHGG/mt3/otHn74YXbv3n3Wz7FL5bguODBKHcJAo9k1QCjzSibCABLbR3kheBppk4fjYlcnmm2DQXOCNE0pWvq/xteK6MBI6JSGxkTd+5E6RUyTpDrAuJDUiSjGCI0GSiV66YzRgviSigZ1k4y6piWlUT/vsHz1LyETM0wcfIm8f4LcOyYrYbqqKIxQGsXMdljq1qxWjoF1LLdryk4gLlllmWhlbJhsM6hCSVfpfCjjcTWoJbPBxNurYmU0bhtVUU7TnEaz4qbjWaKWQCxgMxKS7xGQyJjMleWxeRPRAPzGAMKaJS2CRoftdI7HwY8HBhUcPFFybLHCI0x3DBsmDZl4cMqGCYNXz8mVZJAe15SGVvdrhGRE6AIjzyMJBtx1DfsXlGP9il3bYWsWDM1zG9ZGZoLRs5lUNm+E/tEx8OSDMsW4oARKqywBkDWvG2FSDiQ7gvGPcNXQvj55JRFbxKc5SsAolQ7WLpajTU3Tq0tsXocOYbrWRyuZQ2djcEU0+G6pghrIRZiZMFTes9oLhswJfHYHEXySVE7aKJDyIuw3ja25bnzoRtYdajRCF/Is50S3x7HFo5jc0e07cOGasSKUGsoOLZC6ERrCes0k7LsyAeaYLKiCGu+i6J0kESYJMKwMgwEMBh51UfUl4Xmz0+E5eSa0c5hoWfpVeBdJ82Qlqp5qgy/hOlNw1cQMq5uupO5MNSZR/bLk58eOcOCVn7PaXYllp5DH9wcflWbpGkvlezYDkxuksLQLEzzXMI3aMssseXbpf2OyHhcmnHP89Kc/5c4773zTJUODweCcDIUv5TDGcPvtt7Njxw6+/vWvc+jQoTWP53lOnuenTZAulRurSyGyLOPuu+++LEzCp6en+ehHP9rAIu89R44c4emnn+bFF188bSnm8ePHAS4aNOr1em/q+UVRcOONN7Jnzx6uueYaiqI4rRG5955XXnmFP//zP+fYsWPrhtrr0cSBAwf4Z//sn/EXf/EX/NN/+k+5/fbbmZycXLOOvPf0ej2MMc175dv5fXH82DqdDt77M4K0t/M8nC3G5+DFF1/klltuaRS6l+qcnDhxgs985jN89rOfPWunv9N5BV0KgFRVmZ+f5z//5//M3r17gTDX11xzDb/927/Npz71KXbu3HlGf743sv83uu35igt+J1HXdQNz0nk1xgRgFIGDalQeEZO+UJxEYwCc/hBMsUclZCn5SpH+kbqw+ZDQEWBKFFaEx2LmG0q4BKPSlKuFEhjBqmnAFhFC+DimkZn0qAvcCNMoJuqZVD3eCMOZTSxdU2C3rSLDPhO9LpP1EDGW1ckOAyP0Zj112WeDn6fnhnQ6WTCHxuNigrlhqsPQOdygpnKh61npfDRTDgqHLEoxBPAS1A7JYBzCc0wEXcYkMBcBmSom0gHnlcwY8DB0hqmWsjLweA3nLhkzCwFOhB2NgTQNXjkmQYYIeZRYeqXBf6gchvnqlwqibJ3JsLWjdrBx0lLWjsXuiDzJ6DQHc/TRrte2kpd0nOHPygB+egh6Q9i+yTPRNmSZkJuQ/INn46wyGMDRE8Hs3PlR+/hUbaeMlDfK2DFFZZAB+sNmiKMpiVCm9gF8FA1wC9dGuuc1cW6dgwljkNzS6y9h7AhWJUC3RmEkATCRFHoJBkY5UMsaZtrgKsdqOXp+o/6RUNbnFIZD6BShG9upt+ImHlNvKAyqEbzqVzXL/aOIGbLcV6iCF5QYQ+2FpUEd/K7s6ErNrYnleAYnSlW7AN0iLEp/JwWVTSWADha6wnDg8NErKimTpqfjc2zwQWrnhsr5BoBm8XzXDqQ2tCvLr26a5T3taZ7rw2oxidiM0jkOHz/B/oMvsbS0EG5ExtZY7VNvxqg+Y/RepaIUmcVrKL/r5JbCGJwL1+Nir8KWFe3i/JQ2rMflF957HnvsMfr9Prfffvub8iq5HOv6zxapzO7Tn/40jz76KM8++ywQjvNDH/oQmzZt4rHHHuOVV14BAnC4++67Lxuj74sRe/bsYefOnW/1MF43pqenefjhh5uxHjp0iKeffpoXXnjhrEbQ3nuefvpp7rjjjgveHQZgbm7unJ9TFAVXXnkl119/Pddeey1bt249KxxOx/T444+/7cyK1+P8RCqN/L//9/9y0003sWPHDu6//36uvfZaFhcXefrpp3n11Vcbxd5dd921RrX3do1TS9ROF+90eDQcDtm8eTPvfe97L8njH1dC/dIv/RK/8iu/wuTk5OuWY8FaWJQ+N9rt9lsKj5aWlnjppZcQEa6++moefvhhPve5z3HDDTecN8+ti9kd8MJ/9aTBq6hOEhGBDMWbYEStsWNXagGfHI0SNEpJrQBGtWnL7bzHq28SeYn/mVjm06iMFIJrUjS2JiX5ARp5IRjxRqCUSsysETKrGCvkGvyNZExDk8rmfIJGRJAl0ni+hP3YQPiBvMiRDZuAYFo1NAQvp6rEDvtsGi4yvbrEUm/AzHSBWKjVU/ugxqldmMstUxMUdsjJ7pBB6SmdUnlPFo/PuQjUBKoxZRFjZUyOaBjndDTXPqg7HC5CoIBi1IOVDFVo5Uq3HJlop+MWCcl/HWuxNJ4rkxJpFxL65DNjE/xwo7EBHF/ytHPPpqmMQeVAPJumBeeUpX6zhEZwSIMqLYxjBD8SoEoVYwmwlDUceBWOLcKWWWXbBmGqE5QoxhiKzHHFVuiXsLgMFQHcZBLVb9CswbX+XMQ5gGE/HC9jMCs93jLQ9zQlUTmgNgw2y0djTQofL8r8ynEktl8fh0RxqTfzQASDqaQNFXKx9GqPOqWwQjuzYFyc97F5jMdgbez65mFyKgC93IzeKJQAb4I7tEHVkRmhUuj2u1irVE5Z6Xlm8gCKVITV0sVyOWngVmEFmwnt9gRTkxtYHFRUx48iEjqaGatIUhdF1U6ewVRuODGA1VVPVWqjJsui4XirCLA5qJOUgXNhHWjojmcIhuS2tuySnI9v3ciNc1MsDJTl3NJ1nvnjJ3jp5/tZWDgeVJIRCnpP48slMoJH3q9dg7ULQCkjKKxEoFc51ClaK+KhXbTp5G//G7n1OHPUdc23vvUtfvjDH3LHHXc0ipBz/dC/6aab3nYyfBGhKAo+8pGPNObGxhgmJyfZt28fTz311Jqbpf3793P33Xdz9913n/UbyXdC7Ny5k1/7tV+7JMyuzxbT09M89NBD7Ny5E+cczzzzDN/5zndYXV19w/u4GAqcfr/PwYMH3/D2k5OT3HLLLdx+++3Mzs6eVkl0ujhx4gRPPPHEOixaj7OGqnL8+HH+6q/+CoA//uM/ptPpUFUV/X4fEeHGG2/kYx/72GWhMDxfcbZypdP9+1KEJhcyiqLgnnvuuaRL0VLcddddZ/0i7FRQMhwOERFOnjzJV7/6VTZv3swnP/nJizXc08bi4iIzMzP8g3/wD/jn//yf8573vGfN9Xg+5t85R1mWVFUFcEG9HS+8wsj52B3Jh5IvCZDIGd/glwSMkkomlZqNA5jUejxt66LMovE7iqDHyYhSpt+HcND0XNPmdX1sLZ46nUEqzTE49VhvcCZ0gDJxDElVEBJIbUriTCyVS2NWDdIaYzMKY+M2BmsNmc1CxUtd4asSl1tm7SKdskupUEy2yHNLWdfRrygCMjG0Wzm5tRgxHF8Z0Kt8aGMvkBsTSntqTx6Bj/NRsaWMvJjQCIQSXFEyIzhCUp8coXKRqKRQFEOGoZ15Kh/mzxrBafDFUe/iOQvgwWvwCxIEl/ypBHICAApJfoBzdQ21C35Fh07WTLYtk+2M/jB0adu+QSi9ozeMsCSdhHiOk+onta63NBVrDSxSGZ23/gB+NlCOzDt2bYWN09ApDK2WoZV7rtwKwwGYGvqBF5DZtWV1jgDEfFQMWQGtoTdY+1oJHBUWxEcFWqQ8rcyQA5IJ1oZ5FVWcF7wDV3hqXzZd0RKUGP/ZaVIBBbVbMnLGCycXapb7SpEJiMM5oTtWXidj47MW8hxKF5U9rdExjL8mQHcIvdKT2eB/VdceckeNYannGw8nFUOv8lgJwEoEMmuYKHKKokOlhr4fUGiQCLWyMBgxniwbGVwTzbaNQF0rS11DXfnm+s5N8CwqCkGNNgbdCSYaAsxDQ7mgdZZ3521+c+c2Jp3QEsPKsOSVyrBv/8scOXmEsgoysVRK6D2xG+NoLlSiii2SNyWWMwrBsD3zGCvULmDrmRyuLdoYO0ltC2q5tBO69bg4sbi4yJNPPsnBgwe59dZbmZub44orrnhDpTbXX38999133yUPB37RyPP8NTdBdV2/JhHo9/s88cQTLC0t8au/+qvvCGjUarWYnJxkZWWl+d3ExAQf/OAHL4rq5lxiw4YNa8oLRYT3ve99XH311VRVxRNPPMHTTz99SZZgDQYDjh079rrbTU5Ocuutt3LHHXewYcOGc04InHPrsGg9zjmGw+Eaw/R2u819993Hrbfe+o4CRmeLU1vKW2svidKlixnGmDVdty7FSPn7qZA9nafTfe4/9dRT/K//9b+Ym5vjc5/7HHmes7Ky8prueRczvPds3ryZL37xi9x0001rPo/P15rrdrt86Utf4sc//jG3334799577+UNjKqoinGxBEohmhVrUw9Te20ATwAOAYwYSWqEYEadEsa0XFx0XJa47+CnnXBITG51TPFDUr8E0ON99OpBGhgUQvDeUangTDCmrYwP5WnN66fF68P+IBpC+zjOcT2SiR4wQW2hSPCxcR7jHMZVGDdke77Eq25AiaK1w1hDlmVoXeMhdi8L3ZYU2DQ9QWYtR5d6rAzqkJR6R2YM3sPAucbXSL02xtZJdWPFN6VUglCLRoNnQ2ai91E8rjSfg8pgrdIuTDhm4+lVyrAK8MhGI2wPIEpuhToCEgUkqnVqCW3dleCXY0wwQfdeKSvlwPGSm6+eYbpjWR0MEYHtc4ZD856qHpV6pdKwuJQa5U0CNeMKmnHokUoKhyUcPQlTHQHCuex0hM3TgtsOB497hsOgSJnoxJI0H0BEWktIUAoZD91eWHzNSoowJjeQazB7zlIZYFR+WQM+D+TSe8iQUAqXQasYW5aMxi9xkadrIp3D0bYGFeg6YaEbZF0iYK3goseRnrLfPA9m0WUFU9Oj3zeldmak3OoPwkhElH4VOqEhhtWBZ1DBVCYYDP1aMaIU1pAZmGwXzEzMUPmcoQtQp2Usg8EiYiZoF6GG0aFYE0sm4+tmFnKB2gvdboC9TsPczk5DuxPoTTLITj5FqWSvdlCXUNSWm9otHtyykVkyqrrCOeX51R7fW1jm+LDX+BE5HxVX4+eU0c/pwhBouvOZuC5Kp1CCVU9Ve1qF4gQ21MoVqwO8DPGtt39Sux5njzzPufPOO7ntttsAeP755zl48CDee3bt2nXW5xZFwX333cfExMTFGOplET/4wQ8YDAb88i//Mtu3b3+rh3POoar87Gc/45VXXsFayy233HLGbmAzMzM89NBD/Pmf/zllWZJlGR/5yEe45pprLvKozx4iwkc+8hHquubIkSMAvOc97+G9730vR48e5etf/zqHDx9+y2GRqrK6uopz4cuv6enpN5RwvFlQtB7rcT5jenqaT3ziE8zMzACXtpLkYoSqNl1GEzCp6zrkV5cpNDoXD7/L7fhOhUNnUo4dPnyY//pf/yt/8Ad/wCuvvIIxhoMHD/KFL3yhURxdqDh1/k/tUgiwa9curr322jXbnM8wxrCwsMD/+3//jxtuuOGCw+EL3yXNKak7WUItye8jef8Ev6GoMoreRiIafVUEY0KXsqDciUmxhsw1feM/ggajsjVIQCGWtumoC1soKQrASRnbL0l1ERes99Qo4gUnqRNZOjqJz4/HSlDojL+uGcss1TvUx25Jqhh1tNwAUw3JqlV8scJPlnrYVoH4IZX6qCQC54KKCAlQzDuPN8p0u0C9IgxYHUQ1UmwXlYybNZ4H51LJX/hlug8SE+YmGEALxnhUDcaDN4q1oZzPayghuB/QiAAAIABJREFUG9SQdZSJIqPyUBjF22DG7GNrdh/3qz6UBqkKNpXHRYiSxdIdSUovCeoYi9DteX52wnPDjjlm7TJL3QFTHWXbrHB0QalcOIYEPpoyLBkDIXFhjCtCmnOsURFkglrm+ALs2CoMayUbClPkbJqtWK3C4/0qrluz9nUhQgkftnNjpV5pHbRMMOkeVAleSAM4K69YormzCfNSx5KlydaojX0CY0DjQZXMlSUemBL9kTSUHA6HjkEZy6gIEEOioXVSFaV9GgtT7aCyqmtPqx221zSfcR4zgaoW+iVIPAaDMHDKfM8xrIjGz4ZeDV4drUxoZcKW6Wm2zG1BpWChP0ScQ4zB2AlyO8mg9lS9AMmGfgR/EizKLLSs0BvAYOgb8/DpDrQ7kNm41mTU3j51ditLoRyArQ3Xtgse2LCBDTYnV+jWnm8cPslXji9wwtcBIvuRqghdO1cw8qpK53lczabx3wFaCRrfy7yDvhH+Jh9wbSvnJpniqneACmI9zhxZlvHhD3+YO+64o0lMt27d+hrjzjPF9ddfzxVXXHGhh3nJRafTIcuy06oxVJXnnnuOo0eP8slPfpJt27ZdNjfMqspLL73En/zJnzQmyy+99BK//uu/floomLwR/uE//IdN4jNucquqVFXFkSNHmptZYww7duw47c2lRjV42u58ztvk5CS//uu/vqb99fe//30ef/zx17STf6MxHA45dOgQN95445seX1VVvPDCC/zlX/4lw+EQYwz3338/733ve4HT3+wnE9OPfOQjbNq06U1/mz03N8c111zDyy+//Kb2sx7vvDDGsH37dpxz7Nixg+uvv/5tqzo91xARyrLk6NGjbNy4kQ0bNuC9pyxLiqJ4SwyEz0ecOu43C7/e6DycDpZciDiTeXlZljz++OP8u3/37/jOd77TNEXw3vOVr3wFEeGjH/0oN9988wVpiDDul5Tu1U691k593QsxR51Oh9/5nd/h05/+NCJywdVjFxwYJVSU1BBjD5DcgBvTYiH66YRfOKISSQOMMSaAHRMBz3gkGCAyUp6sAQWMkubwO8WmMilGD6Tdqo5aXo88YkbAJh3ESH0ROow5NAIcDeP0HlWHq2tcVeHrmqqu0LqipSU5JS0GWFdxqLdEH2HaGDIb1DY9V5EZQ+09NkIoK4KxwQx6WDustUy1c8raU5YBLGUxvfU+qru8Nq3hkwmzRLKWvJ2MgNrw+1r8qJuU0nhDoWDV0O17DDUOpWVzqroms0K/DmVVSaHkIyAJwE4ag/PULj3em4YyuAg2XEy/Xz25yvTUJrZuuIppOQbdJVClrODE8siPSU7N5nXtuW+WW/zZjgEQHxVDxxaVqbawYVZY7HqkXzM1a9k8owyGUNVKbzgCED6uCwtQQ68cqY2SeM4a6GRgVVgdalQeCVkmlHHww8pTWKFTRGVWBGETOYgdDTqVTTYLVkaAyRCOIXTDE5yDlR4sroaxJ/swhejZNQbPIgxp5wHUKMrkRDi+PIG4sXnLrWG1Z3ARrLjoQeUBV0dIqUH951QjLDLkuWV2eo52awKPMJflDKK0zGYZRWHJhyVHjh2i1aLxLEoKoyIaYCs0BvkGmGqFUjQ7tq2JgCnMjzAYKuUAcmfZ1cr54IY5ZmxG2wgLg5L/79hJnlhepadhTbkIi9SvhdHWRIiW5jPBofTeFuczXSqGMA4roSSw0zLMdFoMa8d8PJaOvbxuUNbj/Mbtt9++BhaleKM3+nNzcxetrfilFNdddx233347zzzzzBm3mZ+f58tf/jIPP/ww27dvvyySgdXVVR555JE1Hblefvlljhw5wnXXXXfa5ySvp1NDVTl69Ch/9md/9hpgdPfdd3P//fc30KgsS/bv389LL73UePVcc801PPDAA2/Yf+eNRJZlZFnG6uoqf/3Xf813vvOd1y3BGgwGLC4unhb8OedYWlp60+Mqy5LHHnuM733ve2sSk8cee4zNmzeza9cu7rzzTr797W83j2/YsIH3vve9r+u1cS7Rbrf5xCc+wZe+9CUOHz78pve3Hm+/aLfbOOcazxIRYXZ2lhtvvJF3vetdnDx5kj179lzyXbAuVqTjn56e5qc//Sn79u3j3e9+N7t27cJ73yiN4M0Dl4sd5xN0vVF151uhAj3Vr6iqKr785S/zxBNPvGY8ZVnyh3/4h5w8eZKHHnqITqdzQc6rqrK4uMiBAwfYtm0b27Zta8ocx+NCwjRVpSgKtm3b1nzRcyHjggOjBINM7NaVsnmNX8cLYIzEDl9JrTMyoG4USBIhDmP+QHEboPENGr3mmPRobNO039AWPu6fZGCtUaU0OsEmjtNGWCUm9W+LfixGyDMTO5MRStSQoGbyHlcOyHovs9DvkdlNCDlSlrh6iGrNsnP0rWVTMeTg0hJFYUO3LIGhU5x3eBM6mIE0yao1BmsUXzuc9+TWMN0Op7NbOuqoJvJxrBqP1flQPjTyANLGJFoISXJIuhVnwnFbrxEeSfBgIpzLwUDBCLYA78K8FFaa0pwEorwqmQh5HsYwqKPCJ0IxF02gEwCqk6+UUw4dO8bmrbcyNbOZov0Ki/OHQCuqIaxWUbE0RoN07LQ38I+RWXVTntasg7AWa4VDJ5V2W2gXwrGhY2HeMTkhbJpVqlI4dCJAo4lWeE3voYqAgbE5BGhnMNvKqGvP6lAxEZaF0jiDiAblSVSgWAOVg8JA0UnrPiiwLAFWEOGWEOCNFcFEiFd7ZVBBfxAg0aAMMCeK6IIqScYUVozKO62BiTYURfA+MpZGKZaZYBRtJVwb3YFncUUbc/F0q59bwdWx2xsBVE62DLOTOZNTbfqVslotMyPTGMlpZ6EDIcaS5XlQC8STmfyzrA3QLLPQLuJrVKEEbaIdjn3DjNBpCSbT2GVOG2gkCoNSGfSFwhm2tzJ+bdsmNqhFVNnfG/I/jhznh/0BpY4URQkipnlKflip5NGPraEEBxtFI1AIbLXC1cYyUUvsVAg2N0zUgtUcO6xo5SDu8rk5WY/zH51O5xf+FtgYc1l0wboQYYzhzjvvZO/evWdtdz4/P88f/dEf8fGPf5xdu3Zd8t+4O+dOq7Z5vZv0092kvvrqq/zRH/0R8/Pzax7z3vPUU09x4403snPnTn72s5/x5JNP8vOf/7xR/wAcO3aMPM+5//77z+tNb7fb5atf/SovvvjiG9p+3759fPe73+Wzn/3sGeHom0kIVJUnn3zyNbAIQtnKD37wA6699lo++MEPsm3bNobDIdZarr/+eqamps57QvDKK6+wsLBwXve5Hm+P6HQ6fP7zn2d6epqvfvWr/PCHP6Tb7WKt5fDhw7z44os457jhhhvWy5RPCWst11xzDf/7f/9vvvvd7/LAAw/wt//238Y5hzGm+Wy4HKHR+VIWne7fp1P5XCxF1qm+U4cPH+aHP/whVVVx6623MjU1tca/b3zbX6R5yLmM6ciRI/z+7/8++/fv5+///b/PAw880JSAwsUFtd77i7JuL4LCiMafCGgAQlCcxBIfCV5FFolqCGnKYUQVjZMgY8qicbFFeB3FR4fb1B2tUZc09UMJnoxldzrqxqaSfJBGjxuElo2wxBrEjIy4c2vIrAkJtUmjCGY9zjnKYUXpBvRPvszK4FWQglY+RyufIcsmkWwCa1vg+7yyeIiuc7StoXQ+KKtIhtGhFEjE4KNyw7lg5pVloLVnGNuRd4oMr9BXR+W0OcygqIkqljg/aQJNVBkpwU8qKKakaWFuTYBHJna4CmU2o/OmCu3M0Ksdk+2MyjtKF2a5ZaF20rSnzzIhUw2laIZRq/i4fShJA3xYI8urPY6fPM6u2+9EN2yi057g2NGXGHRLukuh/M40BsujFvCnsMK4ltI8rAUn1gRI0K3g6Dzs2hb8g8oaXE+ZnoS5GVjqh99VsdMbYwqUpDZBw0W1qWWx1rDS87EsU6J3VGgzj7qGQkwUgq8VvJAZHcEIQhlbrnGMjKnDImDrFC1a2QSLS6sMB56VrguG5GmM8ShNhFJeR1BtXAnVKgKYQSLQixDNKjivcX3DSpdooj7qQGdEGES6LUBhhNmJjE2zU2zduAOkoHI1RkL/vcwIrSKjVbSQLEdsaIM2XFmmTvuJcCu3MFFAKw+dCrX0tEWYm1SqFuSFgtGRujAqr0SFYaX0ukLuDe3ccMvGjcyZHFfXPNsd8tXjCxwsK6oIiNKcjV3+Y+8Dcc6J8C3+Ps0LsZvclZlwm83YrRZbCb4MsLVTWFp5i1wtrZZQ2pxet2LZnLlt9Hqsx9li586dZ1SdvBNi06ZNfOhDH+JrX/vaWYHK/Pw8//N//k8+9alPsWPHjssqGUixb98+rr/++tM+VlUVTz75JAcOHCDPc/7O3/k7rK6u8swzz7wGFqXw3uOc4+WXX+ZP/uRP6Ha7r9kmKZTOZ6gq+/fvf8OwKLVITmqK08W+ffu4/fbbfyH/hlQC+P3vf/+MaygpoLIs4+abbz7n1ziXmJ+f55FHHmlKLNZjPcaj0+nw4IMPcuutt/KZz3yGH//4xzzzzDM8++yzPP/886ysrHDbbbfx27/925e8ufFbERs3buSOO+7gi1/8IocOHaIsS+68806yLFszX5cLNEqw6Fy2T3GqT5CqMj8/z/z8PDt37qTdbp/xuTAyDr/QkT4DfvSjH/GFL3yBZ555BuccU1NTZ/2y6IYbbjhv3eBOPfbBYMDXvvY1/uN//I90Oh0++tGPvqWd50ReW3V1IeLCexiNJ64Sy580JZuKUdOULCGxg5lIk7il7l4hyZcmQQ0JayQeCjR+SMmzJSpnDAhmTIES/JLGxVsj/5tk7hygUG5CEtiyhsxassw2dTyZlfC7qMKBZNwdSq5K73E4rAjt6SuZ9MvUWlGWx+n2juK8kNscayy1q1D15GKakqegIAoKHGslzkNQHFkZkfDI15rkNjPCRBE0EVp6ylobapKZ0EFKo4oCTaovmjIfn5JuD96AGqLSSMmMokbIo9KqiViGZFQYlI6ptiUzGoFVKP3zMiqNypLpsiqShaS7lmBITDwXaqJyR5WXf7Yf/IBNGzawedNWrthZcHJlL24xGo7H/aayrQbijKmNEihKSyaVECWljREYOljsKpv6hqmJMCe1g6qC2SllQ1dYXlW8C1BCx01s4r5TSVNZg7iRMTNj0NQYwapQ10pdAwPYWBg2TWas9itqFzreeR9K1Bzg4pXqfZg/74WZyTluuOpq5heX2H94leWe4mppgKkCBUHZMj3VweQFxxcXELSBMX5MNTOog6qo8hFQRhiS5qd2sDoIP7cLE44TZVDqSJmjkGeGq7Zs5ootO8nyNoOqQqoKrz50FcsysjxHshxvbIC4HhZXlrAE36IMmGxZOi2hlYf1Nhg6lvswKYaJ3NMzSp6NVEhZNiqJq2pldRUyJ0x2+P/Ze7eYO67zvvv3rDUz+/AeyZcHiRRpiiptybQsJ7biyLEsOTFaN62bWLbcFGkvmiIXRRv3okBRwG1v2qLNVYCgd0ULFAHqBoad1ImdNl9TfUhgw6kd23XsJJZjfaIpUqJ4fE/7MLPWer6LZ83sTYmUSEmUeHgfgBK539l7TmvmnfXb////YXW4wDRY170/2djkqY1NzodoqqI5YJSHc6fieqm3sVWqtdddz8GiE/Y74e3e83bx9JKjTi0wNUteURWoCqMYeQFIo4a1RthgZ2Jwp9dreThdXV3lr/7Vv3pHd8AREY4fP87Jkyf51re+9YrLTiYTvvCFL/D3/t7fY3V19U3awjeurtZmPoTA//7f//uy7mKnT5+mrutXlKgvLi6ysLDA5z73uSvCohtZ3/3ud69pOVXlzJkzfO1rX7tq6DfAiRMneOGFF7jnnnuue1u2trb40pe+dNMAmrquu3Dendqpl9bW1hb/+T//Z/7lv/yX7Nu3jw996EM8+uijNE3DeDymaRoWFxfp9/u3BPB4s0tEeOyxx9izZw/nzp3ja1/7GidOnOATn/gEVVXdMsdsXuFzLc8PV4JKL33txRdf5D/8h//Au971Lg4ePHjVz5lMJvzf//t/O5XvjVbtbm1t8dnPfpZf+7Vf4+mnn+62+5V+b5VlyXve8543PIevXe8Pf/hDzp49y9LSEv/4H/9jPv7xj7+lgPbNGrc3/GmzDqnL+Oj2SeYm8ZqwTmYWdK2d7aq1ic1lsGRJRGsPA/LsLWUQBFGlg0EOcE7BZ8ChEFIkzil4nBhI8WVBVXh84TuA5UUpsnXNu3RZBo4Xh8ueuRCTWdFUUE2kqDQxklJECs9wzzGqpSXOnvkThAk97xnVgRBqmjyzF/FUpetAUeEMchWtFU6EFBUnzo5LSjOlR570V4WzLlw4hlVB4RIbk8C4zuvIUgnNM17NRzmodDlNmo9pQg0YebNTJZVOlaRiyhPELIJFzlwaiFCnQJMSbfcvL46pJpSUIZVkyAZN01qybJIfvdnTorTKF0GTMqkDP3z2Oc6dPcXWXffwwPH3cs/BdUaTEzx3IXSWsy4Li9n4yrs1g0TMlDqdRUugX9j4ayJc3FAW+gbJQjT4s7IIu1eUMxetE1prP0tzah01sQu90pK4QtTcyY/OEqiSw9Bi6FREQeHCSBnXDX3JoMzRBai3SqCQlT+Vd+xd6FO6wLkzJ5g2NuYmdeqsZIPCUXlh2CtZWllmsDDkwqhujwZVAYPKgFR7nW1PYLli1sUN+3uvtOU3t4RCTKGWUla/JWhadVg+vkuDHntX76IqSsQpZemJYsdCnMNXJUVRIs7RYO9vQmB7c5OeF8pC7LWUWHSeonCM6sC59cRoW1knIK26p91QB9PG9kccbG8DQVhYhN2LPbbHBT0XeerSNn+0vs72XKZXyoOmDeNvWWgXop73TfO1v68n9BysFY53FAWHxLOSDABuAxckUTslqFn2xsCl6ZT18ZgLGpGNxC8uL7Jn0Gc83WmhfCfX008/zXve8x5WV1ev+Zf+rl27+OQnP8ndd999yzzg3qiqqoqPfvSjAK8KjS5cuMDW1tYtCYyuVhcvXuTrX//6ZQ//rwYciqLo2u++knLnRtXV1qmqnDx5soM3dV3z1FNPceHCBd7//vdfdWLSqqWut1JK/P7v/z6XLl267vfeqOr1eiwsLFwVEO7UnV11XfMf/+N/ZGNjg1/91V/tstmqqrpijtlOvbzKsuShhx4CLNfo3/7bf8uuXbu6rpq3yu/U9p7fNE2XoXYt2/5S2KSqhBBYXV3lF3/xF+n3+1dUy6gqFy9e5Itf/CKf/exn+eQnP8nDDz98A/bs8vrWt77FZz7zGc6fP3/N71lYWOD+++9/Q9Y/r8AKIfDss8/y1a9+lR/96Ef8u3/37/g7f+fv0Ov1bplx83rqhgOjUR1nM3iZWTnAJmFecj4Q7eTdFlSd5bjYpE67N5k9yy6OAiiIOJLZdTQrH2LE5UwdCo9zjpQSTRs6nWKedJrUopQK8SU+ad4ekyo1KdIkI7itlc45wRfWvUxTskDr3IZV1TqaKYmyKBkM+gwXhlT9/Sys7OJHP/wDmumEIQW+Z3AIFeoQ8+5ZhgviutBtAQoRtBBiykqmFn6oHdxEC44st6hwjrJnn6E0NplO2bozT1bsaHeKFNTylyJiChk19YYmJeWA3iLau1yGcDFlcOQdzhWM68Cwb4ArRGupLsAkJAsFl7wfzj7XiYCnCzpOWeIhYHbEpEyCshDh3MVT/PAvoVcoR/Z7mhC5MNYO3MDMPkQGUS1TUAzoaMrqIDdT0dRR6ZWWLZSiEIPHFanrROYElpdg9xLUEzLsnMEGj2Xs9Jyj9HZzaWIOT2YOYmX1mrh8ztoLRYXNSWKEQZqqFJJA5Rxry0NGzTaFFCz3PUf2DLJnFQs+b5TtaTI1X75m6qQM+o7+0FH4YN3+6kkHX1tLmyrsHgh7FjznNwMH+54XQyRmBZL3tj3TBs5vWYC69xbabWCUPMa0u4YL56mbhrJocOpRcQaKRPDeUxQVzpem6EtK0wS2JlPGkzGrpanTkipBlWmIqFPWR4nxmM4G5nJoumTR32gKGrCcrAQL3tHfrawtlKxvVUgT+eroIs9ORkyVzrbXhsC3Vr+2wxq0Yfb57+Y0ZeBh77KjBoroODNVToSaaVI2EmymRNN2M2xthDl3yuXg7rcPHKMiMCkDvfLOCyzeqVk9//zzfO5zn+PJJ59k165dV11uOBzy0EMP4b3nne985x3ZGe1q1UIjEeG73/0udX372TwvXbrEeDxmMBhc9vr1WhK893zkIx/h4YcfJoTwhgZav55qmoavfOUrfOUrX3kZUDp69CjvfOc7r/pAvrCwwNLS0nWv8/Tp03z/+99/xWXe7JywXbt28fGPf5zf+73f647DoUOHbivIuVOvr+q65rOf/SwpJX7t136NPXv2AG+NFeZWq5cCkAcffJBPf/rTjEYj/uzP/ozBYHBLXWtXauV+teXAolK2trZYXFzsunvFGGnDk++9915CCFe1mrUd+H7yJ3+SBx988IaPORHhBz/4wXU3NlhdXWXfvn1v2HbEGEkpMRqNaJqGY8eO8cgjj3D8+PEblpV0PXXbKIzGjX2DrrTSOboUIWtFZ3DGFCHS5RRpZ0vL+S8tFYWu/XvlHN5b7kuJIqIElJEqdWgIMeK9o1CPFB6PklKgaabUIeTJpyPFNtncsoHAlE8x5u5mMZDSXEt456mqEkGJoaapazS133AZmvDes7S0yEJZUi0MGQyHLK6+m7Jy/OX3fg/RwHKvh3NCE+y4xJRMuSSO0ntilpRXhcc7l/8tpJRI0ua2CCEphRNCzEHcXrruclXhWKg8grU8b7OEhJldsMvjyUAvJbFuXR0G0O5nks9mwlHm7KdGLU/JJaUshNI5pk1kUBbUJJyDvjPAVs8pUlqSE7N9x3vwqbWiZRWPWoe8lAwKFGXkxKmTOAe7+w5fOKoiUlSmBAoBLrt/ZlLU2oxa0Na2pm9hUgJSVEpv6pbxWBkuWvZPyh2zCg971+DcOtTTufb2GWLauZtZvFKmSQmDELFdeZY/qUrOahLL3ckh1ZphgwgMvWNlwVOve9528CB7FiA2I85vjGzcIJzbqJk0idz0DrDA9PPbkc3pmOX+lKrcYruJ3bEJCXy07d+slYVGGUV4fpRwpV2Tpbd9iQm2x2ZZq/zcSrIq0OVQ55Qs8wtfMEolTj0llS3nHeI9zhfgC1R8tlgadBpNRjTTKf3FfFMqQAtQUSYhsrmVPz/nXjlH1zVuewR1A4vDfE9R2Lus9AeOEPqsjyLr2yNqiQSgjliEVIaM0v5fzIpX+qzGExvPBjI153fBc9uJyVTRGA04yeyQ+AyZqgIGPaGsoCi0y+pKCqc08cV6wnITqKeJj736bXSnbuM6ffo0//W//lceffTRqz6EjcdjRITHH3/8juyK9mpVVRU/+7M/y0MPPcRTTz3Fs88++7Jl3va2t70ilLuZ6/z581cERtdSRVHw6KOPsnv3bvr9PkePHsU5R1mW/OzP/ixf+MIXrqpoeS0g5rVU0zR84xvfeBksEhE+/OEPv+J2LC0tXfck78KFC3zpS196RYWVc45HH32U97///df12a+nRIR7772XX/7lX+4mgkVR7FzzO3VZhRD4zd/8TRYXF/nVX/1VlpeXb5ncnZulRITBYMBjjz3GeDzmhRdeuC74/lZXC4uu5d7Q7ldKqbvnbW9vMxgM8N53Xxz0er3OWvWyTuQirK2t8fjjj/OhD33oTbPDTyaT6+4Advjw4Q6kvp5SVVJKnd1TRDh69CjHjx+/Kb5sebOv9xt+xps5OZeI5u5D7fQdNObZVp7UuywNaWEIzIlhOluRmOLGJzyOitzFC8yelhKaIjEFgnjK5HJGj518U3YIUaFRRx2F6TQxig1ODHCl7jMSKdNFmxwKRQFlbbArhkRTR1KMOQvJtrlXOVwTGTYN/dBQpogrCnYdfBeHJ1ucfuaPKEuhdCWaGnplAdlW58TZjcAJvk3vF+tQJh4CiqjgPagKThMqrlMCkSf5CQvmXqjsNDuXmNSJCB2gaOFM26ZMMtRDcvv1ZJap5KDEWt67jPzaLClxduMKCbw6+kXBdkioGIBJyYBT5b0FX0tiFMxGpUAbMeU8FBkYhQBoDjwXzR2vwI/BecNYZ9djttoBDSz0QXu2XIidWxG60TaDBI6ZHansrEeWT1QVwvZUkUIY9A2GhFooBxaAvXsZTr9o2UYLpZAjrIgoXoQpyrTRyxQsUchd0fK4noMMNrRllqXlZvauwikb4wmqCR83qSdKHZStSaDOXckubgdiexxkTlGlSowwniZCUOosoxG1DmqjmO2Vha2/VwpTVRbJ8C6TtCYKGyPLBLNOeQbXwCBK0Jk9Lyn4wSJu9W6oCtR7xJnCCBGS88T8mipIUkpfE7ZHueOfUqEMS4XKMrXGU4iNqcEkU8tWUTeewGgEKwsGebx3+Kj0xFHQ4+x2wYXNS0QXSWLnLEQbF/MGh3Z8OGdg0HuzaRaFqYIkn5PJFLZGdrPK4kRKEfrOxk1VQK8SegOhVmVrEhnVltEU8vXWqgRF3nw7yE7dnHX27Fl+93d/l7W1tSvmB6gqX//61zl69ChHjx7dmRhcobz3HDp0iE984hP89m//9mWBzfv27ePjH//4Lds5yHv/mrMijh07xk/91E+9bGIhIhw5coQnnniC3/md32FjY+Mya9c73vEOPvKRj7zlY+3V9vtd73rXdW/jX/7lX75ioHdVVXzgAx/ggx/84JsOa1qL0U7t1CtVCIH/8l/+C3fffTf//J//c6qq2oFG11jz2T9l7tK7tLTUHbtb5Ri2QONay3vf2d/bDo/Xs8/OuTft3jQPzK8H5IkIhw8ffllo9+up0WjE1tYWe/fufVlnzFtlrLwRdcOBkfOuy2CxbBCTULTftrfZIW0+kVl3zJIlllid3z/npcky7BihFlNZNJhYkYMaAAAgAElEQVS9LaHUmpgmCCqAx7RFHgSCg+Ac0Sf7ubeZYK2C1u1EztYjyaPqSLjcFQxEHF490+hya/WSgKCSbBsVRJW6URgFXLFNAsbTKVVV4QtPtfpXWN3zApP1vyQFpSw8JS4HJCspGtRR6FRG3rmsy9KscjJYlZJN2pPYZL618Tkn3Y3Ee6H0gmJd1uqc1eNayVCn5MoTaTfLA4q5a5okIbRWOAHfWpAK7FzlE5Wi4rxjoSiZNg290o5dzLY+J9AvfbZORetQRe6WpgYvqrwPMcx1dJMMCKY5dLln62vHVYywtW15O7sWrbvYNEBo7GetZa3lNPNh2QYnbbmYO8uVDuqp0OuZymg6VarKURaJu/bCxQ2DD+3YbjNucEqjSpNmEKWFnW02Ths47hxI2XbYs+WKQhBnypuyEHolbE5qFgqPp2E0tdb2o4nlcE0CbNdpJvrJOzkPyGLONeoETvlYtsqqSYRxE9m9ZHlUe3sF69OYu7s5Rk2ijtGCuLPir2Ve7bq6OCGF5ZVV9t1zhCJ3FNS8kNL+clKc2nsqJ5QxMXn+WQOz6qhU6BfC6lLJeh1YX0/dWG1hZkiwvg3jMawMQFQYVI4mGfRrgme0UXHqxU1Cirh8p3NitrLsiOuOWwsSfQZGvdLyw3qFUJWmJtsaJdJUWSmh8kLPm522EMFh5yzV1u1RE/S9IyWlL0Ap1C6xXUOTZsHk89nxO3VnV13XfPnLX+aTn/zkFZUwTdPw3//7f+cTn/gEhw8fvqMeVK612gfhT33qU5epR8qyvKUn4YcPH76sZW9bbXefq4U2Hzt2jL/5N//mVaFHC41++Zd/meeee66T/jvnuP/++1+ToumVKoTAdDq9rvdcbd/KsuT48eO8973vfUOvhV6vxy/8wi9w6NChHWXPTt3UNZlM+PVf/3WOHDnC3/27fxfn3A40usa62jG6lY6d5JiH+Y5nV9r+eUDW3tOuF469Vcfler8oaRW1b8S921xQjqZpmE6nLwuTv5XGyhtRNxwY+TzTs0l1NjipTTwNuGRq5OcHup2kmdpI80SVbqKlqkQS0xQ7FU47GW2CKYcUoU6OaRB8ak9uQRBHkEQUMbWMzoGJrM9weVIcSWi2qYkzlY+KZfKQlERBco5opru8f4mgkTRJNGnM9qRm0C8pS4933ibbxb244hzN+BzDctjRDC82s0+JLqdGSFl94nK2k1FlJSsu1KCG5kl5yrNgs6nZ3weVp4wJEetaJiQLl84KoxYgxHY7wMKvMzlKrT0tGrxTnXW0S+SQay8kTcQkVKWn03KJQZEupC2mLphZNdHkISBiig7UuoK1UKeb2MsMgExqpV8ZFGrBD5htapjtRkVWz0yyGqS1MHUAE7Nktd3ImkAXGh2TMG2EYgKLC/bZmtO4F4dw15oFKyttvpXZlpII06l16armwqPbkaWqpoDD1iN5P7vQcYVCHIlEVQi+dNSjSIUymkYmTWJaJ0IyYLo1iTRzNrw2QDzJTEHTHr7WpqhyucCptdBFtevs3DSyXSfqRhGJpiDKnxsVKm/qqRYaOaSzOYrA8soKq7vX8gZpd20pNqY7xR6molMiFy6ex6vdI6I66sajSZjWnhCUwluINGLd7NY3zYq20LP9HPY8UZXKOaYCZzYjZ7c30BQpC+hVMOjBQuXoVwaFRlMYTZKps1SYBlPuCQaVVnqOhNBzggZYqMRschmakSFjikoMSqyh5xyVd2hQFgemNAwORqoEYFhZOHZ7jnYir3dqvk6dOsVXv/pVPvrRj17xgWdzc5MvfOEL/NIv/RIrKytvwRbeGnW7hcC6Vmn8ktq1axcf+9jH+PKXv3wZIPPe88ADD/DTP/3Tr6qqaq0Zx44de8O3+6V18eLFKyp77Fnnyt8iX+0b9IMHD/Kxj33sNSmvrvYe5xyPPPLIDizaqVumLly4wL/4F/+CQ4cO8fjjj99xk9g3om61Y/ZShdTtXNfbwXL37t28733ve0PP6erqKnv27Lmju9LCm6EwytPlNpuohTqStLOJOREQ606maNdNS8UUCvaNfSTGYIHSCohpjlQErzbxd1kqEjURyTY0zTYqlztyYaojzZP8mEN82iwfmwQLMU+pU+oSlvDqupDiNvOozWGZV5KAENQyh5qUGAelN1WKwplyJ7+np/ex242JNBRS4JkLSVal9AbNQgZHQWNWcdi6vUiXeSPkrmJqHaySzrapaRJFYXadoVj3N+cMatTB9lGSTWDFt6oiITlFkoEzzfvYAhawyb0BJJl1NhOzoMWoFOJN2STCqA4U3plFTBJ1zl3qlw6CWq5RBkLqzBLVtqhvQ7q7rBmgqS1PxzuDGPNqkfEE+n241N5nJFvvkg14hwGxobdMpWk0BZWqWSh7CeqYSLk7XL9n7dvHdaR01j1tbTc8fxaaaVYnqQHFaaOXAZwWxki28aWEKbUymGoyoSu8bWcT1TJzBEZ1IqSAKISkbIwD00a77muTJre0zzC1JWLSXm/d+sWUNzI3RufURijZZmhd1rZTJKhtR68wlVb7FgN/ZLVPzjCaI1MiwrC/CAiaEklTHjuac8EsJD6lgCaDrOc31lk/9yIDbAzWmmga4ekXGramZpNs6de4gUubMJmYCqwQGFQO8Tbu+/0C54RzkymLi8qgZwOzX8KwKhj0PYN+hSYoxw1lUeMUlqqC9WmiAIZOWBkUjJMjTBv2eqFS0KLHOMBkErkwDmxNE2Gq9PL4KhB2L5SUzkFM+KAgiUsxMmoUH4S7cdwXhSLCRJXn/PV399mp27v+4i/+gkOHDvHud7/7ij/f2Njgf/2v/8XP//zP70xq75C6mrxeRLj//vu55557LgMrrdLqRrc8fi11JTD0zDPPMBqNXvb68vLyVQPejx8//ponBe985zv5wQ9+wNNPP929NhgM+Imf+Im3xIa2Uzv1euq5557jM5/5DL/xG7/Bfffdt6Myus1r/h56syuEXm+dOnXquixpDzzwAPfeey/wxu3zwsLCZf++VY/l660bDoxUU25XbVNYl3tVa1bJxJQ6ZY1mX4+qTYg9Aq5VAJkFJyazYWVflilq1MKSndNuNntZBypyG3gkQyXMapYiMSZLi8eAk7RhJWKhxKZjagGA4jD1h/3TwI31RLM26E7aubgQVYjqCVFocBTJG4jJk+ctXWXKuzjk/4wqja1Tm8yyYgrnOhWIojQxZuAklL4gJqUOsUMEMSWcEwqcectIiBMGPbPjpZTwhcNZOzl6HsYuWd5OK4VJdhwaNYVSG3FkeUBKUiMgrbLGDpV2PeCdzZFxeVtiEsoCBoXZ0KJA0taGZXa6YekYE5liig0kBxurKYRQe72FHQawhNFEqUoBZ9vf7kIdYSFbiybT/J4MYXrO6E6TYHMs1i1LZ92wyO93AaRQprUFPq8sGRSokhC9MujDwf1w4qSYKszZIRhnm1qrjuoAIzPbU8rQs196y7/KQeAxtfY6RTyQTCHmxIK4t8ax62wWklJHJSQb7xmf2hEQy/QaZAVWzGqr+XtuC4BSVg3FZICyjpqhkBClDaefWaek/Y9ma2DpmGLw0ef2dNOgnD3zIjHngNm3xym3P06E0JBCgyYbXadfPE0zGjEs7bOTc5AikxqmjVo2V4TtCWxumxWwhVfDUtizWjGuG3Cw2UxNBTU0xdh6bfZLr1BIQ+EbBr2Ghb7DFcpYExqVZpJwOBzCQGE0iVSFsqty7PWwe3HA2e2G6VZkccshscBrTePt3E2DqZIKMauaeA8qFEk5mJReE1lqYKBqyjcE8XCv3NnfWOyUlYhw99138xM/8RPX1BXp+9//PqdOneLw4cNv0hbu1JtRZVmytLR0WQvhXq/3iu2LReRNC6d+vXW1bjchhCtOCg4dOsTi4uLLXh8MBtx7772v+cF9OBzycz/3c/zBH/wBW1tbOOf4qZ/6KQ4cOHDNkE1VOXny5DV9A9527blTJxo7dePr//yf/8OnP/1pfv3Xf30HGt3mFWPkwoULrK6udgqj2/F8hxBetZPlfIkIjz766BXt26+15jvRvZbj+1qC1G/W83jjQ6+bxhQW4nEq+DarKBkUskwc1ymGEkJEzdqUlR+SlTytckYFxDlcbpfUZqPYZDbjGueQnHjssm/Te9/NfCWp/TwDpPa97bOCnWIzYrUz7QA4jYgKmgEEIggep9qpOiSHNNv6Lbg5iEfEo9lj7DVSEEi6wjaH6PmnmTYThLJT+IRkgCDkHCGHI6SUbT6pAxNRk+2jc51NyDpKGVQqciaOHTNr/154R4gJceBdog6Y2ihDo7LI4cBCDsJuJTxKyhkt0oYoYwHBKVt0RJSYLN9Fo0JhOUoigms7sxFRFbNlAb7yUEcmrVILa+ee/ByAmWsb75xZspKDFAVfzFQoYNteeqiz+iOGrEzSDGbIwdd5+dn+mB2wKkwhVhbCZALDgdIroW4SBYJ4Zf8eOH9B2djC1EFtoHIeL2kux6gtxaCnZuIyD8HI2yRine5MpTOzYga1YHEBUxlFrIV7Wx00y9dCYevT3E2t/bliaq2X3pOcd8QmzPKypA2iN4AZW99i3mbnTP1XeAs3r0VxznFpfZutyYlOXaQpkjTBZQApJ0+jnD1zAlJERCgcuEIIUzuWqDCeKpMGtkazY+rEVGK7lz1RI7UmRo1SN3ZSY+4ImOYUcQ5TJYVJZGPdrGpV3+DkCKWeRiYTOImB0OXSseqFXXtKknNM1HFxFJCthuDBV0oqhFGtTILikxDrgLrSAupF6CXHYBQpa+h7WK4cS4Wnh4Wth9fwy2Snbq/at28fH/zgB3n7299+zUGNTdNcUZGxU7d2LSws8MQTT/DFL36RyWSC956f+Zmf4cCBA2/1pr0h9cwzz1xzSKuI8MADD1zx4Xk4HF4RJF1PDYdDPvax19ajMqXEd77znZdZAa9WS0tL/MIv/MJtcx536uaqNij9j//4j/md3/kdPv3pT9+U6sKdemOqKAqqquLkyZMdOL9ZIcPrqa2tLc6cOXPNyy8uLvL444/PRdS8MXUjju3rgVBvVd1wYNSGN9t/Z0BDBYo27ddl5GDiCHAeSZIVSBHNihYFxJsKwDovtZDEgJNkz5Kq4hKIy+9xgivcZeFgwSW8FIgTUvbquPx5psZRNJniSDNkmtNw5PVJN+lWneUX0S7TTt1FrJMYIBoZyJhlt8mqrNNnm54fIwwZ6xabozEpmjrBuWzx0kThvU1CaRVSbWt6zXlLFtA7DTH/TFsdV2e182IQJynZWmVer9IL21NTUoVg1r0YQUXRbK9qk6ja7JoW4DgM4AVplUWKBkHEsotKbwuXRT4OKHhnIcFqWrOophoblA4niUmTx42HouV1ChKgiTNLlGKAyjlIAVwxy1xqmtzdSvK+k/OZ7NR1Qev5rGXLpJ3lNiPJu9xtbQqjsSmWUgDXgF+0TJyDd0H6kXBxbFaxZKekGyttdTcH6FRCm+PYwauY39vaC9tMJI2GLRGYRtvamI/9NM6ygdrx1l4njULZApP8mXMCPMAyeZzTztIXo6kBm5i689xutIHHmdpInMG+djmfW91XzrFx6QLIuoHGOY1cq1WzDns2zkJSRtsbdAYAB5MYqUQYTROjiSm+pg0dWFvqWbC5qFBUwrRObI2VGAwMxsyidPaR5ENIk29IqlA3Zl8c9GFhINkia/vrHUyTciEqf3am5sA4MQ7CNCmhn9iOijbQhERINl4DiWktFASqqqAQR2+i9GNkqe9Y8cKqdwy8wUzXXsM7dcfW/v37efLJJ1lbW7uuB4eyLN/wQOKdujnq7rvv5pd+6Ze63xlVVd1SD5VXq7quOXny5MteV1XG4zGPPvoo+/btAyyrazAY8Pa3v/2Kn3Xs2LG3NKNqOp3y1FNPXRMsAtufP/7jP+bnf/7nb4tzuVNvfTnnWFlZ4ejRo7zvfe/j8ccf58iRI9x33307Y+wOqJWVla6z2+12vtvffS+++CI/+tGPrvl9Dz30EO95z3u6z3irj0u7HzFGYox477vXWqh1JXB0M2z7leqGA6MukEscLndNMrGKzeDcHPCxLCELbQ4p0YRAapRItDyjfICdzA62F1MaZTcboKRk0CSa3MLW6wyWSLZ5+fZLrqyeINuSfNv+O1l4c9uJa35il7LkRbKKwBiOZovbbLkWEhWSWNR1lvQCS26DJV/jJeDFLFnOCUk9w3KI60+4uDFhc6IsDnqoS/mzc8i1tNDNrG1OfKsnAbEQYfu775RKLURoQ8RLL6bM0YRQEDVSeUe/SWxOotmLBCTm4O9kEKTMCiLNVqv2/zHDl0IhJoc4s4xlopWBVRsMLZjLzJl9jYRTT8JaqpfOoYUybqwbnLgMhLydhDZDqb2WYlZDRRViUIrSwEAdoNfL4rWXwoN8PlOW93RorYVhwLhODCqh9AYmtkemMkIMGJUKg0rYv0vZuKSc37Z9NTUWHZSw7RRU2iQsg4qtYq6DS6r5eJjKrm6UwndnFlSymszgUkymPJvjP51yqB3X0Il4mHA5XBKgX8GRtzlOnE70CoM3Pp/X+c5twUKYSOQwdJ2poBrNXfTyeaqqAk8DWmfbWL5GHN04VUzx57zj0vaIVDeUklVjYkq3YWFh9eujRN9bKHnPG6RbWjI4OPRCCDCdKHGSd3smXOrOt879cRkWugy+CgEClI2w7B3DSrhnUHHfypC7di2wslKxMihZ6peIKP1hD/WeMy9s8MNTF/n/zo04cXHCqa1gAezAeBohCmUFe8uCfcM+y6osLJQUKeHrGu9m952dujNr//79fOpTn2L37t3X9XAwHA75mZ/5mR072m1at2tb9RjjVS1pH/jAB4DZQ/MrffsqIjeFvet62lmDZZOdO3eO5eXlDjT1+/07Pkh1p66vFhYW+NCHPsQjjzzC448/zgMPPMDKysrOOLrDar7j2e1azz//PJcuXbqmZUWE973vfTdVMxBV5ZlnnuFLX/oSzz77LD/5kz/JO9/5Tnbt2sXa2lp3zV7pPL7UyvZW/76DNwEYVVUxm6mJdKHPM4WMKVmA3OVr1kZdRGwiiptlqbg2hygrbQRraZ/llylb3QKJRAR1xGQTOAQ8vluPiJpVSk1V5MWCoUWs/XyRs4Z03omTYdGsvXgbCp2TjDR3fhPLYNpVNdzFjxivP8P2ZIIUBfce3M35UaAoHN5Zh7MUEyqeqrfAruWC9ekmQRWXDAK5jK1ae5BDQXzuukWXNeRdtn6JqTh87jAXUquiyXRThMIXeGfhzlIKw0rpl5H1Uc0kmKxIImbfS2JKlVZVktoOdxlItZ3dxEK0kyghWv805wTvAdEMIxyqls/jnUNSIogtE7MtLOosiLy9ltp8qEYtkyZlCKVZMTUJpgBaHAjjJpl6x0PIraha8NcCE5jN17VtL5a7v4VouTyltw5zkzoxGivLSwZfXIBV56iGyv61xMmzMMlfNrZh40ILLOwFzStuA9MLLzTRIBhYCHZSSBnYac5hitGsdE4h5HDukEz1Q4Z2ZLVW+wjrslyvBWMpQ5/uFiRmZwuq7FqBnggeU75sN0rpDEi2x02YwTTTCVlgvPe2ruAMMvX6PQt3Fxtv1t0nK/Vau6hYW/pBFTm/vmHrEbNKJsnHwwkxJgaF5QItLgiLCxCdMq2V0RiaIhFVaRrLpMouv27/2uPfnXcxm6MT6AmsFo4DpeeQd6xFz0KAngoHl5bZu7pEirAcKg71h4w2x5SVoxQQF9k/7LN/1yKHG+XFBBtlYKrCpijf22ooFP5Kr+Qdwx6rolTeGaANiq/y9elmdrmdurNq3759nbLoWqosS9bW1jh06BAPP/zwdSuSdmqn3uo6c+YM0+n0Za9fDQpdrfr9PkeOHHkjN+26q+0st7W1dc3vaZqGkydP8qd/+qe8+OKLALzrXe/iIx/5yG3f6WinXn855/ixH/sx/tE/+kf8rb/1txgMBjjnrqhA3PndsFO3eqkq3/72t6nr+lWXXVxc5NFHH+WJJ554w+1or7fOnz/Pt7/9bUIIpJQYDAYMh0OKouhA0bUojW4G1dENB0ZFUVh+CViGjpDzizI4apUQ5JyirEMQFOeFwhUU2naagjbriAydkgYUZ93ORDImyn9aFYGTbENqA3Rao4xNaH0GId65Dri0qo+YcrenPONvwU2r5JBss0pO0OjxWXFROji2NOEufZrvPHeR7eJe/O41dhUjQniOyluYbyIRglKnSB0i42nNpa0Ro9oCwasMlaqiYFAUM9CR7WkpZf3Q3GArhNzlLRlXawEc0sEMJ7kDXeFzRzWzCK0UDu/g4qhh2iQqBy4aDPJZ3ZKSWL7MTNY1C3nOwCxgcA9RU/tU1m0uJc3fzBm80pyL08KS0juiJnrZyqaa7UVZKuK8bYcLMCjNrjTTrZg6ZWMTBgMDRVVhHdVaWDsDRMxekDYnyP7u8/GKSWYd+5IFLi8vQFViwd+qrAz6HNzdcGK54dT5WSaSdJ/Xjlt7PSXwhXWRa28S2u2BKWkQ20+zgBk8EyXb1+zaafKJzCIp+4RO0TQDYu3PWqjUbo9iCiOwDKKB2IKTBF4cdUymxsrExeyRGYaJbYcTlzmwMJmasqpXVLSqLRGDhYVP9HxNoI+Io1c07OqPmISLbG5tIZohaGFWwEJgIyb2LIFfMVg8DcrmNGcUZVtZbGynotq2tXCoY0YtNMrb3xO4q/K8a7HH8cUeh4qCapqYbAfGTWQSEn5YsDrsUSRlY6thPGlYObBAWu6xsT5men5ErCOjSeDixpj17SnTOuKbxNA5+s7xUFWy2K+4b6nH2kKPnigOpZ42do+Kdl2IwLUZGnbqdqqqqnjiiSeuGRYBfOhDH+IDH/jAbSk/36k7oy5dunTNFq5XqgcffPBVQ+FvdPV6PX7u536O3/zN32Rzc/Oa3qOq/O7v/u5l3xx//etfZ3V1lUceeeRGbepO3QbV/s74Z//snzEcDvlv/+2/8f3vf5977rmHX/mVX+my73Z+N+zU7VJN0/C1r32NmG07rfL2wIEDHDt2jG984xsURcGP//iP8w//4T/kscceYzgcvsVbfXmJCA899BD/6l/9K7a3t7vmFK3lWrJzql22/d0wD49aUHQzXNs3HBiJaxUUrR1NsjzEMjwsELuFNNLZvRSPp1UMtN26dAYkNBKiQSNH6znKdEQUcUJBBk6+wDs3s8NBVttIhlIGZSxjZy6XCCzINqs5lKzcwKw53a/9PKFXVSgM5NzTG7MrPsN3NpZp9hxn0RdUogzDhEvjCWUJW/WUzXHN5nYNKozrQB1Sl4dUo0gOy0Yt6wcFTQ7VlLuo2b56HE2adXyTVomUiVxD7CxJ7YZblpHDuURKWSmlymLfOpptThqmIeV8GyMF3pkqpn0tZcVLC0h0zlaYUs6piRa67b3kTnc5wwXpVBbFXPe8wgmFkxyMjAVhtzDE2ymO0SxZvR70VRjHFlNYZ62kMBxCvzc7l5AVP1kmM7/dc66+7vzXUSkbGLuI9zCdClvbytqqqWmaOjHRhqWyx9sPwLgOXNjUDsrNr5fZKjq45vNrMSmVp1MDiRoga21nKVlOlQEhC59OSbv9aNfTOpwkn+R5SDZ/q9G87qoQy/xJsHe5YLOBi5PaoJ6YBUwdaJxZ1NCsxJM5NU/eudI7yrLCOaVfJAZVpFdOiGEbiZG9i2sgYybNFuvbNRdHka1tUxYtLiha5BwicoZYtGPTRMsmyo3/uvPWNkssZQ6KtfvawWIDfMs9x4NFxYcHQw72PGkSmW5M2ZhGprUyDXZ9L/RLllcGaJ3QaWBxecjqPSuIc4SNKRfObvHCmQ1e2BqzlRJThOgcbugoByXT5Di0FdhTOHZXnsXSUZYOp4keiSABjfk8wkxetlN3TDnnGA6H1/wA4Jxj9+7dOyGmO3XH165du3j44Yff8odnEeHAgQPs2bPnmoERvNxmoKpsb2+/0Zu3U7dZPfLII/yTf/JP+MM//EP+03/6Tzz99NMAfOYzn9n5vbBTt2VtbW1x4sQJ1tbWuP/++7n//vt57LHHeN/73sfevXv56le/ysGDBzl27FjXAOGt/r3w0hIRer0eR44cIaXE5uYm3/72txmPx2xsbLBv3z52797dWdPmoVFK6TKgdDPUDQdGTrIaRgTnvIEAQFILRnI2UQsM5uxqroU3QgeTDDhYxlFI0VpztyoNMVDhvbcuWHmdTvwsPwlop9CtVcZ3OUQtd5KZBKWzv7X2n9n2SQY7yXxoJGYkcBQSP3RvR1cWGGjCpZoyTXho1wZ/cSYxicLG9pjNcU0TwIun8p7S+05ZUvpWwWEQqgkJLWyi7zMcc0gGL/aa4LqBpnO7USA5i0gysNDuWDtxeD9TY1SFp/SRXiFsjAPb04AXIaSskCGfE7H5boh0SiHJmUlRxUKmg1mvQjCw1TbaCrG1S6VO3dPa+4o8ie6XuftasnyhpOS2XaDZahYTxByBVTnplDd1A4ygV+VW9fn97e2ktfB1ihSdKVLmVUh1hCopMdvkLm3CSh96fQjbsKUBr47Di56VBwr+3z+dcmE0h4vaYcRs/U3I624z35lBJMXUMALZRjh7n2YQFNRUNS91M7UqPJ379zy4mt9fzSqmOpgC7IVxJKnrlpe55RW67mwGYwz+9SuX84IcIpFh6bhrVVno13gf2ZpsUzcb1E3EqVCGCU2MhGhjZmNsN6DVZQNUo7FBoRhnneVkbnvMyjY7l63nTPMl6mlBqYGifg/6fRj2hQNFxYPrJUtOmCRlXAfG42id0bKlzTmh1ySaJsIoMp0EekXBj05vMq4Dk3HDdNywMW1YT7A+Dugk4gq7Znr9ksEI7u4pe1Z6LCz2KEpH4cGJJ0lBnWqCZsslifLm+V2wUzdpDYfDt9yCs1M79VbWcDjk8OHDPProo9elzLsVKrXPwjfZZGenbp4ajUb803/6T/nmN7/Z2UsYtQsAACAASURBVDrvuusuPvrRj+7YGXfqtiwR4R/8g3/AkSNHeMc73sHS0hKLi4tdcPTf+Bt/46aCKa9WIsJoNGJjY4PpdMp4PKYsy6vmUKWULlMf3Qx14y1pzndd0MSZgkdJOQR5BhnabmdXOiytMsb+WEZRkZSoPocHp5y3InOTYutMZiHRGVjRTry1ex8kIrO2462Vpl1fC1ZahZPmzm0pgyqbUGeglD/Di2Pbr1J4hwNqHEJCpGBUFwx8wUYDK4urLA4aJtOa8XQCOFYXFljqlcQYaVJiVDeM6wbvfHcQBKzzW7b8tFkzLiumLABHTJHU7a+gTmlCtJDwNv9GzRZWeJ9VVpq7qUFZOArvUZRJk7rcIpfA5XBvyXagxlqeoXOWwZgS4s0u2EQgxE4VYrlLBv9UsgJJWognHchyzgKZY1SmcWZ7Q2C5Mii23Rj0aDNsWpBSNzCa2PIx2TpbKNRWp/phFoY8/1oTLEDbeyMmoxouXITeomPgHMuVY9/uin17ezQhMdry/D9/vmVB0czGbcuODHoa0EDabmi2zS0kKZwFSovMgqoNGilJpcvrmf/8y8AXWSWV5tbPrFtYFisR1Y5bSnBuK7JrIAyrgs1J6D6ng0ZqIMaJ5Q85l62jIjTRQO5iT6jKCaMmceHihEsbE+5ei5hLTZmk2J07dbA5gsXK9jPNdTdrwZkyg0BC7nKXj13TKsFaZVhWE/Ur63jW64Pz1ulutSq5e7sgXGw4F2DvWp/GO2qJTIGpGjBKCXwTWJ80xI0JZ6Yjzm9WvHjSUadEmDY0oykaAjEkenViHBLFUoGvHJNxQzkRyr6jN6wo+iW9SuhXHkmRVCQkOpxT6qxocu1J36k7pkIInDp1qutw8mpV1zUXL158mdz6hRde4Ac/+AFA9y3crfQAtVM79UolIuzfv5/777+f48eP37a5Xd/97nd5xzveweHDh2/L/dup11/f+MY3XqZOc84RQnhV2Hgzhufu1E69Wnnveeyxx9i/f3+nyJ4HKO04vpXG82Aw4L777qOua+6++25WVlZeZkW7ePEiJ06cYO/evdx9991v8RZfXjccGJlVxnV2NM0qoZTtUwY8pHNmaLautf8ym9McwMl+ExGhFCFhICRp6ixb0KqTWptbQhOXAaOQonU1S9Hel9RCecXNQrPy+2ez83a754CRWOc1hzPbWw75xUkHTxQluZI6OU5OVvixu6b86QsXCZooi4JB1WPX4gJNM2VrMsK7Psv9PgMRBqWn7hVMmkQdEyEqTUjWrt6pgTixdbRd0CQHXbtWYpT3w6xFFiQu4jpgZPas2S8dn8NrxCmL/YKYSs5tTYmquZMcuQOdZRuJJ8NALMw3n8PWohZTbmfedcrKXehopXe27VEhhIhvj1uGK86ZhS1FUxWZCsxykZqsbhKZg0lz6pTRtnXUSnPAyM2fUi5XsbQiJp9/HjS3lM8eRMtUcuwb9Pkr+0vu3rtIKjzPX7rErtJxZL9n97OOrWlimnLIuJrqql1LC3S8WHh5d7vLMMQ7oSyyIgyldLbvqkJQ298WQl12q9SX7MvccZgHR92yGcSUrg0gt2wqzeAsi/Y6oGVjQyi8dCo/VelypDQpp85vc3ZjyvpWZKkPRWlKpg7UiQG4uoGtEfik+DCnGppdaqa6ktl5U23b1xuktPFmlrNhH4YDoaqs21o7Hgrn6FOwuBmpk3JmfUpDouwJU5eYFMmAUZGDvEPDc+vbqCjfW4vs2h5TbiWWHAxJlBIJKTFJifOuYHPvPva4LdYWYbtOTKc1l2rHYhtWLw6NCnVA6waVvE/erovJDi+64yqEwBe/+EW899x3332vGtJY1zXPPPMMBw4cQFUZjUacOnWK3//93+fChQuAhWI/+OCDvPvd7+bAgQM73zrv1E1X99xzD2tra5w/f757rX3wd87x8MMPc+DAge5nRVFw5MgRer3eLTUpuN7a3Nzk85//PJ/85Cc5dOjQbb2vO/Xa6qXQB+D06dN8+ctf5r3vfe91fVGwo2bbqVuhBoMBBw8epKqqy1Q4t9rYnc8hWlpa4t577wXsmW1+X8bjMV/72tcoioJ//+//Pbt37+bf/Jt/w9ve9rbuc97quuHAqPQO713X2SyhSGxDc2c2JAMEaaYkyGohsyK19C3bvzowkifiWQXU5gi1bdI165na2WcgKxVSIqRAEwJNbEgpGAxBEOcR5/NDvMtt6emgDEnRFEk6m+g7bVuL5311bqZYEoNXlUBfGkZTT+XLDgIU3ixzIgW9oqBfljRxyqXRFsuDIQv9iqGWbEwmyBS8pFlINY5EwuVkJRGla18vNlmNWdXhsM5VvTIDm9zaPaZW9RKJEXqlxzvr6NT3nsIlnJg96sL2lGlQSmeQKqHW1UzFrIfaQpAZrNDu8CtNsHPnRGiiyWREWmVXBkTJVFJJlRAVR+7G5axbWpEzjxKwFRJNkC7356VgpB0/Ergs76dTOTFbULMyqcj/zgIqRA1uVAVZPSb4Eo4fW+Xo/hWcBspeyenNLVKv5Mfv6/O2PSuMpsrvfesMF6YN62NlYwykvA+FdYQrPexaLBn2XO4KZiPXObMsjSeBJti5nNQZXmUr30uVQ/NKo3Zg5kPcuim7ao9TSOBzFlThYGMcmNrF10GtLBzDk0GiWBA8+f2WmWXg8IWNhumFhsnULHMH1/LG5fW5nEG0NYZzZwVqpSyE5b6jEBg3ds7HjVJHW3e3T/kceWO6FB6GPQNFZS/bNJ1dA97bNesVFouChSDUPrCxP7FdKk+XgVRY4HRQZhY/hYLIgrtAFJg4YXeISKH0yyXuq+FAHNOMAxt14OxIiHsX6QVYbNZNrTRwvLClDLYbUuHpV56+B0m2Mm2USZOVa0lprvAguFO3f43HYz7/+c+zurrKX/trf42jR4++4vJ/9Ed/xHQ65cSJE2xubr6sPXnTNHzzm9/kW9/6Fg8++CAf/OAH2bt3743chZ3aqeuqtbU1PvWpT/Enf/In3QP0Aw88QL/fxznH2traLdcm+o0Cs5ubm/z2b/82f//v//0uGHWndupqJSIURcGzzz7L+vo6e/bsAa4MlnZqp27FKsvyZffXmwGavJZqoZH3npQSZ86c6QK82y9NRISnnnqKgwcPoqr81m/9FsvLy/zrf/2vbxob9g0HRr1yPnA6hyF7R0wud/gyYBGzeiemRDtlVVqliX2W5kmjtKoZdZ3yoL1NWpv1mLuwhcugADnDKKLZ/iOIeMuM6Sxl0qmLWpAhLrekh6zO8aYeklYvk61vXXCzdBYjr+CIeAJJBOkvs1mvc2hlwPfOrBOioyqgcs7sWeqJWjIKDTIdo5JY6Q9ZWxhyQcdMQ+zUGHUMlN6kLyJC6RyatMu8SVlx5UQs6wW1HVDFufy+qIQYu3MToqm+NJOGflXQK9uHuMj6ODJuLHC78DNKY5N6A3ROxBQxORA7MbO+gcHCoAaDJLebUzF1maoyDQapnFiGUAudHAZZQszwpDGYFGfinU4KMw9RNM0gScsb27HUWsXa05+djZadhIGjGKAXbd2aYBSU85Mph1VYLEvqumZaw4W6YXnfgLv2lZw+f5Efu19YR9mo4ex5SE3J4kLJoF+YSigl+oOSlEx+ZWHUQh2jBbvHgunU0FVdWwexrXFiPFZG08R4Omsn343zjhjNIMj8LbaFL2TlTsp/gkIUtddkDr7prPW7Jyv3gCaBkOg7RxILYR83MJ4a3FusYGU5K7skQ6skjGtTfYUaVhfNrnhxGilEqBslxLm8qbzh7eXoxEBRvweLi0JVgneaL1vFe0dIitPWOucovGNcTfn+IDJK2XpGtr/NgcOg4BO8LSrVouOii1S1cHDLofUmTW9KubaXfbsH/OjFxKX1KXE74p79Ec1iyWQ5UHth6uB0JfitQFkFUlR85fCiaEg0dSQksxWOg3bWxZ2682o6nXLmzBkmk8mrLts0DV/5yldedTlV5Tvf+Q6nT5/mySefZO/evbfsQ9ZO3V4lIuzbt4+//tf/OjCb3J4+fZpvfOMbgNls3v/+97N79+5bYtx++MMf5vz585eppl5rXbx4kf/5P/8nP/3TP82uXbuAW3eCtFM3vlSV733vezz33HMdMHqlZeczUdraGV87dTPWS1vLz//9Vh2zLTQaDoccOHCAS5cuXbZvg8GAX/mVX+HcuXOcPXuWr3zlK3zpS1/iiSee4PHHH78sGPutqhsOjPqlz/TMdV2coiohCTEmQjSlS4iRGBPa5u4IFtBsPdCyrSzPriQbeyR3T9M268VgSWzlJDpTrrTAyLezTwTnCgpvbbcE6Wxk2SVpk1Ra25B2OTGSJ+WaT1xqyQM5aDilTlXjUIIoE4W+RnokntsS1kqlcI6oBgjqGNmYNlwaRzbDgFjey9riXpbD81y6eIH9iz0KX5iySRJOHE1WenhLFrfjB10AdbsPkje65z2hhXSpDe9OnZ1NSRYaHROFE6bBLGi9smRxUKL06VeB5y9NqGOyTnSiXUhx4bNKq4UxYgomzRlGFgpux7RJim8PqJ3xDuSErNiKGX6pmmUqpJlSKEWDEU2WAmnq8rBfBkjmeZITs0jFOdDSLjO/bBeKnWFVHaBf2Cevj5U//P4FRuOaexZ7nN1uuDRNbGxPubA1RgeB/rCkXFGKCQwLYQ0lhEC/spRmyZ336maaoY0dNPt/7jSXzI6mqhTZcrW67PDiaKIyGivn1xMXNyLj6Qw+SEvwdAbCoBP7dPvlpAWsM0DTLx3jJnXB0XEeaIipjNpj1POWcbW+nZgGU5BpgtVF2L1seUJg52paw/qGsrmdA8nVFEWawdU4B5u3XeoKN1unE1iohKoPZaWUpSm1XD6fOMlqOWXcwLCyTnuV91AoW5gdrWktiQA5Eszne40PsEuEe8qSya6KShz+bM2uWmCaqLca0vQc02NrXGyUJlpgtRuN0CiMeiWx5wkqjJ3yrHoG48SeoDSTRN8LEiMpJEKMjIMyiUrd0c6duhOr3+/fEEXBuXPn+NznPsff/tt/+1UnEzu1U29FXbp0if/xP/4Hp06duqxT2IkTJ3jyySdv+syiNmPpySef5POf/zznzp173QqP733vezz77LMcOHCAj370o+zevfsN2tqdup1K1Z4nT548yZ//+Z9z/PhxiqLorhdVJcbI5uYmzzzzDN/85jf5zne+w0c+8hEee+yxLjtlp3bqVqh52Dl/j70Vx7CI0O/32b9//8u2f9++fayurnL06FGWlpZ4/vnn+Y3f+A3uu+8+7rnnHsqyfEuh2Q0HRkjblStli5btaMsKZkDH/rR2K9XUKYdMeWNh06oJUekmwfNhwSmrfuYVR61qyJE7iznLGjKpEFhWTws43Jw8jNx1zBRNoq3JbdYJrVNAJbIFjrwPtr+BrJrShEsNMW1COsfzzTleSOuMmsg4OiayQO1WaMrd6K5VpBziiooNEcZ6gIXiHOONH9KLW+xb6jEJtR3XfGzanQ0ZAs0urIR3zgKzMxgqfIYSYqoKJ9bW3OxHdg6aaICvcEKIiUFlYchVMaBfNTiBC9sNo6yW8GRI1QEqAyKtHa9RmxhrVpIVzs5Rk4lNe7yRNmScLmjcGGFWngSz9qSISX/moIeI4HQGSlp1kZv7t3M24Ns5+ksvOWHWsax9f7tQHciB3DYKLm7Bd5/bZn15zLkJ9KuS59cjddmwb7HAS6JJgaJ0uGQAJvz/7J1pjGRXef5/7znn3tq6unt6evbFxvYMAx7whp0YO4CXYGIcEsBGskLIX0m+REpE8iWKEinkU5R8CVJCkJIIgUgUCQEJCCkoxgmLHRLHYDAmLMbgFc94PNN7V9W99yz/D+fcW9XeGIPHaz1Sz3TXcu6555xbVeep53leAmVVIjhynWGUAqUoKotqDhwa5YtS0pA5hLjOtMS8LCOemW5gvm+wXrO67vnxCcfKRhp4opKrvtAazjSda60emlQSEWBYeqwHI1vJM1WL7pRQ2UieGq0Ylp7NIhFWLlr3akLHBxAXCaLHTsJgENVhEiY6ka5fn0q8qXiJNh3LM9jWU+xZyFkqK7x3UWkkSUwmoCXggLVRVDcZgUxp2pmm19WMXGBoK4yLjxMiEVarlrLEGnWDouwaOr02XcmQJaGiiMpBHVhdK7jr/x5nlRjUbiSgdMzeGlUOchWr6SnhcRFK3eG8wQY7gqUtHhUcKjic9xQ+UPlAucUsOMUrCQcOHOAtb3kL+/fvPyPtnzx5ki984Qtce+21LC4uvmg/XE1DWV95WF5e5lOf+hSPPvrok+47ceIEn/rUpxrS6MWMmjT6jd/4Db74xS9y1113/cyk0ebmJj/4wQ9YX1/npptumpJGU2yBiNDr9Thy5AjXX389r3vd6xARrLVsbGxw33338b3vfY8777yTb33rW3znO99hbW2Nsiz5x3/8R6677jre//73c9lll70oVAvPBvW19VLp7xQ/G+oCVc90/0tpLUwSuk/Xb2MMi4uL7N69m5WVFb7+9a9zyy23cODAAd785jfT6/VesOvgjBNGo6KKyhJiJTStk7krLQRFreIRrEijtnDeYV0MmLYhhkzH7CC/1YIDgIr2MK0RpRCJldmURGIoHlswIhgVM3qUVinhKNqvPJL22bVVKoU4JxKEEAkJSRk8tV8mkHKVYGI3HnBeYZwjBEtWHqc7ehhjlykCrNGh0Psp2/NgZglZF6UMWuJOuZaPhhBJhhHbMN2j7Bl9C62HdFSGdT72PMQAb2Eyad0jE+RXSMRB0lWhtKCVR/sQiTOEEDzWKyrrEhGV8mJEKGxFruMY9jstMmPIswGPrxesDR0+heTUuU552mALEokiovrEJV6wSmqi2Ndx32hGdBxgXZMJwUeyKFjwVVSfRXFJSDayCYUXYzVNtAuGRkmTG6H0UY2jZDxtIR265iKfqDhyaV1u6xnKyoKHxzcCMyYwQrG6UbFWOPZ1BK8CVXAx/NyHLZZK6wNaHBWQKYMP0TblJhKfJfnpgh+PaZzfRAQpARfth84HtIZtfWF+NmdlDR4+VrJZ+BjeHR2IkV+rlV/p3KwHE8b2PV8rt9I5axXHXIhrQQGlDU2fNgrHqAyUJTF7KgT6XbAVlAV4q8h0TlkoiuEQfGgUW1sGWSLB1BB2xHPPDOzYrskzxWplCXgyI+RaNcH5Ng1bYWFUwvaZmJvWMoZ+N6PTMWQOOl5TOpcI1UAIKqkZA708o21yMp0BgtGGovJ4gSopDL1Eq14xqPAaJBcwEBJxaW1AhYCXgBehco5HZ2YZmRb7V06xUI7oeUeGJ4gnKPAqhvZP8crDwYMHuemmm854Xsm9997L0tISb33rW5uA7RcTrLXce++93H333RhjuOSSSzj77LNfdP2c4rmD957bb7/9KcmiGo899hh33XUXv/iLv/g89uynR6/X47rrruPAgQPccsstDAaDn7nN48eP881vfpOrr776OejhFC8HzM/P80u/9Eu85z3v4fzzz6fb7fLwww/zD//wD3z729/mG9/4Bj/84Q9ZWVlpKqhNYm1tjU996lN87Wtf4+Mf/ziXX3759LV2ihclnrh2nXNUVYXWuikUopR6yZFG8PSWu/q+PXv2cOjQIUajEZdccgmLi4v84R/+Iddffz3vf//72blz5wtC9p5xwmizrGJAswiZ1hgXlSs1Y6CVIMRMIO88LgghWHyIwb+12qi22SjU2EImQpBYgimWYI+EUS1REJWUMlqhJCqLsmSPQ1J4sPdJwZRkHUI0n3mpt+9xw52kHrHs+lbSKD5qXBI+kkqgGaA3v40rVtjUi7jOQSSfxZt2VDol5msLAeVDVAr5qETAR2VQETSPmXOYLb9DV/t4TonxKGxt7SOqiaRWT0gjpKpJA53SoZWoSJOJoEXhUUjaUNdKoMJZSgdU0Mk03dykTCqDkjZVypwaVSFZ8VKANg5REgmNEKiCp7JEsrDOHKpJojBWZ9Ul7UUmiKKaOCmgq4Shjwqh0oeokCISHHWw8xPEK0/wv8LAhaZsu5/sR5zELf2YEG8RiEHFCz3DqAwMK0cLCF6xYQMrQ8dsL5Z7H1qHjynosZpeUs0oFduAQK6g8jZSpRKDvoVafRfJv5CUVFJXl0snaJJsKhDbdzaOiRfHwpxGa8O9D1bYKtn4JlRWE6caq9I5yLVQuJAC5uP9VSKORLauH+cjoVr5GB7vKgg+WgZNIn3KCqBFq7ULT5dR+Ri7ZyyDwnJi00cLmKbJqWKCHKxc/NEC3W5cv0qgcFGaFEIdaB+SCjCe1/ogWuBaBozS5FrR62YoDVplKMnj9SJR4aaUpqhiGno7y1DKUDqPsxWiBB8cRUcYzMJMIYhXqNKjXcBYcGVcKF4Eui3KXNH2JRiVKrvFCownZ+dYz1vMrq+xeOoUO8shnQx0puL5+slZmeKVgiNHjvzUZFFZlgwGAx544AHW1tYQEQ4dOsTOnTuf8sP/yZMn+cQnPsG1117LZZdd9qLZIIQQ+K//+i++8pWvxNdJIsH1tre9jYsuuuhF088pnltYa/nRj370Ex/3UgvwzbKM17/+9fT7fW677TYeeOCBn7nNl9oYTHFmUAfE//Ef/zG7d+/mnnvu4XOf+xx33303P/rRj1hbW8M595MbIq6p+++/nz/5kz/hox/9KK961ateEsqdl0uWzRTPDiLCsWPH+O///m+01lx11VWsrq7iveess8562ayDEEJTEff48eOcf/75zM7O8qY3vYkrrriCnTt38td//dfccccd3HjjjbznPe9h165dz2sfzzhhZJsQ67jZrDNs6lwjAEmqHuXBSAClY6l2EULQCBl1GEtdah2EEBOoIZWWV6Iaa1MgqYRUVBUFpRoFTxQ4xbyk0OiLImrdEdSbUz/OzQlRZVJvoif/VSI4H4krAfJQ0XNLrLf24voXECSLYd21gqm2sKX/mwpvvpbROILz+BS240NgNXR5KHsNi9UDbDMr9LIsknDaUVhHCJKqaEXliSjwriYXApk20cKV+myUTmomiyiFUQoxUR3hrEsmNrCVZbMoaGeanXMzdIyh28pY7LUoKxuPlwg3nwinykdrXJYBLmYWVS7QMkJbxWwj5ydIjJDGMbE1kjbSwcHmJnRFyDqKjRSqM6kiqt9Hmr9lfNsk4SM89W21qqW+IVCrq+KcZzqqcUoLJzeqSEqIkAmMLFgnOA8m16yPPMpEglGp8doRIvETiIHLlfLN2jeix/av4PE+rqfaclWvlpDWvQvR5ogIXiJxI0CmFKbylBsxGF1IiqsJRU+zBUskVh2MXVvfFCmsPRGnNimk6r1bXQ0vKr4imWpTntRMC2xcuuSmSycY7n/sGMeX1lAeWkaoKtDJtqZ0IqJsJKDKKiqFtECWCZ12vN4Ka0FCowir1Vj136uDePxeC3KtMaKZn8kxWmMSYQRgtJAbnYhdRa4dw7JCRDVrXiuN8z7mgnU0J9qCjALGBySDchSoRhBEGLTbDOf6jOb69HxFe3QCEzwVijx4quEGQ5NTaGGzP0N5aoXhyDNTCm3j0FlU7U0xxdMhKk0DS0tLrK6u8u1vf5vl5WWOHTuGtbYhWu644w7e9773sXPnzqdsxznHf/zHf3D8+HGuvfZaZmZmns/TeEqsrq7yta99rTkHiGTCv//7v9Pv9zl8+PAL2LspXkh0u10OHTr0QnfjWUNEOOecc2i323zkIx/ZsrZ/GqyurjbE09lnn/2zd3CKlyT6/T4XXHABn/nMZ/jKV77C0tIS1tqfqc3bbruN3/qt3+IDH/gAV155JVrrFy1xVPerqiqAFzzLZYrnFw8++CD/93//x3vf+176/X5Drrxc5j+EwAMPPMA///M/88lPfpJzzz2XG2+8kUOHDnHBBRcwPz/PW9/6Vm677TZuu+027rnnHi666KInEUZn+po444RRHWTskx0nEC1POql0astUbRvDaLKg8EbjgokqG5K4IowrPzVfzG9R+ZD4oET4EEOYA8ku0my6J4mbWrER5W0mSd3iMWJlL5vsL947nHMpeLq2O0VliErF7UUcEjwOzygsghLECp6qseGJ1IHTcafuU2992omHpCxSIVZ8CiGQCSCBNdelkvOYNQ/iOYUSQ25in8tUXcyFmD1UuQB4RAJaonTPizShNDErOxJdkaxRiZiLqi6bmIY8zxmWJaWzLG1uMNtpM9tqM9/roJTi0ZUNKl8ysnETX1dqC94x3++j8Ty0sklRxjXQziEjEQ2pslrNaeh0njYIowLWNgJlBbM9Yejj7Ta9eahEUNVLoHY5NQ7BWrHEeL2EEE+xfmytnJm0pwH0MmHHNmF9kFRSLtqz1gYOFOQqsG1OEwIUVaDbiQyTs8Jg5CEojImknQRBqVi63umYHVVZT2ZipcAyuKTiEbQkzUzyjylVB5TH/kZ1TLx+XAgYwIiOYe8OijjjaAlU6SRlYkzq8dmi4nJhPD7EduI0hGacXIjn384UVRWacaqrrJlU6r6q4rwsraxhh+uc3HQxPB0YuRh0HhwMR1FlhESSqLA0JJfWMeC7146KoDBBFtUnUovyRhVsDGH7jNDJooqx21L0ehl5ppOyMCoZ6/WiQqSF4/k7vAKbvp2zzhFwjCrH0DpGHU+16dnnNcpLrPwnKaBda1Zm+3hjwAWsaIyv0ASUd3QGG2xkbRyB7rAgHw1xOrCZB5Yd+A3omKmK4pWI2i7wVG/uRVFQVRVVVXHLLbewtLTE2toaw+Hwadvr9/s/0QZjreXuu+9mbW2Nd77znS94+e7RaPSUfa6qitXV1RegR1M8H6hLgj8VtNb0+31uuOGGlzRBorX+yQ86Ddxzzz3cc889AHzgAx94Ttqc4qWHjY0NPvnJT/7MJNEkQgh86Utf4r777uNDH/oQb3/725+zdXsm4JzjwQcf5NSpU1x88cVPKrk+xcsXr3/96zlw4AB79uxBKcX8XVLEHwAAIABJREFU/Hxz38uBNBIRjh8/zoc//GGOHTtGURSce+657Nu3j/n5ebIs49JLL6XT6bCxscHRo0c577zznvd+nnHCqA4xjmRNpIY8AROiNU0SQSMKtMTNcPAxSLbeyTfkTSIWPL75u97pJvFFY2mSRpnhaRQaqUKYgphjJMSsH+Imd5IwinYdRxU84Buyx3sfVSDJZhdE0EEiKeADBId415BWOmUJQZ2FFJK1Zhzm5RNJE9ksj6oVKek5SqloaaoDYHzGA+VBdirDrtZSU/HMKBhWntVhxWZREQjkRqFEaGlDqTztzJBr3ViylBKM1g2xpxG0MbjgCG5M6HXyjNLFvKTNokCL0GvlzPVa+OBwBB5fr7ApVVhUzMdpFxWhbZoy5pakCHFE5ZFNZEVtQfSBfkfothRGQ7fjaeWBYfCReEtV1ybVWTVqQW5gTAARUiZPmCBLGNu0tlRVq5VpwGYVWAjCzx/tMxg5HlsuWF5zBBcJn8LDyZGn1xGCOHQdJo4iOCirFF49EeAMyZomkWQpKk+mVdMHH0JSDyWCj9o+lwg9LWRKk2nNqLJ465K1MK4rZeJa3rld0Jnw4AnLRpEUQvU5Rh6qIYxqGVNdSdCFMUFUJnuYD6BS/2vyykjM34mVDgPdPFoQTZqHUekYlvE5uZ4keCeUXgEcwkYV6ruaeZubEYweB7PXAdUhRAudS68royHs7CoW5zIQj0LY1s/JdCTRrKvo5hnOB1ywtPNWoygalhXBRzJwUFRkWlPauIo2i4pBUVL4wJIOFB4WlKaX16FQgdbmkNb6OmszHYYESjTaFlHV5AN5UaBGmxCEuZMrtG1FZkDlwtDCWgEdfrZvoKd4aeJ///d/OXDgQLMpds415VTvuOMOlpaW8N4zGo1+Ylv79+/npptuYm5u7rSOff/99/O5z32O97znPU+7cZ9iijMFYwzXXXcd//qv/7qFMKzl96997Wtpt9sv6Y1Av99nYWGBkydPvtBdmeJlgPiF9Zn5rPDII4/wu7/7uxw/fpxf//Vfp9PpvCiVRmVZUpZlk18zxcsbk3Pc6/Xo9XpPe/9LGdFJFbjwwgu54YYb+MhHPtKE1O/evbvJaTrvvPM455xzGAwG/OVf/iW7d+8Gnl/b8hn/tFjVsgEELwEVBFW/7omgPTHvJu2qQ71pdjEfx6UcHD9ZiSyRMZIyjkgaJUUKpY5US1QtBUmKkpqQiVlDMfNovHmVRB4p0Wkz7aNqIwVwR6uQIxAJo9jPeAwP4GIZS+VdlGgk3ZBDUrsqkVPpTJPiqVZF1Ta5mtFQKQdJIWjxaEBCTH+23lJUlh+HBQalR1fHEV8w226zNBhxcr3Ah5jVUthYMapQ0WYzqiraWUZuYhUpNWENREKy+0DbZAQTsN5jvU/VzTSIZ1CVBDylK9k+02d7vwMCo2qd9VGqbhdgQWtaIfDDpQHDIlq7QqAJnO5msJrsTM7GsufexQBhCOSZREVNIjJSHFDzU5M7PMXvTPzdKI4mblTEEGMftj5ustT8Q497JAy45NV9Du6YYXljyImVIRsjx2AUWZS1ykIiRJyHyoZY3axWuKm0vsOEBS5xDpnSOOcRPe6YSFzDlfNoEXzy1wmCSdSSdR7vonquVgnFLKpEhImwfZui18t55ITl5KqjcmObXr3evauXW2isc9aPSS2i4I2QPIyBeH4xpCcGYFtbq4tCzDOqBzIRPMlJOg45lzEBJBmsDcYqpnp8OrmgTSyjqZIFVGthYxDPebatCM6zNgyYSjgwn7PhA94rnIK1kbCyMaQKHqMURltEPC2jybJ4XYgEKm8J3uLF4l385s4FT2Ud1ltciGvfGjihK6oysMdk5DbEinUuMLOyznpbY5ViIIp2srMZDbqsmB8O0DYwZwtaOpDlEIxQlQHd0dhwerkDU7y8UH9jXFeB8t5z/PjxxoJ2uti7dy833XQTs7Ozz+r4jz32GM65F5QwWlhY4Pzzz28UFDX27Nnzgnx7NsXzAxHh3HPP5V3vehd33303AIuLi1x44YX0+/2XxUag0+lw2WWX8W//9m8vdFemmGILRAStNVprjDEsLCzQ7/f5p3/6J44ePcrll19+WtWcnm+UZUme5xw4cGD6RccrGC+W9fhcQkTodDq8973v5bOf/SxLS0v88Ic/5IorrmgIpb179/L7v//7bNu2jcsuu2zL85+v6/TMK4ySLYy0KY0l3X3Mr3EKpyTl1kgS2YSmAlLwAQkek2QJjTIkbeojiZBuSP6jmjCKQdh1APXEY0hkDLVVLm1xpSYLYiUnH4VAUY1UhxKLxnsheJ/sY9LkDoWQdu7WRUtZnYuUwrUdydODTJBXxH6qOoNJE7NaIlGilaAJaLvMxtLDjIYDispiqxHOlQTveYiAFs9iHxZmKjaHjsoFMpPOO8QQbfBJ5RMJB60URW5oZ5rcGIyOZFYcsxSKLaBcbMd6iw0CKDKVFBpVhQuexZk+870O+6qKh5eHDItIlGxrG+49UbE89DG4Oq1n7yMxkZtk0wox04Yqhi87D0trnvm+YERh63VDouFkbCurq6JNiHjGLsV0Q/34UCuIwlitUj9MJhqpVWo+wEMnLeujFV59sM3+7S3O2T3LsKrYGFWsDCwn1yq0jhXFFJCpqDSyJOl9nFIcSYFU90HApjwm60OsxBUgJGVRbeOU1A5BqLxP2U7RWuV8VGSp2m6V5EOCYETT7QRe/aqcncuB7zwwopr4gkpIFrC0FA3SELMKMCaeS1FTQGm8hGQ5dAHnJBE8cU7rsa+VQvWYp0u7YfqUQN6CU4PIrQbGc+ECdDtRmSUSMDqe67AIbAyEhX60UA6GsL4Gyge+/1gROSyJs/nI40WyNkaiKTpO49pG0VxbuVa0jKKdK9otRZ7Fi750vgkA94ncNO1AMIJFUKOoVlQh0C4q2qOCYbfNQAxzQWGsJ1NRNTnvCjSQO0uuY47SCChyAyrHb/zs1XSmeGliMBj8zNWUzj777NNWFk2i1Wq94B+88jzn+uuvZ8eOHdxzzz1475mZmeEd73gH27Zte0H7NsWZRU0anXvuuS90V84IRITzzz+fO++8k8cff/yF7s4UUwDRKnnDDTfw9re/nT179jA3N8e+ffvo9XqICLOzs1veF17o94hJ9Ho9Op0OeZ6/qPo1xZnHK2W+L7jgAq644go+85nPcNddd3HzzTeTZVmjMHzTm96E935LQZAQAseOHUMp1aiOzhTOOGGkQ6CpNxbixtgQ1RBKIpmkEgsUpLZtQVC1Gkclm4o0qptATRjVyiNJm0VpFEcgTW4JSalhQzzGRDwyTibsX2mXHiQeQBGtN1rFikYahcPhUYkoimqoWj0SmRYd+9PUbwoNEUay5KWjxfMXkiJhbM0TYli3IiBEj1dVDlldPs5o5GOeTNqIK+LmeqRUrJLVVjxW+Ia0iJlCnkSjUdqYNVM6y6CyZEYwStHJDK1Mk2lFpnST0YSQKrIZTNBUrgLRVL4C8SwPBvjg6bc7zHVzCut4zBVsVHDfyZJTo9CQPE0Qs49EwWaArlYMbWQbWnmcz9LFEOSVjcBsNyq96vBmF8aqrMkKaemmBpO/q3RDmlYg9SXd1ti06v8nnh+AUxuBb943ZFh4Duzo0Gvl9Nua4WhIv+WxaR6jfTCqsJzzGAVB1YtjTM4I0bYlqeoXLo5RK9NR0SNC0BBcui5CHLQQ0vXha1K1zuYZE2aegAQhzwyjyuKc57zdHbRTLG1aljdtVKWpRIYkoqdMFi+b+uoDjGwgObQa4qTOLIqV0eI1rCfmFonrFhmHqzdrNd2W58LAQlGGsVUwDbbWYEyglxuUiso2CTAcCc7BYARLy46yTPZSFSuNaU0TKu5tbEsUaB3ItKCNoBWYhhQOlN5TlrBRgtpIry9KyJRgDFgvdJTCZp5ObtjV7aM2NWFzE1dWkAWM8rTLimGnxVAUVVCIqwja4LRCuYAZVOQS0ClJfYAw2NYnW7foaZW0KZ4ljDFkWcaBAwd4zWte86yfPzs7yy//8i+/KDIg2u02V155JZdffjmQvvCZVkeb4mWATqfDa17zmilhNMWLBnUBhT179nDNNdfQbreb2+HFuzF/ptyzKaZ4uaDf7/OWt7yFz372s3zzm9/k1KlT7Nq1C+89RVHQ6/WeROqurKzwR3/0R1x33XXcfPPNZzSH7IxfgTM6+lokhT1HAiZZjZRvQqNFtqqCRAlKNLohUbZu5GPeSySGRBReBO88VQoTNQpM2iQGIllUeChSBk1NQJj0O4QkAHKNciN4jyZWU/MpaVulYOpaAYXzMbvIR9uQaE1QuslsIkQLWy2FkVoFlcixLIUFGxXzhCT91OfonWD1HJ3FC9ilNY+deIhR8QQLVoDloUe0sLOTLEbp9pjfI4wqF5USWsWKXlohErAptGaEZVBWaCW0M00nz9ESs560FlRQkRxD01IaF4ShLVi3lpMbQ4alpd9q0W9n0BdGg4LlIqqFYEwUhZCqo4WYj7NceYJLLicFeQZlGqsq2dNEJVsUqaKZTJS8D1vJISaUQ0/yq6Xxr59TExr142oljJq8L7W1UcD3HylYG1bsX8zZ3s1pAXkQgkpKtRAYlFUkihCMjvZLNWGkrK9zaX4PidBMWUOpNL0WhUsMkw+RcvUurr+GElWC8x6lFVorPFBWFoFI7lmHUmCD57xXddHaUFaOU6sFJ1ZGPL5eUY5CU/XM1ss0ETxllQKwFSl8PR7Y+0j2OAe5gtBY28aDG4hrmnosU5tGR7JsbTDOn6rbDoEYiG5Aq2jp0wIDF+1ovoBTqwGvQHSy9qWMJW/jeqn8uNpbJPAiqSUSVWBGQ26Edh5/FxUwJqnddGxnGMBUKuV5aXKj8QIFlpGHjaJiu4Fui2g7dPHaqlCMVEYoLJSgqgpTeYwEtImvYyNgpdOmarfxvqQzmn4ImuKZISL0+30OHTrEwsICr371qzHGMDc39xM/4M/OzvL6179+y21Hjhxh3759Z7LLzwrTzcAUL0eICEeOHOGrX/3qcxpWPMUUPy2899x+++384Ac/4IMf/CDvfve7McY07yOTVrQXG16sZNYUUzxXmKyy+cMf/pAHHniAnTt3opSi0+kwMzOz5Qu10WjExz72MT796U9TFAXXX389CwsLZ6x/Z/xTWl/KZHWKKgyjoqJFqWTFSnasemdeh0+L0uMsFZG0eY/Vu5oqaBKziIxWTb7KCIu3McC2ZQxaR/KmdIFB2kiOvOCCSseL1rEQQgzwrcNokh1OSSxbHqzDOp826lEtFazHWRermYmKG3dRoKM2iEQC1KXuQ6i/QY0/tXUnKkSiLimm1KQXbaAlFqMqNt2IXFyqbDahjCH+vn3WcGCnIVOaljYMK0fpPJWPYxbJo/pbhJjRJAgqBCwOoyTZAaNFalAWaFFkRtORDCVCpg0iCqNARNPODEaPOLVZsF5UlNaRiaGshLbSKG1Rbkw0OGobYCQoasVPbf+zPhIBmYob/wCMSui2t1Y5Szzh2AbV/JMIHxkrYkK6vVYZ1URTM4Y1GuIwkldP9dZUlPD4skdLhVGatSJwatPRmZFU8SvOuaT16lyqwCeRWGjqwU2omKJaLirtSusQhNwIHh+zpSTKckRFtRtB8K6+VqIaqV4MM+02w9LiQmBjVEX1mhbWixKnQLlYjW1+zkBmaPc8P3rIUlU0FiyAmp9ulHM+zp2XqEgqqlgNLdc8IeMo6uq8jFVfNUmmJN5ujHBqMzR2uFptRbo2jYZeHklK66N6anMIvgoEG9eIS+ulLihXJRWUUdDLYLarmetpZtqKTtvgA6xuWpY2KtZHno1hYG0z9k2n15iZFmyfEzrdeB6EQBU865WnHTRGaU4ORrRVC9MTtPOYXNhcCojyZDaQlxa7bjEWchymsmRKyLWgjDAwcLzX5VSvTxDBd1v4svsUK22KVzJEhG63y+LiIueddx6Li4ucffbZtFqtZ62+mZ+f5+qrr37KD9v1t8233XZbs6FVSnH++eezb98+ut3uVO0zxRQ/A1qt1gvdhSmmaDA3N8fOnTvZtm1boy6CJ5MxT/z7iQTSlLyZYoozg3379nHZZZdx+PBhdu7cGfeTEz8Qr8e1tTX+9m//lg9+8IMMh0Nuu+02vve97/HGN77xjPXtjBNGsyr6Q2JlMkFphVIBnUJOlNT6nrhJq21o4hUSVLJ41QoV3+xQRQlaVAxuI0MkoLBAgaPCOMHoDIVGfEA7jy49xgqqirtNo4RMRbLGJhWRdZ6yslRVRXAukR0ecR6cx2hNq5WTG4PPhZE4yspCEMRrtNEoMZHkCiGqiwiEFHQcc1niWIgINimZPIwZEF/h3RBXrrExXKYYLDMcrjLaHFHaSGxMVvfywMl1y6By9FqKuV7OQi8n14q1Ycmwcgwqi1IK631SNqUqXInJ0crH3KIAw9LSMpqgA660lJVLtjmhZQxKa5QSullGZjRF5dkcVWwOPaOixJcak2WIsWiXVCDETb4bF53b8lOj8jHPyCblSOkgt5CbSAzU6homzr9RCD3h9sSrNJW3aqJpMoA6TLTRqLbC+O96u+Q9VElFc2LVM7JDnAvk+dZKbSA4F9e3UFvfBNI6E5GUQ7S1clhtvQKoXMzb0VpSNT/B+TosPZFENoXBJ9IlVxKrfhHbcs4y181o5QbnLYWtEIRMCyc3C06sVAyHkfyplV/RDpfGamKOnI9KPCXJLlglwkYg2Ilxl3Gm1KRqCxkryFZHgUGRxl7GhGEAWjqSUL22QqVKgptlYG0VfArUFh0VSd5DYeMcKyLhc2R/m7P3tVmcz+l2crSKCjnnA2ujguWNAWXp2Rg6ltYtK+uewTBQlFFBppahHEGnJ2QZZDpenwNrkWBRCP3g6WctbPAMRp5gAp1hSffRk+jSYnzAqJDyiiL5KQoGAsdm+yx3ZvCRcY6vD4NplbQpIlqtFocOHeLw4cMcOHCgKR37034473Q6z/jhYW1tjU9+8pM89thjW26/5557mJub48CBAxw+fJhzzjmHTqczJY+mmOJZog4YniqMpni+YYxhZmaGHTt2cNZZZ/Ha176Wiy++mIsvvpjFxUV27NjxrO0rT6U8mpJHU0zx3OE1r3kNn/jEJ+j3+0+bNbm+vs5f/MVf8Dd/8zdNDqaIPKmS3HONM59h5IrGjqKDQgWFCnos5wAgWtYi4k40iCKIJqAba1XwDu9cs/HWSuF0hjc2hgjbgqoYIt4TjKEqLNZarIs2s8p6rA0EG3exyii0iQon8SHlz0AploEbURQjvIuhLSoEtAvkWU4369BWbYzJKLWwiWNUWLwFCQalUvWxpBqqyTACSBAyrcnEEJSiCh5Lga02cdUKm6NVRsN1ytGQorRU1uPdVmXNFvVGGrXSQbURWNtwnFwZ8lhbsXtbzs75nIV+i+XNktVhlRRHUXVklMSKb8RQa5NUX7kWNouKzKhI7CGRQELhg42b+8wwqDwn14esDiqMh7KA0TBusqvRCK22WsDqPteKosCYLKrVRjUblhkIVb08hLaGwoYtZETtHRvbu8bt1MdtVthEH3jCfc3NEwPahDAngqlud1hBC1jf9NE+ldXWJ2narMO1o6pMYhWzEK2GPniUCEFCY4tUEgOnScRQ8IIysTpfVHbFfCvvUxVARQrAHhOp1nvyTNNpaSqvKEqLDY620ljnUF7IjWZ1WHF8qWJlDQaDNHYT64nQFEHDeUjFw+LlmsbCuUjQBDcm45icz1r0VMuo0n9VgI1h+jvNQa0+U8Qqei0DSMqtCoGV9VhRzPvxlNUB9S2J9kUfYLOC7zxa8siypdfWzHQN8zOGhVnDbE+RZYG5ToZ0NZ3OiE7Hc/ZuTT/vUFrDI4+POH5yxNKmQwbQ6wrddqCVk5j9SNCthoqhcnSs0BtB20ErSLSdJUWXpAUZJFCFgBXhxFyf1f52RBQq1KH4Dq1e+ByZKV5YLCwscNFFF3Huueeya9eu58SD3ul0uOGGG5idneXYsWPMzc3R7Xa3fPhYXl5+EllUY3V1ldXVVb7zne/Q7XY599xzOXLkCHv37qXf7wPTjcIUU/wkzM3Ncc0113DLLbdMSaMpziiyLGN+fp6zzz6bw4cP84Y3vIHzzz+fc845h8XFRbrdLlrrZ/26PUkSWWtZXV1Fa83s7Cxa6y33T98Tppjip0NdDa3VarFjx47munpiBbSyLPn7v/97PvShD20pmpJl2Rn/Uu+ME0bBVUDM7yBIIoAa808KqU4VxdJO0yeqxQeVytrHKlneO4J3KKLFSpRGaYNWijwzMWuFRDaFgPOe4WhAWRSxbLYoggflwPmALQPoVO5eKXTeRpQiw5FRUFYb+MrGTT1Ci4BxFZlT5GgyAcFRhRJrh1TWIUqhVCxXGVUmsYpVPeHWWjQgwVK5dTYGSwwGawyGBUXpsXYiWDhtppvqVIz34Mn9BICWqIbo5MJMS9E2GiPCcNPzSFEy28/Z1m/T6xhWNguGpaOwLpZsB0iWNZvyXkbpWKZyMUNKoDCaXCtyoymtww8L1kcFg1FFG4UKUI6EYRUzm3otTScIw8I2KhJX25dqAnDMozVqIAnRhtYQDkSFRqakUdRookLLEWKlPKGpegcT+UY1WTVJiDwBtaKouS/QBGBPPqbu77CM6qEQoNOK94aaIUoEmUJSRcBEjPg4R0K0IgZiLpNN4T51eHXdR+cDoYoEilexDHwrBa9bHwdNtQyVDVjraGcapRTDqkSJ0Mk0gscHx6Ac4UNAo1gbOE6sOZaWo72uJtH0EwbHqEhAOje29tXZRc7HfqFAO8gzRWH9FpVYPXdajefaC6wP4vwrNSbvdPqlbWAmj/bDGJAelT+b65EsIpHOW9ZFiGujTNlLm6VnWHpk1aIkVkozCjotxcKc4ezdbRa3xXZ29jss9mexHgZVhWll7NguLK06jp0sWVp3rG5AO4N+N9Bp08zdKPNU22DTQccr2i7QqgJtJxgv5D5Ork9BSkFpqm4fMa143XqPshWd9SG9wfApVuUUrwRorTl69CjXXHPNc1JOPM9zZmdn2bFjB/1+n69//es8+OCDeO/Zt28fN95445aKarE6pzxjXoX3no2NDe6++26+9a1vMTs7y+zsLLt27eLQoUOcd955U+XRFFM8DZRSXHLJJYQQ+NKXvkRVVVPiaIrnBLV1edeuXbzuda/jF37hF7j88ss577zzmJubI8uyn/ie8mzfc+IXl57V1VW89/T7/dM6zhRTTPHsEGNyXBJ4BLTWaK3Z2Njg1ltvZXNzs3nszMwM73vf+zh48OAZ7dMZJ4xsZaP6Aokqi+BjJSeASAtFK5qKZY5c2hQ753EuYF3MDqoJoyi3iXIDpTOyLCPPM6CN1on40VEREBN7Be8sIbjIwAWQUOFdhassNvVCKY13nizP8cHjbEVwFoJDIWilEa1jdalqQDX04FqR8KpGYIdo5zBoctMi06Rw68j8iYKiWqGoTrK6scbGcMSwsJRlVHHUlqBaydIEDDPeJDfVwNLGOTfCbFsz09a083E1Oe9iaXAXYDi0rG5UHHtcmJmdY25+gXZ7iK02KMqSwnlKCzZJOHRSdwD4CZlOYSNxkZtoaRuUFSurnqwU9uw0+ExQlaffVlgXyLRqMnxCqug1aUFzoWm6IcF8GNuUalWS0uAlsFSEsVJJ4hrxE2oWRbQ8uURI1YKfWrTUkGx+TL4F6oys2I8w0adJZczkdsp7KKpAp0VSZEnTd1Urm6TOpkrqIlULpwSFSvlEpCwoofC+yXYSEYyKuVcuCC0lhODJWxlaG5wLlJWjso48F7QIu/pdsiznsdUNQvDsmJvh2Mo6eMEFj/cOaz1VFdhYjeHRWk2srYnxEGKlsjBBWnpIQUPRKthrx7+1CJVLodkT4zU5VhBVWsMqklC12rCej3YOa5vxmFrDqBROLce5HYxiCLVKtq56X1pXhfMhZipJIrgm11JNQnoP1dCzNip5+ETJTFtx1s6cQwd7LOsRpatQCJnSaO3pdgML2xRiAqvrnmEBg5VEHLUTcaRjBUKvhGA8RQqQNwK5QMspdq4rulXAerCVR5UV0o2d097TWdpg9vFlWtPNwysS27dv581vfjNHjx79qQgXpRTz8/Ps2rWLffv2oZRicXGRhx9+mEcffZS77rpry8b0kUce4V/+5V+4+eabm+yKPXv2cOmll3LnnXeeVshpCKFRHj388MN84xvf4KqrruLyyy+fkkZTTPE0UErxhje8gSNHjvD973+fz3/+8y/KUOEpXhoQEXbt2sXVV1/N9ddfz8UXX8zevXvp9XrPqE59OlLnJ+UTTeamGGNYXFxkYWGBzc1Nvvvd79LpdNixYwfdbvdpM7umhNIUU/xkTF5r9Wcqay1LS0tkWcbc3BztdpsLL7yQW2+9lRACO3fu5A/+4A/4nd/5HWZmZs5o/844YTQqi1gZTY+rn8Uy76EhVExmMMrgg1BUFaOioKwczrrEsLm48bc2Ejneo40my3K8y1DSRWlN8BqTGZTOUEpwziEhtk9Q5JnGB8F7h7JQeYt3qXS3KJxz6DLDB09VlrjkBVM6ZhNFhk8I3mLLTawbxfYqSyYOnWta7RZ53sZojYgiUFK6JZbWj7G0vsLqpqMqx+qNyVCeWjU0yVk0G/oJS5URWJjJ2bPQITOeUWlTsHZUL7hAJNxCKr9OYFR5Bo8vcWplSG/bPmbnDjDTXqNdnWJUDChtmcqNRxLA+tieFokKoZRvM6zisU6c8qytw7nziizTPFZ6unmG9Z5KQlIU+Ua908RPJWLETxA3mq2kTF39KoTIDxaMyYKY9zO2tcHY5jY5ljX5Uduo6jGErccKUWTWVHNzqT/1WLsnzIMjkiYto2hpIVdCED9hsYrZVbGC2YQ6Jx1LpdasS5a1FAaUmZpgETJjKEuLdYGicnTbKpJGRhO0wmhHWcUflcHxEtEZAAAgAElEQVS2mQ5Z1majqDi1vs5DJ1ewrqLfaWPLRLY66BjF4f0Zw8Lz0OOWpfWwJc+pXoOS5sumNSpJxUWI6qI6VNz7WMGttgCKjAm6erpsiGROnVukkhqstqA1pF6yv1UEfBVzoKyNDWoV0JFPbnKSJCnNVKrgphUx38s/eX7rOQ8B1oaebz844t5HC3bNa87dn7N93iASqGxgdbNkY2gpbUBpyHMIPl4TSxvQLWCmG62IWsfzsynjCwNBWarMYbcZ5oaKmTUIlUc2hzBTklnH3IlVZlbWaAdHpqcfpF4pqL8RPnjwIG9+85vZtWvXaX+QVkphjOHAgQO89rWvZWFhgT179mCt5dFHH+Vb3/oWX/rSlyjL8mnbOH78OEVRNIRRlmVce+21tNtt7rvvPo4fPx5zAk8Tzjm++MUvMjc3x9GjR0/7eVNM8XJHCIGHH36Y4TAqSOtr98ILL2R5eZn/+Z//mZJGUzwrKKU4ePAg119/PTfffDMXXHDB0xYm+EnvK8+09p5ogZlss97IKqWYm5vjvPPO48477+Sv/uqv2L59O+94xzs455xzmJ+f31J9bYoppjh9TF5reZ6ze/duiqJoLGsXX3wxMzMzHDlyhD/90z/lmmuueV4KLDwPhFEZM4AEjNFopXHepQDrGPTZMQZBx5whFxgWFaPhkOA9mTGJ8AlU3lE4S7AVIjku5QQVZaySJu02xmicrfAqSiets4QQA7B1yhYyLkPpCqUkZhSFgPeBypeUiSgKzsXqVaIIKZgaLUm9EhJB4KNVLdOoTptW3qLVyhGlCcFR2iVOrt3PseVV1jYC1o5tWWHyc3nYSgjBmACp3wqURFvWfDfjwM4e8/2c4C0bowqtFJXzeBfVQZVNZFEiJGLGrqAk4P2QjVM/ZLC5jdbc2WT5TkxekGWbdFilJeuMqhFlGVVK9U47hEj6FSP48SnP5hA6CvZvy1hxoI0h+HElsMp6iioSEpqYX1Ori2orVE341FW1toh7VLp/4vZJaVCjtqp/ZNzuZAW0MDGG1PeFibZkrISZPAT13ROqIRgHLg+LQD6naGlFRVwLsbpazZDVB492PUVUDWmJZbmEFCatY0CySwoZ7wOVdWitcd5S2liBKzOB0jryTGGk9qEL1jlWRiUdH9V5LghFFSsTjsoqVvgLgg+BygeUOFot4Zy9GnPC8/jymNSTiUGwtcLIjYOsNSA52BR6HRU8YTxn4yGN45jIomFSFplEKhli+7mJ2UNaIJOoJvISiSRtFLgQbW1JXVTPQ70+jIzVeM5H0qiqr7GQrH9pzglb18ioDDx0wnJsyXFg0XDeWS0K5ygqFxWOPs6JdXER5LlAEArnsRsxw0l1QJQ04dihDGSZkGWBQlU83lWsG00PIS9LemsDti1vMDcY0CKQ6Ri6P8XLG61Wi8OHD3Po0CHOOussZmdnT+uDdKvVotPpcOjQIQ4dOsT27duZn5/HWsv999/Prbfeyn333cfq6uppbT737NnzpA8VWZZx1VVX8cY3vpF7772XO+64g2PHjp02ceScY319/bQeO8UUrwR477n77rv5/Oc/T1XFIEYRYd++fbz97W/nqquuot/v89WvfpWNjY3TajPP8zPZ5Sle5Oj3+7zzne/k937v9zj//POfMgz3+SBnnniMmZkZrrzySqy1fOADH+BjH/sYZ511FpdddhlvfOMbufrqq1lcXDzj/Zpiipcy6s9vk9fXpNpIRJrPbmVZcuTIEX77t3+bm2++mYsuuuh5U3jLmf6W46ZfvCTYskBrTSvPqTe51kZvXrvVodvt0GrHF8DBaMRwcwNbVYhA3mqTG4NzlqIoGQ43Cc5isiyqflTcPOd5i5l+n/7MDK08w4XAcDRic3Mdb20knowGpbDWMRqNKIohZVHgfFRh1EqHJitJzDgkTuKmVWsViS9tYgaE0ihl6HS6dGdiqrnzBY+f/D8eOfkgy2sVRQVlFTegKqSS8WGsfmDi9xT70tisjIqB0wu9Nru2ddix0MIYKG3FsHSUhWVjWDEsonVvMvMpQCIMQh2xEzfcKqBFQLcIrb34bAdGaZR37OYh7jv5GMMqkmhKaDbP813N4pzixyctq4PAgb7h1XtbrPtU8c05rIei8gwKx6CIpNFG4Rkm652dyDGCJxAVNWRrbg6AMRMqIiZsazImEvxEu0LjomqULfVzJsd+8viBiedPkBNPVH6ZRGAcXFTM9gVl4t/WRyVMDLKOt2VKItmiGAdYqxigTMoyikRGJEtrG5hC0coNlXcED0YrMmPotltk2oAovPdUlaOqKjqtNqOqimRrUUZ2WqLCDC/Riifxfx8AFcPYf/RoYG09NBZBpWC2F8+9sFHhVSt6jIZ2K2aAJb40Bm8LKaOMxiYIMLJxDmqllasJPQRrA3MzsDwAHWA2i9eGEhANM22hZxRFFdhMcjJRE4SUjFVnNQnkAzgnlDZeAzap1BqSqV4TEy95Nbm1Y06zfTuI8gyKmJ9UlsRMsRDVRAhokuopBGYyRZZF4iuqjeL1khshy+MYG4TuSLNzKWOmUMw4S1sCRtXrSPh/Dw5f8V/DiUymhr20UZc/nZ+f55JLLuFVr3rVswqzXlhY4JJLLmH//v0URbHlm9per8dXvvIVvvvd7+Jqlvk0cODAAW688UZmZ2ef9jEhBMqy5N577+XWW29lbW3ttNp+61vfyuWXX37afZliipcrQggNWfRUar92u821117LxRdfzLFjx1haWmI4HPKFL3yhIZeeiE6nw6/8yq/w6le/evo+8TJ6nzhdHDx4kD/7sz/j3e9+NzMzM09JFD3dPu7p7vPeN+08nZro2SCEwAMPPMCHP/xhPv7xj3Pq1ClmZ2f5u7/7O9797ndPLctTTPEUeKbr9ukeu7y8jDGGEMKW7Mv6WpczyByfcYVRtMPEBN0iWb+sDxSjEuccZelwqcqT0oqqLBA8JjNRrZHuCz6WqBcRlDGIipYvTyxPrbWi1WqRt1oYY7BlVAtVlcVWFc55Mp9FJUwQRClEGUSqVGHLN9XDQtpligQIDqFWKzkI0e6mTdoliybLW5EsarepimXW13/A2toxFlo5B/Z0cZXlaw9vRvUDE2RHiOqHmmBoSCIRcqOYaWcszLRZnO8y28/ROrItlfexHUjEg2wJwVapIR9i7lCAuOGuu1yTRnqEcD/BniA3O8mlQ1dbbAWDYcxfmbRTjSrHXB8OH8wYDANGK9ZDbN85n+x+IQYW29Dk2yjGihOpyZpauZPQiIdCHRBNCjFPihEi6dIQHulJk2qWurkms2jLOpywn02QGpNKpZB+CRO31WjIIoH52Ri07ELAaKH0UWmG0JSmj5lU0uRAeR9ZMOdBi0KJbw4mBBSCkWjJciGq2KyLNjSTaTZHFRIc0pG0fnyjoBtWJRujghAE53xcw0TSJAZwR5IjHjseM7g4vnsXhdEoMCrTGCfizaYx825sGzMtIFVGq+2FzTg9gYRzPuYWZSqqm8r0+NykdalTWHmAbr2PlmRn8zGUu5vBXF/jBo5RNbbPqXpB1aqv9GQhoHUgA7SvCaQx2Sf1+dVzWq9t4PiK4+Q6zPeh00nt1rlJYXw4FwLdFsx3egxHnqoq6RmFURI/8GsobcBYYQ7D3Cgwuwm90mGwGJGY0xWHkuJZWICmePGj3W7ztre9jd27dzMzM0Ov1zutD98iwsLCApdeeilHjx5lc3OT22+/nW9/+9tbPlR0Op3G5nI6qG0Mv/qrv9pUN3umPrRaLY4ePcr+/fv52te+xte//nWKojjt400xxSsV3nvuu+++Z7SGjkYjvvzlL7N//35mZ2fZuXMnIsLGxga33377k5R95557Ltddd91UpfEKQ57n7N+/n6uvvprf/M3f5A1veAPGbN2uPZt9obU2uieco91uNwUPnkuV0tlnn82f//mf82u/9mt8+tOfbjJWptbLKaZ4MurroigKfvCDH7B9+3Z27949SfxseVx9+/z8fPN3jWcif59LnHnCyFZxcxsCoYomEWc9VfLjCYGq1MlyElLuTwz6JUDhCtxwiHcubqxVVPdoY6i3e1orsixawZwLID4SRdZGFYatcDYG/5ospFKQChGDF40LY4WFIBODHxVFIYSUDRTJKYOgRKUX3QBhxGD9IYarm0gYosWyuz8bN/TWcmylZDiK6ppamQGQKVA6kkNaorWlm2t67RazMy16HUO7JbSMwgVL5aPFpnLjkGQXAqV3VMFH602SWkTrz3hHX5NGqLThT0oOrQJKNtBsEmyLodVYF7ATSpx6sx08/PiEp3SBTktoadOQNoFAYT2lDanaW8xDCiE0iirYIu5oxrg+Rk0k1QQaqY+GlDFkxhv8hiCbvD7qvjQdHt8VJh7XzSORULqUzZOg0rHrnBwmmqkzilyI1b5aOWyMAts8BJG4btIBJZBYskT+pDaCD6nd0PjktJJU1c03gdc+pAyoyqEU9LtdjMkYjAqKUUW7reL6qxnAEAlN72OFuvFJJ3IskVRZqtbnfVQmeB/Jj50Lih+f8Dhfq53iOLQVDJLCrJXFOZnUSNRKn3oOJlVYQxszhcpEgIUQK6FlEpVKQSBY6Kp4Heg0HrVd0Ho4ue5oVwEvMTibRLD6NHxNFbp08DoXSwmIErSKt9XnU88DE/9PkoylhVPL0BvBTJ9GcaUm1llLw7ZOi21zO3CzipPLS5zaXKeVJ7UYYBBmRoqZIeRW8MAAj/ZCIQHlBS0xINtPLswpXtIQEd72trdxwQUXPKs37jzPed3rXscVV1zRbBy///3vs7y8/KTHni5ZJCLs3buXn/u5n+Pw4cPPyt8uImzbto1rr72W3bt385//+Z+srKw85WOzLGPv3r2n3fYUU7wcMRwO+fKXv8w3vvGNZ8wRA1hfX+ejH/0oWmsOHjzIz//8z3PllVciItx7773N4w4dOsSll156xoNMp3hxoFalXn755bzrXe/iiiuuYN++fXT+P3tnHjPJUZ//Tx3dPTPvuYev9bk+WGNMbMDGBhLLwVyxwxUg2ImUO1GEIiGFJP8EEqyAIiJFoJ8gRIlESCAR4QggIIAFSSBgFhsIiKyPLIsP7F2vvcd7zdHdVfX9/VHVPfPuru017Nq7Zh5pdt6d6a6u7q6e6XrmeZ5vt/uo6tRJMqZRnE4SQSLCaDRiz549DAYDTjnllHWE0eS2f9K+Q8zquuyyy3jmM5/Jb/zGb5Dn+VRdNMUUh6C5br333HHHHfzxH/8xzjne/va3c80117TXzOT1/Vi2tScLx50w8q5CvIukiyfm7HiHCoI2liyLYdLWGoLElN3gPc45vI92G1dVKAVZlkcpVgrLVRIrohmj8SFQjkqci9lDVTmkrkYE71K1KqGuKozzkalXSY3RhPem8lpN6K+EqJhxQpqMx+BtnTVWEk+QNep6lVFZI8HTyzVOO/YuDVjqu2RFE6pyXL2rUcIsFJbnnj9HLYGZboFDYY0GQrSRIWQmEFCMvLQh1kgi3XxcLqDQRmG8IpZST7lFpEl5Og9KyZg40nHSrlVjlQIVhDKMWFqNlp62qhltdFM8n17Yt0/YvBE61iPEQOB+6fEpP8Y1lbPSJJ6JfdcytorBepVKo2Rp85sSGWEVhDq2oyYCsWMDKZhajdeHGEbczPMPVQppoGzUJWPuJq6fOqJSp5rl2/eJ6hcAlcfza7JI8piWGW72LVVQU4JOypKWXguKkA6MbggnpWK5+rQhLzGPqj8a0et0MUZTVjVFnlN0LNZoilzo5BlrgyFVXVM7cD4q8toAbkhkZJ7a9Ilsiflcp29UDPpwYDWMlUIhVqjr2DQGsnRc1PhY6JQzJawPm3YBhhWtQk0p6Ka27MSJDi6OLZpjrMbqMBFBlGJQBcr0niGNWQV+ItNocv2G+PXJTql1Cphn3JdDiaMw+bdAfxD73uul7ZnEtWpY6GTMzmwiYDBaMT+3wJ5+HypPnil8GkMP54GlHGyAPCgWS0NvqCg6itxFFZTNNRnTm6mnC5RS7S9ETwQXXngheZ7zr//6rzz88MM/0S+yWZZx6qmnctVVV7Ft27afqOSxUopLL72U8847j29961ts37593WRYKcXzn/98zjrrrB+7v1NMcbJjOBzy6U9/mrvvvvuo12lUe3fddRc/+MEPuPDCC7n++uu55ppr2mWOpACZ4ukFYwzdbpezzz6bl7zkJbzqVa/i8ssvZ35+/nFDoye/JwaDAdu3b+eUU05h8+bNbN68uQ2nzvOc0047DeccnU7nsHaPxxjL85ytW7ce83anmOJkxqEE7913383NN9/MV77yFbz3vPvd7+aKK65gdnb2Me8Dn6rvheNOGNXVKCovJGbiSPBN/fBYKclmKSdIYxTUrsJ5T11HS5n4WOJea41T0UcjysVcER3VSEF8DL5NrIwEHyucIWnCpxEC4hyVq/HBRjtbiKSL8wHvPBpBG50molGJ4b1rFSvWWrqFJbdrsX2d0+2eQlH06FrLBh6mcivMVIHtD6+xPByzFrGkelSUZEbTsZaHDsKpi7NYHWJWDdFC1iilvPeIh8oHnJdYaS7JaLyXlKIOxqiUawQKSf0VmgBmlRRFTXCwMZEoMjpVvULFrBqnKGuJAdWMJ+9ZFBJReyg9zGaKjYUlMxaFShlQIWbT+Ni3RtURZKzwUCoqeiZVS4qkFplUMzXLy7jPWtOWqG/FQ42iRU0QAk17jK1SDfHTqGdW6/GyLYk20WbzpCVub+Ll9u+ySsfERRJRpKm0FlVCMFY6aaUICFoUtQSsinZHnToQM3jSuSUSki1hF4TBsKSqHItzc9F2lkKgjI7t5pmhU2T44PFBUEEiORUAiTeduTHMdguWBxXSSLGIpFamYGFGc2AttMdIN2SZgrlufLFRCh1KsoUwzjlSCtaqFBadDlrHwEweSUrfnNc0DnU6L02+UaMiasaGNRpRgcqP84eafCuZWBY10ae0skoDodmXll9SrA9ZT+006wZgWMb9mp2J7RQa5rsFs72NoDpprCqKLMcWBeWgT2Y0PaNwSSpXKahEkZWKrIQsV1gEkwkYYaSF2k4taT/tuOOOO37iNhYWFjjvvPN4/vOfz6ZNm45ZxQylFHNzc1xzzTVcdNFFbSg2wMUXX8y111571NlMU0zxdIP3ns997nNPiCw6FM457rrrLsqy5LWvfe0666iIsLa2RlmWU1va0xCzs7O85jWv4WUvexlZlnHXXXfxrW99i263yxvf+EZOO+20x21jNBpx8OBBZmZmcM6RZVlLFimlMMYwMzOzbp3jNeF8KtUPU0xxssB7z5133snb3/52Pv/5z7fqwNtvv5177rmHZz/72UD8bmiu5aPBo1U4PFY47oSRjmm7yW40ZgIUEKQhbDxUNQrBVTWurnB1ha+r1vYiBLyv8OKx3qJ1DKTWRsWJc/D4lLwrEie+RhuUtSitsSjIAq52eFfRTNS9qwl1VAihFVrFm992AimRejDG0ul0yIoZsmIDvSyn6MzQm1mgl1u60mfj2kNUGEZekArwkSCyWpNby2yvx3xvhtwaMhwb5mHDnGWtHJEblciRRCxl0TJXu0CmBK19HAgiBAJKJyaGJOFRYK20dp04MU6VoppKaYkg6lhFJ9PM5BmF0XgvrA49a2s1lRtX7DIqWnAuPEtRBaHfh6W1qO7oFhYnqs1QyozBCWiVcqaU4FCJJBwTQi1BMzFhn7SZTbI3IUSiSDQYCyH9uK0nlp9UFU2SP0020ST5ENU+67c9seo6sqh5bkmlQ1YQYFTBylpgS89QhxDtSwpCUKRiaHH/AmRWg8Swax/G5emlIYsSsQQpZDlZNGMulMIHYaU/ZGGmR2Ysxuhoy/SB2vmoOPOC84mYldRe2n+dyJpRXadrJF5/AQha0cv1WIolkJtkeQxRJZNZxWoVg72bY9v0vzmfSsEgkY4tWWTjw0wQOmMbI+02m/83Cj+lY+B7ppOCkIBrlELp/DYKsea8N/bCde2qRDg2JKgkIlCNN3pY5bz0Z1XDcACbFhSb5mbpdTeAzlFKo1LomNGK2d4sB4Z9lFZ0FjaxOihh1Ed5YdZpNpeKjgiFBAoFxgpKK0QJI//jq0mmOLEQQuB//ud/eMlLXkKWZcdtO1mWcf3116+bBGzZsoVut3vc5P9aa+bn57nkkkt4znOew5lnntlOTKaY4qcV3nsefPDBY9LWPffcw+c+9zl++Zd/Ga1jFMKePXv4+Mc/zsrKCm9961uPyXamOHGwsrLCZz7zGW655RbW1tYYDAYAPO95z+PGG2884johBIbDIQ888AB33XUXe/bs4cwzz+S8887j1FNPZcOGDetI/KeCuDmSfWaKKaaAfr/PLbfcwrvf/W5uu+22dcUOHnnkEf7jP/6DSy+9lNFoxCc+8QnOPvtsnvvc5x4x8H4ST0ZW2PEnjLQmSAzibaqPSUjSDfGMBgOc85ik7JHg8M4RfGgn0Kq5KZWAhDqRIKAkJGuPRntNSBXNhJg5JKnUucGgtMHaeBMvVUUIPikiYgAvxqSKZ5GOUF4jJmC0RpuMTqdLnucURQebZaA0ZVmD6iN1BrJCHaBc7fP9B0pGtWKx2+G0U05hyxlnsrC4EQmwtnKQ0WAPVo1QGpYHUZEwk6rEuZQ/pJWingj6NikTR6EQn0gTLWiJSo1AnEEnyqy1pVlNKuMu5FYxkxtmi4yZIiM3liCeUekJwTMcwaiOFaxUCvytAgxqIS9gZiZWycqUpu8FRbSkxaBqjSdVaEskiISYd+QbbgtaZU8z2W8UQZNWp/Y5VVRr85ZsCjFmTOA0JIESUln7MWHQkASTmLzcWkIokQaTBNE64qp5aZI4Ss9LfTi1FvJMp2OmU25TSKRAU6FNJviYFBQeJIVlJ6JonIMdj0trcYvWvsGwoq49i3Mz0aKmNMpqeigkqGgFDCW1REUaSlLAdszRWR0NEQmt4qkKwqAMjIaKtQk1XJ5FVVmooypo6IWBj+RRsw8NsdNmNCnwolirJCmtItnYtTGjKO5vbL8515PnvRkXLZGjVFQgpUpzPoNBGkd1o3BS68eNbv4fxrZHrcfnzIcJZVH6CFKTbcj6h1ZQ1zAcGsyGObTN0dqCNmilUYmMnZ2ZYW05VmzMevNsnDFUgwFm/0EW1ypyH8gMrbJM0QSBC9XRF7qa4iTAbbfdBsBLX/rSw0JKjwU6nQ4vfOELefazn/2kKnuWl5f52Mc+xu7du7HWsm3bNm644Qa6TUL8FFP8lEFE2Lt3L6PR6Ji1uby83P7tveezn/3sEbPMpnh6QEQ4cODAutc6nQ7nnHMOBw4caK1lIsJwOGTHjh185Stf4Wtf+xo//OEPecYznsEb3vAGrrzyynU2tAZTwmaKKU4sjEYjPvnJT3Lbbbe1CqKYLRvw3nPrrbfye7/3ezz88MO8853vZGlpiV/4hV/gj/7oj7jkkkue0r4fd8LIWoN3kqqZRQZAGoWDd9EeIx6nVBtWK9GLE5UqOnWxmemJpNyipopRVOZoo5LiIa7bpvN7hyISGhAn4cbEyZ4XwSqN6AxQSZER1UpBBC06Kot6c/RmZjE2Wtl88Hhf45xnOBzgC4uznlotsjEf4NyQc045hedeeTWnbjkbpWB1dZkDD9+L8rspzGoMNm5tahMkg1JUtWtn5EFS/k3y4IhSkTxRgm98OcnTpXRIPEZIpFPKKNKQGU3XGnKrEYFh5RgS7XauDqz0Hf2hMHSRILET6p3lNdjShTIoCmPoWJssdklhJNGCNKgCpRMqF/COaG9LJc6brjbEwGRWkExM2pVMlEkn/ZOCh5UBkqOxVRJxiMqICaGMOsR61DynfdOMbU2TNqtmmeScHFuZJreT1qnqGIJ9+iaDqFghLpJgUcFm0jZihbL4Ba4QfFCEEM9j8/1udByDKmVuqYlzb5OsynnPytoAJcIpGxcp8hxHwBgdSUcEVYIijuGGfKycw+qYu+MD1BI4sBrYvxQ7KBKZOK0gGFgLKZRdohWxUWUpFUlIpVSqQBavZaUTWeTjsdFEssimg9eQQaoh3dQEWcfE+W/CE41Ca41VsGFGMWPhR/s8EibWmVAKTRKHk6qlZptKRYKICfKysTo29jjSuQohni8f4v4PS8e9ux9hw4Z58qKD0YZebpidiWGkRZYx0ymYm+mh0udVJ+uQVRmFL8nStehFYtU5L7jU0dV8ekP3dIKIcNttt3HgwAG63S5nnHHGMSk5r5TirLPO4mUvexlbtmx5UpU9VVXxyU9+kt27dwNRJr1jxw4uvPDCJxzwPcUUTyd89atfPaaE0dLSEv/2b/8GwCWXXDKtUPhThizLuOCCC7jtttt473vfy80338zi4iJ33HEH73nPe/j85z/flqy/8cYbefOb38x5552XYj3Gn8NP1WfytCLaFFMcGTHTNzA3N8c73vEOfvZnf5YHH3wQ5xy7d+/mk5/8JGtra+zatYsHH3yQj33sY+zatQvnHLfccgu/+7u/u64tOPw6P+ktaVmeR5WMCzHlNlU/CxIQDJLUDtFeZuKEOTJABOLfIiGFUEPSDwGJOLIGbWx7Ax18VDApBKVjoLbSOpJV7eRRoY2JIcWNGgnQyiAI3kukckTI8y5Fp4e1OVmeIwh1LQTnqBvrXKlAG7KsoOydzUXPPJNTz9vGwqbNiHjWlh9h7567qfoPEUKN0goVYrUzayyZNYxqR0jltRREW11rVYKgdAwFV9FyVPto5fMSEDxaJxIOwZAm9ibaegqj6WQpb8jDsPRUzlP5FLjsoRCLFk/AR7KEMYGyNoCyUmh0LNMeorLEA5UXRrXHOVgrPWUtOA/OxedDw751kyvT8H8wwcI0ypr4dxDAT0zsk61OkoJv0m7WtNPk1+iGR5tQC60jlRrCqiGLJp4bQuJIUzJ1SDtBYHUYOCUIjoBPYdNaR1veOJ9IEKXbIGaIpCeSgpohjt7oYIcAACAASURBVNuWzIgHQVKYtpfm2MVsq9XhCDmwxOL8HN08Y36mS5FlNAY/pWKmV/CxcppC44Jv1U2rg8CBZXBufLyVAm3jeRW/PgequQ8wKiplfEMUpfNQBxiOlZVkZiJQXY1VX+12DjmOkMjfNN6tiWqcolCcdkrA54EDqyqGaTtpFUXriMOGiFLj/zeZXY0tLQioMB6PRkXlmklB8ImTjmM8QK4Mp2+ap6oD1WhEXY6Y6eQUMxvTkQwYrdi0YRNZ3onnz3l4aAm72kcTB2KgCYSP/Z0xloWiy6LNjzDKpjiZccEFF3DVVVcxOzt7TLKE5ubmeOlLX/oTh1j/uNi1axcPPPDAYa/v2LGDyy677EntyxRTnEhosieOFUajETt27ABg586dx7z9KU5sOOd4+OGHOXjwIB/84AepqoqFhQU+85nPsGvXLjZv3szrX/96fvu3f5sXvvCFdDqddeufKOR9SD9+w4nTpymmeKqxtLTE3/zN31AUBZdccgnnn38+d999N//5n/9Jv98nhMAPf/hD3va2t/HlL38Z5xxnnHEGf/mXf8mVV175uO0f72vtuBNGJOIlWsQ8obEoBQgofPCIjQSOUjqpf+KsT4kkNUDKGwpxJmeIKhstCqstmc0nlEGOEGJ4tbGGzFq0sYkYiuyD1jpZUlRbjQlUa59TGALRDobSKBVJKWOyNCHV+DTzCyIM6xAnpUZYUfMsnrkBUZ59e3fRX3mQuv8wtSsxVmONxSgovU8KohTo6+PEs8hjX3xbbUshBGrvYzh3iM8ulR9TEiujoQJKBKskTn61ah+ZMTF82guVg0HpGZSeysUzlCvN1vl5tF5G8JGUYaywcQH6Q5jN477HXB2onKN0MTdn5ALDSnAu5u74kCxWE2RDGg24CRVIay07wg8TzaQ/hGhF0zZO7lMxvZZomVSUtORQQyZMqITCxPJaxkHZk2iIiNCQT00/Jp7b1xKxNqpgOAoUXUWdrGfpqxIvkiqBqVYNFxV2KXdKKyRZlJpIqkhqxvOo2q0l8kODD4G6rlhykaA6fdMis0WO0RofepEI0VBWNSEFaBulCRLJztwJoVQ4F8mseC1EEkYl259J5JkSWhILNSZpfJNenrCaQqJJ2+6aCYUPYwVRU+Wsm0G/agK2m6ytSBrFaoHRQrk4B/MbAg5h47zi4QOpQtrEuGrabwmu9sVIMKoAykQSqFElpWgyjE1kpInEktUgST3nguBcQOE5bfNitKFp3Yb0B18lQleTd1KejA/w0DL5viWMBFza1iDlfXW1YXOvw5zK6GQZxk4Dg59O+Jmf+Rmuv/76w27kfxwYY7j66qu54oorWFhYeMpuvMuyJDQX9wSGw+Fx/0VriikeDWVZ8vWvf73NfTnnnHO49NJLeTKri5177rncc889x6XtqqrQWlMUxVRp9FMCEeGRRx4BInn0wQ9+EGstZ555Jm9605t44xvfyOWXX0632z1hP3dDCJRleUy+A6eY4ifFiVRtbGFhAYA///M/bysYjkajdSrVpaUlPvrRjyIibNiwgb/+67/mDW94w7oIgkP36cnaj+NOGEXFhW4n/i5EgqH2Ci8OpTzGxRL2QTSSSbLtQJxaa3yTf5RUDQ2boQOIpEBtovIm+FixSxuN0RZjY0C2iMeHlIukYznxWHo8WuS01mij0aIQrRETbWINEeWDpByadIOcrEWGgNaCzTSdwmNYYrD8CBIGBD/Ce5fUEgYXou1HtML7kMgXh/KC1gajofYx3Nonhr72HieBkJQlPkSVkfcBrRqtVbTgKR0rbzVEUazIZhNZBCEIVS2MamFUwaCMZNDm2QJPxmrlYntqPPGWRJ4s94VMC9oISsVgoSCRcAvJaqNIqpykPgpJPdMMba1oy46rifF+CO8T1U0yJhmUJJIoKUVIZc6ZXIYJxVLTvhq3ryY30CzTvDdhUTq0MT3R/iQmCaQ6wNIgcEYnQ9MQolHplVmNTcHseabRRiWbIVTOt+Sl+GhN82liFq+XqGGJleHizooojI6WyiCelbU+a4MRc70Omxbm4rgBimQbDD6q50KI9kCpHeXIszaS8f6nA2BSWroJkTix6Ry2x0HidRm5SknHUNGvYZRUP5mOZJBN5NLkgWvUOx4Y1GPrYbz+oqrImKiqy6yi24GNGwNeRVvjwoKwtKLwTV7ThGKptQ9OkFro1P80HkJ61gKixwSTTWRRo2Jrrh8vikoLK4MhC7NzKBvPg/iQlGwKhWk3rFD4WpCDa/gQqIyi0gopLGq+R/CG2eU1unnBXJZjlUbbE/Omb4onjmc961nccMMNP7GqyFrL1q1becELXsC55557wgZLb9y48YSdtEzx9MZoNOKzn/1sq8YB+N73vse3v/1tLrvsMp797Gcf1+B5iDfpz3ve89i1axc/+tGPjrhMCIGDBw+yd+9etm7dSqfTeULXTFEU/PzP//yjtj/FyY1m0pjnOZ1OhzzPmZ2dZcOGDZxzzjlcfPHFXHTRRVx11VWt9WwSJ+Lnb1mWLC0tcfrppz/VXZnipxyTxMqRftx6Mn/waioW3njjjfzjP/4ju3btan/sOBRNv1/0ohfx8pe/HGMMIoJzjgcffJDt27ezefNmrrvuunVKvuNtCT3uhFFZ1vFXfZ2hLSAOVzvK2scQWgVGR5WMDx7nYnjsOHtERwuaUtgsj5VZrE3hsTF7RbAoEZyrcS7a3iIZlCp0Kd/6U+LkOeCcJ/gAKmC0QVuNbW7MFXiXypxrQwiecjRMFpQVar+KJjA7U2NmA0H8OJ/Fp0m+UqBjyLciqhCMMXjvKF2gcoEgjsyopNyI01dFzABySYrsE0PW2M+aoW1MVK4EmSAYUhiPSvKK2qf3RbWEQemEOpW9DxItMqO6ZliVVCFO+o0aT8IlLTesYFQFgg2pCltUYTT5POmwJUJOJTJPxtXR0oQ9TAQPNwQS0gpCWiJGTbwQUtiy92MCBxXzgdZV6mo6QdyWJtnSUntaJjYwiWbDzXFM/21KxbcWuYnVW3JKkoKkFNYGnl5XtxbHSJAISmmsjWSRNVH2UjlHbjTWGkQiQeJCrB1fu6a8fTKQ+ag2EhG8KHJr4i/+ieysa8fB5TXKUUmv2yGzhl6nQ24Nhni+D64MGK2UhIHnR8vCsGqC48eKqsyOz0VL4k18/iglKFGtsksR/+6X8TqzGrr5OAS7UWA10932uMnYEkbkb8ltPDYmM2gCnRzm5gTJAv0q9nG+p+l1SVXjfJs/FdI+aDXZ10i0mSZIPIzJoobIJAoIU8YXY0WSlhiWryDPFPhELEsqHaeSHU9pgg7RgthYCPsjlHhcxxLmu5hNG9DzC6isQPavUi4PGIxq5nVGpzAch1zkKZ4iXHzxxT8xWXT++efzohe9iHPOOee4hGY/UTzWDcjWrVtPyAnLFE9vhBD4whe+sI4sgqjIuP/++/nRj37Erl27eMELXnDc87663e4Rg99FhO985zvs2bOHO++8k8FgwDOe8YxHrXz1aBgOhzz00EO86lWvOlZdnuIEgbWWN7zhDbz0pS9l8+bNbN68mZmZGXq9HnNzcywsLFAUxaNOak/Uz94sy+j1ek91N6aYosWkQnoy7uPQ154MzM7OHnWxkEsvvRStNffddx87duzglltu4b/+67/YuXMnr371q7n22mvX3See9Ja0uqrJM01mM4y2CA4fKgbVEB88VierDh5CrNDllGtVQ1oZlDFkNiPLMvKii80yFB4JjhA8zlWREKlKgg/JyiQE7/G6RouOgbOJKPIpfwgfyDKDsTFHKMuzNnBYguB8INQeFxwojwtCJ9PUrov3Q0IICBVGO5RydPOM02Y77O1X+BDtd7OdnMJahpVLk29NIKqEchtDiHUKemnURM6FWC2NqDiqgoskjhZs4xMiKnuERBAlAiVmQkVFifPS5uggUDphVMKokqikSoROv/TcH/qUE4HXTcZPM8sXD7UDwVNoQ2ZUuw3vYxWvhlwKYVwtjTRJT1XIk4pmTERoNbaGtSQNY2JhkgQQD5LK0TugYxS9HEoP/To22AYhp75LOi4RKTy82UbT9iQLlF7TE2+N12Yc1t0clwnCamUQmO9lURGTMqiMaixkgTwvKPKMYVkRfCDPs5TbExVoVgzOB7R2hBCSpW9MPmkVS7FLCG14dUtUBqE/qHClw1pLlWectnGR2W6PvUvL1MuebOTZMxQe7ss4Q0hJmynU6cConiB1JvY50acxjBtFypBnNanUrIpkkVHJzsaYBGzUXBNcX3vulYHcqKjEygxKCQtdzWwvQ6xnVAW0FXILM4Vm84KmP3DxmCGtGq4Jd2+OR7NNTOyT6KTsSvvtQgzz1goKC9ZGCxokYkzHLCqlYC7PUJj2MwlJ2WdK0CmTLeYnKexige2ejhQFFF10VqB1FkmtuS6u12VYVSyXJQRhXo7vr+BTPHloCi0c7Zd284vTaaedxvnnn8/ZZ5/NmWeeeULdbN9zzz1s3779sNeNMczOzj4FPZripx0hhMcsZS8i3HHHHezcuZNt27bx8pe//LiN1R/96Ef88Ic/POJ73//+97n33nvb/+/fv5/BYMDMzMwT2sZ3v/tdTj31VK666qqfpKtTnGAIIXDPPffwjW98g/PPP59t27ZxzjnnsHnz5ta6AusngScqSTSJ5rvhZOjrFE9fNISQiDAYDNizZw9btmxhZmamvVcTkVa982SMVxHhu9/97hEzIY+Ef/iHf+Bb3/oWu3fv5v7772cwGLTk1/bt29m1axfbtm1r+3/Sh17HMt46VgJTgjdgjI7KmqDIjCI3OpInmUVUPHm199S1Q4JDG4PkgjaWPAg6sRPOB4KrUaqOk1nvYnCwTsXlU7W0kDKUgvN47/DexUm30dgsIy/yOHm3FglCCDU+CGVVM6o8dR3wAnleMtPp0O106RWzWBtLYGoDe/feycG1NcrKIUoTvCfPDMELK3WFBCHTmtrHCXduDd3cUier27Cqk8oqPirvI2kgvq3kZLVKE9mQHo0iJg6SkGb5grSVnibLhHmJ1p/MQlkJLpWtD154aFjiZTzZTvPfJqO8zepZyGiPbZBIHFijovUwNMG+0iqJIolF4yJsS6m3XI2MA5An1TytZUzWL5tiqGiCsI2Grqat7taKiJr108MlFmRS7UJaLjbOuqpqkhbSan1Ac3spTjBJLm249FFltDhv6Veelv5KKqlRWYGOJN9st0NmLSGVuRcUeB+vl6bihRKCjye5yV8yJlI32iisRGulMqqtmKfQKCdUo8CDB1bpZQMGgyFVVSFWeKgvrTKnIb4C0MkjeROq9QRfJCKTRVQmw6YVLsCojsRmJ4vEj05KPtUQUYd8dk2eG20iUWOMwmSKoITcCAuzORWKwdoMWd1h0+KIDQV4hI0Lmgcfdklx1RBXsm48NGze5DjTSGuX1ErFfdTSquOMHquVnEBGJGiVQK87Q0CnAPaJQaJSJloQgg4xoF9rpJujtBkHqCeVH1ZTbV6gfHg/ZaYYiqcnT72KZIpjg1tvvZWzzjqLjRs3HtXyW7du5frrr2dubo48P/HCz0MIfPe732Xv3r2HvXf22Wdz3nnnPfmdmmKKo0Rd1/zv//4v/X6f1772tczNzQFRibS2tgZAnuc/EUE7GAyiqv0QNCWSJ7Fv3z4+9alP8ZrXvOYJkUaNompKGD29EEJg+/btfPOb38Ra2xItl156Ke9+97vXFRQ42ciXxjp3svV7iqcnVlZWuPnmm5mZmeEP//APOf/88yPPUNf0er0nhWyBaNf80Ic+xPLy8lEtv3fv3iPefwHcf//9/O3f/i3vete7jklxlaPB8SeMvEOSv0NpHe1fOHSa0LWTcq2iFc3YWB3NRFtZGWqkrimTNkQpTZZniAScryG4SDaZODvTWjA6Mh0heMQ3yoAIpaKiQ1tLllk63W5UFmmTKkrFrCDnHFVZUpYVo9JRu0Cn6CWfVsDoDjOdnPluznwh5KMO377vEUZFVCspiSollcrA9/KMjjXUifEw2jCoHSMXYjWrIDGrSGLYdkiJ0bnVaC1tELI0y6SJrhBzbYDxfkrMimpyo8aETMzSIWWxoIRC5xSm4IH9qzFQWcZl6yetQyJQOejmNhIYIZIIBhVziSRm90TOqlFBpcyiCTXRpGKnIQ/G/0nnKP2/UbG0BE5auREXVl4wdQyabjJsjtSWyIS1auLz4FDSqGlXGnVSyz5xOCbaj4HskFtYGjgWZg3znQzf2gWF0kVLYWY1C7M9rLWEELBotNZUdVQVRVukJmiFch6HIgSdzkVAa0OR20iuESij7Cupt6LExpUK1sCPhszPama1sAws1VGN1RCARk2ckwzWRmOF1uRxU4p111Ak/2IO2ayFWsDaSMpEe5i0pN6keAs1JgwjcakwVpFbDUYh4ul2FCNV0a88RWao3Rz7l2YobGDjvMOoirmuo07XzKTboOlXPBaxSh00QdsqKdkEpYRCKyqvqL3Q3NZb0xCw8TrIVDymSheROFVjFVskTSW2qUNUQgqAjsybSucxxDB6kfhZ6GcLlkZdVL9PhcLVk1fEFCczHnroIT72sY9x3XXXcfbZZz/ul3hRFGzatOlJ6t0TQwiB73znO9x1111HfL+qqiMGYU8xxfGGUorZ2Vn27dt3VMvfc889fP/73+fqq6/mO9/5DnfeeWf7C+/8/DxXX301z3nOc46pde2+++5j9+7dh72+c+fOljTqdDrx+2U6qf6pRjNxreu6DTmvquqp7tYTQqPmWF5eZt++fZx//vnTcT3FU4pJEuiUU07hJS95CW95y1u49dZb+bVf+zVuuOEGlpaWeNaznrVO0dfgWFvWRISlpSVuv/32Y5I1FELgn/7pn3jJS17CDTfc8BO3dzQ47mmaojQqPbyvca7Ch5qgxr/o1x7qOlYkipNAHQObc0u3U9Dp5uSZJoSK4WCZtZUlRv01xDmsjpXVMmvI8wybxXyj4H18SFNmPFbOMMTQYGsN1mZoY0HihH2Y0sqruo7B2SnbJLNCZgLBDalGfYb9NcrhEO89qj7AgtmL80PmOllU1HhPEKGsPbUPdDJLN7MxUyVZ3lZHJSvDkkFZMaoc/bKmrGq8dygJKITMqjbIGgkxELmpQCaJKAqxTaOiCcin6mEKhVY6ZatE+YQWjRKDlnjajYJTFjdyxqbTmetqegUpFykqi4DW1gXxPO1frelXntpHKqBRSDUBx0GknSA3qpiW8GH8/yZXqFWBTJALpPcb4moSKboHSLaiIDQ/5DUET7O9ZvLPRLutVUqtf8OaZMWb2FZDBjG5fPPeIR3zPqpUjFIcXKlBhExpcmPItMWgcQ6qWghoaudjEHZuYxA2grWWTpGT57b1cDXnMSrGYti59z6eY61RmGSRih9qPgijfkA5RzcTcJZQWSRStO0xbh7NvntNawGcPD56YsfHnFsi6ETIDBQGVCAqcFjf+DiLLBFU6ZoqMkWWaYpcYzOF4Nkwo5mZ1VRSgw70w2pUHuk5Hjgwy649c6wN55mdyelkUcXUsYpuZiisTnZHRfDJHpS2r9N2rYmPIlMUmaHIoFcojIE6MaPWQDdT5DaqH4tUwVHrSHhHAsnERxt4rUFnKFNgbBdtuxjTQSsT1WXeE7zDB0cpNXu6JXfZATvVkLuZVr95OuGRRx7h+9///uPeYMzNzZ2QigERYXl5mU984hN88YtfpK7rIy730EMPsX379uMesjjFFIdCa831119/1DkQEMfrN77xDb7whS/wwx/+kKqqqKqKffv28fnPf57bb7/9mBKgu3btOkxh1GDnzp388z//M1/60peO+pfmKZ7+2LRpE3/2Z3/GBz/4QS6//HKAdt5yoqKx9QB47/n3f/93/u7v/u6kI7ymeHqiuXayLOOmm27i6quvZseOHbztbW/jpptu4j3veQ9LS0vr1pkc05OvHQt47x/1nuqJIssyzj//fLIsi/E4iXg+njjuCqNGfaGUwnvw3hGaHBCJ5IZWgdqD1BWZAqsErRSFNYg1JM1KDLoNkkpgx8yTIs/IsmT/QPC+ThlBra6htfhorXBKUE7aTKOqqlE4nK9xdRlJpWQnya3FaijyjNp5vPMIniAVtQNfrkABuw9oDg5L8tySCZQ+Bn1bY5KiSlFYzcqoJFeKKgSGlaP0gdoFggSs0WTGoFRoVRJIVCe0wdEoaqKNRid5ltKRUICx9SV+ydD6jlT7fjonRDvPYm+Rmc6pZMZyysIsEKs7hXJs74KJPB+JKhRjBCceo2KGUSQJVGtZ8oxJh6iEmWgnvdaQMc1rDZPRVM5qFC6Hqo5Iz03WUR0iYeEdrVKkIYvMhHuosbg1t4Rt9ax0mJpqbod+LKhEmE32nbTORLcjkUVUoayVgZnS0cktGXGcOx8tXP2Bw6g+eZFh53r0RzW1i5bFIstRKELKP2qqAjofx0jw8ehGdVhIWUKRDDRpOwhUZcAIrDhhX10ykxl8JgyVTpasZufiftucNg9JJhRGzTmcvI+O+6jwLv5PkUrRp+PSZAnNdBSjStrz2YRSZykvyGiFtWAzjfOOTbOGTk8zCnW0DwJaBzLrsVmBExgGx9L+Aa4q47pe0bEaZTS1D+gA80YhGvo+Bt0bA5mJeUc6MVfxh+RAZlMltODbHCetxkqjJsdJawM6A9K1lS6GYNIxUAptMrTN40ObdP4CiEdEUbma1cFB+oP9ODdCGXAzPVg8gymeHiiKgle+8pVs27btMSs0KaW45pprOOecc57E3j0+6rpm586dfPGLX2RlZeUxlw0hcPvtt3PBBRdw5plnntCTmikOx1NVlvdYQCnFpk2buPbaa/n85z9/VOv87//+Lzt27DgiKeS95z/+4z84++yz2bJlyzHp4yWXXMI3vvGNw7bX6/W49NJLufLKK1lcXDzuldymOPGhlOLiiy/mT//0T3n1q1/dWmROVDSfHZN99N7zxS9+kZtvvpmyLPn1X/91LrnkkictG2aKKR4NjdKoKAquuOIKvvCFL1BVFbt37+bGG29k8+bNh63TkC8HDhwgz/Ojjhl4PMzOznLqqady3333/dhtZFnGRRddxI033shNN93UVtK9//77+dSnPsWb3/zmY9LXI+G4E0beeWqjkeBx3sXy9D7ObHUzc9WAitkuPtSYoFCJ5GkqpCkVVTWBmJWjzGSwrmoZNhEVS9QbjTaWLLcY2ygCosLC+xArWQlICNQ+UNclwdcYoxMpELdpjIlKiCKpoZxDM2S202em6FA6w/JwjZGPXp/SOZTSdDJLxxoyrQBPv6yoXECjWB05+qVPla5AG01uFVpHZlM39rvGbpa8Qc1rMSQ8EUUqHsAgPqlRoKmS1tjvcm1xPuCJ9jcRYUN3E7Pd0/FOIUGY622mdqNomwmBkaNlQ1pbGlFlNKqgyCRZ+KLiJ5IaKV8HSSqnsVKlIWaaCmuqsSQmTPB7wJiQadZtlSuN4kcaC1Ikhqxar2iaJJha1dIEGTL5emPZa6p7rSOn0t8y0dfGWjVptxIaUkSoA/SHDq01NVEZVNVRflNW8MhgRG+mZljVIFHJFkPPwRqN9wHnhaqOWV3ttlQ6cqIT4RbLx2kVSdHapQBmpVgtA8FBhsIrRV80+8twSBaTwmjBZBDq8XmIRJ9q912lPxoLqQvR8piy2iORlh5aw+ICzMzB3odA+7HKx+iYW6Q1ZJkmzzRePKfNZ+RdzdBXuOa6JJa6V6xi9AJWe0b1PobVEh2lE7GrsVk8FsZojJol0zlIRTVcwaWbdaMhMwajBG10DLUnVo/zSUmo0/E1WrAqHsPKpfwz8RgzG0euBqUMSukYpi0NYWQwxqK1bQla7x2jesjq2n7WBgfx9YgQfAratpxy6lZsvsgUJz/OPfdcXv7yl3PGGWc85g2yUooXvOAFXH755SfMjbSIsH//fr7+9a/zve9976h/Tev3+3z84x/nda97HWedddYJsz9TPDZEhP/7v//j1ltvRURYXFzkFa94xQkVtv540Fq3FdCORhl0pF+NJ1FVFdu3bz9iCfvZ2dmWSMrzHO89VVVx7733cv/99x+xvUMrHPZ6PV784hezdetWNm7cOL1WpgDi5O+6667jL/7iL7j88svb7J+TAc31NBqN+MhHPsJb3/pWdu/ejdaa973vffzVX/1VGzA8He9TPJVoSKM3vOENfOMb3yDLMv7gD/6AF7/4xRhjkqNIt2O6qio++tGP8qlPfYpXvvKV/Oqv/ipZlh02jo9Enj4WZmdnee5zn8vtt9/+hPs/OzvLFVdcwS/90i/xile8gnPPPbf9nllZWeGtb30rn/jEJ05uwkhCTfCCC4J3NaH55V+TLB6KLJUXt8aiTbJ9yERej5CqRoU02Yv6F2MUzoEPrpUDxMmoRZsMm2XRLqIMWudpgm2S6kEnQgpEPME5vKsRr3HaJ3tO7FcnszHjKHiyrE8vLymsoQyelbJiUMWQ7H5ZISLMFAUzmaVbZDGoGmFYeeoQWB6UrJY1oLBaYa0BFQOSfYj7HIkflVQOMkHaRHWESexLM8CjJcxgM4vznqamedQ2jWf0Iame5jqnImGOwcClAa9Q5Mzmi+jZA5ReqPqR9BlX00rnU2BYNSoMQYLC+Sj5kUR0ycQ6bZB1umCFJqR7PEbWKX8mCZtDmZ2m3eZviaqi1Tq+odS44hpHuH4VhwdYTxJEDbHRBH23xEW78DrOqt1Es6ySSFyhYwB26FeIKIIonA/0OgYXFAdXPadowdqYayQIxmjqyq/rh2pVUIpMa6qQVEXEPkaVVWSzpMnUCYp+HcgRCpuR5xqTwf4+rJVhXbaQiJAXSV1EvHa0NEqbuPHJMQiRSBnVglGQ6fF51ql6XWcG9Cw4EYocyjJZ9XRU+hijyDNFp4gV0U6f7VB0NUujEbX349ysNM4dA3LuIbeGQTlivoDZ7mksryxTuxEawVqNokM/0wAAIABJREFUUhnabkR8QJOT2xJXDROxGu1lKB3Pr47B7A2padIY8KkyIaTzKCpaAQFrMrTRGJthbIHSJmWE+Uj6GY0x8XOidp7+2hKrqw/R7x9klKo3QlJZaUW3mMEWi1RuckRPcbLBGMMVV1zBi170Iubn5x9z2YsuuoiLL76Yn/mZnzlsQvlUoPHU33vvvXz9619n//79T7iN5eVlvvCFL/Bbv/VbJ9Vk56cVDVn06U9/muFwCMRKX3Vd87rXve6EGJdHi9NPP50rr7yS22677ZhYBv7v//6PvXv38vDDD6973Vrbqj4uvPBC9u3bx4EDB1hbW3vc7TaKouc///ls2rRpOnGeosXmzZt505vexO/93u9x+umnrxsbJ+o4OXS8P/jgg7z//e/n/e9/PwcPHgTiXO1DH/oQz3rWs/it3/otOp3OlDQ6SXEyK1GPhGc961l8+MMfRinFhg0bqKqKr371q1xyySVs2bKl3b8f/OAH3Hzzzdx3333cf//9XHXVVTzzmc9s23kilrWGrGqW63Q6R91frTWbNm3iuuuu4/Wvfz0/93M/x6ZNmw7L23vwwQfZuXMnF1100VG3/ePguN8dKKkQ5/HE/JWQbFPWaJQ1FFlGlmVYm2G0SZNxwTsXLWg+4FyNc1H5IgJokypMCT74VGU+TaWVjlW68PigETzaxlBekVh5bVRGgimXZK9yHhdi9TS8AmUiCUK0o2mTYfNAli2RmZrcWEQphrVnWFaULlC6ONmdzQtOneuSGU3lPEpHf2HpAvvXRvRHNaIUvSLmNEnUTEX7CkkdJI10AzQqhSdHgiiGFMcZtSKWZVYSB1ZIz0oUSmlyrSldoA4eEc9sZ4ZMb2Iw0qz1h4yGZVIGxUE9V2g2znQZFEPWRo5RE6ydPiNMsh65EFVGeSKNjIo2IFIxqEgiJGWMTgRHsgT5hoVhbFNq7WGJJFnHE6lxpbU0NNZZwRg3F6mxSVJngt0RDn9u7FKMD3drPfOsD+luyKaQyDsYEy+kY1JWSe1k4zBarQWCpPEJoyoQUDiBpbXAfC+jmxlGvkaiNxMFZDpmT6mkygkh5l6JCFoieVS7tOMqBqAHEcQrllY9WglZYShHwkwHVAaD5YDzAWVoiTxRoPPY98aS1ZJqzXGVcQUyrRSlj0TRTEcx09WYTKNMtJb1fY0j4Ot4oLyTliyyhhhwbRTdwmKMYq6j6M3CalkzqF2bg9UolzKjyAwIjpVhjQ+BhdkFvDoNa0ZYOwIdbWfazsdwau0RyZjpLhJCSaaj6k4kWmIRCCHaNHMEa+NGcx2vmYODisoJNUKhNPMzGyi6mzB5gckKsryDyQoUOmUTRZWYMiYSwkuPsLz0AKPBEq521K5JjorEnPcwFBgMV9l78H8YlMfXczzF8cPCwgIveMELuPLKKx+TLNFas23bNl71qlc9oZuF4wURoSxLduzYwZe//GVGo9Fj3vA0xNLi4uIRbxiPt29+imMDEWHnzp3ryKIGu3fvxjl3UhFG1lquu+46lFJ885vf/IlJo7IsDyOLIFZVayya3/72t4+qrdXVVc477zyuu+46zjjjjKMO1NZaMz8/jzHmxyJwpzg5cNlll/Gud72La6+99rAKmSfipPzQa6ssS772ta/xjne8g1tvvfWw74C1tTXe85738LznPY8rr7zymAbKT3H88WifpScz8df0+9RTTwXivmzfvp0/+ZM/4f/9v//Xqkidc3zkIx/h3nvvJYTA9773PT7wgQ/wzne+c9212qhWH4/obZYbjUZ86Utf4tOf/vTj9jXLMs477zxe97rXccMNN3DZZZcxMzNzWPsNGbV161b+5V/+5Qnl+v04OP53B0LK6ZGW8BFAGU2ed8iKjCLLMSoV71aK2rnxzF07hBjmWyeLSJbFalDGmGg3A3yzDSex4hQOkTLmAWlDluVorSmriuFwgAI6RZEqTjnqusbVdbS9hboNjg5BsFmgKAZp8mvxQL8sGVUu6T1S9om1LPZyNs92KVOp1dp7VsuafatDhpWjsAZrFKKiUkpCZBMaZUxjbYp5iZEWCUkhoZUeq0/QGK3JtImvN7SMAEElhZQQCHTyjA1z5yHMs7w8YDRcYXVtxNraICq+kJjzUkNhNb3CUGQeJ0JTMTaJhGgycMo6TuglndAmj0oSwWBUQx5JUt/Ec9ioxxVjhVBz/Fp1EOtzj0wiEFwYk0mNfazJ7WlWbcO0GZNHSqW+JXJqstS7UeM8JEiB4ROEyqStrc34YWKFZpgnEq3bgWDi8XFRTEeW2hlVIZ0zxbASdu+r2LhgyDONUpLOKRhlsEaPj4GBMvjWhhh8sv6pWIlPJx3UwTXPcCh0ihlWRhVKAksjYff+mlEdA6o9USUUBLJsPO4asm+yol5L2OmYO9QtNJsKzVwvY6FjWKk8pRL6Vc1KXVHXEsOvJYZ7t+tqMEaRWejkGmuEua6i6AVKr1gpy0h8Mc61Mibmcykdg9VrH3O+gtpEWQpCJE87VpHZjGBmY8B+ug4KM4tzSxAchY0qRiFnVhm8r1AhoFUTFAdWdCJhbSSY84JOd4HQOQUxHYzNyYouWdEjywtAE5ynqkuGwz4HDjzI8tKDuNEyEnxy2SpCyvjy6e8QoHKCCx5h7bDw9ClOfOR5zoUXXsg111zD6aef/rjLb9myhVe84hUnBFk0HA658847ue222x61XOsknHPce++93HrrrfzKr/zKSUUoTLEe9957L5/61KcOI4tOZjSWnrquj5rMeTJwxhlncNNNNx11RpExhoWFBa677jrOOecc6rrmYx/7GHv27DnOPZ3iyUSWZVx99dW8+93v5jnPec5h75+Ik/FJ8kBEeOCBB3jf+97Hhz/84SNWAmywvLzMjh07uOKKK56Mbk5xjDGpijnRw9ePFs0+iAj9fp+///u/56677mrHsYiwd+9ePvnJT7ZWZ+ccn/jEJ/j93/99LrjgAiBmdt19993ce++9nHHGGWzevJler0e3211nXRuNRiwvL3P33Xfz3//933zgAx84zPI8iSzL2LZtGzfddBO/9Eu/xAUXXHDYPdeRSKNOp8PWrVuPzUF6DDwpodfOB1wQQkgT1GSxAZ1CfYWgxmydcy6pKyw6i5kjrq6T4kO1ahAf4j+SiJ2YQO6oqjpas1RS5ehxOHBZVYxGFT5AUWR0O5bCAISUsaRIEUsoArOzjvkZBTowrDyrbkTtBBdCmpoqvPfk1lDkmsIaMqOoXFKSDEsO9EeMah+DrW3MbZEQ1RdBGuuRSuQRoFUiK6KFp1FQRfWFxmqNQmONxqYqXCJCrqOFpl866uCxRnH6prNY3HgBzuesLC8jlNReMRzVDEcVVkm0CFnFwqJimQH9USDPY15UlcghmFDtEImQYS10bLTyxGJ0qlXuNA+hsXilZdL6SUwytpipCftakg9pUgWvQFLRTCiLmtXU+P/hkNczDbmGKpBCmtev26qM1Pj/LSE1sZ/NesIRtp8eXmIAtwvgkkXOJqKq9uP9CgSsUVQORqWw0q/RqbR8NwerFcHEMPTYftxa7QImSXCci4oio5OqToTlQWA08GQ6KvW0VRSdjOEwMKgCVRBmsnHOk1GCyaF0qcKbxOPVxmIRiY4iV5yymDE3Z9GZYVaDEUVZOoZDx75+tGNOkk4N6WlMEyIdq451co3NoFsosp5HKcXSIK0/cVCVimNKq3iNxPMv5Pkco7IbKwkqizEp80l18cEAoSX2lLIUWYfg+qnSWQH5OTidowggDisVue+j6zU0jmHIybuL+LyHt/NUydKZktTQxpDlOTbvIKLol6vs3nMvK/vvwVerQGjPDZJUXxKJw5jdlsLR28+X8dib4uTA1q1befGLX8yWLVuO2oL1wAMP8KUvfYlf/MVfPOzX5CcDjaLojjvu4Pbbb2fv3r2Pq8YQEVZWVti+fTu33347i4uPnbU1rZZ24mPPnj1PK7KogTHmUSuSPVWYmZk5quV6vR5nnnkmV1xxBeeeey55nrcTgte//vXccsstjEaj49nVKZ4kLC4u8pu/+Zu85S1vWfdDw4mo2jiS5Wb//v186Utf4r3vfS+33XYbrvk1+VFw7bXX8opXvGKqLjrJMEkUNQ+t9Qk3Rn9cNPv31a9+lVtuuaUt9lFVFd57PvvZz/KDH/xg3Tp79+7lnnvu4YILLkBEuO+++/jN3/xN7rzzTubn5znttNM47bTTuOqqq7j00kvZuHEje/bs4a677mLHjh18/etf5+DBg4+qxjbGsG3bNn7nd36H1772tZx11lmH3V8+Xjbmk3EPdtwJI2MMgscTJ32ukYD4EJVAImgVKwlJYheMgizPUSrmFgkabXOsChhiXfWqqvGpIpiEWPVMfKB2DldXhCCYLEPrlHESEplUe8rSR5LKewwZZDFmuqrT66KY6wlnnKbo9QIjFxj1A7VXhKDxiYzpFLGams4MVmu6RYbWikHl6deeh5bXWB7UCAGr46Q5iMN5aRU1TV5OJBPGLEWTYwQKa2P4tVIKqw251ShlsUph1DhIZuRCJMq04dQNZzI3dxY2X8AFxXCwymBYMyg9o9JRVzW5VfS6Gb3C0Mli2HemHaRcncwkO1iIpIsiqZ+S+sYlEicziqBIaqRxda+2utsRVDlaj9U6yVnVWsAmS9mXyUZEs9ykyqdBIodqP0HoSCQaBmmCHiaWnUSzfKtYYmzHUkxkKk2wW0LM+hnn+sS+b5wxVHWgUKRKgGPllG/+DvE9Y2Mbo1JBLZTGU5aBLIs2LJPUZLFqWjyeRdZkVoFzgdzqlkQbVIHVKpaYHy0PMASy2RyfTI9BxZwk31S1M1ADlaMtiadDrGKmk6Ko19Ns2pCxMF+QK4UZOULpuX/ZszRyDCtpK/o1trX2mWRD0wprFEWusZlittB05wQvnuVSUwXXEktaxX2Nh1uR6Tjuax/IrcX5BcoqZXxRMJNbPBlV3QPl2vEZs6ziWc1SRcXSd+IgZgRKoUQxUDlGZRTZLFp5anL+P3tvHvxXVd//P84599739tmyB7IohB0RCDFIxK9jWNR2tFJUdMYRGZd2Wv9wxs50lFptp06ZtmPHOsUuUzvacayiUH6AlBBBFCFQkLBDMCEJIWT/bO/tLuec3x/nnPt+f7JAgOx+XkzIJ+/3532Xc8+97/t63ueSoMlF4o353XkgjAOcdaEdKJ1m7Nz9Ctu3PE3a3OWvWQ6sxbrzxRg3H7X2YGU/eCq8D5k/l6br+KglS5Zw1VVX7Zca/Fr11FNPsWTJEt7+9rcfsRsvYwztdpt169YdNKMofG7dunXcc889pUSn2+2yZ8+eks7dX6OjozzxxBMsXbr0kG7/dB25Ouuss44KmHkoavv27Tz77LOv6zNFUTg5/1FqgubOncsZZ5zBBRdcUCbw7L0tM2bM4Jprrjkamzddh7CiKOId73gHf/Znf8bll1+OUoqdO3cyOTmJEIJ58+a9oe+UQ137azgDUHTzzTfzgx/8gEcffZR2u31Qy3vggQdYu3Ytc+fOnWamHmfVb+Z8orCLoLdfo6Oj/PM//3Ppu3Xfffdx7bXXsn79em688UayLJvyuaIo2LFjByE97aabbuI3v/kNWmuazWbJUFq9ejWDg4PUajXGxsYoCqdeOhCYI4RgwYIFfPzjH+fzn/88S5Ys2S+D6GDqSIBGh/0sTuKIOJJE2tARBRSuPzXG0OmmSOkTzoxFCscGUgKiokBFcfm0HiRK4RrI3JDlKaaTYaxwUfAenbDeNVdIQaysAzy0xRqDzg3aOzlHHtjIC+0bc+uc0oVh5ohgZJbBWsG2nZYsj0niIaqVOpVKhTSdpK4mHHsiVigJ1dgBObm2bB5t0uxmNLspFm/qrSTaOmPrUNYGdxPrm90ywN4lNvkbGiEck0JJxy5SUiGRJeNEa+OlWJLh4Xk0BhZjRINuock6bbppSqvZpNlq0my1yPIu9SrUqnUajTrVJCKSEmxBnSqF2cVoJwMBUSyoYLGZa34LDwJJnIeRwCVmYUVpqFzSbuj54gQgBv/vEkwSfXIvv/dBQobpMTAMU+PgSxDK/1NFPYAprEf3vR+kVgHnsbbHTgoYZj+YFN5X4We/IOHBJ+Ob/rC8mXXJuQsHeWrLJGmqqVQpTcP9IXWMOL8OJdw2t7tQaEESW3TFkmtIYkiU8QlwfSvBkBWOqZXmjn2Ta42UAm0gL6AeQ9U6Q/gKGlm3RC1BYSyVWFAYx3ZRicdP/HGwxgE9iRQMNCQDdcFgXTBQF8QmJ84KOgZe3KPZM6EdEynIzfrGLswB6WVoSrr9iWNLHEF9wKJlRpZKunlBEgkPLrl9kBZnhO99nDq5QWCJVZ1mK3JpgEJghaIeVWjrYQyJ84oSvbHGGhLlEgJBUegETFburPXMoUIIciGoxhYrcrQU3nzeIZXGOqPwHBCyxXi7xejuzXSb2yjy3IG/YaXCnYvhWBQeMHL+arYETwOrTXIkNMHTdShq3rx5XHXVVQwMDLyhz1trWb16NYsXL2bGjBmHeOv2v761a9dy77330mq1DupGwlrLrl27ePjhh1m7du2Up2HNZpO7776ba665Zp+b/6Io+PWvf83ixYunjX2Pw1JKceGFFx6XTIA0TbnrrrtI0/SgP9Ptdvn5z3/Oe9/73ldNhmu324yNjTFz5kwqlcohmdfz58/n/PPP58wzz3zN68D0eXR8V5IknHTSSVx11VX88R//MUmS8JOf/IT777+fF154gZdffhmtNR/72Mf46le/yuDg4FFjG+2PUTQ+Ps6dd97Jv/3bv/Hwww+/bnbi1q1b+c53vsO5557L4sWLgek5fTzWiXDM9pZVrlq1il/+8pflay+88AK33XYb//Vf/8XTTz+9z+eNMYyOjqK1ZnR0lNtuu22/rNaiKBgdHS2BqAOBOEmSMHv2bFauXMmf/MmfsHTp0ikPbN7omB/uY3XY+xUpLAEHMbFESEFhnAFtoTUm94bPNjAyhJPa5BqpCoQ3rY2VcibR1pln54ENZFzaUWn8i095ko7NoyIJhAh7Az6ZTHkaimOsGKSAuTMitOqSFoaNL0GrCYWWVCswNABpkaM6mhhDfSBmqKHQyhk5J9L5wox2O4y2Um9265OhJI7nYS3Wuzc7tox7zyW2BcDEM4sCsCAlSjmgqGTDeKApKywIjdaGSjKDWmMxIhphrFWQdsfIspxOltFqtem2WxidIdAM1hTx4CD1aoVGo0EU+yhwaxHCUh+so7dtYrSdY7DUEgHG0vYNvVefkRmoCmgoQW4EbX88jOkxJ0q2ED3Axquo3Pygz67KM5dM38/l9O/DTYRff7+/EMKZTRsLmT+PRU8pNRXwKWPUKVcQfqf0UhJMAZiCaqpcDn1Nv4RT5lQZrMcMVCNGW8YbKzvgQIfpHbBPP0lVJLHWUGjvf1RAo+aT5IxL07LS/ayDj4+UaOPkbDorKDTU6hKlBFhDxRpmJBGJgDgBNTdnRxfScT9fEChhMX7brHWg2GDipGKDDcnMIZgzFFOtKFrdjrtIxJLxSUu30AwOCqLEAUbGWsei0WB0SFjzgFEJFoGQloG6RMY5eS5oZYZIQi2SCOGYUkq5fVTesyvz6YqJiuh0GuSZRkhnWI0Q5GImxiQl80z488axsAzYmEgp2pnEWok1eck+Q/RYYEZAJ1coqbFKYpVnYQnHZerkKWlrF3KsQ6udYrV7+hA8iVy6mmM6Fp5d5KRpgWFne9LL3pTbR944XcduDQ0NHbTM5EDVbDZZv349F1100WH5YjfGsHv3bl555RXGxsa4//77D8qQOkjW7rvvPtauXXvAxmDDhg28+OKLnHbaafts/549e7jpppv46Ec/Og0aHaP1lre8hTiO95kTAwMDb3puH40KiW8HirY/0GfuuecennnmGf7f//t/r/p7a9as4Ve/+hXz5s3jyiuv5JRTTnnD87per7Ny5UrOPffcQwY+TdexW0IIrrrqKt797nfTarX4+te/zjPPPMO6detI03RKE/noo49OkXcdTYlaMOf9xS9+wXe+8x3uueeeg2YU7W9Zq1at4hvf+AY33HADM2fOPCbld9O1b1lrS5bNiXa92rFjB//0T/9Eq9UqX9u6dStf//rX2bNnT+ld1F9aa375y19y9dVXs3nzZl588cU3tO44jlm+fDnXXnsty5Yt44wzzpjy0OJYH+fDDhgVhXtS71KlfTKYBSstprDoXJfNurXWJxqBtAZjg5eRRFiLkQJtChfLLgXCWm9sbD2S1/O5MdqiTQ65PwDWNbhJLBGRB6X8uoK30q6xglwr0lxSFIZCO1ZAx+QUepI4ihAChhPDmIGTZg+hI2gVBakxjHdSJtop1jNjIqlAWN9UO01XrBTaWgdaSeFZQjh2gnGJSiEyXSmJUsolZiHQhXFsEuGaaylgsqVptWtI1UCNtbG00UVOmmWkWUq3k5KmXSKZM9SoUK/GVJMKlUpEFEXUqjFRUiWKK0ipAEuRN1hYZHRe2UInN1jhJFSqoPR3Ct93mYGBGIYSRVoUJQMJD+KVrCGmysXCa8Fcut/81/Z9IDB9QkmmNtr9oI6UUIndzz6hfp/P2MAakr2F9L8fQKB+g+xw+QhyvF7cvQNFZtQVjWqEEpJ6NWL7RIot8Alfbh8CaBQqeNkI4UEXC82uA58cI8qlz6FtyQoSBgqccXwrszRbTopXrVpEJKhHgkYOdeVSv/Y0cyozNCedJJjsgPUu4FJA5rcrktBQMFKXJAnUq84rKbcFQmgypcksGKuRdcHsyDFnAkBjhSQvDFpDnjuTdGudn5O1UFUCpSzVBOKKpjCWNHesouFqTCWO6RYFWeFYhsYPWFZYUu8aLmyDTlti0AhrkdKCVHSLyEnGhPUcvTAp3OTr6oi8aCCxnqnYm3ghuc6KwPwRGCudRNbmICNyY2i2xrDZKFJkFNaCtmR5OK4WowXap9iVvl19rK1yEvq/g+xR0Mdsm65jvvI8xxhzQN+i0ABkWUYcxwdkazz99NMsXbr0kN8YGGP4v//7P+67776DfhIcmoNnn32Whx56qKRcH6i01tx6661cffXVvPWtb91nH3bs2MH//u//8vGPf3xagnAMVb8f1d5gkZSS5cuXv2Hm3NGsPM9Zs2bNfm/wAwja3+xYa3nyySd5/PHHybKMDRs2cP755+932UVRsG7dOqy17NmzhzVr1rBo0aKDNrEOJaXkoosuYvny5dNA6u9QBbDk5z//ORMTEweUpUgpmTNnzhG/Xu5vWzqdDuvWreOHP/wh3//+9w/K6+61Ks9zfvCDHzB37ly+/OUvH5fA9O9iBRlaFEVTrlnH6/UrMH201vzoRz/iN7/5zZT3i6Jg165dr7qMO+64o5Sg7S9Nc38Vzp84jjnnnHO47rrruPrqq5k3b94USfTxMq6H/SrV7uT+aT4gJFJG9Lon7z1kHWpgsT5RXvjmPQhHDLk2UFhcthhY4XxFlIRYSCzO6yRNi9I8OjSfocG3BrS2KGnRvsG0xrhl4Q6utiGmPDR+Fq0tppuT4cxIZE0wnEhazZzGjAqZ1oy2U7ppBgjiyKEdUvg0NC+3w+9bJVKOOSWdCbbAUmiDihTGgFAeNBMC6aVz2gqscdI0awvSXLJjh2H3npxuWiBVF6RyLCZj0Nr4pxaaWi1moFFlqFGlXktIkth7vbidjOOE2sCwe/pYaJoTY8RqhHkDE7wyMU6qPdCgcClYHsypxlCNoKNdcx+AIpjK6On3/wmgTQCLhOiLr/cADYFV498PrDHoATngJWF2KgtJRdCIQGWQ5+CT7XveR8ItI/jtKAGDiWAydfMqkpBE0E49yINLOdOmtPopSwjn+VOJBWluyApNLZYlI6nQDjTKcuf3RAC/PMupnTkGTSSFk5rhmEYGqBoPSGBRfg+NtW4+4IAqjWP2THZgSFjqEkRh6UpDXEgGELRTUDXD7JmCyZbzKcL7R1UkjFSEB7ygIpxnT6QsVlkKCzLy++5BXhQoL69yY2hRiaDQTgaXFRZbeIaNg3OIpKBaERRWk+dQFIJqJJEynLfO+F4bx/STVpAZJ99MophOpwE+RVFIiVQKpWKElJ7RVoA/j61HGY0xaK2RSH890SCs9wWT5cQT4WfPH9PWkmYZzXScTnsMJTIaEaSFA7Gwllz3aKbWBpZRH5MMnAE4vblp+74PSjZhHxg5Xcd2bd68mXvvvZd3v/vd+4BB1lo2bNjA448/zplnnsl55513wOXs/XT5zZbWmm3btrFmzRqee+651zQiDdsbTLAPBijqr2azyapVq/jUpz613wjXDRs2cM8997By5cpjEjQK1wVgiuz7RK2QavTTn/6U8fHxKe8JIXjPe97DxRdffFyOwfPPP3/AFLF2u82tt97KZZddVnoEPfvss9x+++3lk/PHHnuMJUuW7AOWBebS6OgoS5YsYdmyZZx++ukHbXIf5tXChQt55zvfyWmnnXbQn52uE6eCLOXVyhjD5OQko6OjDA4OHoGt2hcsCteIb33rW9x2221s2rRpHw+XN1OdTodvf/vbDA0N8YUvfIF6vX5cXG/6fXx+V6p/bvSnfR3vYxD2a8eOHXz3u999XRLmUO12m1tuueV13b/V63XOPvtsPvGJT/CRj3yEBQsWHNffBYf9jq6b6b5G2xLFOAmKl4iJ0g229yg+OLPjDYKtT1gDStDFpaVJojiiUklQUpEWGqG6dFupXzbu92Rvwmtt6VrnVSSEQ5FsWDBeDmT7mmTbYz/5tTo5nRFQaNJWxp7JNtlePj5SOj8jjEuzipUDiZR0fBbp2UfaGM+sck1IpJy8SBLkNYKicAbhIjOoimC8k7Nxs2ZswlIUxhv0dkuWhWtULVEkGBqoMGO4wdBgg4F6lSSJ3W8YjbXGmRbLiEq1TlKpYjpdskLQbmXYbszMasLWydSlaZleoys8cFMYB8xgDYV/P7ByXG6UOq3XAAAgAElEQVSVZ1OIXvNcso1Ej2ERfqck/oieZ1FgJYXY9X52UfDLCcuKIwcMjtQlWWGZaFvHNuoDn8I2SgkjdTh5jmDDVkuSwEDV7Wcn9+wnRyop4+f7vZbASaq0dSlm2lhqiUJ6yVumnc9TrHqsnMCAKwzk2hArNz/D8rV1YNVkB6qxpVGFyLPJBKD937ESVBNLq+PlbBVFEhuEMuS5i5ufmURsNAVpphkeccweo0FIQUPAcF0yc1Axf1CSiIKxCUumgAi62nkkJZF0ICpOxubDBj1DypbMLunnXEWAVX5fDWTGkFqBSSFrQzd153otESjhAZpCk3lEzZaa32C0N0iuawg/GYQUCKlASoRwCKb1J20RbOOtweoCa4K3V+/LzgqLC2iUDnwSykviDN08o502yfMm2AKJYx9OpN6wX/dA5JLN6CdUP8gMHgylN9/CnJni90TPZ2u6ju0yxvDAAw/w9NNP73PzZK1lcnKSZcuW8ba3ve1Vbwh27tzJPffcwyWXXPKmWB3dbpddu3bx0EMPsW7duoO+we90OiWj6GBNsPeuV155hVtvvZUPfehD+3jABCkPcMyBRkVRcO+99/Lcc88Bzkfg7LPP5rzzzjsivlJHo3bs2MFPfvITJiYm9nlPSsn8+fOPyxvYZrPJmjVr9nvzbozhN7/5DevWrWPLli1Uq1UAJicnpzCsNm7cyE033cSll17KySefTKPRwFrL+vXr2bhxI5/85CdZsGDBQXs7BQPjiy++mEWLFjE0NPS6GUnT9btVUkqq1eoRScLb28clPFz47W9/y5e+9CVWr159UA8c3khNTk5yww03MDw8zHXXXTclDfBYrL3HKtSxvM1vpvbeX631CZWMBm6/brrpptcdkLD3Ml6rhBDMnDmT5cuXc80113DZZZcxb968fe6FjsexPex3c5m2HnwRWGGIPKNCSienQQnPRKB8JO+kHhqjHWMgYEUOfBCeEGCRUUSMIIpi4ijGipwiMZiscHIQerIiIZwXkhWUMeAGZyosPDPBWk9DCWbAfh/CHFECRuqChUMRRhviXGMncvK2JVdQ4CLqjXH7EymJ8gyHSkUhhUQJQWENUjp5nhLONFp4wChWgfEAWhu6eUG7nTM2XqB0xMCAZf3GjF27zRQWlAjwmLBIKahVI4aHG4wMDVCvxjSqCUkcgfdaQQiUjEgqNeqNAWq1BkIl6FZGmuaknTZGF1RVg1l1y0ujGcHjywrnMaSNMwPul+HQx9bam5HT0331gKEAhFhHXpnSTFv/ex6Lc4DNXvMr2D0J4eZTI5ZYK0hiQdEtmDUo2DNpXdqaL+mZRUNVwYL5EiM0Q0NuG7oZNDteeueXXTKUvNRQ9r2npAOL8sIxjJT0aV9+3uYaaonbt4oS7Ol64EF4U2TrZVw+hU4bzxwq3B9jYLhBmazlNOBuHUN1iS4Mg7WY2XPmIMZ2E2mNsFBIMEIQG0kz18QRDDYsaMFIVTFSj5wJtdIMRzDeVYx1NdGAP5bej8ha70EmKU3IlXDm58afkxG2HFOUA/6i2C0D62SLReH2U1t3/qVtzWTHEEWCJAYlbUn0KbRjeUWqQicbwUp/0+3B3XA+WizCTzyttQOJBZSeaN7rKACpYU75DEJAooEs69Jsj5PnbQTaga1KUBgntQsMonKe9zGJgkSzX3sZ5JWm91IJUobrXAA41aEjm0zXYa5gfLi/Ghoa4j3vec9rAiRFUfDAAw+wffv2MnHtYCo8RBkdHWXz5s08/PDD7Nq166Bv8NM05emnny7T0t4syymALh/+8IfLhrx/W9esWcOOHTs499xzOf/884+6obLWmnvvvZcHH3xwyr5v27aN559/no985COMjIwclzdxr1a7du3aL1gEbky2b9/OGWeccYS36s2V1prbbrutTKbZu7Zv3879998PuKfCr+bBsmnTJrZs2cLw8DALFixgzpw5zJ07lyuuuOKgU+OEEMydO5eLL76Ys88++4Tz/Jiuw1OVSoULL7yQz33uc5xyyilT3juU7Ja9wYB2u81DDz3ExMQE559/Pn/5l3/JqlWr9ivtPJQ1NjbGN7/5TU4++WQ+8IEP7CN3OtbKGEO326VSqZTgye+CB9P4+DibNm3i9NNPp1arHff7G+b/iy++yL/+678elK/jGykhBDNmzODyyy/n2muv5Z3vfCfDw8NT7n2O97E8/B5G1rEIjLUI6+LXZQTVxKWLFdqnl4Wn9vin9d5AVu9LQAIcXSPBQCJQKiJOYgyWKMuoJLIEGrSxzg9Gunh6IQUI6VgKwrF9AqKaZpoiNxjR4xyFbk8AjYpkxSkzePvMGs2iyc7RLluaBYmyZEZ4KZlrVGOlXDqcT3sSyrGLpBQ0VELhEa1EOWmOEoLcuPQmbQ1pntPNCiabGTt3anbvtiyaG/HStpQduzVaiz7wRPRAEyWo1iJmzRhgaHCIeq1CtRITqeDZZL1Pi0BGMUltkEptkCipkheWLMvJsgyjc+IoIoki5iYxWbGHHZO5M/XtO74GZ2wcfF2ksCXTqG/4SmAnvFYysTwQAz22UWisZd9nAtgUjKzxbB1RAoLeYNwKtHUgXLeA4SoMNwTtrqXAGTtXEge2VOuWVBtabchSt452CmnWd+zpgUWWHliABakEzdSQeE+sRCk0/gvFOhAl0066N1QTGC2QtufTZYwDRnK/PCEopUxhl9s+2GuwDkL1wCuDAwZnDinmzJ5FtVqhu8cFgUXakkvDeGFRFQeKGA3VBAZmS+Y3alSlYWc7Y3vXsGnCoyJKUE0kCH9OFFAIUB6kjSNL5s8Flz7otifcZ4TjJZVPBZPeDNtYL8HsAwmlez0rLGkOs2uCpCLoGgeEDlSqdM08NA2i2PuTaY0ucqzRXpan3M9Gg3WMOccIdOxDoRRSxe5cRzpWndFYDBpIsw6tziR51iZRllgJisJihCXTe0tTe4BTyTILr+31d5jk/XNV2v455QBFiQPXpuv4LyHE6wJF1q9fzy233MJHPvKRfQCX/rLW0ul0aDab3HXXXWzbtu11m5B2Oh1uv/32/aZ/vJl67rnnePLJJ7nooov2K9Nbv349mzZt4oUXXuB973sfQ0NDR+2GqdPp8Nhjj+0XKNu6dSt33nknn/jEJ47Clk3X663HHnuM9evX7/e9PM958MEHX5fkQGvN5OQkCxYs4Pzzz6darR7UPA2MouXLlx82oCgY2b/44ossX778kC57uo5unX766Xz1q1/lsssuK5loewNFbxSgOBDzbsuWLfzgBz/gX/7lX/jgBz/IQw89xO23337YwaJQv/3tb/nrv/5rFixYwIUXXli+fiw10v1+hHv27GFgYIDh4eGjvFWHtwIYZq3l+eef5/nnn+ctb3nLfmXnx1OFY9lsNrnhhht4/vnnD/k6wvfA7//+7/Oxj32Md77znQwMDOwzpw/3HD8SEsrDDhjFcURkAeGj4qWglggqkSBSYIygUAJjTCkHK7SlMAJppWMmaG9aC87XSAiiWFKtRjTqNQYHGiRxTBRFpGkX7Vkezi3JMX6SSFJJJFEcI6MYROTX57x+ijx38iNtENqWIIcJrBgL1gre2qiye3ScqGHpyoKXJjVGwslzKsQNxXieUVWSSqyIYkXspS9hWVIK6tXI+cMIJ8sBx5bQWtBKuzQ7HdptzdiYZedOS6ftmtc9kwXNbYVn+rgNC8BLogSVWNCoRQw0KgwPD1CtJkTSItDowk0kFxlu0EIQywpRXEXIiEIbumlKt90mzzpIYYkjRRTFKKVYPCumluxid6vLROqAgPCVZIQ3eNY9gC+wLEq/Iv+7geUV5rQN7KG+EkAkQMupTXgwyJ7C6PAfkAJmDA5RlZLJTofxtEuEi2ufN88laVklQBhSXVBow3jbYHJBmrntzgoHFgX5WkhSC8ltJVDkV2+MpZs5mWOQ6UVCEktBUVCyZQoLRW7pZD3JY6iiDyyzuN+dsmvWbVOhoZ5AJcGn7kFuDJGA8ckJRBTTzCzD2pIVMG4NTWOJ645tpDz4KmPDy5MdurkhzYzzxRIwMqAYnlEhSiSFzsmNprDBlyoAkgIhjANS+g6Btj4RLXLMHWOcV1Dhjd6FFUTCAWP9kqzIA2DWwGQGVSy5nyPNtEonryOl8pIJQRHWXaTYPMeq3J874WYnXCNwn4tipIqRKgIhvbdXQZo2aXdHyfIO0loiaZ2puHAG3Rb65Gc90Ccc/zD9wnH0KtMeS7J/rvedIz2QyU2iwKCbruO/tNbl08iDrU2bNrFp06bSuyJJEmbNmgW41LGNGzeydetWNmzYQKfTeUO6e2stjz766CEHi0LdfffdxHHM+eefv98blaIoePbZZ3n55Zf54Ac/yJIlS45Kc9DpdF61KWq32yfc02NrLZs2bTrg+0KI47IheOGFF/YbaQzOa+zJJ598XcubO3cuK1eu5Iwzzjho0DcAReecc86rAr5vtILP2BNPPMEvfvELOp3ONGB0AtZ5551XgkXGmJ73opQlA2dv8Gd/16hXY4waY9i+fTurVq3iP/7jP3jkkUdI05QHHniAjRs3vqHvlTda1loee+wxvvzlL3P99dezfPlyqtXqMXftLYqCH//4x2zYsIFrr72WkZGRo71JR6SEECxatIgdO3YQjK+P98qyjJtuuokf/ehHhxwYHRwc5Morr+RP//RPecc73rGPP9eRGr9D6Yv5anXYAaPBwVp5kFwTbqnEgmqsiJRAa00uc6yVXhaGZ7FICiO83EejtZNbCUBJQbVaoVKtMjg4yPDwcMnsSeKEXLi4PJfIFtgNzjA3UhFCRWjr0Qi8qbRxfkIhFj6IWIRwzCiLpV5RtPKMHc0M3bK80oVWLugWhiTRLBmuIBXU6xGVWKGDPEtI5+tjDHGsMFaQRNI1/VqTF5pWGlLNCnbvNmzbaWm3LcYEsZll52hRgi9SCGf4rQSVGGqViMHBGkNDQ1QqCXEUIaXC6II8y5z8LYoRGIw1SOGMg6WKyIuCrNmk2WwxOTFG3ml5jyPl5D0ipqIGeMucIebNbPLS7m3snMhIvRqiwAFGUQQm7zEprGcABYDDYw9lk9wvR9v7NA6AjfdoRtOTp4VGPDTt1r8X+YVZoRluKIYbEfVazEAikVaztZ3T6hQ0O4Y8w0vMXEJZ5sGuwCgJYFGQSQVQq8SqrJObBR+n8bZm3ohxiX5SYq0ux6A/LQ4caCI8TSec52E/+wGJUBbHEJrsOLlcpHrAUZRIR7vvZMjcUEPQzg1YQVExVDXUIkWqHWsmywR5UZRzPI5hzoyISj0mSiRKSYSMsYXA7YItASBrHQvHSIvWPQld2Fjnz+XmpXIu92gP8CklscINRCFdEqA2HliUkBtL1nWywoFqjVZ3BsZaosggpfKSUs/ikH5m9COTIjCLQAhnjC1VRBQnSOUYRp2sw3hzF7o7Rr0CyJ7RdjDKKqWVfplhDk6hzOEunCZcQgJIutdxK9lJ/nNK9uZ5kPDZacTohKhms8lLL730up5EFkXBj370o/LflUqFc845h507d7Jr166DTjs7UFlreeqpp/jlL3/5ppbzapVlGXfccQfAAUEjgImJCW655RY+/OEPc+qppx5x35wNGza8amN0Ippfd7tdNm7ceMD34zjmtNNOO3IbdARq/vz5XHDBBTz55JOvKdeMoohly5ZxySWXHBT7LY5jzjzzTJYuXcpJJ5102KRneZ7z5JNPlob003XiltaarVu30m632bJlC41Gg263y8DAAOedd95+Jc794MqrNYrdbpctW7awevVqvve97/HEE09M+U5Zu3btod+hgyhjDKtXr+aZZ57h2muv5bOf/SyLFy8+pqQ7eZ7z3HPPUalUjssEyddb/SEu8+bNY+XKlaUk92gfizdaYZ/Wr1/PN77xDSYnJw/ZspMkYdmyZXzhC1/gfe973z7SMzjxwCI4AoBRvVb1UhHXWQksSaSoVSsoKSiKHEsXrV0CmTGWSICVCmUFSWzRRoJfhsAZxVUqFeI4Jkk8Co9v3gtDlnsvE+UjsxGY3KKtoTC5a9RxyU66yNE6RxeGLNfoIrCZ3MF2xs2OdbC7lfP/PbcHayGzrgGXvqmcTA0qFswfapBZb+hd+IwrYdHClibOmTE02znttEOW5bS7Ba0WTIwLxscN3dSWMq3QvQbGkxICpTxQFDkJUb2qGGjUGRwaoV6voyJFoQvSbpe02wUMlUrFAUbCsZ0q1SqVqnu62O2mdDpdJkZHmRzbRdppQlE4kC2RnuUREccJQ8NzmTGygBe3ruPl3Xtopj5OXDipodCAZ7Pghn6KYXRouGPlmGYCmOyaUr4TwKAgYZN+GcL4OHgzlaETCxioCEYaikqcgbTMHYxIYkktgroCqwtaacHuPRlp7rYvjiCpOqlTJ7Pk2jOYTJ/vVdQDd8LzzGA6LfD75Zlj2ydz5rZzqok73tJ/xtJjLCnlPpcXMFyB1MBYSumLFFhGAZAKAFuQPgXT78xAJ3PgyswFA0TKUGQdRNWic4E2oAYt9Ypj16W5JdeWwlNOwWEuSsHsEUVckxS6wOaaxEY4Hyr3X2DeWBnS+nx6n3RgkpSOeZfllm6miaSkFksqtYjxdubAYuGAUbxXmBBekuZPMwFlcpu20OzmSDmOtUOlR5eSDry0pvAeRcbLuULKYm9OiBLpc8lyRhsm26O0m9uwOiWW/ngLSxQMugPwI6Zul/XXAHx/q42X2fXNlfAnnKh9P/a8uEQPLBUePKooQa1y/BnOTtf+q9PpvO4npf1f9t1ud5+414Ot4K/Uv7wtW7Zw5513HtLEm/1Vnuf87Gc/A14dNGq32/zkJz/hfe97HxdeeOExcyM6ODjIe9/73qO9GYe8JiYm2L179wHfX7hw4WFhxxzNajQaJZPtvvvuY+fOnfv9vdNOO413vetdLFq06KCM2c866yxWrFjBySeffNjATmMMW7du5cEHH+TZZ589oo3AdB35Wr9+Pddeey1FUTA2NsbExASnnHIKy5cv54ILLuDss88+4Nzc39yw1pLnOVu3buXxxx9n1apV/PznP2fTpk1HlEV0MGWt5eWXX+bv//7v+dWvfsX111/PihUraDQaR/V7IYyrUorrrruOWbNmTXkIdKx8Zx2uGh8fp1Kp7BNmcTzXSSedxCc/+Um+//3vs2nTpjd1XRVCsHDhQq677jo+85nP7BOKcCTnx97eZGmasnPnThYvXnzY1nkEJGkxxmjnYyIsSkiSJCGuVB2oIiSicCbXZQMGSJx8TQjpJG2lbskikAhrKApDu53SLSYBQbPdodVqkxWONaA9O0d7XxQhJVIajE3R2r0eKALCOuBDh3WJXpMeGr+8sOzaiwpdSwSnLKow/6QKqiHZk2U02xntds4AlrMWzWHLRBOtJNYauu2CNC3IUku7YxifsIxPWLopWGM8m6nc1R6AIASxxINEgiSW1KsRtWpMNYmp1WpUK5FLWJMCjPD01sI1/MYtX6qIOEmoVBtEsZNPpGnK5PgYk+O76bYm0Hnq2CtRRKU6QFJrEHmwKcsLjImYO7yEmkjYMb6TVyYKCuOa4Thycp5QgUEk+vbJ4DyGtBHkuuddFdLVQqMemB/GOnBDByNm33AP1STzRmIWzIioVdzvSmfBQ0UKlIXN4zmbdmc+wh7qMciKoLAw1rZQuG2uKMjoNfsGypQ0PBMmeD/Tm4rlX+3UMjqZMWsoJpIOiFJedlSLJYVnsUXKrUtFMIhgPHULaSSCbuGi7ANrRYg+aR+916UHyQZrYHUXbQyJch5A1kClEOQYsgJyb5AUZIABtFMKGjUYHo7palOaRwtbABJrIZIKo8EYh5AU/hxGilJS6FhUtjxOuTZICWknc0CPEqV/2d6sKaUERjhwVPqDbgwUtoBiD0q0wIyQ5jXPMsJdM9COjTgFVHVnac/3yoFd7fYkrfYe0E0SZTCR+/3gBRXYb9h9PbHCoo1xc9p4sEibHlgUsKrSxyjM3wAs9o17YBUpCYPViDkjg9RrJ/7Tq9+V+sUvfsGsWbM45ZRTjsiNQ/De2759Ow8++CDr1q2bItUxxhzWpjM0M9ZasizjZz/7GZs3b+aKK644oNQpyzIef/zxKf4VR6JOPfVUZs+eza5du6a8vnDhQi6//HIWL158wjUDryYpOOWUU7jqqquOS8Do/PPPf9UmWErJueeey7x587jrrrtYv359eR4kScLb3va2V52joYKZ9fLlyzn33HNfl9z09VbwKHv++ecPmynrdB1b1el09sv+/PM//3MuuugilFKlPC3PczqdDgMDAyVgGQCisbEx1q9fz9NPP80TTzzBfffdx/r168sHGMdy5XnOr371K6677jo+/elP84lPfIKzzz77qDI+rbVIKXnrW9+KlPKoBzYc7uqfIwMDA+X+Hu/fh2H7R0ZGuP766/nQhz7Et771LW6++WZardbrXl61WuWKK67gS1/6EhdffPE+3wdHCywqioKXXnqJH/7wh9x+++08+OCDh229hz/z1neoQrhWyiJwcdgKEUWeWZKhjURr7f1RLMq6iGyXYob7rHBJZgIoCk2h2xTt1FNbJGm3i85SrLHk1rEYhHWNbmF850/fYPeIRPjNwwYBmO2ZSk/xLvEflUCjIrjkvGGyqMOW3W06Wy1ZpokR2EKQVxQ7ZnRo5RmdjmZyomB0zNJsCrLMAVA9CYxjdFhcolzYEunHMImglkhqFUk1llQrMfValTh25tpKCazVLl3OOnAI4aLHhad0xEmFuFIjTqrElTpCxWSFpdls0ZycoNNpebNrRbVWpVYfpFobJKrWMVaQ5TlpltHtdknTFJ1HzK7X2NWcdPIsQHi5lEl74xZAt8CiCZXmzqTYBECpj5Xkh6QEaUKDn0QOKJozEtOoSxqxoVErULWIyU6XIocKAioJHSMQVcn82YkzV84MujBMdAyjk47p43ylKNlftm9brHZStZDSZvu2v59FgnUgwmhLM3socWClhRqQG2imDkQpU7OEYxcNxIJaZJksQIueE4/oW25Yb3gdAfUIZg4K4khQiwz1qqKbu3h6bY2bVx7UwLN5Sh2gB4uSBOpVSRwJcuOMqqUQRFKiEc6W2QoUDui0/gQw1mvqhSBS7kCJ0tHZ7WPa53oeKTevw9hK6dajjWM9eRVb6YtkAlhjLbnpErETJQawZgikcuwmIctBMta6xtgY/5JbYK41rfYERTZGJDWRstiSxubki5apPkRhN6z0CYAeJCqKPsAojKvtMcz6Uc5+kCiAzlL0wM9qJJk30mDWzJmoqNIDvabruK9Wq8XNN9/MpZdeyrJlyw5rpPz4+DhPPPEEzz77LLt27TrsLCIpJUNDQ5x55pkkSUIUReWNfbfb5fnnny+/V1/rKdeRMljtrzlz5vDRj36U//mf/6HdbpegwooVK45LH5+DqRDtu3f8/KmnnsqHP/zh41ZqcfbZZ2Ot5fbbbz9gHLkQgjlz5vDxj3+cu+++m4cffrhMsDn77LNf8+Z+5syZXHrppZx11lmHfX5MTk5yyy238OKLLx7W9UzXsV0nn3wy//iP/8gFF1zA6tWreeqpp6hUKpx66qm0220WLVrEypUrqVartNttHnnkEe644w4eeughnnvuOUZHRw86NfNYq1deeYXvf//7zJ49m9NOO+2IS5ZDhevC/r67j3cA5WBqb6DuRNnnOI5ZunQp3/72t1mxYgU33HADmzdvPmhAdcmSJfzRH/0Rn/rUp5g9e/ZRYRXtzSgyxjA2Nsadd97Jv//7v/Pwww8fdibhYQeMtDG+eXU7K6QlLzQy1yQywSKxQqGD/AVcQ+g/qz2i4j/tGBbSR2UL5+eC8AHfiQCr0NaiM01R2LKpdA14CNjGSWPwzBsRjIx7aIDtR5NswJbCp6AawfuXzSEeMPz80Yw9Y06uEwCuGXXBRaeN0Cya7B5P2bHDMjYmyIq+BdKPWdkpZsvl1BCCaiwYbEQMNarUazGxiohjRRRFJHGEVBJjCozRaJ2RJEMoWUPbiKwAnXcdoyNKqNYGqFQbyKhCmmW0Wm0mxseZmJwk76bEEmQUI6MqqITMQJZq8sLQ7XbodDp0u22M7pDTZiJv0/E7IXAyrDiCiu2ljZUJY6K3vx7P6lUfPcP39AgP+kkBFQkzGhEzBiNqNeWYVNYwXI+Y1F1EZjCRpKtzCimxyhAnihkDccke0dqBKa1Ozuh4wZ5xw0TLAQLGTQ9nygxUhPMmKvq2ux8ACDI80TdNxjqGZqrJtZtJVSVoC7vPvlq//7u7xi0fB0xNwTEDkBmmfR+Q1S5g25ihmsDJsxSjkwV5YRxw48dOC4ejlhPegxgBLKomICOLtpZISbJCY6whUgqrnXTUgU09dpDw6WnWD4jxEjOLY814nMelponeqks5lu2No5SQeA1eYawzfzcWRW8/lXDspsJOEMucWM1ERA0XcYrFGsdM1GgnI/Wy1U6e0eqME8mUeuKA4hKL7GP8hONdXu6FA4m0gTx3P1vdYxUFL6qwD2FeB0DIegZRJL0c0R8z5zUGI40Kc2eMUG8MuuQ2a8tExuk6MarZbLJq1SoWLlzIwoULD9lygxnqtm3beOaZZ9iwYQPbt28/ZMvfXwkhmDlzJm9961s544wzeMtb3nJA35YFCxYc9HKDyfeRrjlz5vDpT396CtvkRLkh3l9FUcTKlSuJoojNmzcD7gny+9///uMWLAI3L8855xwGBgZ48MEH+e1vf3tAE+woirj88ssZHBxkwYIF+8SX72/Zixcv5v3vfz/z5s077POj2WxOg0XTxeDgIF//+tc57bTT+Iu/+At++tOf0mq1EEJQqVQ4/fTTufHGGxFC8PTTT3PjjTdy6623sn379qMCwB/KqlarnHrqqXz+85/nD/7gDw4rk+9g6kT+Tthf9Rurh30/kcag3+9raGiIz3zmM5x33nlcf/313H///Rz2j6IAACAASURBVAf87gB3j7BixQq+9rWvlayiozFGe4NFzWaT++67j+9973usWrWKZrN5RNiEhx0wcjHkrs2y1pIXBu1NQrQ1WF2UEhIBLsXMo8tFnpNnGYWXqwkpfIPnDJxVFLm/lcJiyQpnoJNrFztPUJwZ0B40Cv29KOO2RF/6lgOEgvzNekCgxyYRZQN/zlsGWXbOTG689QV277EY64CiAHotnltnxkzJU0932LzFkqY9+YpfxD4slfCP8KMUUIlgaCBh9sxBBgcGqFUSl/qEi7CPY4cK6KKLRRPHVZJaHURMYRV0MgrbpbACg0TKyJkaI8nzglarxcTkJM1mC12kVBPluvlco0WGTS2p7tJNM7Juhzzv0qh26YoWu1s5HZ8q1p8IlQNR7MY9zSlBIDfuHuTDg0ai99kg4wnDIYXz6Zk1GDFrOGGgrpBSkBpLu5Mzt6FIagrVkRghqMYRWMcu0dYgrSASAqUkhTEoJYhjQZLEDA5EzJyZ02xpxictoxOWdteZSwumeiX1YUK94yWmHiuAtLBs2JGirdPnjaWWrk9Li3ofKcEK642nA9AS5kE/CNW//HKKWEgLB0JkhS4T64QHHHUfw6UEaIT3bYrdnyhyXkRY67fHJQnmRnv/qQDRWmKlyLQuZaLu2AgPsrmNjZTbO2t7KWPO/6u39eX5g/fzEk66J6zbqQC6BOaP8HPCWEtm2ghdUI3nEcczkVIBljwvIE0dWGoMnW4XdJORqsVgSqhob2+s8FoAZ7Wfq3nhjktR9ACj4G/UXzL8by/ACeGBRBx4JAUMVxVzZgzQaAygVOw8mLzJ17FOGZ+u11+zZs1izpw5b3o5WZYxOjrKpk2b2LhxI7t27WLXrl2HvUGI45gZM2bwgQ98gHnz5lGr1Q7ZzdHChQtZsWLFIVnW6y0hRGnk+btSURSdkP5MAdhZuHAha9eu5de//jWjo6P7/d04jnnXu971msscGhpi6dKlrFixokyoOty1evXq1wSLut0u69atO+zbMl1Hr6644gouueQSvvKVr3DnnXdOYQq1220uuOAClixZwo9//GP+9m//lhdeeOG4AYqCrCucT05JEoKQBFdffTVf/OIXS9nniZLOdTzV/kCjE63CPkZRxCWXXML3vvc9/uqv/or//u//3idgRAjBySefzOc+9zmuueYalixZMoV1drTGqCgKHn30UW688UZuv/12xsbGTizT62AAbHB+C1oboMBYqFgn1QHrQYQIlSTEUeybO0FRFAgfxSRxyWfOC8SBAVJCFEnPHrLYJMJaTRIprJUuASt3vkFF7iVpBAaR+5dA9ORG/YNv9+kT3T4BJ82vcvejW3hlt+6BAH5pUsK8OTHPbNzD5s0uej0wnPr4RPTDRj2gRJReJ4kS1KuKmcODjAyNMNCoEycJ2jjvJyVd+hRYTCQpitRRCnHUwjhKEFJiDKRpTqvVQcU1cquwCJrNJpPNSbqdSbAt6hVDnICKJEZ0yIoIYyTdLnS7BVmukUCuDEinQVMBXwvj5/fIADKGyLM1wuvBYLgfOOv3LlKiZzo9VJOcPCth9kiVKHIARZrldNspFQwihnZhPHgA1gqqSULR7ZAV2kvDpGd9SA9ZuHkVRU4aGcdQq2kGBix7xmBsAoocdJ8WrEzKmnLEev8u99nCRMegJFS9p5KglyRW7mvfWAXmT0+aSI9R1HdNEn0rFjiwaMagH1O5F2jRt40hVKwSO3aRUg6wU9ItM88LZOQupIUHVhuxpFKNmEwNmTZoLw8NX+RSWA8cCVLP4pP+vcL0YtO0n/OR8ACTtZ49aMtzwNheelh4x1rPyLK9eWUN5CbDdF+hITTV6jxAeTmcAwkn2+PEoku9iktkEz2pYQB6Rd96BA60zLzkrCjcsS8Cs8iDev2ytSAh0/RS/gJQ1D//A0A1UJGcNGuIqFIDhL9R8jdLU2DI6TpRKoqiMip578qyjE2bNnH66afv931rLUVR8MILL7BmzRq2b99+RA1LZ8+ezRVXXPGqbKI3WlJKFi9ezNq1a1m7di21Wo1zzjmHOXPmnJApZcdKnajjKoRAKcXSpUtZtGgR999/P0899dR+b6BfbQyiKGLFihUsXbr0oNLS3mxZa+l2u2zbto1Nmza95u/ffffdb9gMf7qOj7rgggu49957Wb169T6ysiRJuPLKK7nnnnv4yle+wtatW4/SVr52KaUYGRlhwYIFnHnmmcybN4/h4WFGRkaQUpKmKVu2bOGRRx7hxRdfRGvN/PnzOfPMM6d83+wvPOJEBzSOdv0ujGv/Pi5evJh/+Id/4Mwzz+Tv/u7v2LNnD+DuUy688EK+/OUvc8UVV9BoNI4ZX6eNGzfyzW9+k3vvvZfJyckj/sD5sANGDpWzUIAso+s1WZZirCZJFEpYYiWxKsR6y7JrFFK6SG/pBWMedLFGY4yAQpAZ18AKCZVYokSCqQgQyjeEmlYnY7KZkucB4BEloygMudlr7EUJD0yFCYSArWMTbNue0bNrCYwB9zs7mi1efCmjmwW2hFuGY01YDyDYPtaDY09J6RLEIiVJImjUYurVKnHkIsKFip0xsWdoRJF7YqqFRJscYzTWeJqE0SghMFbS6WYUZoK0sMRJC4TAFJNUxCgzh8fIdUZutYs3d5heL90sEtQGFFUt0UYihaISJdQqGZOpYbLb8wOaMn4KooqPq/ebbPDMoj4WTQCIAvgxXJUsmFVh/kiCjQSZMRRGYIucAaGhCrWBKlEs3Dq9uavWxsn0VEya5z7RymCVO9mld1ZWwh3zSqJwckbX7UtlqdVgdBTGJq1L4eoDacIPYT/CUe+fHXuzY4TssYecZLE3RyxeprUXgyXgivtcCoRjXAkBc4cdi8v0b5/obWiQXUnlwKUowqfruT8iGFdbQzWKyY2lnRYkkcQmglTjJGrCIvH+YQgkgkgpENYbxHsQ0Lh1Cc82ksJSeEPzACA6k2gP5PiBDECqEILIHx9tbCn3Ag/YeZSnMAWtzja0TomjuWgjSPMunXQPtSgljo0Dm0QvCS6AcWF4/JQpvYnyYiqjCOvBon7AWNCP95bHF/pAKb8Cv3qMhVZu2DzapFZJmTNQJ0kqfVtx4n9BT1evrLXcd999tFqt/QJG1lq2bdvGnXfeyUsvvXRknxx5+dIFF1xwSBlF/WWM4YEHHpjy2gMPPMD8+fOZOXMmp59+OvPnz2fGjBkHBNyma7r2rmBO/cEPfpDh4WEeffTRfZ4YH6jmzp3L7/3e77Fo0aLDbm4bgKINGzbwyCOPHHRiT5qm00zUE7gC8+Hmm2/e77xNkgRrLf/5n/95zIJFQ0NDvOMd72DlypW8+93v5owzzmB4eHifBwEhqGF8fJwNGzYwOjq6T9JU/+/ur/pfP9oN/HQdnxXOuRkzZvDFL36RRYsW8bWvfY2XXnqJiy++mL/5m79h+fLlUxjJR2Ou7X0OLFq0iG984xs899xzfPe73+Xuu+9+Qwbeb7QOO2DkpCfS6WF8B5trjTXWP6E3KClARS4pzV9QtDEY7Z1mA7so6MOs9Q2oRWiNUhIVRygVEcURlcSZYAsh0Qa6mcZayHJNoR1lQOKiwrGUMpqeU1IfC0j0gB16q2d0IqPrI+V7Yhvn72ItjI7lTEzil+eWgRDe60WUoEEAS5QUxF4yFUeiZFI5dZgmKzSik6JNCuXvg/D0Equ1S7TSGda2yXNDXhgHmOWaTqeL6GZ0uikDdUFS7ZDpCQwFWWGdj08fkBH8Wow397G26LFgLCgteOvsBsPVjN1xzmRqS6PgYBBsrQMRKlUQKWQ5U5CV0DIHWVojEZw8q8LskYRKrLBeU5gVBqFziAy7rSGuKKxyLA9jrZMdWbf9hdYopZDGSR8LbcgLTRy5+eDW6XZOSajGkWfH5AhhXdy5l23t2EMvOY+pbKKSFcRUIAHrgYS+a4u1PePv3LOyAnsmAE/95OKwbCGcyXcAKyQwsyYYqgu6GArTY7XIvnWGeaOkG/8kdqwiBxY58Cd4Qwks3TSnVq2S5sYlzEURibScPNRgZzPFWBhtZ15i5sywLRaje6bWQgiUlBhhUFKSe+pOoXuSt8AiCmNk/dxS3gjbWrd9YXIEj6jwJ0gYjTV0s1Gs7pKbATrtcYarBRpTgmT9zKLyXsT2Es+yYipgFC41Ane8izBP9ze+/vV+P6Rw3PolbzGQRIpGrBisVoiiGHf2Bze06fpdqna7zRNPPMGSJUv2+36e59xxxx1s2bLliG5XFEVceeWVLFu27IgnwoQo8a1bt/LUU09RrVaZP39+GV9+1llnMTAwwODg4HRzMF2vWnEcs3LlShYuXMhdd911QIkauJv/t7/97Vx66aXMnj37sG6XtbZMsnr44YfZtWvXQQNAY2Nj7Ny587Bu33Qd3bLW8sILL7Bt27b9vp/nOWvWrOGRRx45wlv22lWv17n00kv57Gc/y3vf+16Gh4dfM+whiiLmzp3L3LlzyyTPfsna66nXyyacrukKFeZJpVLhmmuu4fTTT+eee+7hsssu47zzzivBomMBKLLWluy8J598krvvvptnnnnmiCdqHn5JGtYlI6Hck/sA1ljtm21RgiYg0Dqn0Bl5oTGFRucFwvOArO1nVFgkGulBJOvMkoikcoaygrIlU1I749lIkkSuYYviBJQkLzRpN8dq08co8ghAX/MnbC9q3QBj46BwXa/LlApBVC4u/uUdzmcGXLOeSEEU4SLX6cmU+uUusYI4dmBRmKNZoWm1W2gLUTfDGI0U0v1+rEiyAiUVWIPRXTA5KjcIqSk0tDtd0m6bLO1Qr0GjbiDOmEi1Y1TYvj94po/tRYa7Y9YDgKxPihJYXtrdwRSGdubAolpVsXjuIM3uJJ1U083cGORBMmW9R4wfw5CaNpgIFs+uMDQYk1QUrSwj7XZpdQviqsIKy8mNiK6S6MJ6k2+Li38PEJAbSGsd+JBEEYUuHMvIgPLoV48NInyDL4iFQVt39CJpkdIyxwMuO3aD6GNb9eMIJWjkp02QJQrbmzfSs2+07Y1BAJlKeRpTWUdhBfUE5ow42Ze27mStxWCEA/isn3Plev18DayiUoIme8wi6aPAAriRFaALS5QX1Ksxea4pcs1pJ4+AUmxvplQjyUg9YbSdloBoOAdBIKWbs0mkEEKhPcgWRU7MV/idlO4QeNDULST252MJignhjyEY4wBZ7YEcpShBH3eetVG2Qz2xaC99jRSlwXhpaO2PQW7C/jrwsij6DK1tDywK42r7Pl9eB/pBItEHJIXzWEAjltQqMfVKlXq1hlJxOdccq9GNW0gvnK4Tq9I0pdvtUq/Xp7we5GbhJnnvG5Ht27fz8ssvH8lNJYoirrjiioMGi6SUNBoNTjrpJMBF1rZaLfI8Z3R0lNHR0fKhT/86wHlXvFaj3O122bhxIxs3bgQcA2lgYIA//MM/ZNGiRdPNwHS9agkhSnbDrbfeut8mvNFosGzZMt71rncdNiZbiDx/6aWX+P/ZO/cYSa7rPn/n3qrqnsfOLmeW6+VSfEgkJYWUKFIkJZtknMh6WBIMBVIkB4liOw/JCYwgMRADDhIkRGDECQwkAWLYQJz8YSeAkTC0accKLMk2KEGkQDmSKDHiQ1w+VlySSy65z9mZ7q6qe0/+OPdW9Sx3l0tzZpYi+wCzs9NdXXXr3lvVfb/+nd955JFHeOihh161Uuj48ePcddddW25uP4sLHw888MBZQUvTNPzv//2/OXHixDa36uwxHA659dZb+Qf/4B/wwQ9+kIsuuuhl9+Zz3avzdXCu95zxeMyDDz7Inj17WFpaYmFhgbIsN+z3TMc403vrLGZxrnDOcdNNN3HDDTd0nluwvbDoTO8NIQSeeeYZvvvd7/Inf/InfPnLX+b5559nfX39nGbdWxVbDoxiDCl9wxEDhKDEELuqaSH0ag9IMCEEYtvSNC2isVf45OcVkEipzioliZlcizMViTiDRaqBNiihDaCR0sPCXEFZeMrBkIhQNwZ8xqMJGqeqseXjdb+T15EY6Di+qr0BcFJAda9UGI0jXkwFNCiFYQlVIRTGzaw8d6INIclLRGSDOiIEwyDNZISGhqIsURFiUmd5X+D9Gs4X6fgBLxHva2CUKptNcIzZvRwo5mpqjbRNKmOuG0FFBkexP+luG00L9enS4kdXQweRUNAYibuW2Dm/yI5qQmjXqUPNyXHLqFGGJaytwTgpjeZL2LurZM9FJXNzBePQcOTUmBNrLeNa8QJ75pThUDkhAVVHUQi56tU0uHBol/IU1eEkK4oikvoMIpq8dvKcyiPunSm7HCSvHVhetvN/6QidmidOHdfRq2AyZszzoAlWtK9Lu0opW2GqL7tUqbPck4JCHXu3KxGYBEXDlJIlAwvX+xUVyaeoSP9PgjtTFTk63yAHNGNB1bFaK4xrFuYdq3Xge8+dIMbI/MBTeEehyqBwNEFxziqbVYWjDVZlrSw8ZeGtH1oDc4XzuMpB09rrJCmcEmTb4OMESelnAMqp0iJoNH+zrP5Joj/ERhZQqoEkEKdm5j3lNZQ4YacqahrzKaqDGZzr1NhtuF8nGJS9ozogdwbFUW7ToBCW5kp2LS5QFAOc8zjn8K7oFYjYQcUJ3hVTd45ZvFHi6NGjPPfcc1x99dVnfP7xxx/nscce4+1vf3v3geTUqVN85Stf2dbUExHhgx/8ILfccssrwqLhcMg73/lOrr76ai677LIzKn7W19cZjUY0TcOjjz5KCIG5ubnuPL/97W+/LCXtlSKnL3zhC1/gc5/73JvOtHoWrz5EhL179/LZz36Wu+++myeffLJ7LsPHK6+8cksWA+vr6zz//PM8/vjjfP/73+f48eOv2pw4m93/0R/90barDWdxYeLRRx89a3WwGGNX5fD1EMvLy/zyL/8yf/fv/l1WVlZeEeCcKV5pO1WlLEv+5//8nzz66KNcd911XH/99Vx++eVcf/31G3xlfCqSlL+QeCWF0yxmcaYwb9ui+/92xumf+0IIHD58mHvvvZff/u3f5hvf+MZf6L1ks2PLr6zQtkQirULdRsaThrZpKZwt0kMybi6SqiZGA0ohxARU+m/6O3ABSDSlBQlYxCYQIpYC43yCMoG2sXLzqJWn93NDqqrCFxVRYVLHDlLVk3YDQOkrXmu3oM3QQGKCCAkigXa+LEKqcOahKoWygLlKGBQGkLL3SVZXBTWVR4ialAuWGuSSGUrhI941OEJKTbLUt7YRmtpWrk6EQtLi2hssiVHx2rJzqSGUNWttTqE7bXGs/WJ4GhDB1IJ6GnQk2JShR760QlSOHT9BVe0khArVAohUTPDlBFcGdg4iq+vK4tBx8a6CKEoQaGLLqcmEo6uR7PlXlVANIPgMCUzH5ZziRDqFTkJBpgJK6pMi+UCFqDQhWOqeGkSx80wG2InoFM4jCN5FxKtth3LximVTHn4pgS6mVEBMQaIptZHQp/RJblLaeNrnaXoc3Gl/i/SpUskyaMO+ppUufir9rJgCRs7b82XRK7Ccg0LM78tFqyDXRGjbSAyRuGbX6fwwMD90lKWnnrQMCm/eWs4zSWS7bgOF8wwKb5UNRdAYTXEkhuScOLxzSQGYr18bP9Gs7EkwFgN+DrGy9Bic6thMuvYN5ghttNe1qngVqrJXUIU0HiEYvKvrKVVR7OdNHo4sEuoURdJDui41bgoYaVJMiYOhd+ycq1iYm8MXpUFruxuk85J0DOlyp4UEt7ePD8xiG+PLX/4yO3fuZPfu3QlYRx5++GHquiaEwB/8wR/w0Y9+lJ07d6Kq3HvvvTzxxBPb2sa3vvWt3TdqZ4vBYMB1113HLbfcwp49e8657fz8fKeq2rt37xmP92qBUY6Zj8ssXm0sLi7yyU9+slOrgS12L7nkkk1bEKgqdV1z6NAhHnroIQ4cOMCxY8de9be/qsqhQ4fYv38/TzzxBIcOHdr2dINZXLgIIbC+vn6hm/GKsby8zK/+6q/ycz/3cy8DXJu9yHbO8ba3vY3f+I3f4M/+7M9YXFxkeXmZj3/847znPe/hbW97G2tra9x2223Mz88zHo+pqmoGjGbxquNCK4ny4+PxmGeffZYvfelL3H333Xz729/mxIkTr5vPPlt+ZdXjCYrQRJg0gbYxeUssvHmeRIihJbikEMLUIKqKqOKk/w7eUn/6/I+YYJFoJIipHlwbICl/oioaLZ3N+4KqLCnKkqIwryMVh0hD3TjauQoN5vujKf0tHbVbSOrUnNL0r0g2q7ZFcvbjcaIMCoNUZQGDgpSSRrcgNRWM/d20StP2Zr/ZFFqcmQE7b2louVlR1X6yOiktRs1wOKIacKpUCy3jombc9CbF6QVdH6L9gjgv6qfVRTH06qLpFLbp7D0SSJtM1mibglZ92ocSokfjgIKISGRlqWWsNQdeamhDDz2mvXtKB7t3CVJoV1WscNL53XSarymVB/QL+qiKeMHjiRpoY6QQ0yI5JKXeaYIaQtCY0qEcDsX7yGBgpOBiLwwreO5FZW3Uw4uQQMI0852Ga6ilgbWtVfUblFCPtRvfDWAud2WGoxhIPLUOyztTSlX6DNqt2aQ3ds6/fVIRTUvemmD78y77ZZHAo0NKaCehV/lEOHoMXiKwtCNwfK1lx7xnrrJ8sNKb51iIZh4umEJOiWjQ5BWVqql5R9NGBoWnKjxBo5nOB4NEKqboComiSerPNnVekaR2qhCSgswlNVWGq5rmQURpa6ssWBR2/WbgNq4NGIXTFEU5Da2L9Ed3LWDHkgwC8/MCc4UwNyjZMZxnWA7A9c5noooSzZSflLp62huSqnbplLN448Xhw4e58847uemmm3DOcfLkSe6///5uITkajbj77rsvWPuuuuoqPvWpTzEcDs/4/PLyMldddRVXXXXVBiXULH64oq5rHnrooZfBh0svvZR9+/a94cd1cXGRd73rXZu6z8lkwmQy4fHHH+ell15i//79HDly5C/0ob5pGh566CGOHDnC/fffP4NEs3jdxnA45J/+03/Kz/zMz2yARVtxD8lfrP34j/84+/bt48CBAxw9epSjR4/y67/+6wyHQ2677TZuuOEGbr75Znbs2MHi4uIb/n621TGrRLd1cbb3h8lkwuHDh/nWt77F//k//4evf/3rPPXUU4zH421u4SvHlgOjtdEEkKRIiRQCReUoyxJXeEKMtE1j5b2T8VlMpEIcaVGawYYmBUeCBmnlrtCtvE1l0hvKOkyN4N1pC7YYUIl4rwwrQaNDtKBtzI+nboOZcCOnJY1ov9CX7A9jqWa5zLYBEEflDRT57OGT04uS8XXhwSejFZ+UIaHtUBSkfblsUCyAaAdVXJK3WKnztFBPVCmEiK9axsWE9Ua79ubfXXHzKWjRdaP2CqJsOJyVXKenrWX1R1bWNDHgqGnbcirFyDEsS5bnGxrXcHw0YZQMw3PE2Bs1KzA/EBYXhLU2e9OYKiaSDNN9Hl9nqYEqfWqYRoIKJT6BEDGz86wS8c5mjdo4NaQ3qIQSbL6YP5IW0AosLir7BI4chRNrBmG8mvok+xNljyuV1A7pVWpNUFzb951LfZ2nZQcl87ikWJ9APAELc1BKKlWfOj5b4EynoWUA2e1HoQ7aKWfapMCKrSAeGtUOnNi1l1Q5E4GBY0xkUrcsDiI7Fz1VaeCnEBDnUoqetV5yGqCm2oMazazeeUuDE6EYeNYmDcRUDU36a9u5fs53+CV1hpMe2DonhKQQm75aWoW2EXwrFM7UhuNJSkOLG/u12+cUQM0gMMPPDqJh87L0wkLlWRgMGFQDvB+Y0g3MSDzrzXJno0SNSAyI812fpBlPG5qX3V1m8caJF198kS9+8YsXuhkvi7e97W188pOfZGFh4YzPLy8v85nPfIYf+ZEf2dQPjisrKywuLnLq1KlX/dprrrlm9s3xq4ymafjSl77EAw888LIPqzt27OCv//W/zuWXXz5bHJwlcp+Nx2OOHTvG6uoq+/fv57nnnuP48ePnXYntTPsdjUY8/PDD7N+/n8cee+x18w3yLGZxpiiKgr/xN/4Gv/ALv8Dc3Byw9VBBRLjyyit573vfu0ElqKrs2rWL97///Xzyk59kZWVlg/J1dj97dXGme8/MTPzVxZlA27mURE3TcOTIER5++GG+9KUv8fWvf51HH32084B8vcbWp6QFRTUm1YgZ45ZVRTEYokDbBjMBDRGX1TxCSuvIC2pTGdliuVfy9F5FacFKv8AjLeR6xQloiKgYBIrJG8klnyEtwM8VhIFLap/AZFJbWpfYdooRgoANunNCldKAfJGTUAxEWOrPVAqLWrqdInhAvKlgULr0Ku9ACjr6ko2ZScebFiMkd54Em8RScXDE1B9SRCbFhLWmV29Av+g+k7bhdG+d/LNYCetRIUOSAJI8YKb3LUBQJcSaGIS5oSNIQVl6lsox84OWJ4+OGdUb22R+TBsVHPNzQshwLO1Xko9N4VO6E+YFI9FUL20yg8rl32N6XBMei0SrouZ61BA0UhaOEKOlOaZjOCdkcyknSlUIC/MGJi6eFw4eVdZrOvXT9PBk9Yrt3343oVdwZViUwd+0SiqnBeapFDFoVLewYw7K0iBVkWBlVp0pBkw0+fXEADvnPANnyrIx0LZKXStVAaVTxEeakAzlMdVPVOnUOzsHFWMNnBzXaIzsKJRy6BmFyLD0FEVJ3baEqAaDnacQb6bcLiaQqbQhUHqH90UHhEd1Y9ATS5lrY0pHnZqX2WA7G46XztLQQtTunEV6EOSczZM6QhuEApfuKf0NeIoPbQBIGfhlqKqYafZc6RhUJYuDAVVZmcE8LikEbfA0DZxdrz6Bs3wOeU5GUOmuO40KErvnZzGL7YiLLrqIT37ykywuLp7x+a2CRWCQYjgcvipgJCLceOONfOQjH+m8KmZxfnH//ffz7W9/+4zPra6ucvfdd/O5z33urHPhzRgxRg4fPszhxnyZAwAAIABJREFUw4dp25aHHnqIkydPcuTIEeDsi4Dz3feLL77IU089xbe+9a1Z9bNZ/FCEc44PfvCD3HHHHSwtLW3rsYfDIe9///v5whe+wPXXX09VVVx66aV8/OMf5+qrr+baa6/d8L4wgxp/8Zi+t50OPmb9ujHOBYPO9nhON3vkkUf42te+xv33388jjzzCsWPHLrg30fnGlgOjwntEbHGfzXGdl5QGRFpoObyXpDCwhX6Wi/SqC3tOXC7hbTDF1BzaV6YSQZKHj/PmnxLVwJRqRGMLKjgp07ECoi2lh8IXtFEoi0DTODyOGGKnZhLE4BektpgfjE9+TC4vXrWfODGax5GKpTB5AVFBg9JGcMF8V4yLpbNMSpvpAkrdRHQGhGLsOial8EkHg8RH2mLM6iR28CGbijvXw4ocGXhkQEE6h5w2tWvgWT/ZsjaGlh7wFCVI7LfP+3BeqaqCan6Nk6NTrK1HTmrEaYIapH6QPkWqU3OkfZSFKUT65iSjb+kJiQoJRtosMdiSYBTWR04sdUrFoJFqUnaIS6DOXpvnU1QDTwaCBOdid6zCQVUZlFkaGgTKXkUdiMj31TSFXeeZ1KuLMlyaK4Rx28/dzhcn7yPzR4XYwMnW+rwoYK6AixY9K7uGEAOTJnDkZODEWiS0ltK36y2Clo650hPr1gznNVi/e4NlHkEKT1sb0bIUT0uDrErHyfWG8Rg0wAmvBJkwP1+kqm3BUtGw1+VcLgOJQukcQvYusrldlgVVjDQh0hB75RdsSEETMXCFqinp6OcL9KBOxMajy1RN88mLpa35CoZeaBqrLBfSHM8QKoO97D9VOjOnH5QFC4MBc4N5nB8g3fwJqb0x64mmwG42VBdEc2Mtp627N6k12ACSAbpZzGI7wnvPhz/84VeERWfyH9qMcM6xb98+XnrppfPaXkS44YYb+Mmf/MmZ2fWrjKZpXtETazQa0WbDwDdpZG+xQ4cOAbC2tsb3v//9TUsHUFVWV1c5ePAg+/fv59FHH31dphrMYhZnChHh1ltv5dd+7de44oorth0ceO+7Qgv/+l//a2688UaWlpaoqsrWgQkWzYDGXyymAcfq6ir33Xcfw+GQK664gssvv3z2JU2Kc6mwzlapL4TAqVOneOGFF3j44Yf5yle+wle/+lUOHDjA2traBaly9lpjy4HR3LCyxVRsEDXH5NAGIi0RIURTFrmyoChLotqHndg0aUFnmgPjIyntxblUFUpSeheQ1ELiHOI8zheU1YByMEQQJpMxk/EaXqAoS5wvDExFTdWMPM4VVDjatsExTioV19EVIXZgKMMNl5RA9pj2iqYotEGJUbsqaDk1rcmqlJTehqpBNScpNc124qX3m8kpX04wFVGSU2XPI1s0K66INH6dE+OWNhiwGKQFdHMaKLJeowMWztmEyNl+US2V57lRy2prZclDSNBjCvZko2WXZBqByM5FR0PLeBIIoV/o50V+rgaXgQqpPyOmnpkfelrRZHA9rT7S9CMGO5LEJGQliYDGSFADRTE6Uy91KhCXzk/xziW/qZ42ODEfqBCjqcucmCeNmpG298rEK2WRXjP9awpadObh6ZzbNAccfen2HUNHGEXq1irCZZhmc63bVTdOUUEbM28eC+yYq9ixYxnfjjl6YmRzfGJpYIMBSBFZC5H10HT7Kwvr+4ipXBrFPMW0b1tUpRCoQ2Bch64y3nqA8SmlmDQsLXoGxYC5smJUN7Sq1G0LE7tWY4j4wpmZuAht6JWEhXPMVQVx3KBi6WW98kpSlbp0PXvpKvrlPnXkeWOKo3wd5P4deGHXfMWJccu4DebtVCZbpwhEYX0M67WdZ+kdRWFpk4OywDmPF4+4Mkn+EtHsdEiZ1uZ/E8zOkzhv2kEtA9iIM5AZWggtaDAANYtZbEO89a1v5ZprrjnjB5xdu3Z1yqKtCucc73vf+3jkkUfO6dXivWcwGPDhD3+Ya6+9dgaL/gLRNM15g7k3a6gqDzzwAF/60pc21TsoxshoNOLZZ5/lmWee4YEHHmBtbe2H5lvkWcwix5VXXsmv/uqvct1113XvG9sJZ5xz/NiP/Rh33HEH73vf+1heXn7Z8WewaHPi3nvv5Z/8k3/Cddddx9/8m3+Tffv2zdLA6cGQCTVi9//JZMJ4PGYymTAcDpmbm2N9fZ3Dhw/z1FNP8eCDD/KNb3yDRx99lEOHDnHq1Kkf+veAbVAYZdWAVUqKUQnaom0gii0mC+8YDAc472mDVTsLTbAFVXIGAVJJdANG5tWSSnAn6YGIedKI85RlxXB+kcFgDlUoihLvFGKLS5WMmsaIj5fS/JOcQzWrgEx11IZADKYGKJylr7mUKmXpW51ziSkLEgjCaef9A1n9lFKUokGwkNJwkOyzlNOtpm+A0v1SgaAp5SwrI5IMSZPKIRQTTkwMFmXlzrByRDXlSZc+lcGNmlGwOjPerhtLadrw06TsrAQ0QlIfibN1b5v3l6t1uUhR1oQmUqYS51k5JRkSuf41Nj/S73SuZeFpQtst1WPs09a8GEgMOLzaWDhn6g3JF2SGWqn/nLN+tdS9aVWSAQr7O6IERNT6rhBCUOvzqKizvmqcMphXButWnj0ry06vgJZVLCLWXxkoa/pn0mZCnYyqOwPzjaAoP5ghZVba7NoxR9QKT82kNbWOiAHCvcuC9zH1DZ0MKgu0AqYk8iK05Daq5bulg9UxmsorZjhowCwEOHI8MJqMuGixZFh42lTZcBxryrJIwEftmgpClVzNnQOfRqX0QlUUtCHStjH1tXbeQhGrPFgVQuEc40apYzRgmNLVcj8VLoElUSZROb5eUymsjWCtsT4oU9XCuUHBwlxBXRc4MViM+HQF94b3ZkwdUXVdOmGvHtQEeh3qeqJryifraHHpTJ1DXIETo7+iVsFx+jqexSy2Om655RbKsjzjc5dccgl79uzZ8g/fO3bsOGultaqquOmmm7j22mvZsWMHS0tLs8XALLY0vvvd724KLFJVTp06xYEDB3j88cc5cOAAJ06c2IQWzmIWFyYWFhb4pV/6JW655ZZzVsfc6ti9ezcf+9jH2LlzZ/fY7H1hcyL3YwiBr3/96zz99NNce+21rKysdM/NUtIsVJWjR48yHo+7uTgej3nyySe59957eeyxx3jqqad4+umnOX78OKdOnXrDKXi3HBhpzIsuK3cPRhBiUGJs8c7jXIlzBST/HfNRSd/ZqwEYSWDIqoXlimpJg+G8pbR5h3cecQ7nPc65ZLgbU7Uxb+a0Ir1iIZcJQ/CuIKpVSSvTt5oqgtCCWpWt0psSSKMSSJXZkrogK0psPSldRorvVv9KFINMIXnFaFqkuwTAJOeuIaiYp4tz0vVF2k1SXaTtsAvfl7AWaqumldriBCYhTqXO9CbHISmGaitcRwiSytD3ptch9GXIoYcVUTuLn+QxBJJKmDdtZMfCKU6NlSaZ0mRAdaZ0u1ziPJ9bGwxEeZdLkNs+um2wRblq2KDkYYNbjf0dJSAq6Q0ve/XY3HEkjxwN3Q3RiQNvN1AnNsYR8wFqG6VpU0Mc7NwB4wYmU9A4e+pkiOilV2Nl8JWfPzbqXxjSfCyk16+c9RatMPCwOCyI6mjaQNPkioCwOIQdC0pNX5UvpyZ2bZM8RyWBkWzgrR1kqhtN3kL9+BVeqJzNkVPrytqoZse8MD9IBuNq6Z8+KYMKB6UIrrCFqveeWkNSdtm1PDeoOLle08Y2mazbNWYQyFR6UjjEhS71S7EUV52qfOaSx5EKTKJVYbtoh2NH65i0Fd5XFEWF+ALEUQ0VjbFT+aU7TddPdk1HYmjRmImdqSRjxroSMOv1XgWIRINlCOoKUJfaLFP4O4GnmYfRLLYpzlYRDWD//v383//7f3nf+963pR8O5+bmeMc73sGDDz74sudWVlb4q3/1r84URdsUe/fuZX5+/kI344LGa5nr2e/oySef5Nlnn+UHP/gB6+vrP/TfIs9iFgBvectb+PjHP05ZlhcUGnjvWVhY6IoizWLzYtrY/+mnn6YsSy6//HJ27dqFS4V/3ux9niv2iQhVVfHII49wzz33sH///k5Fevjw4TeFinTLgVFdT+w/IhRFQTazFommaEAJMVI3Jn9p2pjMpmNKwZL8ZT7iHWVZUVaVKThCC9omr5kC74sEk6Q7dk5ji6FNfisQQyCESNsEQtsiCFGFbP+r0Z4PCfyoChIVTemcklLkSGkzLtGiDFGi9sv9XMXKwIYjG99al5hfk0YSRxOCSFdlCyCm109LTlTNMyYypU4BNMBACgZzkaCBtcYASa5ANqm1Uw11lkhpp/3atQcI2XMnAyZNyqJp1Y8kIJIrlIFtP6ojdTtVunwKGpFVQkypcrT/iVgp+mLoCPTVzfpN02LdkUZ0CgUlxVBWD+XejglCxBg7uBCS4s38tIKlQIla6mRONhLtUue8g+DMNBoFBrBrEV46YX2aVSi5r5rQdbCBQptOnZKoAzd5XNkYuUu6P/J/U3tOjVt2zgtNSh1zwEIlXL3HUQxg0oROmeRcErbRw5DeW8mujEIM8iQmwsn1xjKn1MCPdn1p7Z6rrALZ8VVlbdQyP2cm0SbWkk5V5p0HccmcXahKT6uOug3UbeyUR85JUhU5YoZYqcHjuiWk426YDGluaTTYRZ6bCmNVWpRh5RlW88CcwcI0B/uy9rHfEZby2I2JKmYvb8eU/Ldqp/gTjcmAPhntO5LXWIKG9KqkmDo4akwwnVnM4oJH27Z885vf5KabbtpSGXpZlnz84x/n2LFjHDx48GWPn00BNYvNjx07drzp4dy73vUuDh48+Ipm1jnN7MiRIzz//PMAHDx4kO9///vUdb0dTZ3FLLY1RqMR3/nOd2iahksvvZThcLit8OD0hXpWOb3ZAcZWhHOOt7/97ezcuZOVlZVO3ZvTsN7sqWl5zi0tLfGud72L3/3d3+XOO+98wymIXim2oUqaLVo7WukMuLi0YLPS9VYGPiI0TSC0TbfI7YykxVQiRVkhvuzSOTTkZWwCNCltTWMktC0a13G+sJSvoiKEltC21G1L27Q0IVraSDBQlVU4ihLbSAiB2AacKqKm2nCiKbVL0oJcs9AJooGfqCQ/pbQITYvDqGn5KeBFbaGLGTQHtDPzbVEa6WGRc8lPh25Zm86XpAhRtFW8DMwDqGogjKlT6lfloRwKJ0ckZROgyU8ng6FkEp0hU1duXV+ueDG1Se9n1D2X2n9qZJW6slplOpWKrKLRjfvTNIwaYXU9sjw0A2XnpftAF2LvaSSYcg2R5JWTUvxU0ASaEPtWQmNWqUGIkRCz2ko70hM6tVmCIxkUeQOBzluVOBSqdMY7FmA8UU6sTxkxaw8t8szM8GO6D3WqX3M/Z8DTeUh3Ldq4rfewVtfMtxFtI5MmsrLk2LUsDOaFUYi9b9RUH2e4KGowNkTzciKG1E6Dpk2EAY4YY9cHGTBN+1ENKofWlu548hTUg8iOeaXE40Rom0CtLVVZ4AaV+Y+FSOkLCh9oY6BpLT3LOate2ETtlEaC4L0jpIlaFeYN1ii0MXbztE8js47KaW0hwnrdUPnjlB5g3iCySjfG06PSpYhNTU5NxFrJbUpjkrzHtDMUky7VL0Zw3sytVZMfU7pYNbZoSnN9Y38fMYvXS+zcufN1AweqquKnf/qnueeeezqz4fe85z3s27dvthjYpJB8vzlHXHHFFa/5OKrKsWPHeOCBBxiNRnjv+dEf/VF27dp11uPHGHnwwQd55plnuscuvvhibr755m1VEYgI119/Pc899xzf+c53zrntgQMHuPvuuxmPx5vqdzSLWbxe45lnnuEf/aN/xN/5O3+HX/iFX9iyYgjnigwtLmRK3Bs5cv9677nhhhu48sorKcsSESGEgPd+0+7HZ4Ly59r3q91+O0JEWF5e5l/9q3/F6uoqv/d7v/em+sJgy4FRLwYw1/C8SNIYEokQiIFIJERSipgpUDpz6ZTMIViKiqi9LqaUIhdz9SKXFEyuq6ClRKtmVhQoBdJ62miAZtKG5JWUyrQ7oSgLvDejlxgjMQQkpSRpqorlfH9eDk0pR9K1FZcVTy4pmiKRYIoWNVhU5IW7T0qSCE2I0Eq3iEze3kmZI/jCUToovMN5wTufFq7Wr94p8/MRygkjNQBQJoixY+AZ1ZFhKYwb7cYGhCb0Kpq8yJ5WBmUQlitMQQJAGWblv9O6WYBJCy72qiTV5JuTtlVJ6ivpoVf2pBGBk+ste1bMBJ2oeN+Dim5VLzZffIJFBrYSLLKX4dNNJ8O67GUU1Cr3BQ1otD7tlVWpbLtqSoszpVHmAsYGbF9lAbtSatq47qEXaUyVvl+SkGxjWliiD6ffBzOUyNvndC8wL55hKWho0QRcmlaReUVd5OhEO0Ny7buqO0Ye6xh1ChTaNiFdf+NazYw7G5q7bnYbdNOcXhcpCzPTblqYjC11b26uZW4QKZw3w/WmTcDYURaWxFmIMPBCmzyuVLBU0gLqNhKiUjlTDmUlmRc7sagBFenSyQrpVX899rPfUaEOLcgxSgmgCzb5sofQhvelKQVgJ/vK+rW8xylErXk+Kp36L7dDLeUtJmiJGJm1ynFTcq9ZzGILY9++fXz605/moosuOud273jHO7alKoqIsLi4yE/91E91HwrPB3DM4vyjqiquvPJKvve9753xeRFhz549r+kYqsoPfvADfv/3f5/V1dXu8YMHD/KZz3zmjPMtxsg3v/lN/uRP/mTDt7POOfbv38+tt97KW9/61m2bC4PBgI997GOA+RmdTWl02WWX8c53vpNvfvOb29KuWcziQsfKygp/+2//bT772c+ye/fuC3Z/zlAj/38WmxsxRsbjMbt27WJubo61tTUOHjzI4uIil1xyyaYco68aHl/1e/302GfF2YWYD9OeTvv27eM//sf/yMrKCv/1v/7XN03lyy0HRt77DhjZUioZDov5ftjiO6llADSaCS0RK2FvsMieijRNQ6rETQgtjoCIwyc/IFOcpGPkevZI+ubKJVVQQ1BblDaTFjSlylQ+TcacTuOtrHoEiLTJt8hldQKYWgqDNQaRBLzHynB7S29xRlo6dQfagSBX2Eo9BJInkpWTD53RsMEo54wLOScU3ptxty8SPAuUvmZhaULwNaPWvGdSdXO8wLi1ymG7BwXjCazWMYGePvUnK1ty5EvRnQaKes+grPRJAGL6dRmSpPPK0aTuyK9jCho5163PGbeR9bFVJmvVqlnl/Wbg5DWbhfdL+axms5TG3FjfkSpJB9aoqCilcwQNXYnD7GGT5UFZNVT43vOpAzhpzIsCdgyFSd3Dik6Fkq+D9DtMKWEiUEqfrpbPIfeBTO0r5nMDBkV/zqGNNK2aAidBCi8GlTKsmk4vzMXduqsxqil6EpgJ0RCV93aucwWWgod2CrFpKNbBLoGqtPk8aZRTazCeRBbnlL2LFeo846jEpqFtBV/YtVZ6j3cGS2OMiePY9RUxU+nCCbvmCo6NGgy3bPSqyqbeHigLg0htpzzSNBWFto344iSFKDHOAemNZ2pMbH5pBzmnr/NIzBmG3fnLhpZMoaWU7qianYus4yUBJjcjRbPYhti7dy+f/vSnWV5ePud2V111FT/6oz+67R/AZguArQnv/Tn9iVZWVl7zYqBtW774xS9ugEUAhw4d4p577uFTn/rUy15z9OhR/uzP/uxlUv4YI0888QQHDx7klltu4aabbjqnSmkzo6oqPvrRj7J7927uvffeM374L8uSj3zkIwB885vffMUUtlnM4oc53v3ud/Nv/s2/4UMf+hCDwaC7Di8kNJrF1sSJEydYX1/nhRde4LnnnuP48eP88R//MXv37t00YAT2ubptzULG7GleeUzza5xznfp0+t57ITyWchsuvvhi7rjjDqqq4j//5//M2tratrbjQsTWA6OiTGlomLG1mD9JE5SYJk8vr1AkVVPLSqO8gLfqTpHQTGjbJi3uBPUOr8kAWqSbVDFauhuYnDGWFYX3aZHvCVGom0jdmPdLVZm/kKkvpkp5p3wXxYBBX9koL7jNa8mnNgogEXwEVyQ/FDWD5cI7NFVYc5JSzJzgvaXZ1C1oa1W5rLR4Ui45Mwf23sy8VQqilDZ8olRFZGGpZqQT6lTRrAMNEVoMkDQt1DGYMXDawEmvGJGpxwwEiFV0kl5RkZVVHUxKw5eNvdswBY6cwZTclw4TVrQmBqOgP36GI9m/KSi8eKxh9+4eeiD9fgRL4fNiKWbWNofvKHRmPookf6KoDokJ2CXIIF6QmFLOMCWRE/ORijkvDOlgiXOmuMpG3alaOvNzymAEo6RW35BuJv1jG25tiQ4VAvXUE6fDpg4epX4alkJID8bQMKmjVXoremBlSjbtxihXssvnADa+MadFpX6NwfZbmPc3i8MSNxCUumtTztzL6V/ZwFwclDjQIbGONPWYE61SxpaVRTO7DzHSGK1FHAyrkiLdEwqXTbdT2qH3jEPEBVier/CFp27M+DoDrQweY+pgTfQqe0+p2pxzCeZOQiT4VSpRNM71UCjmlDPprm0lzzftBkbJH15yX9tBXJondhztyZ+GZE7fPy6kYnR5sGcxiy2IhYWFV1QWFUXBtddey0c+8hEWFha2sXWz2MoIIbwM5ExHURSboiY7W3rW2WT6+/fvP6eEv65r7rvvPh588EE+9alPccUVV2zLgmAwGHDrrbeysrLCH/7hH86g0SzetHHjjTfyW7/1W9x4440bUsFm0OaNF6rK008/zbFjx3jiiScYj8e0bctzzz23ARRuVnz/+99nfn6et73tbefdvv/xP/4HMUY+8YlPsLS09LK05QtlzJ3T0/7Fv/gXAPzGb/wGk8lk29uxnbHlwKiqSpy36mjOe/v2v+1T0HrlSk7liCkFyBJ4FPqqaOkbyYB0cMOLDdyGSaSW/haCVb+KIRKa1vyCYqRJZrt1YzlTVeUYlo6qcpTeEYG6DUzGTZc6oqlaE+IoXAHOpccsLShY001LYIZESBtxKKUzBVL2ICJBFnG2MLcy87Z4DwolYmlvSPI+sWpvReEpEqFprcQbgyIwv+MUa3HMuElr1Cya0ClTaSxlatLErrpZG0zBhFjbU9cBOQXJIEVWVLnU5lzRK6t9nNg4Fg4qN6VoIQGVaOqoNkmNREBCAiBFn36YvWgykHjpuDKccywsGuAKU/IdIaeoZWphdau8CEXhTNkUYgI72QAbiIrz1qgQzV+m8KYSU01VtpJyKAPA3IUuKY1Uk3IqKWuSmIzFOTqjb5W+aZ0i5zSTcBKoKwUqgXrqWLlvp2+Dgql9fJHHyAGRSRtNcVX0kMq8iXoYiBpkybRtSiDUlbIHIUTBuYgmxdhgOCSWBow6UKP9PEkZYgQFnztD5ikKj4sDYlzn6FrDsGjYvTTgVFBCaIkIoyYwnjQszA2YLwvGQBsCQUyTE9JZx6A8e3Js6ahg1dPI5vJ5bKb8gFwCMwriHDmlNc/vto244pRVsIuDLg1xmvDlCoydKfyUwZSSPcz6AcsvzS3KyiP7tzfN7l7S0TdmMYtNDxHhAx/4AMvLy2f9MLVz504++MEPct111808It5gMZlMePrpp8/6/F/6S39p28e8bVueeOKJ89p2dXWVL3zhC3z+859nMBhsccssRIR3vOMdfOITn+CP/uiPGI1GL9smQ6OmaV7R92gWs/hhi+uuu47f/M3f5L3vfe+G940ZLHpjRoyRF198kYMHD/LSSy8hIiwtLXHZZZdx8cUXb/rxnnrqKYDzBkYnTpzgt37rt/h//+//8ad/+qf8/M//PDfffPO2G7CfHtPH3rVrF//sn/0zVldX+e3f/u03tMfd1nsYOd8pi8CZWqb0iDZASJWb8urJVsjOCahVU3OQFvjJzLorYS047yi8pywcrrBKTKb6UUIbaNvQKU+QGpx5vZxaGzMaTSBEBoVjblAyNyyoyhJxhUGVEKnbgEYrkZ0JiffOUsGcw3lTGMQWVCMkA9wQkuFPAlrqDaZE1yt1cqpZTAtQTbXXnTfVUSGpmlMqye3E4Z1LYCUSY0PhGhYX11mLI+ow5TsEvUVKUpZEhWGVUt+SZ0xI6ovOXLkjGfTL3QxF6CGQS9Cj8+PJqglN8Mf3QEfSa7KCxyeFi0/woUpFcaIxn94bp4VJAy8dj8zPOyLRFEmua1KfsiWK72Qutlj33hRFNjjWSJGcMGQgLkiCDqnjJIOA1HdZaZUVS971oEySmXj+cQLVAMoR1M0UsMOUOl6gyQoVetURwCB90bsu/XmdbpCdHx+W0imGnPNEDdRNpPLKwsARJW5oUzc+qf3Z1yhibxbTUCr7PJEAoHdwYn3EYN5TVXSKtW686BVhLs0HyzEsKIHohsRYEuOIE6MRO+bUjN0xuDv0pv5bW68ZFp5BaUbZdQiEKCkNUYjiGNVtd4vIgBLJqjAz7+7mYEoCy2o5KVyCxZpeK4yayHyxRlk4JnXZeSGJ9LAnUydJCqF8HRh8lAQps9/VlPeRSgJMmsy1bV+Sz6fjXBtT62Yxi82Ka665hne/+91nhQJFUXDbbbfxrne9a7YYuMCRK9EA22b6fCE+cDdNwwsvvHDe29d1ve1lilWVpaUl9u3bd1a4VZYlt912GwcPHuTIkSPb2r5ZzGKr4i1veQv/6T/9J2655ZYLnoI2i5fHtKJxs8YlK1GXlpZYX1+nKAqWlpa4+uqrz5nS/Gojt/fWW2/l5MmTr7h9PtennnqKxx57jJMnT/K7v/u73HfffXz+85/ns5/9LJdddtkFnZ/TPkorKyvccccdnDp1irvuuusNC422oVaeeQLZItVSgzTXagc0hq5SlXdCVZgrUOy2MWyUF2VpWY/zDu99AjgexREjNG00WNRYFTQngmK+R0GVSR0Yra8Tm5rSReaHnvmBoyo9vii6dLCoVjUrtIoXS33yHaywf0NKVet8fESmloC8rCbiAAAgAElEQVQ9bNFoC/xUQbxTc5iRsnQ7cM6MgCEbd6f/i3kiFaI4Ak4jQmTnUkPjxkzq3munU2xlmjIlnPAeluY8x05F2rSAzSokL9J7MNHvRIDoQJOvUtDeiLsT/OT9JMrhSGBHTBFjZeuT6iNt7AQqLxRiqqrW+KGlq+UUMQ/rEzh8VFneKbQoRTqPron9NLPzT+lpqli6Hw4hdqlzkLbxyaQ8zT1x2nlqxdjvOPtAZUNwr+YPFAOEBGAKD01KTZsbmPmzaX/sXNT3Y5Db2gEX4GQLpZNOJSNsHLecClU4GBaScmgjZVmgUalbMzMvvNDEHuAwle+b/aE6yBOn1GfSw6Bs1F0Idi2KXUuDAV2KVj+Hp8CXJu8oLXtKlfx7vBsyaYVnjq0xXwp+UKBEloYlZeEJo5pxGxikamyVuA7OhShMmkBVOGJQYqKbjsRks3IsN0P7KzD3o7VTKL1Y1TeMZLYh4twpvJ8ntKVdM3aW6fV2L+iveRJ0lG7HMp2jOXW95cu/e5Pv6GZ/vwDpzLxnMYvNisFgwAc+8IGzKjN2797NbbfdxvXXXz9bEFzgCCFw33338fDDD+Oc46/8lb/C29/+9tc8LgcOHDijQgZsfpzvN7znigwdv/jFL77sA/KZDLUPHDjA+vr6az7uVkTbtjzzzDPcf//9PPHEE69YLnn37t389E//NHfeeecMGs3ihz6GwyG//Mu/zF/+y395pjZ9E8XRo0dZXFxkeXmZZ599lvF4zNGjRxkOh0D+snzzPiOsrKywsrJyXtuGEPjWt77F8ePHu7YcOHCAX/mVX2E0GvEv/+W/pCzLTWvbq4n8uX4aGu3du5d//+//PcPhkP/23/5b54v7RoptML0eoFgFqhAa2mjfGoUY0BhoQwuqyaOnoHAuKSyEmEGTamcgG1FcUhJ5780MSyyvK8RIrCOhbU1dlMqrx7YmhoYQzbNIQ0PpIlXlmBsUlEUBCG0baAI0baANEYlKIWYI7J10P6qBGAwoaTJX7haBIl1pekkQxh5PRtdJWYSTlPYj3aLbe+k8VAwcTOEpl+RABNCWhWFEqgnjWjvPoun0mA3pMpp9jKBUZeAddQgodMqkKEqZUuZkCgYoWTkCCMkvqvuz27+lriW4lKhVAFoHRVItxaziUBNOTTBzblXQBlyqQhfEni/S4vr4qlW1W9kpDL0jhIj4vJBP39Bq7C9edV3KVD4PW6hrB/BCjD1A0nQhZBCSzsE5U0iF1HcqEDCFT1mkKmMhKaZSamFVgR/RV/5KEiOdaks6RAeDIKdW0qWqpSnThcOUSKacMp8lJwVt29C0sHvBsaMqOD4JffpenDKqTvNhWtDXzZM0zlndJZrUSN5gGAlmdX2Zz0P6/dhxhBBKAzuZuqmlc4kG1msoNDIcGBg7MZowKAvGjVUinEyscuKgcHgvLFQlTSsoE9rY4rxQpmvDoYSUFybiEiBTU8wlUJZTzVTt2huWnmFZUCu4aErAEANO1nHFDjQWkC2181wlwVfJoC5DN1Op2RDm86R/bd/N6Rox2+wemm68hmYxi80IEeHGG2/kR37kR874fF7oboXcfBavLlSVb33rW3z1q1/tlDR/+Id/yN/6W3+LSy+99DV9UB+Px2dV5zjnugXBawkR4YYbbgDgj//4jzvIsmfPHt773vdu2FZVOXbs2LYrhl4pVJXV1VW+9rWv8d3vfve8vxnOVeY+8pGPcOedd74hFwezePPERz/6UX72Z3+WorAl4eyLhNd3bJbaqCgKLr/8cuq65rnnnqOuax566CHe8Y538Pzzz7/m96HT49XsazKZ8Od//ucvuycvLi5yww03bEtF19PjdMPtbHuTWcTevXu54447+MEPfsA999zzhvO523JgFFTQaHAiNC0h2htriIEYg6Vq4RCNiAZLj0qgxdZhEVUzxdVk0JtLsqtaNTRfWAW0OkaatiW0AYm5gpbDSUipIwFPYFA6XOUYVCXDqsSJ0ITAZDKhbtSgUtNSOEuZ8T79JN+iJhjoattktowmH6JchUuSimHaYymlx7hkZu0znOnNiXN2VIjmxyOiVgXNJTNwDIp4r8ztaFkNsasGNR3TCpA4tXiNEfYMHS/UsKZWfSxDlxih0d5nKaupQDrvGNSUUlH7SmcZRKhY6lUGTnn8JGb1VTKMpm+Ppv2pcQJahCCKeHt9PpYAJ9as1PvFS8LyYkmQlijRSr6LjUHUCOpwziBCspwip5VFjXjn0tzRLMMhm5qL9kAnVV3vAFLIUMz1qU9lYUqomOBS9jgaVBAnSWE0PS5Tf3fHoVcEFU5owmkKGXogMyxtHgWFohDEFTTthBAjc4Nig+Fz7vP8Wk073HC7VsMjjj7NK3NGTQRSnHRqsW686b2vcngxo+02eNpgFQ7zxiITotRMQuSkwGi1Zm7eU3ph1LYIwlzpqQrh1CQwaRUJSgwNeG9poSjee9pkmu3zBZMmZumhCWnuSprbmnGrMiwc3gmFFHgRTobagJgz/6o2rOHdTmIsQHvvK+j9jzIQNsaWJ3hWGRlt0/6Z6eZlPdJpc2CKDs5iFpsQKysrZ/2W2DnHj//4j7N79+4L0LJZnB7j8Zg///M/3wBRRqMR3/jGN85YYex8I3+Q3Y5wznHjjTfiveeJJ57Ae89tt93Gzp07N2wXY+Thhx8+7/2KCDfddNOW+hepKocPH+auu+7ipZdeetWvFxGuueYafuInfoI//dM/fcMtDmbx5og9e/bwi7/4iywuLgIzWPR6js0sJ6+qDIdD9u7dy2OPPdYBoyNHjrCwsMD8/Pymw6JXA7qOHDnCd7/73Q2PlWXJP/yH/5CPfexj3Wec7Zqv06qitm05duwYP/jBD1BVrr/+eqqqQkS4/PLL+bVf+zV+7ud+joceemhb2rZdseXAqGlsGRo1WHWz2Br8QSl8gbjCIElb0waDOi4rBADzJUqeIU4oxSHeSm2XhRkce28pbCEE2rYltA1eFV94nDPyZ2Y6HiEQY6QoPIPKKi/FGAiNeR7VdUsMIS3+EznMcgsckZAUFKEDOLYoNEgkYgllVtGqr4KWFSgZLtmPdP5C2UjZvKyTOkLUAEVe9ScVxXBOmUhDHdgAF7IaaNrLKPEQWzyreQbtKIWjI+mgQGdSraRqVdJVAYsxTlWM69bFG7JwIHWvQJEXx7qx+lkUM3fOa+sOhiRK0bSmcnLJuFnTdvmcUGgaOHysJQbP7ottD2WCGTm1xztN6WNJHdIRk9SP0dRs5t8Uu4phISmIfPqJ9O2UBLuKpNxRhMJhKXIeYlLiFKly13AAo1QIRpIRUiHQpvPvIN4UEVJMxdZE7dPZ6PupdFAmYCRRKbxHRWjaQFAIBMZN7PyWnCQz6lyhzlkKYDZsDmEqfTJBD0tT09OSsjYCqG5aSQ+X7G9BQ0EbJFUWzI83lEXDJMQOMjUR6tXAcGDnpMlUXSXdCzIcbgLQmLoHwTlhrihxbUtoo513gnxzZUEbgimiIlTRxtg5mK8KlqqSY3XFqC1BHE7HqIyJGnCF3X+cO4VzS6gWnQm7LeZiUiv2ikFJVLGrp5b+zr5e2TPLxtk6Ll9vkO8ZrpdpzWIWmxA333zzWaudvfWtb92UdKdZbE6EEM6YonXq1KnXtF9VPSec2bNnD1VVvaZjTIeI8J73vIf3vOc9Z93mxRdffFX+RZdeeim33HLLlqXHqCovvvgi/+t//a/XlFLmnOOmm25i//79HDhwYPMaOItZbFN86EMf4uabb569L7xOYytBtKoyPz/PaDTqPIycc1xxxRXs2rVr0+fE+ewvZwU88cQTPP744xue+7Ef+zE+97nPdQrZ7YZFMUbW19d58skn+Q//4T/wla98hbIs+exnP8snPvEJrrrqKubn57n++uv5lV/5FT7/+c+/oVKWtxwYjUanTK4RW9AGSBWZnKfwBYhPao+Ctp4kY9q0MEs1y1WSEbS3SmGlN8PpQTWgLEsiQggNTdPQ1DWElrIsLGVkSrGTpSviIpLqo4uvEAlYdTbFERFvZewLbybdiFVmi1FpgtJG7SpsyZTZLSQ1kWSlEV3ZeHeaUsOlNDdJprohrdI1AQlJMGl6heqcULqCwXzDaqvm99MtzJOaCYMEOQNf6PebjYkvqmB1UDBumy51CgwE1Qqt9NAh5DappVkl5tK9RqRXDXUwRKaOPfWflqRCSu10mIpoXKcqW/50hUsPnDpgIbA+iRTiaaU34c77E2dpiIjDpwPl9qtmhYd5UoW8/14s0q3fXf5H+2OrWHsRxXmhKCBGSRXwTHHUtAblqsIqpg0LT6O9H0L2SZoOSSCw9MK4Na+iOn1BnJVBZQGlFwpnc7H0pueqm5QS6aFI3j9g+yi9o00l8WxstOur6allY6rm35UqF2Z4qJj3T4ZGeVBOV055hCYWnQcVCuKUuaplEkNSd9GdlAL1BESVolTq1q6tDKgUS0MMafBUlbnCszRX4dyQl46fMnPsYK2axEgZoMAxJ45hWdA0LfPznlXmGLcFaJHmg+BkEWEBpaFtTyE+EnSEF4+wA6TApTQy1bbzMnJd7/VzRcnG2L2nWdczWfWV662pWgdpJM4+oM1iE+Oiiy7i3e9+9xmfExFuv/32bas4NYsLG+cqXb+ysrKpwOh84tFHH31FX6Ac+/bt49Of/jRzc3Pntb2q0jQNBw8e3JAWt7S09LK0hRDsC8MjR47we7/3e5vyYX44HPLhD3+Y3/md3zlnv89iFq+32LVrFz/7sz973tfaLC5shBA23NNeKzAZDAZ47zl58iSqyp49e9i9eze7d+++oF5WMUa+/e1vbzDI3rNnD//8n/9z3vKWt7zm8z4dwp2+vzNBuhgjR48e5Qtf+AJf/epXufPOOxmPxwD8u3/37/jv//2/c8stt/CpT32Kn/iJn+Anf/In+cVf/EX+7b/9t69b775XG1sOjOrJiJwK452lgMj0inPq2/dp3xXvnVW+EpfUBY6yLKlKR+npyszHaJXP1scT1tfWCU1jpsR4ggZCG7qyXRkcuKm/86LYeY8rClyIpgpyluukCiEodbDjNG0ght6LJAMgSYqOssA8lpKaIAMkW6h3S/WUIpX9jECimL9RNkju9mtVp8R5M1WeCzQyMXWR9kbTgv0O+nLgYi0xT6AmwJwTFsWx4ApqbTr1UEgqo1Y3vjBDhSl7lm7o8mZZNdWlqNEViusbMNVOwY65Pk4Vv1LJd4VO3dHtl95sWYC6VUILUto+fFLxWDW2mPrcnG4ki8um/LBEzWw8Gz9LqtrWpaQJvXu49P0srlcROWBQJGKljrZVhh6awhRbg4EBNu+F0E71RT53ToNh9GmLBjf7NDknMEjqIsTUVN4baG2CpXXODxy+SG7cmDdUbFLlnQT/Ersw8/IEZGK6FEV7OJir2mUT7AyQps3O8yXcefqoMGk8MQohgicydDUBS0Mt0nuc5rFNY96YhRlFpTTBDKlzCljef0jbxygUvuKipV2EsYe4xqi1NMG5wpSAhcK8d+wcVrQEnm1KxnVJgSl9XJq4SvYjcqAeYYS6dbwbEZoSWEztFVQdqqHz6sqeZSQ1V5d/iUw9nkGyVT0SpmhZaoP0f81iFq85Lr/88rN+8B8Ohzz55JMcPHiQa665hr17925z62bxeolLLrlkW4+XAc35hHOO22+//WUpbeeKY8eO8Qd/8Ac8++yzXXrfwsICl19+OT/1Uz/F/Pw8qsrzzz/Pfffdx6FDhxiPx5v6If6SSy7h7W9/O9/73vc2bZ+zmMVWxwc+8AFuv/32bsE8Uxn98MRmjFX2rHrhhReIMbK8vMxll132qu6/mxkZ1IxGI+65557ufj4/P88//sf/mNtvv/01paKdTa01be59pm1UlZMnT/I7v/M7/Pqv/zqrq6sdLAL7guapp57iwIEDfPnLX+ZDH/oQv/RLv8TP/MzP8MADD3D33Xe/IVKWtxwYaVIm5MGIKgZBVIhtMCNhVdqUcx+TCsSl1+YlVa5GVaTFPRppmoY2wLhuWFsf0da1KZAGVTKhAsRZ6krbmk+StzQSWwQqqtFK1hclZTW0dLCoKI4QlTYoTRuZNIG2jcSouJRWVrheLVR4qyplj2lvDC3mC+SS6U9UqxIXRXBqJtJZOmP7MnVFl0qVFpamMFLK4YQTk9gtojMIyBW5pj14MrjRRCVUoPKO0RrEOlKqoMFMlNvU3s4PKatyxPyKsloqiWF6JYX26Vsx9ubNXYqb2QrZKMa84LbxbOukEJryw5HUhtyMnK6XYQcJOKyPYaHq1TEZinRpP9IbeAeNCGKLf+ga0/HzKVDkxGBNTPvKRuV5Dmuu7pcaVRbmlTRXQYFVgxMiYQDjSYZZG6PInkjaQyrnwCW1mmjfzwCVtypqOYdN1QzfQwiM69ClN46btuurjmP006gHVCLd+EwNNzFoN+ZBoY5QBGWgG5VlPhmSt9pzNVVPXXu7RgDnWqKrmdQN3mvnCZXTDAvXz4+mhUqhKJWmtQYI2fNLKFQZiINWOXp0zNHnnmdZ4ZL5HYS5iJQt601k4CIDB8uLDqkc+1cLjteOpo1o8ubqJnF2/05eSxortBX8cMz8fMPxUw02onaPgAQa88RXIaZBcvk6ldyT0v2ytNSpCZ4keBkU/vC/hczi9RBVVfH+97//rN8KjkYjvva1rwHwwAMP8JnPfIa9e/fOFghvwDh27BjHjh0743Miwr59+zb1eDGrrUW6n+lYX1/nqaeeOq99vfOd7+Sqq64672MfO3aMu+66i0OHDm14fG1tjUceeYQQAn/tr/01jh8/zl133XXWfjlTTCYTHn30Ufbu3cvFF198zm/cnXPs27dvBoxm8UMTO3bs4Od//uc3fMnwSsqLWWx/THv/bAV0iDFy/PhxBoMBzz//PFdddRXLy8ubfpzznVuqyqFDhzb4F91+++38vb/3916TEm66D6e9oFSV8XhMVVW0bdupb/N7maoymUz44he/yH/5L/+Fp59++pxtP378OL//+7/Pd77zHf7+3//7XHXVVVx00UUcPXr0L9z210tsOTByTroFcETQBIsybJC0EJNEN7IHS158CVkxIoi2hCA0dUyV1qCNQt0EYmipyoKqrBDn8EXF3Pwizhe0TcNo7SRtM0npLVYGS6PBq3IwxIfYkYF6XNMEM9et20DbRFsIq+JEKRIgck46UFGkSlk9eABRwfkkcHIGLFBHSJKNgKlQ3LT8QzT56mjWLFhHaqAqlCi1lU5P114GQoqldInrwREkYDOl2FlrIyKOeSdIGyFMQRuyWsSUJxn8SAI+eZGbtxPSdkyds/RKlAx/ctdqtDQt+f/tnUuMZFX9xz/n3Hur+jHd08PQzAwIKIPo8AiP+MCAw0MSMRKjCRITN2okunFhjFEWLl3pxpi4c8GKhQGCEhOiYAwQlL8JoAgMKjAE7NF5MTPdXVX3nnN+/8U559atec90jyL5fZKG6arb93luVZ1vfX/fH7RZM+2K0hipipjj4wNtlg+Mj4e0f4dXAnPzMdw4iyStwyntZQxyTmKSteNMIpsUA5NFyc5uJPGpsONznMliiZEYaOSdwRFLyapegQvC8oGAL2BuxlDXUBUwMrH8rb0n0nhxnlaogyRAQipTHC8bs4c6I8IIZVkxcrGUa7Yy1D4wUxnq7GvpXKjuNYFUquaSWEoS8ZKTJ5AEwRCdVK5IW+18Vs5ZRFnUsgaCL6mb9GKMx1ZDhr5BkLbbXRbJstCau/t5gVGd7qECvJN23JbAtC24oFfRt4IfeWQIW2yfmXcMoyawd0Y47B3vX+wBwjuh5MBqjz2DwMooOq4kCdVRvMnfJsQDFTzGCATLYLWPrwwEl4anpJ8wHv8Sr4WQ8spILkWTxPDO9WtFSBstVlGY861kpB/HlPWg3++f9reCBw8e5Be/+AV3330327Zt00nBe4zBYMBgMPiPbGtlZYVf//rXbVDqZz/72WMmG/v37z+tUq25uTluvfXWU5bLiQiDwYAQAi+//PIxYlGXV199lZ///OeMRiNWVlZO76ASr732Go888ghVVbFjxw4+/vGPs2XLFm07rrwnuOyyy7jhhhsmXv+PDiVe77bqytkTQjRJFEWxrtckZ+ktLi6yZ88eRqNR6zxaL47Xhv5kyz733HNt5t38/Dzf+ta3uOCCC87KCXd0Z7ODBw+yvLzMeeedR1mWvPPOO/zxj3/k6aef5sCBA3z3u9/lwgsvpN/vMxqN2L9/P48++ij3339/m6l0KuEuhMDf//53fvjDH7Jly5b3zD10zgWjqixaZwEmdnYSoqulMMkFJCDB4NvJmUmT9iTIWKEwAQkSJ8m1o2k8zgeCGEpbUhaWMpWlCFAWFWU1FTtAVQbXn8K7GiOhdc/k7VjAlAWVVDhXYcpACA3OeVzjovOCcfCvNZ2uZ2bcAWyi0k7SxD8pSGIKMCXGFBgJeJPsFURxJC5m0sRT2gl5dLnEHZ6ZCtTBZ1MEVQGlKaKLwQdWfQpxPqqMK5a8RTFg79CzZargAqZ4Y/8RUmOxiUDjrOPAWMfK4k3b2KkjGHRL0/L2YOxsCqGNA4qlbw5sNc4kMozPXR1ia/S8vEmOl2T8aYWr5UFgNDLY3tjNZAJtTo4xUBaWxrt2f3PnOkmhTtYaCmuSKBVdYQXQsxZrwZlAk4LFbUHbLa4RwQYwpWCNpTQlBEsxXXJkUPPyWyMWNsCmOQMBBrXBeWlFLYhiUWDS+ZP3vXX9JOHK2uiiIt038Y9KnPNIiAJmZePJ6gp3IZ+X3L4uX5POa123O1oONc8CUkj5VmUaT/nSHu1cKo1h2JRRCBXBljXBJLEobbstB03HlN1K+TFLFKimK0MtuQxOsBiGboq3RgVzhWdOHItlRb8pmKKgHHpG4mjmLHvqkmWpqFehCYHVOqRMtFRSZwLZtDh2+IT2eKyFEApGTfpGx+Qgqaz+jEXFuJIs5MXXESSKwiYtWJj0ey4pFUm5RXGMS36hUJQ1ctlllzEzM3Payx88eJAnnniCL3/5y+dwr5STsbS0dFwh5dJLL13Tek/2YXZhYWHdyg1WV1d55JFH+Nvf/tY+9uCDD3L33XezadOm9rGlpaVTtqs3xnDLLbecsoOfiPD666/zq1/9irquT7le4Ky+2c3tpUMIjEYjnn/+eV5++WV27tzJjTfeiLV2YhIwGAxO20WlKP9t8v22adOm9vViOByyb98+mqbh4osvpizL98xE93+ZfH289ywvL1NV1bqK1s45/vWvf7G4uMjy8vI5yzk8nrPneOMrhMDvf//7Vhz7+te/zu23337GpWjHex88dOgQ3//+9/nzn//MPffcw6c//WlWV1c5fPgwzz33HE8++STnn38+d955Jy+88ALPPPMMu3fv5o033mDfvn0THU1Ph+Xl5TU3sXg3cc4Fo15vKmai+GRVSdkhMWA6CURG4mSO2I7bYLEmhu2WZRSVfAg0zjGqPYNR7JIUBRFLmb+QCgHv4iD0ziG+wZRlcmx4ICQ3Tp7sxRIj5xzYAud96ihVUhZC6AUCgsOBN7GLV5rAd8t88n+ywNE+ZvJjJs7abYGhwFIg+JiflFWVViqTOPFPk868DWugLB2HR/G5GVviXZ/Glcz2DFvnR+xeXqXJc9muaJPum8ZDLcJeHM3qiKI0FD5MuByEnKOT/p2OJR9bKxQlRScLO60gMf5nW3KVBSTD2FlkbWf9edm0guxsgkkxypNCs4mCy/Ky4bzzxl3ejIFONDMu+OjeQtoSsqg6dV5IBKyRtmNZ3LZgTOy+VxS5R18MPZdgGJpA3Zj2eIOPJ0cQNi+U9PbU7D8iDB0sbgDnpXU/ZTEnB21384XKJJDmHTEi9IqxsJJdMYWN48k1o/ZFd6pfUlbgafBB2jyqrsiTT0HMEIqZT91udDmTtBWwTOoYJ6kMlDT2GS8XfwzDOq5IaCiLEUJImWVjh1thsvg1eX3z48ZYvIOpCpyN51WCQaTEYTnoKyyeLd5jfKAoPYU1bPQVB8Wwe9CjSSv3koRVJN1nIBLv4fFwlbGgSgoMN1nMGb9OjUd1yh1KymW+LhDdipJu/LFIHB1Htiii80iEIq3De4eRo8aiopwlZ/Ph/nRDiJVzw8GDB/HeH/P44uLimiZqu3btOuFzuV3yWlldXeXhhx8+povNP//5T1555RU+8YlPAPH183jHeDQ7duzg2muvPeU3z6+//joPPfTQGbuFToWIUNc1uWXyb37zm2PKy0ajEU888QRvvvkmn/nMZ9i4cSPGGAaDwTHCmaK8m+n1euzcuRNjDMvLyzz33HM88MAD/OlPf+Lqq6/mxz/+8TkpS1LWxsGDB9m8efO6rCsLKqPRiN27d3PRRRfRNA0bNmw4RhBf6zYgCl7GmFOKXcPhsC1Hu+qqq/jmN7+5LqVoAEeOHOGpp57ilVde4aWXXuKFF17g3nvvZfv27Vx55ZU89dRTPPzww7z44ov87ne/+485df9XOOeCkbFFslLEUigx0XJiRJA0oW/b03fVDRGstZQpEd4LNK6hbgLOA6QJmsSwXEya0IunMFGMGhZQVX2ca2hGq7F4xBh8iIJAEEvjA7VvCKHGuyY5OWJYcY8Ka6Cx4Fx0KxjGgpGQhSNpBaJ2Fk2adJIm6ulvSXlG8VANPtiOsBI6JW2xExem7a9E7T24CuunGI4szsFMzzM9XbNMTb8PoYnCSusWST850BhgxXnClLCw2XDoELGUKF2vPKHPwg3psLpKUNfFIoyFibxYXIixk6vzpLHQ643FouwOyutuS6I6gkJpO+sln1tYGQib6eQcEV8cCmuTE4cYnE4SCRmv11pDYSzGxrwql51naekQQnK4FUk8MRRVifOCC02a9BsCBhc8Roo0DgNzM4bVQ0LtYOQtjU9CmYz3vXW1GNgyVzCsY3aWyaIDuczRjK8BsYSRInYzG9ZNFHoQgocXvAcAAA/FSURBVBhq14xPfWdIZpHPFvl8h9ZV1BmusQteWrYwMNcvme8FbJkKsPL1ZhwFVBYgwdI08T7uVyNsESjLJComRbGXlD4fxuWR+TxUhcGm6+Sc0K8MMz1DZQtWh4HBMIplhSkRSoypMamU0/Yss1jOH8G/+oZaDD74zrFZhJgQH0JHLDJmPI4xrUpaAGJTIHobAj5+4wztIDFtPhtkB1jABBBjY0ZZkNiREbBFhUnuI2NiyD4S2n1SFEVZD871N5ohBJ566qljxKJM9wN6Lhs7GRs3buT2228/aRmEc45nn32WZ5555pyIRbt37+bRRx+lrmtCCCfchveeXbt2sbS0xIc//GGqqmJpaYnXXnttXfdJUc4l1lqcczz55JPcf//9PP744+zZs4dbbrmFb3zjG8zPz6u76F3GiTLi1rrOlZUV9u/fz/bt2/n3v/9Nr9ebyKU7W44Wi9566y1EpC33OtG6Dxw4wBtvvMHc3Bz33Xcfl1122cT+nsm283FkkappmvZ9Znl5mT/84Q/cddddLC4usnnzZrZu3cr+/fv50Ic+xMzMjApGR3HOBSPvAy4YvA+xC5hNJWoERDzBR2+NBN9O6mPYtMf7gpr4eM4rAhvbr6fZnIjBeZ8Ep+hSMlWBcw2j1SPUZgUfXHKY2BhKbA2m6hME6sZHQakeISGGYldlSZHKkoxNDiUbsD5gZVz2k/c3ltpFh0R0j2TZAWzyUcWZpyN7YMbZKGkSa3LQr2CtUBaGojBRUBMhBMtg0Kce9WLXLS/0S8/GhREDaWhGcTKeEUkVb3RcRml3vcARCUz1LXNThlUfz29b+kV7WK3YMOH46VhMWi3oOKIPjEvdjKHtRiZ+vK+VjUJFFo2yWCRm7D4qrWGmV9B4YeB8u87GCeItUsY8q1wa6EOIbq3UBaxI9h5j49iyycFmrMFajwsydkqR85DjTsRjjcHGjXPENvOW0hpGCD6d5CAeawuK0jI/a9h3JDuhwoSglc9FLvETYORybpehtFH4DOQys/FyPkAThL4tCD7gmugQqB0MRp7+lMGFKHxlET87mHIJZc4R6gpKItHJ45y013OmskxNTzNbDpFSGOEmrn8+FhFwrqDxYO2QqucRKxSdUrT8hz5IW+aW961XRhdOCFEsKkzFaNinmh0y2y+Zqgr+OUwCq41lgbUTnDU0BmzfUpSGjU1guwu8Zi0HySJbVi0NZFG6vc75G5Sxc6g9aVl8JN3jrSVKkgg6vm/pjBuRkAQ1jzWGYCwEi/iALTy2KMnZ5SbdEEbOzOKqKMfjTD/g9Xo9rrvuunO8V8p/GufcSQWjD37wg2veRl3XvPTSS8d9rqoq3v/+97e/Z+fOiaiqik9+8pMndTM0TcPjjz/Os88+e8rsiBPRDY49Hi+99BL79u077fUdPnyYZ5999qz2RVH+2wyHQ37wgx+wsrLC0tISIsJHPvIRfvazn3H55Ze3y6lo9O5BRJiZmVk3509ez5EjR+j1egyHQw4cOEBZlqflCj0TDh8+zK5du5ibm2NhYeGkZW8vvvgihw4d4p577uFzn/vcGZXfHS1S/d///R9PP/00X/3qV9m0aRPLy8sT3c2qqiKEwIEDB6jrmltuuQVrLTfddBN33HEHP/nJT7TUuMM5F4wGwzq5CiRN0G3roBHASgyTzu3tC6KbwfvAYBQ7LEUXi8WHWA9TFhYnseuZLQuKsqDAELwj+OgE8kHaGpsQfHIJBAKWsixpXGidQb7x+LSsRVLZSoFBKEj7XVq8jZ2k4m2Wu79JCq22E26baEKIZSm2rbHyEOI+ZEnJppwjY2NpXmFNKoUyMWDZxgmvE6Fp4va9D1gCmzY6htIwbMYBwlm8yblBQSA1eWo1oyDQszGQe+OU4cBw3NUNxrk2uQxpogV81zEErcjTuli6IhJjoaIwMdC4X8Cqo91ZmwNm6LiE8jGk9dVekCbEblekEHETc4FGI2G6gibEkjsrSZQyMbvGd4rUfHBICFhTREea+NZO1TmcmFFlgBBSzlG0ylgTO+oZK4y84CWkMjPD0AuDeoj3lpkpYaqK+708bNouctAp82IsNCyPAqUx9GzMI2rEpDItIUlfIHGfnIeeWIL3McMonbPGeSpvmK0KRt6PHV0dwS+f124JX9ZUahd/8jmY61cUZcV+t0y/EXpVR3yiU7YoUDcF4JiddgQT2lDrfHyFIdUvT46xXhHFtxAMtROQCu9nCY2lX3rqyjHTnwLjkCBYCUx7oV8V9I2lNJZKiG4jgUt9wNrAXyyMcle0dBJE0oQh2ZryMUTx0XTGbHQBteKpEYzpijqTkw4hB1wn+TgJSwET/87EdYVQYL3DFjaOpyQQo4KRsg68+uqr/OMf/2D79u2n/EC5YcMGbr/99lOWACnnlqqqjhEyjDFrChwdDAa8/fbbJ3w+l1GtBefcCScU1lo2bNjQ/r60tHTSDKEbbriB66+//oT75Jxbs1gEcP3117O0tHTcgGxjDLfeeiuvv/46e/fuPettKMr/CiIyUUK5detWfvSjH3H55Zfre8K7FGstmzdvXvfr0zQNV1xxBSEE9uzZw+zs7LrkV3Xf295++21WVla47bbb2qYGR3/BlTOOdu/ezdVXX8199903UYp2qnLlLs45nn76ab797W+za9cuLrnkEr7whS+0z0Es47/mmmtwzrFnzx727t3LjTfeyGg0YtOmTdxxxx3Mzs7yne98h8OHD6/pXLxXOOftHpxr8MHjQ8D5gPexDCM6DZLtJOWFWKKAUJroIGpqx+pgxHDUJJFk3OYuSCwv61UlM1XJdL9gul9SFRYrgoS4Le+jg8S5QN146toxHNUMhiNGtWM4cozqOrpSOu4hS6xJkRCSI8VirR0HcWOSsGBjPglpUkqSH9LjxhSILcbHmeKD29IUYygKobCSuqxJKp+J58u5eBwSAiG39zbCwpzgipphnbqQASShKLs4snDU3mZJPBKJwc1HmsBs37ChTOV9HedI1w2T58g5a6b7fHufylgwKsw43DhPzKsC5iuDcaadI3dv/7z/rfOF8TYN0alDWpekCToYlgexxXvRWQfEbTgfHUBehBB8dJCRXphawW+8jSx2IVFsmu6VVLagNEUcexhEAk5CzKBhLLrE4xV88FSVYX46niif1tU90Jybkx/P7e0N6ZwZYaocH2sW6YJEESqIxTkfA9jSeTbW0KssVRU7KPgQ3UR5H/Ox9ayhzAFSCSvQNPH/1qQyMyM415C7geV9pnO8+VrXzlJVo1hSaQVbjAO8bb7F6fyNhcoapsoCJIYcWekR3AwSYrB3Uxc4L7GjmNi4ae+ZWmnoDwMzFPScYZaSBdtjsTfNpv4UF1FyfoCCkAS+9JPuPJvuudjhMN2HyU0mYXx/tOOZVI5oopg8DuPvBOYnp6CV7BrMAzHdcCFA8EhwBOfwvkG8i2NSBSNlHVhZWeGhhx7ir3/960mzibZt28ZXvvIVrrvuOp0Y/Je56qqrJlxexhhuvPHGM2orfyZMTU2xbdu2Na1DRPjLX/5yQhfT0SUTJxOXtm7dys6dO0/6DfIzzzyzZrGoLEuuvfZa7r77brZs2XLcZaanp7nyyivPehuK8r9KURTce++93Hzzze29u96lT8rasdaesoPk6XK0UHPVVVdx8cUXc+GFF7Jjx441d0nrBlyLCGVZctFFF53SLWSM4YorruCnP/1p+z54JmMxd9B84IEH+NrXvsbzzz/PYDDgscceYzgcMhwO23Ljubk5brvtNrZt20ZRFPT7fW666Sa+9KUvsW/fPt555x3uuusu7rzzTr0XEv+BDKM4EYXYjSrmDEV1yFqbmlXTOmDiF/5mPHHPj0lATIGIwXsfyzysoTBCVcZSHm8FIxYJ2VUgravAS8whch6M8dgiYGwDEigMqQTMxsm5RPEnSGrvHVK2kEhbptKtJ83dzVLVTFtelBOyDYCVtD92XAYkyeVEml6m8iZvwPhWkomOiGTrKWxsi96frjlUS8xzkujeqQysNtFt04YTS7oGjFvcZ9fPCDgkQtUz2JFMlJVh4jkrYCIQut13OoHVhglRJAsEWWQo0vZWRkLdGFIEFZic/TK+/pnswgkyDk5u12nynwiDIVTWYkx0/QSJ1ykLXYZYvmdNtxwpjq2cD5SdUF0nVo6lEgJ1UnQMnS52jEvHmhCbrmdhrA6BqT4Uq1CWsftXPuQsoJQCdRJxokghydVlKG0s1VppJPni4s/ICY0XytLiU9t3ksjjfewKNkjlflmoy5fFEq/D1rkNLB1pCAzbc2mtoW5oSwY39A0bZ6dYaVzrUPICRYjLdM+jiKFuRvR7nsDYXeTDeFzmg2/FK2viNcNQN4EpM02QPpXNz0NpLAWGxsWudVioMPRKy4aqpCBmBPV7lumypCwLpqyhXh5wUeNZLuN9lDcuIWdZmbQvqSTRmFY87I6/WEYa9axWhMSMm5pF5TGJS1kcSvJaCoJqS+LSwI3Hn4XKEF839H1IWSdWV1f55S9/yfve9z4WFhaOeX5xcZEvfvGLLCws6AegdwG9Xo8777yThYUFlpeXWVhY4GMf+9i6tzTOVFXF/Pz8mtdzskyiSy+99LRCtXu9Hp/61KdOGWa6f//+NYlFECfEGzduZH5+np07d/Lggw8e0+3mdMJYFeW9yAc+8AHuueceivRhTd8b3l10O4qdi9eoqakpduzYQa/X45prruGjH/3ouo6Buq5588032bBhwzFu2uNx8803n3WnNu89jz32GN/73vfYs2dP+/jevXvZu3cv1louueQSDh06RK/XwxjD/Pw827ZtYzAYcPHFF7OwsMBtt93G4cOHmZub4/Of/zy//e1vz6rb5nsNs9Y3Y0VRFEVRFEVRFEVRFOW9hX6loiiKoiiKoiiKoiiKokyggpGiKIqiKIqiKIqiKIoygQpGiqIoiqIoiqIoiqIoygQqGCmKoiiKoiiKoiiKoigTqGCkKIqiKIqiKIqiKIqiTKCCkaIoiqIoiqIoiqIoijKBCkaKoiiKoiiKoiiKoijKBCoYKYqiKIqiKIqiKIqiKBOoYKQoiqIoiqIoiqIoiqJMoIKRoiiKoiiKoiiKoiiKMoEKRoqiKIqiKIqiKIqiKMoEKhgpiqIoiqIoiqIoiqIoE6hgpCiKoiiKoiiKoiiKokyggpGiKIqiKIqiKIqiKIoygQpGiqIoiqIoiqIoiqIoygQqGCmKoiiKoiiKoiiKoigTqGCkKIqiKIqiKIqiKIqiTKCCkaIoiqIoiqIoiqIoijKBCkaKoiiKoiiKoiiKoijKBCoYKYqiKIqiKIqiKIqiKBOoYKQoiqIoiqIoiqIoiqJMoIKRoiiKoiiKoiiKoiiKMoEKRoqiKIqiKIqiKIqiKMoE/w/bnHENmo1jaQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Sample images path\n", - "merged_path = './data/alphamatting/merged/GT21.png'\n", - "trimap_path = './data/alphamatting/trimap/Trimap1/GT21.png'\n", - "alpha_path = './tutorial_exps/indexnet/results/GT21.png'\n", - "\n", - "# Plot sample images\n", - "merged = mmcv.imread(merged_path)\n", - "trimap = mmcv.imread(trimap_path)\n", - "alpha = mmcv.imread(alpha_path)\n", - "f, axarr = plt.subplots(1, 3)\n", - "f.dpi = 240\n", - "axarr[0].axis('off')\n", - "axarr[0].imshow(mmcv.bgr2rgb(merged))\n", - "axarr[1].axis('off')\n", - "axarr[1].imshow(trimap)\n", - "axarr[2].axis('off')\n", - "axarr[2].imshow(alpha)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HmYZRxw6wefo" - }, - "source": [ - "Congratulations! You've done the tutorial of using MMEditing for matting task. Go to [Getting Started page](https://github.com/open-mmlab/mmediting/blob/master/docs/en/getting_started.md) for more usage of MMEditing and start to train your own mattor!" - ] - } - ], - "metadata": { - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/demo/restoration_demo.py b/demo/restoration_demo.py deleted file mode 100644 index fefbab89fb..0000000000 --- a/demo/restoration_demo.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -import argparse -import os - -import mmcv -import torch - -from mmagic.apis import init_model, restoration_inference -from mmagic.utils import modify_args, tensor2img - - -def parse_args(): - modify_args() - parser = argparse.ArgumentParser(description='Restoration demo') - parser.add_argument('config', help='test config file path') - parser.add_argument('checkpoint', help='checkpoint file') - parser.add_argument('img_path', help='path to input image file') - parser.add_argument('save_path', help='path to save restoration result') - parser.add_argument( - '--imshow', action='store_true', help='whether show image with opencv') - parser.add_argument('--device', type=int, default=0, help='CUDA device id') - parser.add_argument( - '--ref-path', default=None, help='path to reference image file') - args = parser.parse_args() - return args - - -def main(): - args = parse_args() - - if not os.path.isfile(args.img_path): - raise ValueError('It seems that you did not input a valid ' - '"image_path". Please double check your input, or ' - 'you may want to use "restoration_video_demo.py" ' - 'for video restoration.') - if args.ref_path and not os.path.isfile(args.ref_path): - raise ValueError('It seems that you did not input a valid ' - '"ref_path". Please double check your input, or ' - 'you may want to use "ref_path=None" ' - 'for single restoration.') - - if args.device < 0 or not torch.cuda.is_available(): - device = torch.device('cpu') - else: - device = torch.device('cuda', args.device) - - model = init_model(args.config, args.checkpoint, device=device) - - if args.ref_path: # Ref-SR - output = restoration_inference(model, args.img_path, args.ref_path) - else: # SISR - output = restoration_inference(model, args.img_path) - output = tensor2img(output) - - mmcv.imwrite(output, args.save_path) - if args.imshow: - mmcv.imshow(output, 'predicted restoration result') - - -if __name__ == '__main__': - main() diff --git a/demo/restoration_face_demo.py b/demo/restoration_face_demo.py deleted file mode 100644 index 8ee6a93b8b..0000000000 --- a/demo/restoration_face_demo.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -import argparse -import os - -import mmcv -import torch - -from mmagic.apis import init_model, restoration_face_inference -from mmagic.utils import modify_args - - -def parse_args(): - modify_args() - parser = argparse.ArgumentParser(description='Restoration demo') - parser.add_argument('config', help='test config file path') - parser.add_argument('checkpoint', help='checkpoint file') - parser.add_argument('img_path', help='path to input image file') - parser.add_argument('save_path', help='path to save restoration result') - parser.add_argument( - '--upscale-factor', - type=int, - default=1, - help='the number of times the input image is upsampled.') - parser.add_argument( - '--face-size', - type=int, - default=1024, - help='the size of the cropped and aligned faces..') - parser.add_argument( - '--imshow', action='store_true', help='whether show image with opencv') - parser.add_argument('--device', type=int, default=0, help='CUDA device id') - args = parser.parse_args() - return args - - -def main(): - args = parse_args() - - if not os.path.isfile(args.img_path): - raise ValueError('It seems that you did not input a valid ' - '"image_path". Please double check your input, or ' - 'you may want to use "restoration_video_demo.py" ' - 'for video restoration.') - - if args.device < 0 or not torch.cuda.is_available(): - device = torch.device('cpu') - else: - device = torch.device('cuda', args.device) - - model = init_model(args.config, args.checkpoint, device=device) - - output = restoration_face_inference(model, args.img_path, - args.upscale_factor, args.face_size) - - mmcv.imwrite(output, args.save_path) - if args.imshow: - mmcv.imshow(output, 'predicted restoration result') - - -if __name__ == '__main__': - main() diff --git a/demo/restoration_video_demo.py b/demo/restoration_video_demo.py deleted file mode 100644 index ebe7122725..0000000000 --- a/demo/restoration_video_demo.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -import argparse -import os - -import cv2 -import mmcv -import numpy as np -import torch - -from mmagic.apis import init_model, restoration_video_inference -from mmagic.utils import modify_args, tensor2img - -VIDEO_EXTENSIONS = ('.mp4', '.mov') - - -def parse_args(): - modify_args() - parser = argparse.ArgumentParser(description='Restoration demo') - parser.add_argument('config', help='test config file path') - parser.add_argument('checkpoint', help='checkpoint file') - parser.add_argument('input_dir', help='directory of the input video') - parser.add_argument('output_dir', help='directory of the output video') - parser.add_argument( - '--start-idx', - type=int, - default=0, - help='index corresponds to the first frame of the sequence') - parser.add_argument( - '--filename-tmpl', - default='{:08d}.png', - help='template of the file names') - parser.add_argument( - '--window-size', - type=int, - default=0, - help='window size if sliding-window framework is used') - parser.add_argument( - '--max-seq-len', - type=int, - default=None, - help='maximum sequence length if recurrent framework is used') - parser.add_argument('--device', type=int, default=0, help='CUDA device id') - args = parser.parse_args() - return args - - -def main(): - """Demo for video restoration models. - - Note that we accept video as input/output, when 'input_dir'/'output_dir' is - set to the path to the video. But using videos introduces video - compression, which lowers the visual quality. If you want actual quality, - please save them as separate images (.png). - """ - - args = parse_args() - - if args.device < 0 or not torch.cuda.is_available(): - device = torch.device('cpu') - else: - device = torch.device('cuda', args.device) - - model = init_model(args.config, args.checkpoint, device=device) - - output = restoration_video_inference(model, args.input_dir, - args.window_size, args.start_idx, - args.filename_tmpl, args.max_seq_len) - - file_extension = os.path.splitext(args.output_dir)[1] - if file_extension in VIDEO_EXTENSIONS: # save as video - h, w = output.shape[-2:] - fourcc = cv2.VideoWriter_fourcc(*'mp4v') - video_writer = cv2.VideoWriter(args.output_dir, fourcc, 25, (w, h)) - for i in range(0, output.size(1)): - img = tensor2img(output[:, i, :, :, :]) - video_writer.write(img.astype(np.uint8)) - cv2.destroyAllWindows() - video_writer.release() - else: - for i in range(args.start_idx, args.start_idx + output.size(1)): - output_i = output[:, i - args.start_idx, :, :, :] - output_i = tensor2img(output_i) - save_path_i = f'{args.output_dir}/{args.filename_tmpl.format(i)}' - - mmcv.imwrite(output_i, save_path_i) - - -if __name__ == '__main__': - main() diff --git a/demo/restorer_basic_tutorial.ipynb b/demo/restorer_basic_tutorial.ipynb deleted file mode 100644 index 141aa69684..0000000000 --- a/demo/restorer_basic_tutorial.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells":[{"cell_type":"markdown","metadata":{"id":"T2WWQiheMF7q"},"source":["# MMEditing Basic Tutorial\n","\n","Welcome to MMEditing! This is the official Colab tutorial for MMEditing. In this tutorial you will learn how to train and test a restorer using the APIs provided in MMEditing. \n","\n","This is a quick guide for you to train and test existing models. If you want to develop you own models based on MMEditing and know more about the code structures, please refer to our comprehensive tutorial [here]().\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmedit/blob/main/demo/restorer_basic_tutorial.ipynb)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"-kYw3WQ0MQry"},"source":["## Install MMEditing\n","\n","MMEditing can be installed in three steps:\n","\n","1. Install a compatible PyTorch version (You need to check you CUDA version by using `nvcc -V`).\n","2. Install pre-compiled MMCV\n","3. Clone and install MMEditing\n","\n","The steps are shown below:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":279948,"status":"ok","timestamp":1625140820804,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"GIeIZEzZMfc0","outputId":"fe2e5ded-988d-4563-eb18-374344c316ef"},"outputs":[{"name":"stdout","output_type":"stream","text":["Looking in links: https://download.pytorch.org/whl/torch_stable.html\n","Collecting torch==1.7.0+cu110\n","\u001b[?25l Downloading https://download.pytorch.org/whl/cu110/torch-1.7.0%2Bcu110-cp37-cp37m-linux_x86_64.whl (1137.1MB)\n","\u001b[K |███████████████████████▌ | 834.1MB 1.3MB/s eta 0:03:50tcmalloc: large alloc 1147494400 bytes == 0x56458d07a000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |█████████████████████████████▊ | 1055.7MB 1.2MB/s eta 0:01:07tcmalloc: large alloc 1434370048 bytes == 0x5645d16d0000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |████████████████████████████████| 1137.1MB 1.1MB/s eta 0:00:01tcmalloc: large alloc 1421369344 bytes == 0x564626ebc000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645535c430a 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c4a81\n","\u001b[K |████████████████████████████████| 1137.1MB 16kB/s \n","\u001b[?25hCollecting torchvision==0.8.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/1d/3f/4f45249458a0dee85bff7acf4a2ac6177708253f1f318fcf6ee230fb864f/torchvision-0.8.0-cp37-cp37m-manylinux1_x86_64.whl (11.8MB)\n","\u001b[K |████████████████████████████████| 11.8MB 254kB/s \n","\u001b[?25hRequirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (3.7.4.3)\n","Collecting dataclasses\n"," Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n","Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (1.19.5)\n","Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (0.16.0)\n","Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.0) (7.1.2)\n","\u001b[31mERROR: torchtext 0.10.0 has requirement torch==1.9.0, but you'll have torch 1.7.0+cu110 which is incompatible.\u001b[0m\n","Installing collected packages: dataclasses, torch, torchvision\n"," Found existing installation: torch 1.9.0+cu102\n"," Uninstalling torch-1.9.0+cu102:\n"," Successfully uninstalled torch-1.9.0+cu102\n"," Found existing installation: torchvision 0.10.0+cu102\n"," Uninstalling torchvision-0.10.0+cu102:\n"," Successfully uninstalled torchvision-0.10.0+cu102\n","Successfully installed dataclasses-0.6 torch-1.7.0+cu110 torchvision-0.8.0\n","Looking in links: https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n","Collecting mmcv-full==1.3.5\n","\u001b[?25l Downloading https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/mmcv_full-1.3.5-cp37-cp37m-manylinux1_x86_64.whl (31.1MB)\n","\u001b[K |████████████████████████████████| 31.1MB 107kB/s \n","\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (1.19.5)\n","Collecting addict\n"," Downloading https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl\n","Collecting yapf\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/5f/0d/8814e79eb865eab42d95023b58b650d01dec6f8ea87fc9260978b1bf2167/yapf-0.31.0-py2.py3-none-any.whl (185kB)\n","\u001b[K |████████████████████████████████| 194kB 33.0MB/s \n","\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (7.1.2)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (4.1.2.30)\n","Installing collected packages: addict, yapf, mmcv-full\n","Successfully installed addict-2.4.0 mmcv-full-1.3.5 yapf-0.31.0\n","Cloning into 'mmediting'...\n","remote: Enumerating objects: 7162, done.\u001b[K\n","remote: Counting objects: 100% (1367/1367), done.\u001b[K\n","remote: Compressing objects: 100% (793/793), done.\u001b[K\n","remote: Total 7162 (delta 827), reused 928 (delta 554), pack-reused 5795\u001b[K\n","Receiving objects: 100% (7162/7162), 5.02 MiB | 32.14 MiB/s, done.\n","Resolving deltas: 100% (4826/4826), done.\n","/content/mmediting\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 1)) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 2)) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 3)) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 4)) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 5)) (0.31.0)\n","Collecting codecov\n"," Downloading https://files.pythonhosted.org/packages/93/9f/bbea5b6231308458963cb5c067bc5643da9949689702fa5a382714b59699/codecov-2.1.11-py2.py3-none-any.whl\n","Collecting flake8\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/fc/80/35a0716e5d5101e643404dabd20f07f5528a21f3ef4032d31a49c913237b/flake8-3.9.2-py2.py3-none-any.whl (73kB)\n","\u001b[K |████████████████████████████████| 81kB 9.7MB/s \n","\u001b[?25hCollecting interrogate\n"," Downloading https://files.pythonhosted.org/packages/cd/6d/ce3ac440b13c1b36b323a0eab191499a902adade3cc11b18078c07af3e6e/interrogate-1.4.0-py3-none-any.whl\n","Collecting isort==4.3.21\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n","\u001b[K |████████████████████████████████| 51kB 7.5MB/s \n","\u001b[?25hCollecting onnxruntime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/f9/76/3d0f8bb2776961c7335693df06eccf8d099e48fa6fb552c7546867192603/onnxruntime-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5MB)\n","\u001b[K |████████████████████████████████| 4.5MB 37.4MB/s \n","\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.7/dist-packages (from -r requirements/tests.txt (line 6)) (3.6.4)\n","Collecting pytest-runner\n"," Downloading https://files.pythonhosted.org/packages/f4/f5/6605d73bf3f4c198915872111b10c4b3c2dccd8485f47b7290ceef037190/pytest_runner-5.3.1-py3-none-any.whl\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (1.19.5)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (2.4.0)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (4.1.2.30)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (3.13)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.5.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.4.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.4.1)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.1.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (3.2.2)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.36.2)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.34.1)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.6.1)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.8.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (2.23.0)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.4.4)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (57.0.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.12.0)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.12.4)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.3.4)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.31.0)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.0.1)\n","Requirement already satisfied: coverage in /usr/local/lib/python3.7/dist-packages (from codecov->-r requirements/tests.txt (line 1)) (3.7.1)\n","Collecting pyflakes<2.4.0,>=2.3.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/11/2a745612f1d3cbbd9c69ba14b1b43a35a2f5c3c81cd0124508c52c64307f/pyflakes-2.3.1-py2.py3-none-any.whl (68kB)\n","\u001b[K |████████████████████████████████| 71kB 9.8MB/s \n","\u001b[?25hCollecting pycodestyle<2.8.0,>=2.7.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/cc/227251b1471f129bc35e966bb0fceb005969023926d744139642d847b7ae/pycodestyle-2.7.0-py2.py3-none-any.whl (41kB)\n","\u001b[K |████████████████████████████████| 51kB 8.7MB/s \n","\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n"," Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from flake8->-r requirements/tests.txt (line 2)) (4.5.0)\n","Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.8.9)\n","Collecting colorama\n"," Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n","Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (7.1.2)\n","Requirement already satisfied: toml in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.10.2)\n","Requirement already satisfied: py in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (1.10.0)\n","Requirement already satisfied: attrs in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (21.2.0)\n","Requirement already satisfied: flatbuffers in /usr/local/lib/python3.7/dist-packages (from onnxruntime->-r requirements/tests.txt (line 5)) (1.12)\n","Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (8.8.0)\n","Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (0.7.1)\n","Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.15.0)\n","Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.4.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->-r requirements/runtime.txt (line 3)) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (1.3.1)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (3.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2021.5.30)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (1.24.3)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2.10)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (1.3.0)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.7.2)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.2.2)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (3.1.1)\n","Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.7/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3.6\"->google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.4.8)\n","Installing collected packages: codecov, pyflakes, pycodestyle, mccabe, flake8, colorama, interrogate, isort, onnxruntime, pytest-runner\n","Successfully installed codecov-2.1.11 colorama-0.4.4 flake8-3.9.2 interrogate-1.4.0 isort-4.3.21 mccabe-0.6.1 onnxruntime-1.8.0 pycodestyle-2.7.0 pyflakes-2.3.1 pytest-runner-5.3.1\n","Created temporary directory: /tmp/pip-ephem-wheel-cache-hu6xvjxh\n","Created temporary directory: /tmp/pip-req-tracker-zk5q0q3z\n","Created requirements tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Created temporary directory: /tmp/pip-install-vr_vpseo\n","Obtaining file:///content/mmediting\n"," Added file:///content/mmediting to build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"," Running setup.py (path:/content/mmediting/setup.py) egg_info for package from file:///content/mmediting\n"," Running command python setup.py egg_info\n"," running egg_info\n"," creating mmedit.egg-info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," Source in /content/mmediting has version 0.8.0, which satisfies requirement mmedit==0.8.0 from file:///content/mmediting\n"," Removed mmedit==0.8.0 from file:///content/mmediting from build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.31.0)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (4.1.2.30)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (2.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (1.19.5)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.5.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.4.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.4.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (3.2.2)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.1.1)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.34.1)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.12.4)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.0.1)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.36.2)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.31.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.12.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (2.23.0)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.8.0)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.3.4)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.4.4)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.6.1)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (57.0.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->mmedit==0.8.0) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (1.3.1)\n","Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from grpcio>=1.24.3->tensorboard->mmedit==0.8.0) (1.15.0)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.2.2)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.7.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (1.24.3)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2.10)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2021.5.30)\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.8.0) (4.5.0)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (1.3.0)\n","Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.4.8)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (3.1.1)\n","Installing collected packages: mmedit\n"," Running setup.py develop for mmedit\n"," Running command /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/content/mmediting/setup.py'\"'\"'; __file__='\"'\"'/content/mmediting/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' develop --no-deps\n"," running develop\n"," running egg_info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," running build_ext\n"," Creating /usr/local/lib/python3.7/dist-packages/mmedit.egg-link (link to .)\n"," Adding mmedit 0.8.0 to easy-install.pth file\n","\n"," Installed /content/mmediting\n","Successfully installed mmedit\n","Cleaning up...\n","Removed build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"]}],"source":["# Install openmim for the installation of mmcv-full\n","!pip install openmim\n","\n","# Install mmcv-full thus we could use CUDA operators\n","!mim install mmcv-full\n","\n","# Clone MMEditing\n","!rm -rf mmediting\n","!git clone https://github.com/open-mmlab/mmediting.git\n","%cd mmediting\n","\n","# Install MMEditing\n","!pip install -v -e ."]},{"cell_type":"markdown","metadata":{"id":"QgX96Sc_3PcV"},"source":["## Download necessary material for this demo\n","We will need some data and configuration files in this demo. We will download it and put it in `./demo_files/`"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4723,"status":"ok","timestamp":1625140825508,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"-K0zFSJ-3V42","outputId":"528a87f7-f78e-4219-84f3-dec19b88e88a"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2021-07-01 11:59:48-- https://download.openmmlab.com/mmediting/demo_files.zip\n","Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.35\n","Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.35|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 19215781 (18M) [application/zip]\n","Saving to: ‘demo_files.zip’\n","\n","demo_files.zip 100%[===================>] 18.33M 6.00MB/s in 3.1s \n","\n","2021-07-01 11:59:52 (6.00 MB/s) - ‘demo_files.zip’ saved [19215781/19215781]\n","\n","Archive: demo_files.zip\n"," creating: demo_files/\n"," inflating: demo_files/demo_config_EDVR.py \n"," inflating: demo_files/demo_config_BasicVSR.py \n"," creating: demo_files/lq_sequences/\n"," creating: demo_files/lq_sequences/calendar/\n"," inflating: demo_files/lq_sequences/calendar/00000006.png \n"," inflating: demo_files/lq_sequences/calendar/00000007.png \n"," inflating: demo_files/lq_sequences/calendar/00000010.png \n"," inflating: demo_files/lq_sequences/calendar/00000004.png \n"," inflating: demo_files/lq_sequences/calendar/00000003.png \n"," inflating: demo_files/lq_sequences/calendar/00000001.png \n"," inflating: demo_files/lq_sequences/calendar/00000000.png \n"," inflating: demo_files/lq_sequences/calendar/00000009.png \n"," inflating: demo_files/lq_sequences/calendar/00000008.png \n"," inflating: demo_files/lq_sequences/calendar/00000002.png \n"," inflating: demo_files/lq_sequences/calendar/00000005.png \n"," creating: demo_files/lq_sequences/city/\n"," inflating: demo_files/lq_sequences/city/00000006.png \n"," inflating: demo_files/lq_sequences/city/00000007.png \n"," inflating: demo_files/lq_sequences/city/00000010.png \n"," inflating: demo_files/lq_sequences/city/00000004.png \n"," inflating: demo_files/lq_sequences/city/00000003.png \n"," inflating: demo_files/lq_sequences/city/00000001.png \n"," inflating: demo_files/lq_sequences/city/00000000.png \n"," inflating: demo_files/lq_sequences/city/00000009.png \n"," inflating: demo_files/lq_sequences/city/00000008.png \n"," inflating: demo_files/lq_sequences/city/00000002.png \n"," inflating: demo_files/lq_sequences/city/00000005.png \n"," creating: demo_files/lq_sequences/.ipynb_checkpoints/\n"," creating: demo_files/gt_images/\n"," inflating: demo_files/gt_images/bird.png \n"," inflating: demo_files/gt_images/woman.png \n"," inflating: demo_files/gt_images/head.png \n"," inflating: demo_files/gt_images/baby.png \n"," inflating: demo_files/gt_images/butterfly.png \n"," inflating: demo_files/demo_config_SRCNN.py \n"," creating: demo_files/lq_images/\n"," extracting: demo_files/lq_images/bird.png \n"," extracting: demo_files/lq_images/woman.png \n"," extracting: demo_files/lq_images/head.png \n"," extracting: demo_files/lq_images/baby.png \n"," extracting: demo_files/lq_images/butterfly.png \n"," creating: demo_files/gt_sequences/\n"," creating: demo_files/gt_sequences/calendar/\n"," inflating: demo_files/gt_sequences/calendar/00000006.png \n"," inflating: demo_files/gt_sequences/calendar/00000007.png \n"," inflating: demo_files/gt_sequences/calendar/00000010.png \n"," inflating: demo_files/gt_sequences/calendar/00000004.png \n"," inflating: demo_files/gt_sequences/calendar/00000003.png \n"," inflating: demo_files/gt_sequences/calendar/00000001.png \n"," inflating: demo_files/gt_sequences/calendar/00000000.png \n"," inflating: demo_files/gt_sequences/calendar/00000009.png \n"," inflating: demo_files/gt_sequences/calendar/00000008.png \n"," inflating: demo_files/gt_sequences/calendar/00000002.png \n"," inflating: demo_files/gt_sequences/calendar/00000005.png \n"," creating: demo_files/gt_sequences/city/\n"," inflating: demo_files/gt_sequences/city/00000006.png \n"," inflating: demo_files/gt_sequences/city/00000007.png \n"," inflating: demo_files/gt_sequences/city/00000010.png \n"," inflating: demo_files/gt_sequences/city/00000004.png \n"," inflating: demo_files/gt_sequences/city/00000003.png \n"," inflating: demo_files/gt_sequences/city/00000001.png \n"," inflating: demo_files/gt_sequences/city/00000000.png \n"," inflating: demo_files/gt_sequences/city/00000009.png \n"," inflating: demo_files/gt_sequences/city/00000008.png \n"," inflating: demo_files/gt_sequences/city/00000002.png \n"," inflating: demo_files/gt_sequences/city/00000005.png \n"," creating: demo_files/gt_sequences/.ipynb_checkpoints/\n"," creating: demo_files/.ipynb_checkpoints/\n"]}],"source":["!wget https://download.openmmlab.com/mmediting/demo_files.zip # download files\n","!unzip demo_files # unzip\n","\n","# copy the data to data/Set5 for later use\n","!mkdir data\n","!mkdir data/val_set5\n","!cp -r demo_files/lq_images data/val_set5/Set5_bicLRx4\n","!cp -r demo_files/gt_images data/val_set5/Set5"]},{"cell_type":"markdown","metadata":{"id":"zXGurqGKOeNE"},"source":["## Inference with a pre-trained image restorer\n","You can easily perform inference on a single image with a pre-trained restorer by using `restoration_demo.py`. What you need are \n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer you want to use. It specifies the model you want to use. \n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model. \n","3. `IMAGE_FILE`: The path to the input image.\n","4. `SAVE_FILE`: The location where you want to store the output image.\n","5. `imshow`: Whether to show the image. (Optional)\n","6. `GPU_ID`: Which GPU you want to use. (Optional)\n","\n","Once you have all these details, you can directly use the following command:\n","\n","```\n","python demo/restoration_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${IMAGE_FILE} ${SAVE_FILE} [--imshow] [--device ${GPU_ID}]\n","```\n","\n","**Notes:** \n","1. Configuration files are located in `./configs`. \n","2. We support loading checkpoints from url. You can go to the corresponding page (e.g. [here](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan)) to obtain the url of the pretrained model.\n","\n","---\n","\n","We will now use `SRCNN` and `ESRGAN` as examples.\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58677,"status":"ok","timestamp":1625140884175,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"KiPvtvlqM1zb","outputId":"be7375a7-4632-4770-8383-2a8ce654b069"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\" to /root/.cache/torch/hub/checkpoints/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\n","100% 83.9k/83.9k [00:00<00:00, 1.59MB/s]\n","2021-07-01 12:00:10,779 - mmedit - INFO - Use load_from_torchvision loader\n","Downloading: \"https://download.pytorch.org/models/vgg19-dcbb9e9d.pth\" to /root/.cache/torch/hub/checkpoints/vgg19-dcbb9e9d.pth\n","100% 548M/548M [00:07<00:00, 76.0MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\" to /root/.cache/torch/hub/checkpoints/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\n","100% 196M/196M [00:26<00:00, 7.61MB/s]\n","bird_ESRGAN.png bird_SRCNN.png\n"]}],"source":["# SRCNN\n","!python demo/restoration_demo.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth ./demo_files/lq_images/bird.png ./outputs/bird_SRCNN.png\n","\n","# ESRGAN\n","!python demo/restoration_demo.py ./configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth ./demo_files/lq_images/bird.png ./outputs/bird_ESRGAN.png\n","\n","# Check whether images are saved\n","!ls ./outputs"]},{"cell_type":"markdown","metadata":{"id":"W1DfGHu3Xcfd"},"source":["## Inference with a pre-trained video restorer\n","\n","MMEditing also supports video super-resolution methods, and the procedure is similar. You can use `restoration_video_demo.py` with the following arguments:\n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer you want to use\n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model. \n","3. `INPUT_DIR`: The directory containing the video frames.\n","4. `OUTPUT_DIR`: The location where you want to store the output frames.\n","5. `WINDOW_SIZE`: The window size if you are using sliding-window method (Optional).\n","6. `GPU_ID`: Which GPU you want to use (Optional).\n","```\n","python demo/restoration_video_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${INPUT_DIR} ${OUTPUT_DIR} [--window_size=$WINDOW_SIZE] [--device ${GPU_ID}]\n","```\n","**Note:** There are two different frameworks in video super-resolution: ***sliding-window*** and ***recurrent*** frameworks. When you use the methods of the sliding-window framework, such as EDVR, you need to specify `window_size`. This value is dependent on the model you use.\n","\n","---\n","\n","We will now use `EDVR` and `BasicVSR` as examples.\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29263,"status":"ok","timestamp":1625140913405,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"iaoE7UF5Xb2i","outputId":"a022e0bd-c47a-450e-f4e4-1bf9f92e4813"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\" to /root/.cache/torch/hub/checkpoints/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\n","100% 11.5M/11.5M [00:01<00:00, 8.55MB/s]\n","2021-07-01 12:01:09,689 - mmedit - INFO - Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth\" to /root/.cache/torch/hub/checkpoints/spynet_20210409-c6c1bd09.pth\n","100% 5.50M/5.50M [00:00<00:00, 8.88MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth\" to /root/.cache/torch/hub/checkpoints/basicvsr_reds4_20120409-0e599677.pth\n","100% 24.1M/24.1M [00:02<00:00, 8.97MB/s]\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# EDVR (Sliding-window framework)\n","!python demo/restoration_video_demo.py ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_EDVR --window_size=5\n","\n","# BasicVSR (Recurrent framework)\n","!python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_BasicVSR\n","\n","# Check whether video frames are saved\n","!ls ./outputs/calendar_BasicVSR"]},{"cell_type":"markdown","metadata":{"id":"Rf3LW57qMHXb"},"source":["## Test on a pre-defined dataset using the configuration file\n","\n","The above demos provide an easy way to perform inference on a single image or video sequence. If you want to perform inference on a set of images or sequences, you can make use of the configuration files located in `./configs`.\n"," \n","Existing configuration files allow you to perform inference on common datasets, such as `Set5` in image super-resolution and `REDS4` in video super-resolution. You can use the following command:\n","\n","1. `CONFIG_FILE`: The configuration file corresponding to the restorer and dataset you want to use\n","2. `CHECKPOINT_FILE`: The path to the checkpoint of the pre-trained model.\n","3. `GPU_NUM`: Number of GPUs used for test. \n","4. `RESULT_FILE`: The path to the output result pickle file. (Optional)\n","5. `IMAGE_SAVE_PATH`: The location where you want to store the output image. (Optional)\n","\n","```\n","# single-gpu testing\n","python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","\n","# multi-gpu testing\n","./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","```\n","What you need to do is to modify the `lq_folder` and `gt_folder` in the configuration file:\n","```\n","test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/val_set5/Set5_bicLRx4',\n"," gt_folder='data/val_set5/Set5',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","```\n","\n","**Note**: Some dataset type (e.g. `SRREDSDataset`) requires an annotation file specifying the details of the dataset. Please refer to the corresponding file\n","in `./mmedit/dataset/` for more details. \n","\n","---\n","\n","The following is the command for SRCNN. For other models, you can simply change the paths to the configuration file and pretrained model. \n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14095,"status":"ok","timestamp":1625140927462,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"tClgIYgcbbVg","outputId":"c37ec2de-e1c9-42ae-ed9b-31009d48ae64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"tools/test.py\", line 136, in \n"," main()\n"," File \"tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/test.py\", line 136, in \n"," main()\n"," File \"./tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/test.py', '--local_rank=0', './configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py', 'https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth', '--launcher', 'pytorch', '--save-path', './outputs/']' returned non-zero exit status 1.\n"]}],"source":["# single-gpu\n","!python tools/test.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/\n","\n","# multi-gpu testing\n","!./tools/dist_test.sh ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth 1 --save-path ./outputs/"]},{"cell_type":"markdown","metadata":{"id":"KWKVyeEQelh3"},"source":["## Test on your own datasets\n","\n","When you want to test on your own datasets, you need to modify `test_dataset_type` in addition to the dataset paths. \n","\n","- For image super-resolution, you need to use `SRFolderDataset`\n","- For sliding-window framework in video super-resolution (e.g. EDVR, TDAN), you need to use `SRFolderVideoDataset`.\n","- For recurrent framework in video super-resolution (e.g. BasicVSR, IconVSR), you need to use `SRFolderMultipleGTDataset`.\n","\n","These dataset types assume that all images/sequences in the specified directory are used for test. The folder structures should be\n","```\n","| lq_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," | ...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","| gt_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," |...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","```\n","We will use **SRCNN**, **EDVR**, **BasicVSR** as examples. Please pay attention to the settings of `test_dataset_type` and `data['test']`. "]},{"cell_type":"markdown","metadata":{"id":"0p2rP8jV_dL1"},"source":["**SRCNN**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8729,"status":"ok","timestamp":1625140936180,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"4kEev4wVIq_L","outputId":"8026ed73-f781-4eb2-bb80-d3446bd131df"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 5/5, 8.6 task/s, elapsed: 1s, ETA: 0s\n","Eval-PSNR: 28.433974369836108\n","Eval-SSIM: 0.8099053586583066\n","baby.png bird.png butterfly.png head.png woman.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_SRCNN.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/testset_SRCNN\n","\n","# Check the output folder\n","!ls ./outputs/testset_SRCNN"]},{"cell_type":"markdown","metadata":{"id":"RONzjTTU_gem"},"source":["**EDVR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":19671,"status":"ok","timestamp":1625140955813,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"vL8WOWXY0fNJ","outputId":"dc2a8f81-9bef-4ad4-c5b2-c6f124e6b113"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 22/22, 2.0 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 23.89569862011228\n","Eval-SSIM: 0.7667098470108678\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_EDVR.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth --save-path ./outputs/testset_EDVR\n","\n","# # Check the output folder\n","!ls ./outputs/testset_EDVR\n","!ls ./outputs/testset_EDVR/city"]},{"cell_type":"markdown","metadata":{"id":"5Tc7F-l5_i1e"},"source":["**BasicVSR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":20220,"status":"ok","timestamp":1625140976026,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"jpW5GWC74Yvu","outputId":"7ba02a32-d4ec-40b2-8108-ef0729b62147"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:07,780 - mmedit - INFO - Use load_from_http loader\n","Use load_from_http loader\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","[>>] 2/2, 0.2 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 24.195768601433734\n","Eval-SSIM: 0.7828541339512978\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# single-gpu (Colab has one GPU only)\n","!python tools/test.py ./demo_files/demo_config_BasicVSR.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth --save-path ./outputs/testset_BasicVSR\n","\n","# # Check the output folder\n","!ls ./outputs/testset_BasicVSR\n","!ls ./outputs/testset_BasicVSR/calendar"]},{"cell_type":"markdown","metadata":{"id":"4DQxNL8BhI0y"},"source":["## Train a restorer on a pre-defined dataset\n","\n","MMEditing uses distributed training. The following command can be used for training. If you want to train on the pre-defined datasets specified in our configuration file, you can simply run the following command.\n","\n","```\n","./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]\n","```\n","\n","For more details about the optional arguments, please refer to `tools/train.py`.\n","\n","---\n","\n","Here is an example using EDVR.\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9337,"status":"ok","timestamp":1625140985357,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"s-hOnSF6ItQM","outputId":"e40e960a-29e1-43e8-b922-5e08c4e98afe"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:31,961 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:31,961 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:31,961 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:31,961 - mmedit - INFO - Config:\n","/content/mmediting/configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py\n","exp_name = 'edvrm_wotsa_x4_g8_600k_reds'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRREDSDataset'\n","val_dataset_type = 'SRREDSDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 600000\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50000, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=100,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 54, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 63, in load_annotations\n"," with open(self.ann_file, 'r') as fin:\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/train.py\", line 145, in \n"," main()\n"," File \"./tools/train.py\", line 111, in main\n"," datasets = [build_dataset(cfg.data.train)]\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 76, in build_dataset\n"," build_dataset(cfg['dataset'], default_args), cfg['times'])\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRREDSDataset: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/train.py', '--local_rank=0', './configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py', '--launcher', 'pytorch']' returned non-zero exit status 1.\n"]}],"source":["!./tools/dist_train.sh ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py 1"]},{"cell_type":"markdown","metadata":{"id":"b0VfQkQQjg8N"},"source":["## Train a restorer on your own datasets\n","\n","Similar to the case when you want to test on your own datasets, you need to modify `train_dataset_type`. The dataset type you need is identical:\n","\n","- For image super-resolution, you need to use `SRFolderDataset`\n","- For sliding-window framework in video super-resolution (e.g. EDVR, TDAN), you need to use `SRFolderVideoDataset`.\n","- For recurrent framework in video super-resolution (e.g. BasicVSR, IconVSR), you need to use `SRFolderMultipleGTDataset`.\n","\n","After you modified the dataset type and the data path. You are all set to go."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":128384,"status":"ok","timestamp":1625141113733,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"liGEKJpbIoXZ","outputId":"84e1502e-e2cb-458f-c7c5-e4b401e570b7"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:41,185 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:41,185 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:41,185 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:41,185 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_SRCNN.py\n","exp_name = 'srcnn_demo'\n","\n","scale = 4\n","# model settings\n","model = dict(\n"," type='BasicRestorer',\n"," generator=dict(\n"," type='SRCNN',\n"," channels=(3, 64, 32, 3),\n"," kernel_sizes=(9, 1, 5),\n"," upscale_factor=scale),\n"," pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=scale)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderDataset'\n","val_dataset_type = 'SRFolderDataset'\n","train_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=128),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","test_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'lq_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=8,\n"," train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=train_pipeline,\n"," scale=scale)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[250000, 250000, 250000, 250000],\n"," restart_weights=[1, 1, 1, 1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","evaluation = dict(interval=50, save_image=True, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./experiments/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:02:41,192 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/experiments/srcnn_demo\n","2021-07-01 12:02:41,192 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:02:41.529307: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:03:18,631 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.000e-04, eta: 0:57:01, time: 34.560, data_time: 34.446, memory: 586, loss_pix: 0.3999, loss: 0.3999\n","2021-07-01 12:03:18,712 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","INFO:mmedit:Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","2021-07-01 12:03:18,764 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","INFO:mmedit:Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","2021-07-01 12:03:18,840 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","INFO:mmedit:Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","2021-07-01 12:03:18,916 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","INFO:mmedit:Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","2021-07-01 12:03:18,956 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","INFO:mmedit:Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","2021-07-01 12:03:19,012 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","INFO:mmedit:Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","2021-07-01 12:03:19,070 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","INFO:mmedit:Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","2021-07-01 12:03:19,142 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","INFO:mmedit:Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","2021-07-01 12:03:19,212 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","INFO:mmedit:Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","2021-07-01 12:03:19,261 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","INFO:mmedit:Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","2021-07-01 12:03:19,302 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","INFO:mmedit:Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","2021-07-01 12:03:19,357 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","INFO:mmedit:Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","2021-07-01 12:03:19,419 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","INFO:mmedit:Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","2021-07-01 12:03:19,473 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","INFO:mmedit:Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","2021-07-01 12:03:19,538 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","INFO:mmedit:Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","2021-07-01 12:03:19,603 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","INFO:mmedit:Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","2021-07-01 12:03:19,657 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","INFO:mmedit:Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","2021-07-01 12:03:19,716 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","INFO:mmedit:Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","2021-07-01 12:03:19,772 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","INFO:mmedit:Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","2021-07-01 12:03:19,834 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","INFO:mmedit:Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","2021-07-01 12:03:19,877 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","INFO:mmedit:Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","2021-07-01 12:03:19,947 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","INFO:mmedit:Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","2021-07-01 12:03:20,014 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","INFO:mmedit:Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","2021-07-01 12:03:20,068 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","INFO:mmedit:Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","2021-07-01 12:03:20,124 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","INFO:mmedit:Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","2021-07-01 12:03:20,181 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","INFO:mmedit:Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","2021-07-01 12:03:20,244 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","INFO:mmedit:Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","2021-07-01 12:03:20,310 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","INFO:mmedit:Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","2021-07-01 12:03:20,356 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","INFO:mmedit:Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","2021-07-01 12:03:20,410 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","INFO:mmedit:Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","2021-07-01 12:03:20,480 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","INFO:mmedit:Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","2021-07-01 12:03:20,536 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","INFO:mmedit:Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","2021-07-01 12:03:20,595 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","INFO:mmedit:Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","2021-07-01 12:03:20,656 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","INFO:mmedit:Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","2021-07-01 12:03:20,710 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","INFO:mmedit:Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","2021-07-01 12:03:20,779 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:20,846 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","INFO:mmedit:Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","2021-07-01 12:03:20,907 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:20,958 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","INFO:mmedit:Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","2021-07-01 12:03:21,028 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","INFO:mmedit:Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","2021-07-01 12:03:21,122 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","INFO:mmedit:Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","2021-07-01 12:03:21,181 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:21,418 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","INFO:mmedit:Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","2021-07-01 12:03:21,480 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:21,551 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","INFO:mmedit:Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","2021-07-01 12:03:21,618 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","INFO:mmedit:Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","2021-07-01 12:03:21,667 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","INFO:mmedit:Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","2021-07-01 12:03:21,743 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","INFO:mmedit:Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","[>>] 5/5, 0.1 task/s, elapsed: 37s, ETA: 0s\n","\n","2021-07-01 12:03:59,996 - mmedit - INFO - Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","INFO:mmedit:Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","2021-07-01 12:04:00,047 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","INFO:mmedit:Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","2021-07-01 12:04:00,114 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","INFO:mmedit:Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","2021-07-01 12:04:00,181 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","INFO:mmedit:Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","2021-07-01 12:04:00,251 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","INFO:mmedit:Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","2021-07-01 12:04:00,315 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","INFO:mmedit:Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","2021-07-01 12:04:00,373 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","INFO:mmedit:Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","2021-07-01 12:04:00,418 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","INFO:mmedit:Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","2021-07-01 12:04:00,478 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","INFO:mmedit:Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","2021-07-01 12:04:00,538 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","INFO:mmedit:Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","2021-07-01 12:04:00,606 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","INFO:mmedit:Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","2021-07-01 12:04:00,647 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","INFO:mmedit:Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","2021-07-01 12:04:00,711 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","INFO:mmedit:Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","2021-07-01 12:04:00,757 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","INFO:mmedit:Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","2021-07-01 12:04:00,799 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","INFO:mmedit:Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","2021-07-01 12:04:00,871 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:00,938 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:00,995 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","INFO:mmedit:Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","2021-07-01 12:04:01,051 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","INFO:mmedit:Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","2021-07-01 12:04:01,115 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:01,196 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","INFO:mmedit:Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","2021-07-01 12:04:01,256 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","INFO:mmedit:Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","2021-07-01 12:04:01,325 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","INFO:mmedit:Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","2021-07-01 12:04:01,381 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","INFO:mmedit:Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:04:01,429 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","INFO:mmedit:Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","2021-07-01 12:04:01,497 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","INFO:mmedit:Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","2021-07-01 12:04:01,545 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","INFO:mmedit:Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","2021-07-01 12:04:01,597 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","INFO:mmedit:Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","2021-07-01 12:04:01,671 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","INFO:mmedit:Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:04:01,724 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:01,777 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","INFO:mmedit:Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","2021-07-01 12:04:01,847 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","INFO:mmedit:Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","2021-07-01 12:04:01,905 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","INFO:mmedit:Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","2021-07-01 12:04:01,953 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","INFO:mmedit:Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","2021-07-01 12:04:02,025 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","INFO:mmedit:Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","2021-07-01 12:04:02,079 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","INFO:mmedit:Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","2021-07-01 12:04:02,137 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","INFO:mmedit:Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","2021-07-01 12:04:02,193 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:02,255 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","INFO:mmedit:Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:04:02,341 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","INFO:mmedit:Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","2021-07-01 12:04:02,394 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","INFO:mmedit:Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","2021-07-01 12:04:02,496 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","INFO:mmedit:Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","2021-07-01 12:04:02,552 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:02,629 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","INFO:mmedit:Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","2021-07-01 12:04:02,682 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","INFO:mmedit:Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","2021-07-01 12:04:02,791 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","INFO:mmedit:Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","2021-07-01 12:04:02,834 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","INFO:mmedit:Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","2021-07-01 12:04:02,900 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","INFO:mmedit:Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","2021-07-01 12:04:03,053 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","INFO:mmedit:Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:04:03,108 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","INFO:mmedit:Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","[>>] 5/5, 0.2 task/s, elapsed: 33s, ETA: 0s\n","\n","2021-07-01 12:04:37,412 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:04:37,422 - mmedit - INFO - Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n","INFO:mmedit:Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n"]}],"source":["# SRCNN (Single Image Super-Resolution)\n","!./tools/dist_train.sh ./demo_files/demo_config_SRCNN.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":117937,"status":"ok","timestamp":1625141554036,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"26uZ4Ak7qbC9","outputId":"2fb26527-eb9e-4b48-e03c-ba9a91c60db8"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:10:12,619 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:10:12,619 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:10:12,619 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:10:12,619 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_EDVR.py\n","exp_name = 'edvrm_demo'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderVideoDataset'\n","val_dataset_type = 'SRFolderVideoDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:10:12,701 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/edvrm_demo\n","2021-07-01 12:10:12,702 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:10:12.951771: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:10:30,703 - mmedit - INFO - Iter [1/100]\tlr_generator: 4.000e-04, eta: 0:26:53, time: 16.295, data_time: 15.833, memory: 1341, loss_pix: 63917.2734, loss: 63917.2734\n","2021-07-01 12:10:31,046 - mmedit - INFO - Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","INFO:mmedit:Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","2021-07-01 12:10:31,386 - mmedit - INFO - Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","INFO:mmedit:Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","2021-07-01 12:10:31,731 - mmedit - INFO - Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","INFO:mmedit:Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","2021-07-01 12:10:32,071 - mmedit - INFO - Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","INFO:mmedit:Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","2021-07-01 12:10:32,414 - mmedit - INFO - Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","INFO:mmedit:Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","2021-07-01 12:10:32,760 - mmedit - INFO - Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","INFO:mmedit:Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","2021-07-01 12:10:33,102 - mmedit - INFO - Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","INFO:mmedit:Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","2021-07-01 12:10:33,447 - mmedit - INFO - Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","INFO:mmedit:Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","2021-07-01 12:10:33,792 - mmedit - INFO - Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","INFO:mmedit:Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","2021-07-01 12:10:34,138 - mmedit - INFO - Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","INFO:mmedit:Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","2021-07-01 12:10:34,484 - mmedit - INFO - Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","INFO:mmedit:Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","2021-07-01 12:10:34,829 - mmedit - INFO - Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","INFO:mmedit:Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","2021-07-01 12:10:35,175 - mmedit - INFO - Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","INFO:mmedit:Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","2021-07-01 12:10:35,522 - mmedit - INFO - Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","INFO:mmedit:Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","2021-07-01 12:10:35,866 - mmedit - INFO - Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","INFO:mmedit:Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","2021-07-01 12:10:36,212 - mmedit - INFO - Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","INFO:mmedit:Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","2021-07-01 12:10:36,560 - mmedit - INFO - Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","INFO:mmedit:Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","2021-07-01 12:10:36,904 - mmedit - INFO - Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","INFO:mmedit:Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","2021-07-01 12:10:37,249 - mmedit - INFO - Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","INFO:mmedit:Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","2021-07-01 12:10:37,595 - mmedit - INFO - Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","INFO:mmedit:Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","2021-07-01 12:10:37,939 - mmedit - INFO - Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","INFO:mmedit:Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","2021-07-01 12:10:38,283 - mmedit - INFO - Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","INFO:mmedit:Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","2021-07-01 12:10:38,628 - mmedit - INFO - Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","INFO:mmedit:Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","2021-07-01 12:10:38,974 - mmedit - INFO - Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","INFO:mmedit:Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","2021-07-01 12:10:39,318 - mmedit - INFO - Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","INFO:mmedit:Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","2021-07-01 12:10:39,665 - mmedit - INFO - Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","INFO:mmedit:Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","2021-07-01 12:10:40,011 - mmedit - INFO - Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","INFO:mmedit:Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","2021-07-01 12:10:40,356 - mmedit - INFO - Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","INFO:mmedit:Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","2021-07-01 12:10:40,703 - mmedit - INFO - Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","INFO:mmedit:Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","2021-07-01 12:10:41,049 - mmedit - INFO - Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","INFO:mmedit:Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","2021-07-01 12:10:41,396 - mmedit - INFO - Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","INFO:mmedit:Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","2021-07-01 12:10:41,745 - mmedit - INFO - Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","INFO:mmedit:Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","2021-07-01 12:10:42,097 - mmedit - INFO - Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","INFO:mmedit:Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","2021-07-01 12:10:42,444 - mmedit - INFO - Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","INFO:mmedit:Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","2021-07-01 12:10:42,790 - mmedit - INFO - Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","INFO:mmedit:Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","2021-07-01 12:10:43,140 - mmedit - INFO - Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","INFO:mmedit:Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","2021-07-01 12:10:43,490 - mmedit - INFO - Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","INFO:mmedit:Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","2021-07-01 12:10:43,841 - mmedit - INFO - Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","INFO:mmedit:Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","2021-07-01 12:10:44,193 - mmedit - INFO - Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","INFO:mmedit:Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","2021-07-01 12:10:44,541 - mmedit - INFO - Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","INFO:mmedit:Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","2021-07-01 12:10:44,895 - mmedit - INFO - Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","INFO:mmedit:Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","2021-07-01 12:10:45,248 - mmedit - INFO - Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","INFO:mmedit:Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","2021-07-01 12:10:45,595 - mmedit - INFO - Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","INFO:mmedit:Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","2021-07-01 12:10:45,950 - mmedit - INFO - Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","INFO:mmedit:Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","2021-07-01 12:10:46,301 - mmedit - INFO - Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","INFO:mmedit:Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","2021-07-01 12:10:46,649 - mmedit - INFO - Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","INFO:mmedit:Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","2021-07-01 12:10:47,003 - mmedit - INFO - Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","INFO:mmedit:Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","2021-07-01 12:10:47,356 - mmedit - INFO - Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","INFO:mmedit:Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:14,231 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","INFO:mmedit:Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","2021-07-01 12:11:14,578 - mmedit - INFO - Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","INFO:mmedit:Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","2021-07-01 12:11:14,930 - mmedit - INFO - Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","INFO:mmedit:Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","2021-07-01 12:11:15,289 - mmedit - INFO - Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","INFO:mmedit:Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","2021-07-01 12:11:15,642 - mmedit - INFO - Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","INFO:mmedit:Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","2021-07-01 12:11:15,993 - mmedit - INFO - Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","INFO:mmedit:Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","2021-07-01 12:11:16,354 - mmedit - INFO - Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","INFO:mmedit:Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","2021-07-01 12:11:16,712 - mmedit - INFO - Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","INFO:mmedit:Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","2021-07-01 12:11:17,065 - mmedit - INFO - Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","INFO:mmedit:Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","2021-07-01 12:11:17,425 - mmedit - INFO - Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","INFO:mmedit:Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","2021-07-01 12:11:17,780 - mmedit - INFO - Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","INFO:mmedit:Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","2021-07-01 12:11:18,135 - mmedit - INFO - Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","INFO:mmedit:Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","2021-07-01 12:11:18,495 - mmedit - INFO - Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","INFO:mmedit:Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","2021-07-01 12:11:18,851 - mmedit - INFO - Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","INFO:mmedit:Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","2021-07-01 12:11:19,210 - mmedit - INFO - Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","INFO:mmedit:Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","2021-07-01 12:11:19,567 - mmedit - INFO - Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","INFO:mmedit:Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","2021-07-01 12:11:19,923 - mmedit - INFO - Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","INFO:mmedit:Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","2021-07-01 12:11:20,286 - mmedit - INFO - Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","INFO:mmedit:Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","2021-07-01 12:11:20,644 - mmedit - INFO - Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","INFO:mmedit:Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","2021-07-01 12:11:21,000 - mmedit - INFO - Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","INFO:mmedit:Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","2021-07-01 12:11:21,359 - mmedit - INFO - Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","INFO:mmedit:Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","2021-07-01 12:11:21,719 - mmedit - INFO - Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","INFO:mmedit:Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","2021-07-01 12:11:22,072 - mmedit - INFO - Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","INFO:mmedit:Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","2021-07-01 12:11:22,434 - mmedit - INFO - Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","INFO:mmedit:Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","2021-07-01 12:11:22,798 - mmedit - INFO - Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","INFO:mmedit:Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","2021-07-01 12:11:23,158 - mmedit - INFO - Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","INFO:mmedit:Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","2021-07-01 12:11:23,513 - mmedit - INFO - Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","INFO:mmedit:Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","2021-07-01 12:11:23,875 - mmedit - INFO - Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","INFO:mmedit:Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","2021-07-01 12:11:24,236 - mmedit - INFO - Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","INFO:mmedit:Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","2021-07-01 12:11:24,597 - mmedit - INFO - Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","INFO:mmedit:Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","2021-07-01 12:11:24,951 - mmedit - INFO - Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","INFO:mmedit:Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","2021-07-01 12:11:25,313 - mmedit - INFO - Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","INFO:mmedit:Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","2021-07-01 12:11:25,677 - mmedit - INFO - Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","INFO:mmedit:Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","2021-07-01 12:11:26,038 - mmedit - INFO - Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","INFO:mmedit:Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","2021-07-01 12:11:26,393 - mmedit - INFO - Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","INFO:mmedit:Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","2021-07-01 12:11:26,753 - mmedit - INFO - Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","INFO:mmedit:Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","2021-07-01 12:11:27,115 - mmedit - INFO - Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","INFO:mmedit:Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","2021-07-01 12:11:27,472 - mmedit - INFO - Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","INFO:mmedit:Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","2021-07-01 12:11:27,830 - mmedit - INFO - Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","INFO:mmedit:Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","2021-07-01 12:11:28,189 - mmedit - INFO - Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","INFO:mmedit:Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","2021-07-01 12:11:28,553 - mmedit - INFO - Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","INFO:mmedit:Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","2021-07-01 12:11:28,910 - mmedit - INFO - Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","INFO:mmedit:Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","2021-07-01 12:11:29,266 - mmedit - INFO - Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","INFO:mmedit:Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","2021-07-01 12:11:29,628 - mmedit - INFO - Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","INFO:mmedit:Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","2021-07-01 12:11:29,989 - mmedit - INFO - Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","INFO:mmedit:Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","2021-07-01 12:11:30,345 - mmedit - INFO - Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","INFO:mmedit:Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","2021-07-01 12:11:30,704 - mmedit - INFO - Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","INFO:mmedit:Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","2021-07-01 12:11:31,067 - mmedit - INFO - Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","INFO:mmedit:Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","2021-07-01 12:11:31,425 - mmedit - INFO - Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","INFO:mmedit:Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","2021-07-01 12:11:31,782 - mmedit - INFO - Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","INFO:mmedit:Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:58,494 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:11:58,598 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n","INFO:mmedit:Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n"]}],"source":["# EDVR (Video Super-Resolution - Sliding Window)\n","!./tools/dist_train.sh ./demo_files/demo_config_EDVR.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":197033,"status":"ok","timestamp":1625141428032,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"_RdqmlT6qgt2","outputId":"b951b426-e06c-4f31-db01-449333eab333"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:06:47,253 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:06:47,253 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:06:47,254 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:06:47,254 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_BasicVSR.py\n","exp_name = 'basicvsr_demo'\n","\n","# model settings\n","model = dict(\n"," type='BasicVSR',\n"," generator=dict(\n"," type='BasicVSRNet',\n"," mid_channels=64,\n"," num_blocks=30,\n"," spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'\n"," 'basicvsr/spynet_20210409-c6c1bd09.pth'),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = dict(fix_iter=5000)\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderMultipleGTDataset'\n","val_dataset_type = 'SRFolderMultipleGTDataset'\n","\n","train_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=6,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True), # 2 gpus\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1, workers_per_gpu=1),\n","\n"," # train\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," # val\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," # test\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(\n"," generator=dict(\n"," type='Adam',\n"," lr=2e-4,\n"," betas=(0.9, 0.99),\n"," paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)})))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[300000],\n"," restart_weights=[1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," # dict(type='TensorboardLoggerHook'),\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","find_unused_parameters = True\n","\n","2021-07-01 12:06:47,291 - mmedit - INFO - Use load_from_http loader\n","2021-07-01 12:06:47,569 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/basicvsr_demo\n","2021-07-01 12:06:47,569 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:07:14,210 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.500e-05, eta: 0:42:52, time: 25.981, data_time: 24.045, memory: 3464, loss_pix: 0.0634, loss: 0.0634\n","2021-07-01 12:07:15,171 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.500e-05, eta: 0:22:00, time: 0.961, data_time: 0.011, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","2021-07-01 12:07:16,052 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.500e-05, eta: 0:14:59, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0476, loss: 0.0476\n","2021-07-01 12:07:16,940 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.500e-05, eta: 0:11:29, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:17,829 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.500e-05, eta: 0:09:22, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0796, loss: 0.0796\n","2021-07-01 12:07:18,712 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.500e-05, eta: 0:07:57, time: 0.884, data_time: 0.004, memory: 3518, loss_pix: 0.0680, loss: 0.0680\n","2021-07-01 12:07:19,594 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.500e-05, eta: 0:06:56, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0607, loss: 0.0607\n","2021-07-01 12:07:20,481 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.500e-05, eta: 0:06:10, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0598, loss: 0.0598\n","2021-07-01 12:07:21,361 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.500e-05, eta: 0:05:35, time: 0.880, data_time: 0.003, memory: 3518, loss_pix: 0.0664, loss: 0.0664\n","2021-07-01 12:07:22,274 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.500e-05, eta: 0:05:06, time: 0.913, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:07:23,161 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.500e-05, eta: 0:04:42, time: 0.887, data_time: 0.005, memory: 3518, loss_pix: 0.0771, loss: 0.0771\n","2021-07-01 12:07:24,058 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.500e-05, eta: 0:04:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0521, loss: 0.0521\n","2021-07-01 12:07:24,944 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.500e-05, eta: 0:04:05, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:07:25,835 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.500e-05, eta: 0:03:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0515, loss: 0.0515\n","2021-07-01 12:07:26,723 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.500e-05, eta: 0:03:38, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0674, loss: 0.0674\n","2021-07-01 12:07:27,609 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.500e-05, eta: 0:03:26, time: 0.886, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:28,498 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.500e-05, eta: 0:03:16, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0670, loss: 0.0670\n","2021-07-01 12:07:29,388 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.500e-05, eta: 0:03:07, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0663, loss: 0.0663\n","2021-07-01 12:07:30,284 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.500e-05, eta: 0:02:59, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0633, loss: 0.0633\n","2021-07-01 12:07:31,176 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.500e-05, eta: 0:02:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0482, loss: 0.0482\n","2021-07-01 12:07:32,073 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.500e-05, eta: 0:02:44, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0743, loss: 0.0743\n","2021-07-01 12:07:32,966 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.500e-05, eta: 0:02:38, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0690, loss: 0.0690\n","2021-07-01 12:07:33,858 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.500e-05, eta: 0:02:32, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0437, loss: 0.0437\n","2021-07-01 12:07:34,750 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.500e-05, eta: 0:02:27, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:35,642 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.500e-05, eta: 0:02:22, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0781, loss: 0.0781\n","2021-07-01 12:07:36,533 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.500e-05, eta: 0:02:17, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:07:37,427 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.500e-05, eta: 0:02:13, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:07:38,321 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.500e-05, eta: 0:02:08, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0567, loss: 0.0567\n","2021-07-01 12:07:39,212 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.500e-05, eta: 0:02:04, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0846, loss: 0.0846\n","2021-07-01 12:07:40,104 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.500e-05, eta: 0:02:01, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0658, loss: 0.0658\n","2021-07-01 12:07:40,993 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.500e-05, eta: 0:01:57, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0502, loss: 0.0502\n","2021-07-01 12:07:41,885 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.500e-05, eta: 0:01:54, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0622, loss: 0.0622\n","2021-07-01 12:07:42,787 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.500e-05, eta: 0:01:50, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0657, loss: 0.0657\n","2021-07-01 12:07:43,674 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.500e-05, eta: 0:01:47, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0643, loss: 0.0643\n","2021-07-01 12:07:44,567 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.500e-05, eta: 0:01:44, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0898, loss: 0.0898\n","2021-07-01 12:07:45,458 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.500e-05, eta: 0:01:41, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0865, loss: 0.0865\n","2021-07-01 12:07:46,341 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.500e-05, eta: 0:01:38, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0511, loss: 0.0511\n","2021-07-01 12:07:47,225 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.500e-05, eta: 0:01:36, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:48,109 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.500e-05, eta: 0:01:33, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0653, loss: 0.0653\n","2021-07-01 12:07:48,990 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:07:49,874 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.885, data_time: 0.003, memory: 3518, loss_pix: 0.0788, loss: 0.0788\n","2021-07-01 12:07:50,755 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.500e-05, eta: 0:01:26, time: 0.881, data_time: 0.005, memory: 3518, loss_pix: 0.0605, loss: 0.0605\n","2021-07-01 12:07:51,638 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.500e-05, eta: 0:01:24, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0539, loss: 0.0539\n","2021-07-01 12:07:52,518 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.500e-05, eta: 0:01:21, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0503, loss: 0.0503\n","2021-07-01 12:07:53,395 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.500e-05, eta: 0:01:19, time: 0.877, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:07:54,273 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0555, loss: 0.0555\n","2021-07-01 12:07:55,159 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.500e-05, eta: 0:01:15, time: 0.886, data_time: 0.007, memory: 3518, loss_pix: 0.0806, loss: 0.0806\n","2021-07-01 12:07:56,040 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.500e-05, eta: 0:01:13, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0576, loss: 0.0576\n","2021-07-01 12:07:56,919 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.500e-05, eta: 0:01:11, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0871, loss: 0.0871\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:08:32,618 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9899, SSIM: 0.5295\n","2021-07-01 12:08:33,591 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.500e-05, eta: 0:01:40, time: 35.792, data_time: 34.822, memory: 3518, loss_pix: 0.0773, loss: 0.0773\n","2021-07-01 12:08:34,462 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.500e-05, eta: 0:01:37, time: 0.871, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:08:35,326 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.500e-05, eta: 0:01:34, time: 0.864, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:36,192 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0575, loss: 0.0575\n","2021-07-01 12:08:37,069 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.876, data_time: 0.003, memory: 3518, loss_pix: 0.0842, loss: 0.0842\n","2021-07-01 12:08:37,942 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.500e-05, eta: 0:01:25, time: 0.873, data_time: 0.003, memory: 3518, loss_pix: 0.0836, loss: 0.0836\n","2021-07-01 12:08:38,808 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.500e-05, eta: 0:01:22, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0580, loss: 0.0580\n","2021-07-01 12:08:39,679 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.500e-05, eta: 0:01:20, time: 0.870, data_time: 0.003, memory: 3518, loss_pix: 0.0449, loss: 0.0449\n","2021-07-01 12:08:40,557 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0702, loss: 0.0702\n","2021-07-01 12:08:41,430 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.500e-05, eta: 0:01:14, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:42,308 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.500e-05, eta: 0:01:12, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:08:43,182 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.500e-05, eta: 0:01:09, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0489, loss: 0.0489\n","2021-07-01 12:08:44,056 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.500e-05, eta: 0:01:07, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0566, loss: 0.0566\n","2021-07-01 12:08:44,932 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.500e-05, eta: 0:01:05, time: 0.875, data_time: 0.003, memory: 3518, loss_pix: 0.0597, loss: 0.0597\n","2021-07-01 12:08:45,819 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.500e-05, eta: 0:01:02, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0640, loss: 0.0640\n","2021-07-01 12:08:46,698 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.500e-05, eta: 0:01:00, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:47,580 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.500e-05, eta: 0:00:58, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:08:48,464 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.500e-05, eta: 0:00:56, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:08:49,347 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.500e-05, eta: 0:00:54, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0603, loss: 0.0603\n","2021-07-01 12:08:50,229 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.500e-05, eta: 0:00:51, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0478, loss: 0.0478\n","2021-07-01 12:08:51,113 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.500e-05, eta: 0:00:49, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:08:52,000 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.500e-05, eta: 0:00:47, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0861, loss: 0.0861\n","2021-07-01 12:08:52,890 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.500e-05, eta: 0:00:45, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:08:53,792 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.500e-05, eta: 0:00:43, time: 0.903, data_time: 0.003, memory: 3518, loss_pix: 0.0787, loss: 0.0787\n","2021-07-01 12:08:54,688 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.500e-05, eta: 0:00:41, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0744, loss: 0.0744\n","2021-07-01 12:08:55,582 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.500e-05, eta: 0:00:39, time: 0.895, data_time: 0.003, memory: 3518, loss_pix: 0.0792, loss: 0.0792\n","2021-07-01 12:08:56,476 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.500e-05, eta: 0:00:38, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0645, loss: 0.0645\n","2021-07-01 12:08:57,368 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.500e-05, eta: 0:00:36, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:08:58,261 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.500e-05, eta: 0:00:34, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:59,159 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.500e-05, eta: 0:00:32, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0626, loss: 0.0626\n","2021-07-01 12:09:00,055 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.500e-05, eta: 0:00:30, time: 0.896, data_time: 0.004, memory: 3518, loss_pix: 0.0681, loss: 0.0681\n","2021-07-01 12:09:00,954 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.500e-05, eta: 0:00:28, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0671, loss: 0.0671\n","2021-07-01 12:09:01,860 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.500e-05, eta: 0:00:27, time: 0.906, data_time: 0.003, memory: 3518, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:09:02,760 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.500e-05, eta: 0:00:25, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0594, loss: 0.0594\n","2021-07-01 12:09:03,658 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.500e-05, eta: 0:00:23, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0446, loss: 0.0446\n","2021-07-01 12:09:04,555 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.500e-05, eta: 0:00:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0491, loss: 0.0491\n","2021-07-01 12:09:05,452 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.500e-05, eta: 0:00:20, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0450, loss: 0.0450\n","2021-07-01 12:09:06,351 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.500e-05, eta: 0:00:18, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0795, loss: 0.0795\n","2021-07-01 12:09:07,257 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.500e-05, eta: 0:00:17, time: 0.905, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:08,161 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.500e-05, eta: 0:00:15, time: 0.904, data_time: 0.003, memory: 3518, loss_pix: 0.0588, loss: 0.0588\n","2021-07-01 12:09:09,063 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.500e-05, eta: 0:00:13, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:09:09,955 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.500e-05, eta: 0:00:12, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0599, loss: 0.0599\n","2021-07-01 12:09:10,849 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.500e-05, eta: 0:00:10, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:11,749 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.500e-05, eta: 0:00:09, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0667, loss: 0.0667\n","2021-07-01 12:09:12,638 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.500e-05, eta: 0:00:07, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0558, loss: 0.0558\n","2021-07-01 12:09:13,576 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.500e-05, eta: 0:00:06, time: 0.938, data_time: 0.052, memory: 3518, loss_pix: 0.0577, loss: 0.0577\n","2021-07-01 12:09:14,463 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.500e-05, eta: 0:00:04, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:09:15,351 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.500e-05, eta: 0:00:02, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0578, loss: 0.0578\n","2021-07-01 12:09:16,240 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.500e-05, eta: 0:00:01, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:09:52,294 - mmedit - INFO - Saving checkpoint at 100 iterations\n","2021-07-01 12:09:52,433 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.4372, SSIM: 0.5687\n"]}],"source":["# BasicVSR (Video Super-Resolution - Recurrent)\n","!./tools/dist_train.sh ./demo_files/demo_config_BasicVSR.py 1 "]},{"cell_type":"markdown","metadata":{"id":"QT0zwBFt7J13"},"source":["**This is the end of this tutorial. For more advanced usage, please see our comprehensive tutorial [here](). Enjoy coding with MMEditing!**"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"restorer_basic_tutorial.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3.7.7 64-bit ('pre-commit': conda)","name":"python377jvsc74a57bd04974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"},"language_info":{"name":"python","version":""},"metadata":{"interpreter":{"hash":"4974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"}}},"nbformat":4,"nbformat_minor":2} diff --git a/demo/restorer_basic_tutorial_zh-CN.ipynb b/demo/restorer_basic_tutorial_zh-CN.ipynb deleted file mode 100644 index fdd18f0c84..0000000000 --- a/demo/restorer_basic_tutorial_zh-CN.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells":[{"cell_type":"markdown","metadata":{"id":"T2WWQiheMF7q"},"source":["# MMEditing 基础教程\n","\n","欢迎来到MMEditing! 这是 MMEditing 的官方 Colab 教程。在本教程中,您将学习如何使用 MMEditing 中提供的 API 训练和测试恢复器。\n","\n","这是训练和测试现有模型的快速指南。如果您想基于 MMEditing 开发自己的模型并了解有关代码结构的更多信息,请参阅我们的[综合教程]()。\n","\n","[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-mmlab/mmedit/blob/main/demo/restorer_basic_tutorial.ipynb)\n","\n"]},{"cell_type":"markdown","metadata":{"id":"-kYw3WQ0MQry"},"source":["## 安装MMEditing\n","\n","MMEditing 可以分三步安装:\n","\n","1. 安装兼容的 PyTorch 版本(你需要使用 `nvcc -V` 检查你的 CUDA 版本)。\n","2. 安装预编译的MMCV\n","3. 克隆并安装MMEditing\n","\n","步骤如下所示:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":321,"status":"ok","timestamp":1625140540858,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"uha_13idyl1b","outputId":"87056561-5930-45b3-e1a8-f9e103d10b23"},"outputs":[{"name":"stdout","output_type":"stream","text":["nvcc: NVIDIA (R) Cuda compiler driver\n","Copyright (c) 2005-2020 NVIDIA Corporation\n","Built on Wed_Jul_22_19:09:09_PDT_2020\n","Cuda compilation tools, release 11.0, V11.0.221\n","Build cuda_11.0_bu.TC445_37.28845127_0\n","gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","Copyright (C) 2017 Free Software Foundation, Inc.\n","This is free software; see the source for copying conditions. There is NO\n","warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n","\n"]}],"source":["# Check nvcc version\n","!nvcc -V\n","# Check GCC version (MMEditing needs gcc >= 5.0)\n","!gcc --version"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":279948,"status":"ok","timestamp":1625140820804,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"GIeIZEzZMfc0","outputId":"fe2e5ded-988d-4563-eb18-374344c316ef"},"outputs":[{"name":"stdout","output_type":"stream","text":["Looking in links: https://download.pytorch.org/whl/torch_stable.html\n","Collecting torch==1.7.0+cu110\n","\u001b[?25l Downloading https://download.pytorch.org/whl/cu110/torch-1.7.0%2Bcu110-cp37-cp37m-linux_x86_64.whl (1137.1MB)\n","\u001b[K |███████████████████████▌ | 834.1MB 1.3MB/s eta 0:03:50tcmalloc: large alloc 1147494400 bytes == 0x56458d07a000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |█████████████████████████████▊ | 1055.7MB 1.2MB/s eta 0:01:07tcmalloc: large alloc 1434370048 bytes == 0x5645d16d0000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x5645536367f0 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x564553632853 0x5645536b4e36 0x5645537373e1 0x5645536976a9 0x564553602cc4 0x5645535c3559 0x5645536374f8 0x5645535c430a 0x5645536323b5 0x5645536317ad 0x5645535c43ea 0x5645536323b5 0x5645535c430a 0x5645536323b5\n","\u001b[K |████████████████████████████████| 1137.1MB 1.1MB/s eta 0:00:01tcmalloc: large alloc 1421369344 bytes == 0x564626ebc000 @ 0x7fce190c6615 0x5645535bfcdc 0x56455369f52a 0x5645535c2afd 0x5645536b3fed 0x564553636988 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363260e 0x5645535c430a 0x56455363260e 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c43ea 0x56455363332a 0x5645536314ae 0x5645535c4a81\n","\u001b[K |████████████████████████████████| 1137.1MB 16kB/s \n","\u001b[?25hCollecting torchvision==0.8.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/1d/3f/4f45249458a0dee85bff7acf4a2ac6177708253f1f318fcf6ee230fb864f/torchvision-0.8.0-cp37-cp37m-manylinux1_x86_64.whl (11.8MB)\n","\u001b[K |████████████████████████████████| 11.8MB 254kB/s \n","\u001b[?25hRequirement already satisfied, skipping upgrade: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (3.7.4.3)\n","Collecting dataclasses\n"," Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n","Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (1.19.5)\n","Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/dist-packages (from torch==1.7.0+cu110) (0.16.0)\n","Requirement already satisfied, skipping upgrade: pillow>=4.1.1 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.8.0) (7.1.2)\n","\u001b[31mERROR: torchtext 0.10.0 has requirement torch==1.9.0, but you'll have torch 1.7.0+cu110 which is incompatible.\u001b[0m\n","Installing collected packages: dataclasses, torch, torchvision\n"," Found existing installation: torch 1.9.0+cu102\n"," Uninstalling torch-1.9.0+cu102:\n"," Successfully uninstalled torch-1.9.0+cu102\n"," Found existing installation: torchvision 0.10.0+cu102\n"," Uninstalling torchvision-0.10.0+cu102:\n"," Successfully uninstalled torchvision-0.10.0+cu102\n","Successfully installed dataclasses-0.6 torch-1.7.0+cu110 torchvision-0.8.0\n","Looking in links: https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html\n","Collecting mmcv-full==1.3.5\n","\u001b[?25l Downloading https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/mmcv_full-1.3.5-cp37-cp37m-manylinux1_x86_64.whl (31.1MB)\n","\u001b[K |████████████████████████████████| 31.1MB 107kB/s \n","\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (1.19.5)\n","Collecting addict\n"," Downloading https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl\n","Collecting yapf\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/5f/0d/8814e79eb865eab42d95023b58b650d01dec6f8ea87fc9260978b1bf2167/yapf-0.31.0-py2.py3-none-any.whl (185kB)\n","\u001b[K |████████████████████████████████| 194kB 33.0MB/s \n","\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (7.1.2)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full==1.3.5) (4.1.2.30)\n","Installing collected packages: addict, yapf, mmcv-full\n","Successfully installed addict-2.4.0 mmcv-full-1.3.5 yapf-0.31.0\n","Cloning into 'mmediting'...\n","remote: Enumerating objects: 7162, done.\u001b[K\n","remote: Counting objects: 100% (1367/1367), done.\u001b[K\n","remote: Compressing objects: 100% (793/793), done.\u001b[K\n","remote: Total 7162 (delta 827), reused 928 (delta 554), pack-reused 5795\u001b[K\n","Receiving objects: 100% (7162/7162), 5.02 MiB | 32.14 MiB/s, done.\n","Resolving deltas: 100% (4826/4826), done.\n","/content/mmediting\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 1)) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 2)) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 3)) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 4)) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from -r requirements/runtime.txt (line 5)) (0.31.0)\n","Collecting codecov\n"," Downloading https://files.pythonhosted.org/packages/93/9f/bbea5b6231308458963cb5c067bc5643da9949689702fa5a382714b59699/codecov-2.1.11-py2.py3-none-any.whl\n","Collecting flake8\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/fc/80/35a0716e5d5101e643404dabd20f07f5528a21f3ef4032d31a49c913237b/flake8-3.9.2-py2.py3-none-any.whl (73kB)\n","\u001b[K |████████████████████████████████| 81kB 9.7MB/s \n","\u001b[?25hCollecting interrogate\n"," Downloading https://files.pythonhosted.org/packages/cd/6d/ce3ac440b13c1b36b323a0eab191499a902adade3cc11b18078c07af3e6e/interrogate-1.4.0-py3-none-any.whl\n","Collecting isort==4.3.21\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n","\u001b[K |████████████████████████████████| 51kB 7.5MB/s \n","\u001b[?25hCollecting onnxruntime\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/f9/76/3d0f8bb2776961c7335693df06eccf8d099e48fa6fb552c7546867192603/onnxruntime-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5MB)\n","\u001b[K |████████████████████████████████| 4.5MB 37.4MB/s \n","\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.7/dist-packages (from -r requirements/tests.txt (line 6)) (3.6.4)\n","Collecting pytest-runner\n"," Downloading https://files.pythonhosted.org/packages/f4/f5/6605d73bf3f4c198915872111b10c4b3c2dccd8485f47b7290ceef037190/pytest_runner-5.3.1-py3-none-any.whl\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (1.19.5)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (2.4.0)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (4.1.2.30)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->-r requirements/runtime.txt (line 2)) (3.13)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.5.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (2.4.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.4.1)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (1.1.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->-r requirements/runtime.txt (line 3)) (3.2.2)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.36.2)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.34.1)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.6.1)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.8.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (2.23.0)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.4.4)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (57.0.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (0.12.0)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.12.4)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (3.3.4)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.31.0)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->-r requirements/runtime.txt (line 4)) (1.0.1)\n","Requirement already satisfied: coverage in /usr/local/lib/python3.7/dist-packages (from codecov->-r requirements/tests.txt (line 1)) (3.7.1)\n","Collecting pyflakes<2.4.0,>=2.3.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/11/2a745612f1d3cbbd9c69ba14b1b43a35a2f5c3c81cd0124508c52c64307f/pyflakes-2.3.1-py2.py3-none-any.whl (68kB)\n","\u001b[K |████████████████████████████████| 71kB 9.8MB/s \n","\u001b[?25hCollecting pycodestyle<2.8.0,>=2.7.0\n","\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/cc/227251b1471f129bc35e966bb0fceb005969023926d744139642d847b7ae/pycodestyle-2.7.0-py2.py3-none-any.whl (41kB)\n","\u001b[K |████████████████████████████████| 51kB 8.7MB/s \n","\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n"," Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from flake8->-r requirements/tests.txt (line 2)) (4.5.0)\n","Requirement already satisfied: tabulate in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.8.9)\n","Collecting colorama\n"," Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n","Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (7.1.2)\n","Requirement already satisfied: toml in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (0.10.2)\n","Requirement already satisfied: py in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (1.10.0)\n","Requirement already satisfied: attrs in /usr/local/lib/python3.7/dist-packages (from interrogate->-r requirements/tests.txt (line 3)) (21.2.0)\n","Requirement already satisfied: flatbuffers in /usr/local/lib/python3.7/dist-packages (from onnxruntime->-r requirements/tests.txt (line 5)) (1.12)\n","Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (8.8.0)\n","Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (0.7.1)\n","Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.15.0)\n","Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.7/dist-packages (from pytest->-r requirements/tests.txt (line 6)) (1.4.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->-r requirements/runtime.txt (line 3)) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->-r requirements/runtime.txt (line 3)) (1.3.1)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (3.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2021.5.30)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (1.24.3)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->-r requirements/runtime.txt (line 4)) (2.10)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (1.3.0)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.7.2)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (4.2.2)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->-r requirements/tests.txt (line 2)) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->-r requirements/runtime.txt (line 4)) (3.1.1)\n","Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.7/dist-packages (from rsa<5,>=3.1.4; python_version >= \"3.6\"->google-auth<2,>=1.6.3->tensorboard->-r requirements/runtime.txt (line 4)) (0.4.8)\n","Installing collected packages: codecov, pyflakes, pycodestyle, mccabe, flake8, colorama, interrogate, isort, onnxruntime, pytest-runner\n","Successfully installed codecov-2.1.11 colorama-0.4.4 flake8-3.9.2 interrogate-1.4.0 isort-4.3.21 mccabe-0.6.1 onnxruntime-1.8.0 pycodestyle-2.7.0 pyflakes-2.3.1 pytest-runner-5.3.1\n","Created temporary directory: /tmp/pip-ephem-wheel-cache-hu6xvjxh\n","Created temporary directory: /tmp/pip-req-tracker-zk5q0q3z\n","Created requirements tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Created temporary directory: /tmp/pip-install-vr_vpseo\n","Obtaining file:///content/mmediting\n"," Added file:///content/mmediting to build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"," Running setup.py (path:/content/mmediting/setup.py) egg_info for package from file:///content/mmediting\n"," Running command python setup.py egg_info\n"," running egg_info\n"," creating mmedit.egg-info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," Source in /content/mmediting has version 0.8.0, which satisfies requirement mmedit==0.8.0 from file:///content/mmediting\n"," Removed mmedit==0.8.0 from file:///content/mmediting from build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n","Requirement already satisfied: lmdb in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.99)\n","Requirement already satisfied: mmcv-full>=1.2.0 in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (1.3.5)\n","Requirement already satisfied: scikit-image in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.16.2)\n","Requirement already satisfied: tensorboard in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (2.5.0)\n","Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmagic==0.8.0) (0.31.0)\n","Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (3.13)\n","Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (4.1.2.30)\n","Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (7.1.2)\n","Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (2.4.0)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full>=1.2.0->mmedit==0.8.0) (1.19.5)\n","Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.5.1)\n","Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.4.1)\n","Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (2.4.1)\n","Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (3.2.2)\n","Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image->mmedit==0.8.0) (1.1.1)\n","Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.34.1)\n","Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.12.4)\n","Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.0.1)\n","Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.36.2)\n","Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.31.0)\n","Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.12.0)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (2.23.0)\n","Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (1.8.0)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (3.3.4)\n","Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.4.4)\n","Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (0.6.1)\n","Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard->mmedit==0.8.0) (57.0.0)\n","Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image->mmedit==0.8.0) (4.4.2)\n","Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (0.10.0)\n","Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.8.1)\n","Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (2.4.7)\n","Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->mmedit==0.8.0) (1.3.1)\n","Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from grpcio>=1.24.3->tensorboard->mmedit==0.8.0) (1.15.0)\n","Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.2.8)\n","Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.2.2)\n","Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (4.7.2)\n","Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (1.24.3)\n","Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (3.0.4)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2.10)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard->mmedit==0.8.0) (2021.5.30)\n","Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard->mmedit==0.8.0) (4.5.0)\n","Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (1.3.0)\n","Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->mmedit==0.8.0) (0.4.8)\n","Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.4.1)\n","Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard->mmedit==0.8.0) (3.7.4.3)\n","Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->mmedit==0.8.0) (3.1.1)\n","Installing collected packages: mmedit\n"," Running setup.py develop for mmedit\n"," Running command /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '\"'\"'/content/mmediting/setup.py'\"'\"'; __file__='\"'\"'/content/mmediting/setup.py'\"'\"';f=getattr(tokenize, '\"'\"'open'\"'\"', open)(__file__);code=f.read().replace('\"'\"'\\r\\n'\"'\"', '\"'\"'\\n'\"'\"');f.close();exec(compile(code, __file__, '\"'\"'exec'\"'\"'))' develop --no-deps\n"," running develop\n"," running egg_info\n"," writing mmedit.egg-info/PKG-INFO\n"," writing dependency_links to mmedit.egg-info/dependency_links.txt\n"," writing requirements to mmedit.egg-info/requires.txt\n"," writing top-level names to mmedit.egg-info/top_level.txt\n"," reading manifest template 'MANIFEST.in'\n"," warning: no files found matching 'mmedit/VERSION'\n"," warning: no files found matching 'mmedit/model_zoo.yml'\n"," warning: no files found matching '*.py' under directory 'mmedit/configs'\n"," warning: no files found matching '*.yml' under directory 'mmedit/configs'\n"," warning: no files found matching '*.sh' under directory 'mmedit/tools'\n"," warning: no files found matching '*.py' under directory 'mmedit/tools'\n"," adding license file 'LICENSE'\n"," writing manifest file 'mmedit.egg-info/SOURCES.txt'\n"," running build_ext\n"," Creating /usr/local/lib/python3.7/dist-packages/mmedit.egg-link (link to .)\n"," Adding mmedit 0.8.0 to easy-install.pth file\n","\n"," Installed /content/mmediting\n","Successfully installed mmedit\n","Cleaning up...\n","Removed build tracker '/tmp/pip-req-tracker-zk5q0q3z'\n"]}],"source":["# 安装 openmim 用于安装 mmcv-full\n","!pip install openmim\n","\n","# 安装 mmcv-full 使用 CUDA 算子\n","!mim install mmcv-full\n","\n","# 克隆 MMEditing\n","!rm -rf mmediting\n","!git clone https://github.com/open-mmlab/mmediting.git\n","%cd mmediting\n","\n","# 安装 MMEditing\n","!pip install -v -e ."]},{"cell_type":"markdown","metadata":{"id":"QgX96Sc_3PcV"},"source":["## 下载此演示所需的材料\n","在这个演示中,我们将需要一些数据和配置文件。我们将下载并放入 `./demo_files/`"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":4723,"status":"ok","timestamp":1625140825508,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"-K0zFSJ-3V42","outputId":"528a87f7-f78e-4219-84f3-dec19b88e88a"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2021-07-01 11:59:48-- https://download.openmmlab.com/mmediting/demo_files.zip\n","Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.35\n","Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.35|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 19215781 (18M) [application/zip]\n","Saving to: ‘demo_files.zip’\n","\n","demo_files.zip 100%[===================>] 18.33M 6.00MB/s in 3.1s \n","\n","2021-07-01 11:59:52 (6.00 MB/s) - ‘demo_files.zip’ saved [19215781/19215781]\n","\n","Archive: demo_files.zip\n"," creating: demo_files/\n"," inflating: demo_files/demo_config_EDVR.py \n"," inflating: demo_files/demo_config_BasicVSR.py \n"," creating: demo_files/lq_sequences/\n"," creating: demo_files/lq_sequences/calendar/\n"," inflating: demo_files/lq_sequences/calendar/00000006.png \n"," inflating: demo_files/lq_sequences/calendar/00000007.png \n"," inflating: demo_files/lq_sequences/calendar/00000010.png \n"," inflating: demo_files/lq_sequences/calendar/00000004.png \n"," inflating: demo_files/lq_sequences/calendar/00000003.png \n"," inflating: demo_files/lq_sequences/calendar/00000001.png \n"," inflating: demo_files/lq_sequences/calendar/00000000.png \n"," inflating: demo_files/lq_sequences/calendar/00000009.png \n"," inflating: demo_files/lq_sequences/calendar/00000008.png \n"," inflating: demo_files/lq_sequences/calendar/00000002.png \n"," inflating: demo_files/lq_sequences/calendar/00000005.png \n"," creating: demo_files/lq_sequences/city/\n"," inflating: demo_files/lq_sequences/city/00000006.png \n"," inflating: demo_files/lq_sequences/city/00000007.png \n"," inflating: demo_files/lq_sequences/city/00000010.png \n"," inflating: demo_files/lq_sequences/city/00000004.png \n"," inflating: demo_files/lq_sequences/city/00000003.png \n"," inflating: demo_files/lq_sequences/city/00000001.png \n"," inflating: demo_files/lq_sequences/city/00000000.png \n"," inflating: demo_files/lq_sequences/city/00000009.png \n"," inflating: demo_files/lq_sequences/city/00000008.png \n"," inflating: demo_files/lq_sequences/city/00000002.png \n"," inflating: demo_files/lq_sequences/city/00000005.png \n"," creating: demo_files/lq_sequences/.ipynb_checkpoints/\n"," creating: demo_files/gt_images/\n"," inflating: demo_files/gt_images/bird.png \n"," inflating: demo_files/gt_images/woman.png \n"," inflating: demo_files/gt_images/head.png \n"," inflating: demo_files/gt_images/baby.png \n"," inflating: demo_files/gt_images/butterfly.png \n"," inflating: demo_files/demo_config_SRCNN.py \n"," creating: demo_files/lq_images/\n"," extracting: demo_files/lq_images/bird.png \n"," extracting: demo_files/lq_images/woman.png \n"," extracting: demo_files/lq_images/head.png \n"," extracting: demo_files/lq_images/baby.png \n"," extracting: demo_files/lq_images/butterfly.png \n"," creating: demo_files/gt_sequences/\n"," creating: demo_files/gt_sequences/calendar/\n"," inflating: demo_files/gt_sequences/calendar/00000006.png \n"," inflating: demo_files/gt_sequences/calendar/00000007.png \n"," inflating: demo_files/gt_sequences/calendar/00000010.png \n"," inflating: demo_files/gt_sequences/calendar/00000004.png \n"," inflating: demo_files/gt_sequences/calendar/00000003.png \n"," inflating: demo_files/gt_sequences/calendar/00000001.png \n"," inflating: demo_files/gt_sequences/calendar/00000000.png \n"," inflating: demo_files/gt_sequences/calendar/00000009.png \n"," inflating: demo_files/gt_sequences/calendar/00000008.png \n"," inflating: demo_files/gt_sequences/calendar/00000002.png \n"," inflating: demo_files/gt_sequences/calendar/00000005.png \n"," creating: demo_files/gt_sequences/city/\n"," inflating: demo_files/gt_sequences/city/00000006.png \n"," inflating: demo_files/gt_sequences/city/00000007.png \n"," inflating: demo_files/gt_sequences/city/00000010.png \n"," inflating: demo_files/gt_sequences/city/00000004.png \n"," inflating: demo_files/gt_sequences/city/00000003.png \n"," inflating: demo_files/gt_sequences/city/00000001.png \n"," inflating: demo_files/gt_sequences/city/00000000.png \n"," inflating: demo_files/gt_sequences/city/00000009.png \n"," inflating: demo_files/gt_sequences/city/00000008.png \n"," inflating: demo_files/gt_sequences/city/00000002.png \n"," inflating: demo_files/gt_sequences/city/00000005.png \n"," creating: demo_files/gt_sequences/.ipynb_checkpoints/\n"," creating: demo_files/.ipynb_checkpoints/\n"]}],"source":["!wget https://download.openmmlab.com/mmediting/demo_files.zip # 下载文件\n","!unzip demo_files # 解压\n","\n","# 将数据复制到 data/Set5 以备后用\n","!mkdir data\n","!mkdir data/val_set5\n","!cp -r demo_files/lq_images data/val_set5/Set5_bicLRx4\n","!cp -r demo_files/gt_images data/val_set5/Set5"]},{"cell_type":"markdown","metadata":{"id":"zXGurqGKOeNE"},"source":["## 使用预训练的图像恢复器进行推理\n","您可以使用 “restoration_demo.py” 轻松地使用预训练的恢复器对单个图像进行推理。您需要的是\n","\n","1. `CONFIG_FILE`:你要使用的 restorer 对应的配置文件。它指定您要使用的模型。\n","2. `CHECKPOINT_FILE`:预训练模型权重文件的路径。\n","3. `IMAGE_FILE`:输入图像的路径。\n","4. `SAVE_FILE`:您要存储输出图像的位置。\n","5. `imshow`:是否显示图片。(可选的)\n","6. `GPU_ID`:您想使用哪个 GPU。(可选的)\n","\n","获得所有这些详细信息后,您可以直接使用以下命令:\n","\n","```\n","python demo/restoration_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${IMAGE_FILE} ${SAVE_FILE} [--imshow] [--device ${GPU_ID}]\n","```\n","\n","**注:** \n","1. 配置文件位于 `./configs`。\n","2. 我们支持从 url 加载权重文件。您可以到相应页面(例如[这里](https://github.com/open-mmlab/mmediting/tree/master/configs/restorers/esrgan))获取预训练模型的url。\n","\n","---\n","\n","我们现在将使用 `SRCNN` 和 `ESRGAN` 作为示例。\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58677,"status":"ok","timestamp":1625140884175,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"KiPvtvlqM1zb","outputId":"be7375a7-4632-4770-8383-2a8ce654b069"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\" to /root/.cache/torch/hub/checkpoints/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\n","100% 83.9k/83.9k [00:00<00:00, 1.59MB/s]\n","2021-07-01 12:00:10,779 - mmedit - INFO - Use load_from_torchvision loader\n","Downloading: \"https://download.pytorch.org/models/vgg19-dcbb9e9d.pth\" to /root/.cache/torch/hub/checkpoints/vgg19-dcbb9e9d.pth\n","100% 548M/548M [00:07<00:00, 76.0MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\" to /root/.cache/torch/hub/checkpoints/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth\n","100% 196M/196M [00:26<00:00, 7.61MB/s]\n","bird_ESRGAN.png bird_SRCNN.png\n"]}],"source":["# SRCNN\n","!python demo/restoration_demo.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth ./demo_files/lq_images/bird.png ./outputs/bird_SRCNN.png\n","\n","# ESRGAN\n","!python demo/restoration_demo.py ./configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth ./demo_files/lq_images/bird.png ./outputs/bird_ESRGAN.png\n","\n","# 检查图像是否已保存\n","!ls ./outputs"]},{"cell_type":"markdown","metadata":{"id":"W1DfGHu3Xcfd"},"source":["## 使用预训练的视频复原器进行推理\n","\n","MMEditing 也支持视频超分辨率方法,过程类似。您可以使用带有以下参数的 `restoration_video_demo.py`:\n","\n","1. `CONFIG_FILE`:你要使用的 restorer 对应的配置文件。它指定您要使用的模型。\n","2. `CHECKPOINT_FILE`:预训练模型权重文件的路径。\n","3. `INPUT_DIR`: 包含视频帧的目录。\n","4. `OUTPUT_DIR`: 要存储输出帧的位置。\n","5. `WINDOW_SIZE`: 使用滑动窗口方法时的窗口大小(可选)。\n","6. `GPU_ID`: 您想使用哪个 GPU(可选)。\n","\n","```\n","python demo/restoration_video_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} ${INPUT_DIR} ${OUTPUT_DIR} [--window_size=$WINDOW_SIZE] [--device ${GPU_ID}]\n","```\n","**注:** 视频超分辨率有两种不同的框架:***滑动窗口***和***循环***框架。使用 EDVR 等滑动窗口框架的方法时,需要指定 `window_size`。此值取决于您使用的模型。\n","\n","---\n","\n","我们现在将使用 `EDVR` 和 `BasicVSR` 作为示例。\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29263,"status":"ok","timestamp":1625140913405,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"iaoE7UF5Xb2i","outputId":"a022e0bd-c47a-450e-f4e4-1bf9f92e4813"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\" to /root/.cache/torch/hub/checkpoints/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth\n","100% 11.5M/11.5M [00:01<00:00, 8.55MB/s]\n","2021-07-01 12:01:09,689 - mmedit - INFO - Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth\" to /root/.cache/torch/hub/checkpoints/spynet_20210409-c6c1bd09.pth\n","100% 5.50M/5.50M [00:00<00:00, 8.88MB/s]\n","Use load_from_http loader\n","Downloading: \"https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth\" to /root/.cache/torch/hub/checkpoints/basicvsr_reds4_20120409-0e599677.pth\n","100% 24.1M/24.1M [00:02<00:00, 8.97MB/s]\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# EDVR(滑动窗口框架)\n","!python demo/restoration_video_demo.py ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_EDVR --window_size=5\n","\n","# BasicVSR(循环框架)\n","!python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth demo_files/lq_sequences/calendar/ ./outputs/calendar_BasicVSR\n","\n","# 检查是否保存了视频帧\n","!ls ./outputs/calendar_BasicVSR"]},{"cell_type":"markdown","metadata":{"id":"Rf3LW57qMHXb"},"source":["## 使用配置文件在预定义的数据集上进行测试\n","\n","上述演示提供了一种对单个图像或视频序列进行推理的简单方法。如果要对一组图像或序列进行推理,可以使用位于 `./configs` 中的配置文件。\n"," \n","现有的配置文件允许您对常见数据集进行推理,例如图像超分辨率中的 `Set5` 和视频超分辨率中的 `REDS4`。您可以使用以下命令:\n","\n","1. `CONFIG_FILE`: 你要使用的复原器和数据集对应的配置文件\n","2. `CHECKPOINT_FILE`: 预训练模型权重文件的路径。\n","3. `GPU_NUM`: 用于测试的 GPU 数量。\n","4. `RESULT_FILE`: 输出结果 pickle 文件的路径。(可选)\n","5. `IMAGE_SAVE_PATH`: 要存储输出图像的位置。(可选)\n","\n","```\n","# 单 GPU 测试\n","python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","\n","# 多 GPU 测试\n","./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--save-path ${IMAGE_SAVE_PATH}]\n","```\n","您需要做的是修改配置文件中的 `lq_folder` 和 `gt_folder`:\n","```\n","test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/val_set5/Set5_bicLRx4',\n"," gt_folder='data/val_set5/Set5',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","```\n","\n","**注**: 某些数据集类型(例如 `SRREDSDataset`)需要一个注释文件来指定数据集的详细信息。更多细节请参考 `./mmedit/dataset/` 中的相应文件。\n","\n","---\n","\n","以下是 SRCNN 的命令。对于其他模型,您可以简单地更改配置文件和预训练模型的路径。\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":14095,"status":"ok","timestamp":1625140927462,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"tClgIYgcbbVg","outputId":"c37ec2de-e1c9-42ae-ed9b-31009d48ae64"},"outputs":[{"name":"stdout","output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"tools/test.py\", line 136, in \n"," main()\n"," File \"tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 62, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_folder_dataset.py\", line 73, in load_annotations\n"," lq_paths = self.scan_folder(self.lq_folder)\n"," File \"/content/mmediting/mmedit/datasets/base_sr_dataset.py\", line 39, in scan_folder\n"," images = list(scandir(path, suffix=IMG_EXTENSIONS, recursive=True))\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/path.py\", line 63, in _scandir\n"," for entry in os.scandir(dir_path):\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/test.py\", line 136, in \n"," main()\n"," File \"./tools/test.py\", line 73, in main\n"," dataset = build_dataset(cfg.data.test)\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRFolderDataset: [Errno 2] No such file or directory: 'data/val_set5/Set5_bicLRx4'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/test.py', '--local_rank=0', './configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py', 'https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth', '--launcher', 'pytorch', '--save-path', './outputs/']' returned non-zero exit status 1.\n"]}],"source":["# 单 GPU\n","!python tools/test.py ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/\n","\n","# 多 GPU\n","!./tools/dist_test.sh ./configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth 1 --save-path ./outputs/"]},{"cell_type":"markdown","metadata":{"id":"KWKVyeEQelh3"},"source":["## 在自定义数据集上进行测试\n","\n","当您想在自定义数据集上进行测试时,除了数据集路径之外,您还需要修改 `test_dataset_type`。 \n","\n","- 对于图像超分辨率,需要使用 `SRFolderDataset`\n","- 对于视频超分辨率的滑动窗口框架(例如 EDVR、TDAN),需要使用 `SRFolderVideoDataset`。\n","- 对于视频超分辨率的循环框架(例如 BasicVSR、IconVSR),需要使用 `SRFolderMultipleGTDataset`。\n","\n","这些数据集类型假定指定目录中的所有图像/序列都用于测试。文件夹结构应该是\n","```\n","| lq_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," | ...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","| gt_root\n"," | sequence_1\n"," | 000.png\n"," | 001.png\n"," |...\n"," | sequence_2\n"," | 000.png\n"," | ...\n"," | ...\n","```\n","我们将使用 **SRCNN**、**EDVR**、**BasicVSR** 作为示例。请注意 `test_dataset_type` 和 `data['test']` 的设置。"]},{"cell_type":"markdown","metadata":{"id":"0p2rP8jV_dL1"},"source":["**SRCNN**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8729,"status":"ok","timestamp":1625140936180,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"4kEev4wVIq_L","outputId":"8026ed73-f781-4eb2-bb80-d3446bd131df"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 5/5, 8.6 task/s, elapsed: 1s, ETA: 0s\n","Eval-PSNR: 28.433974369836108\n","Eval-SSIM: 0.8099053586583066\n","baby.png bird.png butterfly.png head.png woman.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_SRCNN.py https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth --save-path ./outputs/testset_SRCNN\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_SRCNN"]},{"cell_type":"markdown","metadata":{"id":"RONzjTTU_gem"},"source":["**EDVR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":19671,"status":"ok","timestamp":1625140955813,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"vL8WOWXY0fNJ","outputId":"dc2a8f81-9bef-4ad4-c5b2-c6f124e6b113"},"outputs":[{"name":"stdout","output_type":"stream","text":["Use load_from_http loader\n","[>>] 22/22, 2.0 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 23.89569862011228\n","Eval-SSIM: 0.7667098470108678\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_EDVR.py https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth --save-path ./outputs/testset_EDVR\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_EDVR\n","!ls ./outputs/testset_EDVR/city"]},{"cell_type":"markdown","metadata":{"id":"5Tc7F-l5_i1e"},"source":["**BasicVSR**"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":20220,"status":"ok","timestamp":1625140976026,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"jpW5GWC74Yvu","outputId":"7ba02a32-d4ec-40b2-8108-ef0729b62147"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:07,780 - mmedit - INFO - Use load_from_http loader\n","Use load_from_http loader\n","The model and loaded state dict do not match exactly\n","\n","missing keys in source state_dict: step_counter\n","\n","[>>] 2/2, 0.2 task/s, elapsed: 11s, ETA: 0s\n","Eval-PSNR: 24.195768601433734\n","Eval-SSIM: 0.7828541339512978\n","calendar city\n","00000000.png 00000003.png 00000006.png 00000009.png\n","00000001.png 00000004.png 00000007.png 00000010.png\n","00000002.png 00000005.png 00000008.png\n"]}],"source":["# 单 GPU(Colab 只有一个 GPU)\n","!python tools/test.py ./demo_files/demo_config_BasicVSR.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth --save-path ./outputs/testset_BasicVSR\n","\n","# 检查输出文件夹\n","!ls ./outputs/testset_BasicVSR\n","!ls ./outputs/testset_BasicVSR/calendar"]},{"cell_type":"markdown","metadata":{"id":"4DQxNL8BhI0y"},"source":["## 在预定义的数据集上训练恢复器\n","\n","MMEditing 使用分布式训练。以下命令可用于训练。如果要在我们的配置文件中指定的预定义数据集上进行训练,只需运行以下命令即可。\n","\n","```\n","./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]\n","```\n","\n","有关可选参数的更多详细信息,请参阅 `tools/train.py`。\n","\n","---\n","\n","这是一个使用 EDVR 的示例。\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":9337,"status":"ok","timestamp":1625140985357,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"s-hOnSF6ItQM","outputId":"e40e960a-29e1-43e8-b922-5e08c4e98afe"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:31,961 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:31,961 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:31,961 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:31,961 - mmedit - INFO - Config:\n","/content/mmediting/configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py\n","exp_name = 'edvrm_wotsa_x4_g8_600k_reds'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRREDSDataset'\n","val_dataset_type = 'SRREDSDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='data/REDS/train_sharp_bicubic/X4',\n"," gt_folder='data/REDS/train_sharp',\n"," ann_file='data/REDS/meta_info_REDS_GT.txt',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," val_partition='REDS4',\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 600000\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50000, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=100,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 51, in build_from_cfg\n"," return obj_cls(**args)\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 54, in __init__\n"," self.data_infos = self.load_annotations()\n"," File \"/content/mmediting/mmedit/datasets/sr_reds_dataset.py\", line 63, in load_annotations\n"," with open(self.ann_file, 'r') as fin:\n","FileNotFoundError: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"./tools/train.py\", line 145, in \n"," main()\n"," File \"./tools/train.py\", line 111, in main\n"," datasets = [build_dataset(cfg.data.train)]\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 76, in build_dataset\n"," build_dataset(cfg['dataset'], default_args), cfg['times'])\n"," File \"/content/mmediting/mmedit/datasets/builder.py\", line 80, in build_dataset\n"," dataset = build_from_cfg(cfg, DATASETS, default_args)\n"," File \"/usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py\", line 54, in build_from_cfg\n"," raise type(e)(f'{obj_cls.__name__}: {e}')\n","FileNotFoundError: SRREDSDataset: [Errno 2] No such file or directory: 'data/REDS/meta_info_REDS_GT.txt'\n","Traceback (most recent call last):\n"," File \"/usr/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n"," \"__main__\", mod_spec)\n"," File \"/usr/lib/python3.7/runpy.py\", line 85, in _run_code\n"," exec(code, run_globals)\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 260, in \n"," main()\n"," File \"/usr/local/lib/python3.7/dist-packages/torch/distributed/launch.py\", line 256, in main\n"," cmd=cmd)\n","subprocess.CalledProcessError: Command '['/usr/bin/python3', '-u', './tools/train.py', '--local_rank=0', './configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py', '--launcher', 'pytorch']' returned non-zero exit status 1.\n"]}],"source":["!./tools/dist_train.sh ./configs/restorers/edvr/edvrm_wotsa_x4_g8_600k_reds.py 1"]},{"cell_type":"markdown","metadata":{"id":"b0VfQkQQjg8N"},"source":["## 在自定义数据集上训练复原器\n","\n","与您要在自己的数据集上进行测试的情况类似,您需要修改 `train_dataset_type`。您需要的数据集类型是相同的:\n","\n","- 对于图像超分辨率,需要使用 `SRFolderDataset`\n","- 对于视频超分辨率的滑动窗口框架(例如 EDVR、TDAN),需要使用 `SRFolderVideoDataset`。\n","- 对于视频超分辨率的循环框架(例如 BasicVSR、IconVSR),需要使用 `SRFolderMultipleGTDataset`。\n","\n","修改数据集类型和数据路径后。一切都准备好了。"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":128384,"status":"ok","timestamp":1625141113733,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"liGEKJpbIoXZ","outputId":"84e1502e-e2cb-458f-c7c5-e4b401e570b7"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:02:41,185 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:02:41,185 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:02:41,185 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:02:41,185 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_SRCNN.py\n","exp_name = 'srcnn_demo'\n","\n","scale = 4\n","# model settings\n","model = dict(\n"," type='BasicRestorer',\n"," generator=dict(\n"," type='SRCNN',\n"," channels=(3, 64, 32, 3),\n"," kernel_sizes=(9, 1, 5),\n"," upscale_factor=scale),\n"," pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=scale)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderDataset'\n","val_dataset_type = 'SRFolderDataset'\n","train_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=128),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","test_pipeline = [\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFile',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'lq_path']),\n"," dict(type='ImageToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=8,\n"," train_dataloader=dict(samples_per_gpu=16, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=train_pipeline,\n"," scale=scale)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_images',\n"," gt_folder='./demo_files/gt_images',\n"," pipeline=test_pipeline,\n"," scale=scale,\n"," filename_tmpl='{}'))\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[250000, 250000, 250000, 250000],\n"," restart_weights=[1, 1, 1, 1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","evaluation = dict(interval=50, save_image=True, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./experiments/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:02:41,192 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/experiments/srcnn_demo\n","2021-07-01 12:02:41,192 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:02:41.529307: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:03:18,631 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.000e-04, eta: 0:57:01, time: 34.560, data_time: 34.446, memory: 586, loss_pix: 0.3999, loss: 0.3999\n","2021-07-01 12:03:18,712 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","INFO:mmedit:Iter [2/100]\tlr_generator: 2.000e-04, eta: 0:28:16, time: 0.068, data_time: 0.020, memory: 586, loss_pix: 0.4382, loss: 0.4382\n","2021-07-01 12:03:18,764 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","INFO:mmedit:Iter [3/100]\tlr_generator: 2.000e-04, eta: 0:18:41, time: 0.053, data_time: 0.027, memory: 586, loss_pix: 0.5043, loss: 0.5043\n","2021-07-01 12:03:18,840 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","INFO:mmedit:Iter [4/100]\tlr_generator: 2.000e-04, eta: 0:13:54, time: 0.076, data_time: 0.026, memory: 586, loss_pix: 0.4364, loss: 0.4364\n","2021-07-01 12:03:18,916 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","INFO:mmedit:Iter [5/100]\tlr_generator: 2.000e-04, eta: 0:11:01, time: 0.085, data_time: 0.028, memory: 586, loss_pix: 0.3853, loss: 0.3853\n","2021-07-01 12:03:18,956 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","INFO:mmedit:Iter [6/100]\tlr_generator: 2.000e-04, eta: 0:09:06, time: 0.041, data_time: 0.017, memory: 586, loss_pix: 0.4315, loss: 0.4315\n","2021-07-01 12:03:19,012 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","INFO:mmedit:Iter [7/100]\tlr_generator: 2.000e-04, eta: 0:07:44, time: 0.056, data_time: 0.016, memory: 586, loss_pix: 0.4003, loss: 0.4003\n","2021-07-01 12:03:19,070 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","INFO:mmedit:Iter [8/100]\tlr_generator: 2.000e-04, eta: 0:06:42, time: 0.057, data_time: 0.016, memory: 586, loss_pix: 0.3766, loss: 0.3766\n","2021-07-01 12:03:19,142 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","INFO:mmedit:Iter [9/100]\tlr_generator: 2.000e-04, eta: 0:05:54, time: 0.064, data_time: 0.026, memory: 586, loss_pix: 0.3721, loss: 0.3721\n","2021-07-01 12:03:19,212 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","INFO:mmedit:Iter [10/100]\tlr_generator: 2.000e-04, eta: 0:05:16, time: 0.079, data_time: 0.027, memory: 586, loss_pix: 0.3314, loss: 0.3314\n","2021-07-01 12:03:19,261 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","INFO:mmedit:Iter [11/100]\tlr_generator: 2.000e-04, eta: 0:04:44, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.3249, loss: 0.3249\n","2021-07-01 12:03:19,302 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","INFO:mmedit:Iter [12/100]\tlr_generator: 2.000e-04, eta: 0:04:18, time: 0.041, data_time: 0.012, memory: 586, loss_pix: 0.2947, loss: 0.2947\n","2021-07-01 12:03:19,357 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","INFO:mmedit:Iter [13/100]\tlr_generator: 2.000e-04, eta: 0:03:56, time: 0.054, data_time: 0.012, memory: 586, loss_pix: 0.2634, loss: 0.2634\n","2021-07-01 12:03:19,419 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","INFO:mmedit:Iter [14/100]\tlr_generator: 2.000e-04, eta: 0:03:37, time: 0.059, data_time: 0.016, memory: 586, loss_pix: 0.2101, loss: 0.2101\n","2021-07-01 12:03:19,473 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","INFO:mmedit:Iter [15/100]\tlr_generator: 2.000e-04, eta: 0:03:20, time: 0.055, data_time: 0.025, memory: 586, loss_pix: 0.2165, loss: 0.2165\n","2021-07-01 12:03:19,538 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","INFO:mmedit:Iter [16/100]\tlr_generator: 2.000e-04, eta: 0:03:06, time: 0.072, data_time: 0.024, memory: 586, loss_pix: 0.1866, loss: 0.1866\n","2021-07-01 12:03:19,603 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","INFO:mmedit:Iter [17/100]\tlr_generator: 2.000e-04, eta: 0:02:53, time: 0.060, data_time: 0.019, memory: 586, loss_pix: 0.1623, loss: 0.1623\n","2021-07-01 12:03:19,657 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","INFO:mmedit:Iter [18/100]\tlr_generator: 2.000e-04, eta: 0:02:42, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.1397, loss: 0.1397\n","2021-07-01 12:03:19,716 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","INFO:mmedit:Iter [19/100]\tlr_generator: 2.000e-04, eta: 0:02:31, time: 0.055, data_time: 0.018, memory: 586, loss_pix: 0.1304, loss: 0.1304\n","2021-07-01 12:03:19,772 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","INFO:mmedit:Iter [20/100]\tlr_generator: 2.000e-04, eta: 0:02:22, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.1107, loss: 0.1107\n","2021-07-01 12:03:19,834 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","INFO:mmedit:Iter [21/100]\tlr_generator: 2.000e-04, eta: 0:02:14, time: 0.064, data_time: 0.018, memory: 586, loss_pix: 0.1401, loss: 0.1401\n","2021-07-01 12:03:19,877 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","INFO:mmedit:Iter [22/100]\tlr_generator: 2.000e-04, eta: 0:02:06, time: 0.049, data_time: 0.013, memory: 586, loss_pix: 0.1361, loss: 0.1361\n","2021-07-01 12:03:19,947 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","INFO:mmedit:Iter [23/100]\tlr_generator: 2.000e-04, eta: 0:02:00, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.1441, loss: 0.1441\n","2021-07-01 12:03:20,014 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","INFO:mmedit:Iter [24/100]\tlr_generator: 2.000e-04, eta: 0:01:53, time: 0.068, data_time: 0.022, memory: 586, loss_pix: 0.1474, loss: 0.1474\n","2021-07-01 12:03:20,068 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","INFO:mmedit:Iter [25/100]\tlr_generator: 2.000e-04, eta: 0:01:48, time: 0.061, data_time: 0.024, memory: 586, loss_pix: 0.1345, loss: 0.1345\n","2021-07-01 12:03:20,124 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","INFO:mmedit:Iter [26/100]\tlr_generator: 2.000e-04, eta: 0:01:42, time: 0.052, data_time: 0.017, memory: 586, loss_pix: 0.1357, loss: 0.1357\n","2021-07-01 12:03:20,181 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","INFO:mmedit:Iter [27/100]\tlr_generator: 2.000e-04, eta: 0:01:37, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.1259, loss: 0.1259\n","2021-07-01 12:03:20,244 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","INFO:mmedit:Iter [28/100]\tlr_generator: 2.000e-04, eta: 0:01:33, time: 0.067, data_time: 0.024, memory: 586, loss_pix: 0.1102, loss: 0.1102\n","2021-07-01 12:03:20,310 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","INFO:mmedit:Iter [29/100]\tlr_generator: 2.000e-04, eta: 0:01:28, time: 0.061, data_time: 0.023, memory: 586, loss_pix: 0.1121, loss: 0.1121\n","2021-07-01 12:03:20,356 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","INFO:mmedit:Iter [30/100]\tlr_generator: 2.000e-04, eta: 0:01:24, time: 0.060, data_time: 0.022, memory: 586, loss_pix: 0.1103, loss: 0.1103\n","2021-07-01 12:03:20,410 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","INFO:mmedit:Iter [31/100]\tlr_generator: 2.000e-04, eta: 0:01:20, time: 0.053, data_time: 0.011, memory: 586, loss_pix: 0.1180, loss: 0.1180\n","2021-07-01 12:03:20,480 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","INFO:mmedit:Iter [32/100]\tlr_generator: 2.000e-04, eta: 0:01:17, time: 0.062, data_time: 0.028, memory: 586, loss_pix: 0.1164, loss: 0.1164\n","2021-07-01 12:03:20,536 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","INFO:mmedit:Iter [33/100]\tlr_generator: 2.000e-04, eta: 0:01:14, time: 0.048, data_time: 0.019, memory: 586, loss_pix: 0.1064, loss: 0.1064\n","2021-07-01 12:03:20,595 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","INFO:mmedit:Iter [34/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.064, data_time: 0.024, memory: 586, loss_pix: 0.1173, loss: 0.1173\n","2021-07-01 12:03:20,656 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","INFO:mmedit:Iter [35/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.1108, loss: 0.1108\n","2021-07-01 12:03:20,710 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","INFO:mmedit:Iter [36/100]\tlr_generator: 2.000e-04, eta: 0:01:05, time: 0.063, data_time: 0.011, memory: 586, loss_pix: 0.1036, loss: 0.1036\n","2021-07-01 12:03:20,779 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [37/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:20,846 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","INFO:mmedit:Iter [38/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.063, data_time: 0.015, memory: 586, loss_pix: 0.0987, loss: 0.0987\n","2021-07-01 12:03:20,907 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [39/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.067, data_time: 0.018, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:20,958 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","INFO:mmedit:Iter [40/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.049, data_time: 0.012, memory: 586, loss_pix: 0.1006, loss: 0.1006\n","2021-07-01 12:03:21,028 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","INFO:mmedit:Iter [41/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.069, data_time: 0.033, memory: 586, loss_pix: 0.1032, loss: 0.1032\n","2021-07-01 12:03:21,122 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","INFO:mmedit:Iter [42/100]\tlr_generator: 2.000e-04, eta: 0:00:51, time: 0.091, data_time: 0.051, memory: 586, loss_pix: 0.0984, loss: 0.0984\n","2021-07-01 12:03:21,181 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","INFO:mmedit:Iter [43/100]\tlr_generator: 2.000e-04, eta: 0:00:49, time: 0.067, data_time: 0.033, memory: 586, loss_pix: 0.1097, loss: 0.1097\n","2021-07-01 12:03:21,418 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","INFO:mmedit:Iter [44/100]\tlr_generator: 2.000e-04, eta: 0:00:47, time: 0.232, data_time: 0.189, memory: 586, loss_pix: 0.0883, loss: 0.0883\n","2021-07-01 12:03:21,480 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","INFO:mmedit:Iter [45/100]\tlr_generator: 2.000e-04, eta: 0:00:45, time: 0.064, data_time: 0.016, memory: 586, loss_pix: 0.1024, loss: 0.1024\n","2021-07-01 12:03:21,551 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","INFO:mmedit:Iter [46/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.063, data_time: 0.022, memory: 586, loss_pix: 0.0976, loss: 0.0976\n","2021-07-01 12:03:21,618 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","INFO:mmedit:Iter [47/100]\tlr_generator: 2.000e-04, eta: 0:00:42, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.1026, loss: 0.1026\n","2021-07-01 12:03:21,667 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","INFO:mmedit:Iter [48/100]\tlr_generator: 2.000e-04, eta: 0:00:40, time: 0.054, data_time: 0.016, memory: 586, loss_pix: 0.0876, loss: 0.0876\n","2021-07-01 12:03:21,743 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","INFO:mmedit:Iter [49/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.067, data_time: 0.011, memory: 586, loss_pix: 0.0923, loss: 0.0923\n","[>>] 5/5, 0.1 task/s, elapsed: 37s, ETA: 0s\n","\n","2021-07-01 12:03:59,996 - mmedit - INFO - Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","INFO:mmedit:Iter(val) [50]\tPSNR: 19.4410, SSIM: 0.5387\n","2021-07-01 12:04:00,047 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","INFO:mmedit:Iter [51/100]\tlr_generator: 2.000e-04, eta: 0:01:12, time: 38.229, data_time: 38.203, memory: 586, loss_pix: 0.0909, loss: 0.0909\n","2021-07-01 12:04:00,114 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","INFO:mmedit:Iter [52/100]\tlr_generator: 2.000e-04, eta: 0:01:10, time: 0.075, data_time: 0.027, memory: 586, loss_pix: 0.1137, loss: 0.1137\n","2021-07-01 12:04:00,181 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","INFO:mmedit:Iter [53/100]\tlr_generator: 2.000e-04, eta: 0:01:07, time: 0.060, data_time: 0.017, memory: 586, loss_pix: 0.0964, loss: 0.0964\n","2021-07-01 12:04:00,251 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","INFO:mmedit:Iter [54/100]\tlr_generator: 2.000e-04, eta: 0:01:04, time: 0.073, data_time: 0.030, memory: 586, loss_pix: 0.0802, loss: 0.0802\n","2021-07-01 12:04:00,315 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","INFO:mmedit:Iter [55/100]\tlr_generator: 2.000e-04, eta: 0:01:02, time: 0.060, data_time: 0.028, memory: 586, loss_pix: 0.0896, loss: 0.0896\n","2021-07-01 12:04:00,373 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","INFO:mmedit:Iter [56/100]\tlr_generator: 2.000e-04, eta: 0:00:59, time: 0.075, data_time: 0.031, memory: 586, loss_pix: 0.0949, loss: 0.0949\n","2021-07-01 12:04:00,418 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","INFO:mmedit:Iter [57/100]\tlr_generator: 2.000e-04, eta: 0:00:57, time: 0.043, data_time: 0.013, memory: 586, loss_pix: 0.0884, loss: 0.0884\n","2021-07-01 12:04:00,478 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","INFO:mmedit:Iter [58/100]\tlr_generator: 2.000e-04, eta: 0:00:55, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0924, loss: 0.0924\n","2021-07-01 12:04:00,538 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","INFO:mmedit:Iter [59/100]\tlr_generator: 2.000e-04, eta: 0:00:53, time: 0.061, data_time: 0.015, memory: 586, loss_pix: 0.0789, loss: 0.0789\n","2021-07-01 12:04:00,606 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","INFO:mmedit:Iter [60/100]\tlr_generator: 2.000e-04, eta: 0:00:50, time: 0.066, data_time: 0.014, memory: 586, loss_pix: 0.0940, loss: 0.0940\n","2021-07-01 12:04:00,647 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","INFO:mmedit:Iter [61/100]\tlr_generator: 2.000e-04, eta: 0:00:48, time: 0.051, data_time: 0.016, memory: 586, loss_pix: 0.0852, loss: 0.0852\n","2021-07-01 12:04:00,711 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","INFO:mmedit:Iter [62/100]\tlr_generator: 2.000e-04, eta: 0:00:46, time: 0.040, data_time: 0.008, memory: 586, loss_pix: 0.0841, loss: 0.0841\n","2021-07-01 12:04:00,757 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","INFO:mmedit:Iter [63/100]\tlr_generator: 2.000e-04, eta: 0:00:44, time: 0.064, data_time: 0.030, memory: 586, loss_pix: 0.0917, loss: 0.0917\n","2021-07-01 12:04:00,799 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","INFO:mmedit:Iter [64/100]\tlr_generator: 2.000e-04, eta: 0:00:43, time: 0.047, data_time: 0.012, memory: 586, loss_pix: 0.0847, loss: 0.0847\n","2021-07-01 12:04:00,871 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [65/100]\tlr_generator: 2.000e-04, eta: 0:00:41, time: 0.071, data_time: 0.014, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:00,938 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [66/100]\tlr_generator: 2.000e-04, eta: 0:00:39, time: 0.058, data_time: 0.021, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:00,995 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","INFO:mmedit:Iter [67/100]\tlr_generator: 2.000e-04, eta: 0:00:37, time: 0.063, data_time: 0.026, memory: 586, loss_pix: 0.0856, loss: 0.0856\n","2021-07-01 12:04:01,051 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","INFO:mmedit:Iter [68/100]\tlr_generator: 2.000e-04, eta: 0:00:36, time: 0.057, data_time: 0.012, memory: 586, loss_pix: 0.0740, loss: 0.0740\n","2021-07-01 12:04:01,115 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","INFO:mmedit:Iter [69/100]\tlr_generator: 2.000e-04, eta: 0:00:34, time: 0.059, data_time: 0.011, memory: 586, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:04:01,196 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","INFO:mmedit:Iter [70/100]\tlr_generator: 2.000e-04, eta: 0:00:33, time: 0.079, data_time: 0.020, memory: 586, loss_pix: 0.0814, loss: 0.0814\n","2021-07-01 12:04:01,256 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","INFO:mmedit:Iter [71/100]\tlr_generator: 2.000e-04, eta: 0:00:31, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0885, loss: 0.0885\n","2021-07-01 12:04:01,325 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","INFO:mmedit:Iter [72/100]\tlr_generator: 2.000e-04, eta: 0:00:30, time: 0.070, data_time: 0.022, memory: 586, loss_pix: 0.0831, loss: 0.0831\n","2021-07-01 12:04:01,381 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","INFO:mmedit:Iter [73/100]\tlr_generator: 2.000e-04, eta: 0:00:28, time: 0.054, data_time: 0.013, memory: 586, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:04:01,429 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","INFO:mmedit:Iter [74/100]\tlr_generator: 2.000e-04, eta: 0:00:27, time: 0.054, data_time: 0.019, memory: 586, loss_pix: 0.0832, loss: 0.0832\n","2021-07-01 12:04:01,497 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","INFO:mmedit:Iter [75/100]\tlr_generator: 2.000e-04, eta: 0:00:25, time: 0.064, data_time: 0.019, memory: 586, loss_pix: 0.0714, loss: 0.0714\n","2021-07-01 12:04:01,545 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","INFO:mmedit:Iter [76/100]\tlr_generator: 2.000e-04, eta: 0:00:24, time: 0.047, data_time: 0.018, memory: 586, loss_pix: 0.0844, loss: 0.0844\n","2021-07-01 12:04:01,597 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","INFO:mmedit:Iter [77/100]\tlr_generator: 2.000e-04, eta: 0:00:23, time: 0.052, data_time: 0.016, memory: 586, loss_pix: 0.0803, loss: 0.0803\n","2021-07-01 12:04:01,671 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","INFO:mmedit:Iter [78/100]\tlr_generator: 2.000e-04, eta: 0:00:21, time: 0.065, data_time: 0.020, memory: 586, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:04:01,724 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [79/100]\tlr_generator: 2.000e-04, eta: 0:00:20, time: 0.065, data_time: 0.025, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:01,777 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","INFO:mmedit:Iter [80/100]\tlr_generator: 2.000e-04, eta: 0:00:19, time: 0.056, data_time: 0.020, memory: 586, loss_pix: 0.0838, loss: 0.0838\n","2021-07-01 12:04:01,847 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","INFO:mmedit:Iter [81/100]\tlr_generator: 2.000e-04, eta: 0:00:18, time: 0.055, data_time: 0.013, memory: 586, loss_pix: 0.0815, loss: 0.0815\n","2021-07-01 12:04:01,905 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","INFO:mmedit:Iter [82/100]\tlr_generator: 2.000e-04, eta: 0:00:17, time: 0.070, data_time: 0.025, memory: 586, loss_pix: 0.0768, loss: 0.0768\n","2021-07-01 12:04:01,953 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","INFO:mmedit:Iter [83/100]\tlr_generator: 2.000e-04, eta: 0:00:15, time: 0.045, data_time: 0.013, memory: 586, loss_pix: 0.0760, loss: 0.0760\n","2021-07-01 12:04:02,025 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","INFO:mmedit:Iter [84/100]\tlr_generator: 2.000e-04, eta: 0:00:14, time: 0.071, data_time: 0.035, memory: 586, loss_pix: 0.0820, loss: 0.0820\n","2021-07-01 12:04:02,079 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","INFO:mmedit:Iter [85/100]\tlr_generator: 2.000e-04, eta: 0:00:13, time: 0.059, data_time: 0.019, memory: 586, loss_pix: 0.0731, loss: 0.0731\n","2021-07-01 12:04:02,137 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","INFO:mmedit:Iter [86/100]\tlr_generator: 2.000e-04, eta: 0:00:12, time: 0.064, data_time: 0.013, memory: 586, loss_pix: 0.0712, loss: 0.0712\n","2021-07-01 12:04:02,193 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","INFO:mmedit:Iter [87/100]\tlr_generator: 2.000e-04, eta: 0:00:11, time: 0.048, data_time: 0.020, memory: 586, loss_pix: 0.0786, loss: 0.0786\n","2021-07-01 12:04:02,255 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","INFO:mmedit:Iter [88/100]\tlr_generator: 2.000e-04, eta: 0:00:10, time: 0.070, data_time: 0.018, memory: 586, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:04:02,341 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","INFO:mmedit:Iter [89/100]\tlr_generator: 2.000e-04, eta: 0:00:09, time: 0.074, data_time: 0.027, memory: 586, loss_pix: 0.0589, loss: 0.0589\n","2021-07-01 12:04:02,394 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","INFO:mmedit:Iter [90/100]\tlr_generator: 2.000e-04, eta: 0:00:08, time: 0.056, data_time: 0.019, memory: 586, loss_pix: 0.0601, loss: 0.0601\n","2021-07-01 12:04:02,496 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","INFO:mmedit:Iter [91/100]\tlr_generator: 2.000e-04, eta: 0:00:07, time: 0.111, data_time: 0.062, memory: 586, loss_pix: 0.0684, loss: 0.0684\n","2021-07-01 12:04:02,552 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","INFO:mmedit:Iter [92/100]\tlr_generator: 2.000e-04, eta: 0:00:06, time: 0.050, data_time: 0.008, memory: 586, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:04:02,629 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","INFO:mmedit:Iter [93/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.071, data_time: 0.021, memory: 586, loss_pix: 0.0615, loss: 0.0615\n","2021-07-01 12:04:02,682 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","INFO:mmedit:Iter [94/100]\tlr_generator: 2.000e-04, eta: 0:00:05, time: 0.064, data_time: 0.017, memory: 586, loss_pix: 0.0672, loss: 0.0672\n","2021-07-01 12:04:02,791 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","INFO:mmedit:Iter [95/100]\tlr_generator: 2.000e-04, eta: 0:00:04, time: 0.097, data_time: 0.071, memory: 586, loss_pix: 0.0549, loss: 0.0549\n","2021-07-01 12:04:02,834 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","INFO:mmedit:Iter [96/100]\tlr_generator: 2.000e-04, eta: 0:00:03, time: 0.056, data_time: 0.024, memory: 586, loss_pix: 0.0600, loss: 0.0600\n","2021-07-01 12:04:02,900 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","INFO:mmedit:Iter [97/100]\tlr_generator: 2.000e-04, eta: 0:00:02, time: 0.066, data_time: 0.018, memory: 586, loss_pix: 0.0608, loss: 0.0608\n","2021-07-01 12:04:03,053 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","INFO:mmedit:Iter [98/100]\tlr_generator: 2.000e-04, eta: 0:00:01, time: 0.145, data_time: 0.100, memory: 586, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:04:03,108 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","INFO:mmedit:Iter [99/100]\tlr_generator: 2.000e-04, eta: 0:00:00, time: 0.054, data_time: 0.017, memory: 586, loss_pix: 0.0584, loss: 0.0584\n","[>>] 5/5, 0.2 task/s, elapsed: 33s, ETA: 0s\n","\n","2021-07-01 12:04:37,412 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:04:37,422 - mmedit - INFO - Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n","INFO:mmedit:Iter(val) [100]\tPSNR: 22.4152, SSIM: 0.6525\n"]}],"source":["# SRCNN(图像超分辨率)\n","!./tools/dist_train.sh ./demo_files/demo_config_SRCNN.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":117937,"status":"ok","timestamp":1625141554036,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"26uZ4Ak7qbC9","outputId":"2fb26527-eb9e-4b48-e03c-ba9a91c60db8"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:10:12,619 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:10:12,619 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:10:12,619 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:10:12,619 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_EDVR.py\n","exp_name = 'edvrm_demo'\n","\n","# model settings\n","model = dict(\n"," type='EDVR',\n"," generator=dict(\n"," type='EDVRNet',\n"," in_channels=3,\n"," out_channels=3,\n"," mid_channels=64,\n"," num_frames=5,\n"," deform_groups=8,\n"," num_blocks_extraction=5,\n"," num_blocks_reconstruction=10,\n"," center_frame_idx=2,\n"," with_tsa=False),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='sum'))\n","# model training and testing settings\n","train_cfg = None\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderVideoDataset'\n","val_dataset_type = 'SRFolderVideoDataset'\n","train_pipeline = [\n"," dict(type='GenerateFrameIndices', interval_list=[1], frames_per_clip=99),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateFrameIndiceswithPadding', padding='reflection_circle'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," flag='unchanged'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," flag='unchanged'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(\n"," type='Normalize',\n"," keys=['lq', 'gt'],\n"," mean=[0, 0, 0],\n"," std=[1, 1, 1],\n"," to_rgb=True),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=4,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True),\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1),\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(generator=dict(type='Adam', lr=4e-4, betas=(0.9, 0.999)))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[150000, 150000, 150000, 150000],\n"," restart_weights=[1, 0.5, 0.5, 0.5],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," dict(type='TensorboardLoggerHook'),\n"," # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit-sr'))\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","\n","2021-07-01 12:10:12,701 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/edvrm_demo\n","2021-07-01 12:10:12,702 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:10:12.951771: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n","2021-07-01 12:10:30,703 - mmedit - INFO - Iter [1/100]\tlr_generator: 4.000e-04, eta: 0:26:53, time: 16.295, data_time: 15.833, memory: 1341, loss_pix: 63917.2734, loss: 63917.2734\n","2021-07-01 12:10:31,046 - mmedit - INFO - Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","INFO:mmedit:Iter [2/100]\tlr_generator: 4.000e-04, eta: 0:13:35, time: 0.342, data_time: 0.003, memory: 1372, loss_pix: 54741.8516, loss: 54741.8516\n","2021-07-01 12:10:31,386 - mmedit - INFO - Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","INFO:mmedit:Iter [3/100]\tlr_generator: 4.000e-04, eta: 0:09:08, time: 0.341, data_time: 0.004, memory: 1372, loss_pix: 49077.6562, loss: 49077.6562\n","2021-07-01 12:10:31,731 - mmedit - INFO - Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","INFO:mmedit:Iter [4/100]\tlr_generator: 4.000e-04, eta: 0:06:55, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 45100.3984, loss: 45100.3984\n","2021-07-01 12:10:32,071 - mmedit - INFO - Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","INFO:mmedit:Iter [5/100]\tlr_generator: 4.000e-04, eta: 0:05:35, time: 0.340, data_time: 0.004, memory: 1372, loss_pix: 37305.7891, loss: 37305.7891\n","2021-07-01 12:10:32,414 - mmedit - INFO - Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","INFO:mmedit:Iter [6/100]\tlr_generator: 4.000e-04, eta: 0:04:42, time: 0.343, data_time: 0.003, memory: 1372, loss_pix: 53724.2422, loss: 53724.2422\n","2021-07-01 12:10:32,760 - mmedit - INFO - Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","INFO:mmedit:Iter [7/100]\tlr_generator: 4.000e-04, eta: 0:04:03, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 62958.1641, loss: 62958.1641\n","2021-07-01 12:10:33,102 - mmedit - INFO - Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","INFO:mmedit:Iter [8/100]\tlr_generator: 4.000e-04, eta: 0:03:34, time: 0.343, data_time: 0.004, memory: 1372, loss_pix: 36053.0391, loss: 36053.0391\n","2021-07-01 12:10:33,447 - mmedit - INFO - Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","INFO:mmedit:Iter [9/100]\tlr_generator: 4.000e-04, eta: 0:03:12, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 60384.7617, loss: 60384.7617\n","2021-07-01 12:10:33,792 - mmedit - INFO - Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","INFO:mmedit:Iter [10/100]\tlr_generator: 4.000e-04, eta: 0:02:54, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 44977.9297, loss: 44977.9297\n","2021-07-01 12:10:34,138 - mmedit - INFO - Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","INFO:mmedit:Iter [11/100]\tlr_generator: 4.000e-04, eta: 0:02:39, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 64897.3984, loss: 64897.3984\n","2021-07-01 12:10:34,484 - mmedit - INFO - Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","INFO:mmedit:Iter [12/100]\tlr_generator: 4.000e-04, eta: 0:02:27, time: 0.344, data_time: 0.002, memory: 1372, loss_pix: 58721.3828, loss: 58721.3828\n","2021-07-01 12:10:34,829 - mmedit - INFO - Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","INFO:mmedit:Iter [13/100]\tlr_generator: 4.000e-04, eta: 0:02:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 38433.5938, loss: 38433.5938\n","2021-07-01 12:10:35,175 - mmedit - INFO - Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","INFO:mmedit:Iter [14/100]\tlr_generator: 4.000e-04, eta: 0:02:07, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 48173.8555, loss: 48173.8555\n","2021-07-01 12:10:35,522 - mmedit - INFO - Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","INFO:mmedit:Iter [15/100]\tlr_generator: 4.000e-04, eta: 0:01:59, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 56551.9844, loss: 56551.9844\n","2021-07-01 12:10:35,866 - mmedit - INFO - Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","INFO:mmedit:Iter [16/100]\tlr_generator: 4.000e-04, eta: 0:01:52, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45224.1250, loss: 45224.1250\n","2021-07-01 12:10:36,212 - mmedit - INFO - Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","INFO:mmedit:Iter [17/100]\tlr_generator: 4.000e-04, eta: 0:01:46, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 51907.1641, loss: 51907.1641\n","2021-07-01 12:10:36,560 - mmedit - INFO - Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","INFO:mmedit:Iter [18/100]\tlr_generator: 4.000e-04, eta: 0:01:40, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 44153.1641, loss: 44153.1641\n","2021-07-01 12:10:36,904 - mmedit - INFO - Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","INFO:mmedit:Iter [19/100]\tlr_generator: 4.000e-04, eta: 0:01:35, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 49195.8203, loss: 49195.8203\n","2021-07-01 12:10:37,249 - mmedit - INFO - Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","INFO:mmedit:Iter [20/100]\tlr_generator: 4.000e-04, eta: 0:01:31, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 60634.4844, loss: 60634.4844\n","2021-07-01 12:10:37,595 - mmedit - INFO - Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","INFO:mmedit:Iter [21/100]\tlr_generator: 4.000e-04, eta: 0:01:27, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 53779.3984, loss: 53779.3984\n","2021-07-01 12:10:37,939 - mmedit - INFO - Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","INFO:mmedit:Iter [22/100]\tlr_generator: 4.000e-04, eta: 0:01:23, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 45788.3594, loss: 45788.3594\n","2021-07-01 12:10:38,283 - mmedit - INFO - Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","INFO:mmedit:Iter [23/100]\tlr_generator: 4.000e-04, eta: 0:01:19, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 54939.8203, loss: 54939.8203\n","2021-07-01 12:10:38,628 - mmedit - INFO - Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","INFO:mmedit:Iter [24/100]\tlr_generator: 4.000e-04, eta: 0:01:16, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 46857.5234, loss: 46857.5234\n","2021-07-01 12:10:38,974 - mmedit - INFO - Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","INFO:mmedit:Iter [25/100]\tlr_generator: 4.000e-04, eta: 0:01:13, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 67588.4219, loss: 67588.4219\n","2021-07-01 12:10:39,318 - mmedit - INFO - Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","INFO:mmedit:Iter [26/100]\tlr_generator: 4.000e-04, eta: 0:01:10, time: 0.344, data_time: 0.004, memory: 1372, loss_pix: 40718.7812, loss: 40718.7812\n","2021-07-01 12:10:39,665 - mmedit - INFO - Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","INFO:mmedit:Iter [27/100]\tlr_generator: 4.000e-04, eta: 0:01:08, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 33732.1719, loss: 33732.1719\n","2021-07-01 12:10:40,011 - mmedit - INFO - Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","INFO:mmedit:Iter [28/100]\tlr_generator: 4.000e-04, eta: 0:01:05, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 56223.7891, loss: 56223.7891\n","2021-07-01 12:10:40,356 - mmedit - INFO - Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","INFO:mmedit:Iter [29/100]\tlr_generator: 4.000e-04, eta: 0:01:03, time: 0.345, data_time: 0.004, memory: 1372, loss_pix: 62915.5859, loss: 62915.5859\n","2021-07-01 12:10:40,703 - mmedit - INFO - Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","INFO:mmedit:Iter [30/100]\tlr_generator: 4.000e-04, eta: 0:01:01, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 52582.0352, loss: 52582.0352\n","2021-07-01 12:10:41,049 - mmedit - INFO - Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","INFO:mmedit:Iter [31/100]\tlr_generator: 4.000e-04, eta: 0:00:59, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 57709.3984, loss: 57709.3984\n","2021-07-01 12:10:41,396 - mmedit - INFO - Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","INFO:mmedit:Iter [32/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 43927.6094, loss: 43927.6094\n","2021-07-01 12:10:41,745 - mmedit - INFO - Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","INFO:mmedit:Iter [33/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.349, data_time: 0.004, memory: 1372, loss_pix: 57441.5859, loss: 57441.5859\n","2021-07-01 12:10:42,097 - mmedit - INFO - Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","INFO:mmedit:Iter [34/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 34868.9102, loss: 34868.9102\n","2021-07-01 12:10:42,444 - mmedit - INFO - Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","INFO:mmedit:Iter [35/100]\tlr_generator: 4.000e-04, eta: 0:00:52, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 59213.9414, loss: 59213.9414\n","2021-07-01 12:10:42,790 - mmedit - INFO - Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","INFO:mmedit:Iter [36/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.346, data_time: 0.004, memory: 1372, loss_pix: 41177.7812, loss: 41177.7812\n","2021-07-01 12:10:43,140 - mmedit - INFO - Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","INFO:mmedit:Iter [37/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 40814.3008, loss: 40814.3008\n","2021-07-01 12:10:43,490 - mmedit - INFO - Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","INFO:mmedit:Iter [38/100]\tlr_generator: 4.000e-04, eta: 0:00:47, time: 0.350, data_time: 0.004, memory: 1372, loss_pix: 59903.9648, loss: 59903.9648\n","2021-07-01 12:10:43,841 - mmedit - INFO - Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","INFO:mmedit:Iter [39/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 42963.2812, loss: 42963.2812\n","2021-07-01 12:10:44,193 - mmedit - INFO - Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","INFO:mmedit:Iter [40/100]\tlr_generator: 4.000e-04, eta: 0:00:44, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 40039.9062, loss: 40039.9062\n","2021-07-01 12:10:44,541 - mmedit - INFO - Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","INFO:mmedit:Iter [41/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 38943.6875, loss: 38943.6875\n","2021-07-01 12:10:44,895 - mmedit - INFO - Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","INFO:mmedit:Iter [42/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 60106.1445, loss: 60106.1445\n","2021-07-01 12:10:45,248 - mmedit - INFO - Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","INFO:mmedit:Iter [43/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 42048.5781, loss: 42048.5781\n","2021-07-01 12:10:45,595 - mmedit - INFO - Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","INFO:mmedit:Iter [44/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.347, data_time: 0.004, memory: 1372, loss_pix: 53089.7695, loss: 53089.7695\n","2021-07-01 12:10:45,950 - mmedit - INFO - Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","INFO:mmedit:Iter [45/100]\tlr_generator: 4.000e-04, eta: 0:00:38, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 68916.9375, loss: 68916.9375\n","2021-07-01 12:10:46,301 - mmedit - INFO - Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","INFO:mmedit:Iter [46/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.351, data_time: 0.004, memory: 1372, loss_pix: 49331.9609, loss: 49331.9609\n","2021-07-01 12:10:46,649 - mmedit - INFO - Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","INFO:mmedit:Iter [47/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.348, data_time: 0.004, memory: 1372, loss_pix: 47692.4375, loss: 47692.4375\n","2021-07-01 12:10:47,003 - mmedit - INFO - Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","INFO:mmedit:Iter [48/100]\tlr_generator: 4.000e-04, eta: 0:00:35, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 56692.4531, loss: 56692.4531\n","2021-07-01 12:10:47,356 - mmedit - INFO - Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","INFO:mmedit:Iter [49/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.353, data_time: 0.004, memory: 1372, loss_pix: 54549.1875, loss: 54549.1875\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:14,231 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","INFO:mmedit:Iter(val) [50]\tPSNR: 20.9725, SSIM: 0.5283\n","2021-07-01 12:11:14,578 - mmedit - INFO - Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","INFO:mmedit:Iter [51/100]\tlr_generator: 4.000e-04, eta: 0:00:57, time: 26.874, data_time: 26.530, memory: 1372, loss_pix: 39771.0391, loss: 39771.0391\n","2021-07-01 12:11:14,930 - mmedit - INFO - Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","INFO:mmedit:Iter [52/100]\tlr_generator: 4.000e-04, eta: 0:00:55, time: 0.352, data_time: 0.004, memory: 1372, loss_pix: 53194.4766, loss: 53194.4766\n","2021-07-01 12:11:15,289 - mmedit - INFO - Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","INFO:mmedit:Iter [53/100]\tlr_generator: 4.000e-04, eta: 0:00:53, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 60388.1523, loss: 60388.1523\n","2021-07-01 12:11:15,642 - mmedit - INFO - Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","INFO:mmedit:Iter [54/100]\tlr_generator: 4.000e-04, eta: 0:00:51, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 48352.9922, loss: 48352.9922\n","2021-07-01 12:11:15,993 - mmedit - INFO - Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","INFO:mmedit:Iter [55/100]\tlr_generator: 4.000e-04, eta: 0:00:50, time: 0.350, data_time: 0.003, memory: 1372, loss_pix: 55056.6797, loss: 55056.6797\n","2021-07-01 12:11:16,354 - mmedit - INFO - Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","INFO:mmedit:Iter [56/100]\tlr_generator: 4.000e-04, eta: 0:00:48, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 53869.2344, loss: 53869.2344\n","2021-07-01 12:11:16,712 - mmedit - INFO - Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","INFO:mmedit:Iter [57/100]\tlr_generator: 4.000e-04, eta: 0:00:46, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 38026.5781, loss: 38026.5781\n","2021-07-01 12:11:17,065 - mmedit - INFO - Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","INFO:mmedit:Iter [58/100]\tlr_generator: 4.000e-04, eta: 0:00:45, time: 0.354, data_time: 0.004, memory: 1372, loss_pix: 54388.4375, loss: 54388.4375\n","2021-07-01 12:11:17,425 - mmedit - INFO - Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","INFO:mmedit:Iter [59/100]\tlr_generator: 4.000e-04, eta: 0:00:43, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 55608.8125, loss: 55608.8125\n","2021-07-01 12:11:17,780 - mmedit - INFO - Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","INFO:mmedit:Iter [60/100]\tlr_generator: 4.000e-04, eta: 0:00:42, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 43325.0195, loss: 43325.0195\n","2021-07-01 12:11:18,135 - mmedit - INFO - Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","INFO:mmedit:Iter [61/100]\tlr_generator: 4.000e-04, eta: 0:00:40, time: 0.355, data_time: 0.004, memory: 1372, loss_pix: 47598.5742, loss: 47598.5742\n","2021-07-01 12:11:18,495 - mmedit - INFO - Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","INFO:mmedit:Iter [62/100]\tlr_generator: 4.000e-04, eta: 0:00:39, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43414.2422, loss: 43414.2422\n","2021-07-01 12:11:18,851 - mmedit - INFO - Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","INFO:mmedit:Iter [63/100]\tlr_generator: 4.000e-04, eta: 0:00:37, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 53083.8750, loss: 53083.8750\n","2021-07-01 12:11:19,210 - mmedit - INFO - Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","INFO:mmedit:Iter [64/100]\tlr_generator: 4.000e-04, eta: 0:00:36, time: 0.359, data_time: 0.004, memory: 1372, loss_pix: 43161.5781, loss: 43161.5781\n","2021-07-01 12:11:19,567 - mmedit - INFO - Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","INFO:mmedit:Iter [65/100]\tlr_generator: 4.000e-04, eta: 0:00:34, time: 0.356, data_time: 0.003, memory: 1372, loss_pix: 56597.0156, loss: 56597.0156\n","2021-07-01 12:11:19,923 - mmedit - INFO - Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","INFO:mmedit:Iter [66/100]\tlr_generator: 4.000e-04, eta: 0:00:33, time: 0.356, data_time: 0.004, memory: 1372, loss_pix: 52818.3125, loss: 52818.3125\n","2021-07-01 12:11:20,286 - mmedit - INFO - Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","INFO:mmedit:Iter [67/100]\tlr_generator: 4.000e-04, eta: 0:00:32, time: 0.363, data_time: 0.003, memory: 1372, loss_pix: 50922.8828, loss: 50922.8828\n","2021-07-01 12:11:20,644 - mmedit - INFO - Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","INFO:mmedit:Iter [68/100]\tlr_generator: 4.000e-04, eta: 0:00:31, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 42469.6133, loss: 42469.6133\n","2021-07-01 12:11:21,000 - mmedit - INFO - Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","INFO:mmedit:Iter [69/100]\tlr_generator: 4.000e-04, eta: 0:00:29, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 54508.9062, loss: 54508.9062\n","2021-07-01 12:11:21,359 - mmedit - INFO - Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","INFO:mmedit:Iter [70/100]\tlr_generator: 4.000e-04, eta: 0:00:28, time: 0.358, data_time: 0.003, memory: 1372, loss_pix: 56221.5938, loss: 56221.5938\n","2021-07-01 12:11:21,719 - mmedit - INFO - Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","INFO:mmedit:Iter [71/100]\tlr_generator: 4.000e-04, eta: 0:00:27, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 56114.1094, loss: 56114.1094\n","2021-07-01 12:11:22,072 - mmedit - INFO - Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","INFO:mmedit:Iter [72/100]\tlr_generator: 4.000e-04, eta: 0:00:26, time: 0.352, data_time: 0.003, memory: 1372, loss_pix: 51000.3047, loss: 51000.3047\n","2021-07-01 12:11:22,434 - mmedit - INFO - Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","INFO:mmedit:Iter [73/100]\tlr_generator: 4.000e-04, eta: 0:00:25, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 59626.5625, loss: 59626.5625\n","2021-07-01 12:11:22,798 - mmedit - INFO - Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","INFO:mmedit:Iter [74/100]\tlr_generator: 4.000e-04, eta: 0:00:23, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 60362.0703, loss: 60362.0703\n","2021-07-01 12:11:23,158 - mmedit - INFO - Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","INFO:mmedit:Iter [75/100]\tlr_generator: 4.000e-04, eta: 0:00:22, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 53156.9258, loss: 53156.9258\n","2021-07-01 12:11:23,513 - mmedit - INFO - Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","INFO:mmedit:Iter [76/100]\tlr_generator: 4.000e-04, eta: 0:00:21, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 46747.7148, loss: 46747.7148\n","2021-07-01 12:11:23,875 - mmedit - INFO - Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","INFO:mmedit:Iter [77/100]\tlr_generator: 4.000e-04, eta: 0:00:20, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41265.0078, loss: 41265.0078\n","2021-07-01 12:11:24,236 - mmedit - INFO - Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","INFO:mmedit:Iter [78/100]\tlr_generator: 4.000e-04, eta: 0:00:19, time: 0.361, data_time: 0.003, memory: 1372, loss_pix: 65673.9844, loss: 65673.9844\n","2021-07-01 12:11:24,597 - mmedit - INFO - Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","INFO:mmedit:Iter [79/100]\tlr_generator: 4.000e-04, eta: 0:00:18, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 43488.8594, loss: 43488.8594\n","2021-07-01 12:11:24,951 - mmedit - INFO - Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","INFO:mmedit:Iter [80/100]\tlr_generator: 4.000e-04, eta: 0:00:17, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 57209.5312, loss: 57209.5312\n","2021-07-01 12:11:25,313 - mmedit - INFO - Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","INFO:mmedit:Iter [81/100]\tlr_generator: 4.000e-04, eta: 0:00:16, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 46945.9297, loss: 46945.9297\n","2021-07-01 12:11:25,677 - mmedit - INFO - Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","INFO:mmedit:Iter [82/100]\tlr_generator: 4.000e-04, eta: 0:00:15, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 49951.7031, loss: 49951.7031\n","2021-07-01 12:11:26,038 - mmedit - INFO - Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","INFO:mmedit:Iter [83/100]\tlr_generator: 4.000e-04, eta: 0:00:14, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 41923.9453, loss: 41923.9453\n","2021-07-01 12:11:26,393 - mmedit - INFO - Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","INFO:mmedit:Iter [84/100]\tlr_generator: 4.000e-04, eta: 0:00:13, time: 0.354, data_time: 0.003, memory: 1372, loss_pix: 42797.9297, loss: 42797.9297\n","2021-07-01 12:11:26,753 - mmedit - INFO - Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","INFO:mmedit:Iter [85/100]\tlr_generator: 4.000e-04, eta: 0:00:12, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 55596.6211, loss: 55596.6211\n","2021-07-01 12:11:27,115 - mmedit - INFO - Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","INFO:mmedit:Iter [86/100]\tlr_generator: 4.000e-04, eta: 0:00:11, time: 0.361, data_time: 0.004, memory: 1372, loss_pix: 39217.5938, loss: 39217.5938\n","2021-07-01 12:11:27,472 - mmedit - INFO - Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","INFO:mmedit:Iter [87/100]\tlr_generator: 4.000e-04, eta: 0:00:10, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 45385.6719, loss: 45385.6719\n","2021-07-01 12:11:27,830 - mmedit - INFO - Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","INFO:mmedit:Iter [88/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 52986.2578, loss: 52986.2578\n","2021-07-01 12:11:28,189 - mmedit - INFO - Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","INFO:mmedit:Iter [89/100]\tlr_generator: 4.000e-04, eta: 0:00:09, time: 0.360, data_time: 0.004, memory: 1372, loss_pix: 42257.4453, loss: 42257.4453\n","2021-07-01 12:11:28,553 - mmedit - INFO - Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","INFO:mmedit:Iter [90/100]\tlr_generator: 4.000e-04, eta: 0:00:08, time: 0.364, data_time: 0.003, memory: 1372, loss_pix: 57483.0820, loss: 57483.0820\n","2021-07-01 12:11:28,910 - mmedit - INFO - Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","INFO:mmedit:Iter [91/100]\tlr_generator: 4.000e-04, eta: 0:00:07, time: 0.358, data_time: 0.004, memory: 1372, loss_pix: 47986.6094, loss: 47986.6094\n","2021-07-01 12:11:29,266 - mmedit - INFO - Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","INFO:mmedit:Iter [92/100]\tlr_generator: 4.000e-04, eta: 0:00:06, time: 0.355, data_time: 0.003, memory: 1372, loss_pix: 42591.9805, loss: 42591.9805\n","2021-07-01 12:11:29,628 - mmedit - INFO - Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","INFO:mmedit:Iter [93/100]\tlr_generator: 4.000e-04, eta: 0:00:05, time: 0.362, data_time: 0.004, memory: 1372, loss_pix: 44414.8047, loss: 44414.8047\n","2021-07-01 12:11:29,989 - mmedit - INFO - Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","INFO:mmedit:Iter [94/100]\tlr_generator: 4.000e-04, eta: 0:00:04, time: 0.360, data_time: 0.003, memory: 1372, loss_pix: 55887.0938, loss: 55887.0938\n","2021-07-01 12:11:30,345 - mmedit - INFO - Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","INFO:mmedit:Iter [95/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 50413.8594, loss: 50413.8594\n","2021-07-01 12:11:30,704 - mmedit - INFO - Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","INFO:mmedit:Iter [96/100]\tlr_generator: 4.000e-04, eta: 0:00:03, time: 0.357, data_time: 0.003, memory: 1372, loss_pix: 56848.2617, loss: 56848.2617\n","2021-07-01 12:11:31,067 - mmedit - INFO - Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","INFO:mmedit:Iter [97/100]\tlr_generator: 4.000e-04, eta: 0:00:02, time: 0.364, data_time: 0.004, memory: 1372, loss_pix: 48228.6172, loss: 48228.6172\n","2021-07-01 12:11:31,425 - mmedit - INFO - Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","INFO:mmedit:Iter [98/100]\tlr_generator: 4.000e-04, eta: 0:00:01, time: 0.359, data_time: 0.003, memory: 1372, loss_pix: 46352.1172, loss: 46352.1172\n","2021-07-01 12:11:31,782 - mmedit - INFO - Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","INFO:mmedit:Iter [99/100]\tlr_generator: 4.000e-04, eta: 0:00:00, time: 0.357, data_time: 0.004, memory: 1372, loss_pix: 56967.3750, loss: 56967.3750\n","[>>] 22/22, 0.9 task/s, elapsed: 26s, ETA: 0s\n","\n","2021-07-01 12:11:58,494 - mmedit - INFO - Saving checkpoint at 100 iterations\n","INFO:mmedit:Saving checkpoint at 100 iterations\n","2021-07-01 12:11:58,598 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n","INFO:mmedit:Iter(val) [100]\tPSNR: 21.3930, SSIM: 0.5684\n"]}],"source":["# EDVR(视频超分辨率-滑动窗口)\n","!./tools/dist_train.sh ./demo_files/demo_config_EDVR.py 1 "]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":197033,"status":"ok","timestamp":1625141428032,"user":{"displayName":"Kelvin C.K. Chan","photoUrl":"","userId":"05911692378028575851"},"user_tz":-480},"id":"_RdqmlT6qgt2","outputId":"b951b426-e06c-4f31-db01-449333eab333"},"outputs":[{"name":"stdout","output_type":"stream","text":["2021-07-01 12:06:47,253 - mmedit - INFO - Environment info:\n","------------------------------------------------------------\n","sys.platform: linux\n","Python: 3.7.10 (default, May 3 2021, 02:48:31) [GCC 7.5.0]\n","CUDA available: True\n","GPU 0: Tesla T4\n","CUDA_HOME: /usr/local/cuda\n","NVCC: Build cuda_11.0_bu.TC445_37.28845127_0\n","GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n","PyTorch: 1.7.0+cu110\n","PyTorch compiling details: PyTorch built with:\n"," - GCC 7.3\n"," - C++ Version: 201402\n"," - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\n"," - Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)\n"," - OpenMP 201511 (a.k.a. OpenMP 4.5)\n"," - NNPACK is enabled\n"," - CPU capability usage: AVX2\n"," - CUDA Runtime 11.0\n"," - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80\n"," - CuDNN 8.0.4\n"," - Magma 2.5.2\n"," - Build settings: BLAS=MKL, BUILD_TYPE=Release, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DUSE_VULKAN_WRAPPER -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, USE_CUDA=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \n","\n","TorchVision: 0.8.0\n","OpenCV: 4.1.2\n","MMCV: 1.3.5\n","MMCV Compiler: GCC 7.3\n","MMCV CUDA Compiler: 11.0\n","MMEditing: 0.8.0+7f4fa79\n","------------------------------------------------------------\n","\n","2021-07-01 12:06:47,253 - mmedit - INFO - Distributed training: True\n","2021-07-01 12:06:47,254 - mmedit - INFO - mmedit Version: 0.8.0\n","2021-07-01 12:06:47,254 - mmedit - INFO - Config:\n","/content/mmediting/demo_files/demo_config_BasicVSR.py\n","exp_name = 'basicvsr_demo'\n","\n","# model settings\n","model = dict(\n"," type='BasicVSR',\n"," generator=dict(\n"," type='BasicVSRNet',\n"," mid_channels=64,\n"," num_blocks=30,\n"," spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'\n"," 'basicvsr/spynet_20210409-c6c1bd09.pth'),\n"," pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'))\n","# model training and testing settings\n","train_cfg = dict(fix_iter=5000)\n","test_cfg = dict(metrics=['PSNR', 'SSIM'], crop_border=0)\n","\n","# dataset settings\n","train_dataset_type = 'SRFolderMultipleGTDataset'\n","val_dataset_type = 'SRFolderMultipleGTDataset'\n","\n","train_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(type='TemporalReverse', keys='lq_path', reverse_ratio=0),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='PairedRandomCrop', gt_patch_size=256),\n"," dict(\n"," type='Flip', keys=['lq', 'gt'], flip_ratio=0.5,\n"," direction='horizontal'),\n"," dict(type='Flip', keys=['lq', 'gt'], flip_ratio=0.5, direction='vertical'),\n"," dict(type='RandomTransposeHW', keys=['lq', 'gt'], transpose_ratio=0.5),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(type='Collect', keys=['lq', 'gt'], meta_keys=['lq_path', 'gt_path'])\n","]\n","\n","test_pipeline = [\n"," dict(type='GenerateSegmentIndices', interval_list=[1]),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='lq',\n"," channel_order='rgb'),\n"," dict(\n"," type='LoadImageFromFileList',\n"," io_backend='disk',\n"," key='gt',\n"," channel_order='rgb'),\n"," dict(type='RescaleToZeroOne', keys=['lq', 'gt']),\n"," dict(type='FramesToTensor', keys=['lq', 'gt']),\n"," dict(\n"," type='Collect',\n"," keys=['lq', 'gt'],\n"," meta_keys=['lq_path', 'gt_path', 'key'])\n","]\n","\n","data = dict(\n"," workers_per_gpu=6,\n"," train_dataloader=dict(samples_per_gpu=4, drop_last=True), # 2 gpus\n"," val_dataloader=dict(samples_per_gpu=1),\n"," test_dataloader=dict(samples_per_gpu=1, workers_per_gpu=1),\n","\n"," # train\n"," train=dict(\n"," type='RepeatDataset',\n"," times=1000,\n"," dataset=dict(\n"," type=train_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," num_input_frames=5,\n"," pipeline=train_pipeline,\n"," scale=4,\n"," test_mode=False)),\n"," # val\n"," val=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n"," # test\n"," test=dict(\n"," type=val_dataset_type,\n"," lq_folder='./demo_files/lq_sequences',\n"," gt_folder='./demo_files/gt_sequences',\n"," pipeline=test_pipeline,\n"," scale=4,\n"," test_mode=True),\n",")\n","\n","# optimizer\n","optimizers = dict(\n"," generator=dict(\n"," type='Adam',\n"," lr=2e-4,\n"," betas=(0.9, 0.99),\n"," paramwise_cfg=dict(custom_keys={'spynet': dict(lr_mult=0.125)})))\n","\n","# learning policy\n","total_iters = 100\n","lr_config = dict(\n"," policy='CosineRestart',\n"," by_epoch=False,\n"," periods=[300000],\n"," restart_weights=[1],\n"," min_lr=1e-7)\n","\n","checkpoint_config = dict(interval=5000, save_optimizer=True, by_epoch=False)\n","# remove gpu_collect=True in non distributed training\n","evaluation = dict(interval=50, save_image=False, gpu_collect=True)\n","log_config = dict(\n"," interval=1,\n"," hooks=[\n"," dict(type='TextLoggerHook', by_epoch=False),\n"," # dict(type='TensorboardLoggerHook'),\n"," ])\n","visual_config = None\n","\n","# runtime settings\n","dist_params = dict(backend='nccl')\n","log_level = 'INFO'\n","work_dir = f'./work_dirs/{exp_name}'\n","load_from = None\n","resume_from = None\n","workflow = [('train', 1)]\n","find_unused_parameters = True\n","\n","2021-07-01 12:06:47,291 - mmedit - INFO - Use load_from_http loader\n","2021-07-01 12:06:47,569 - mmedit - INFO - Start running, host: root@fce870c778f5, work_dir: /content/mmediting/work_dirs/basicvsr_demo\n","2021-07-01 12:06:47,569 - mmedit - INFO - workflow: [('train', 1)], max: 100 iters\n","2021-07-01 12:07:14,210 - mmedit - INFO - Iter [1/100]\tlr_generator: 2.500e-05, eta: 0:42:52, time: 25.981, data_time: 24.045, memory: 3464, loss_pix: 0.0634, loss: 0.0634\n","2021-07-01 12:07:15,171 - mmedit - INFO - Iter [2/100]\tlr_generator: 2.500e-05, eta: 0:22:00, time: 0.961, data_time: 0.011, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","2021-07-01 12:07:16,052 - mmedit - INFO - Iter [3/100]\tlr_generator: 2.500e-05, eta: 0:14:59, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0476, loss: 0.0476\n","2021-07-01 12:07:16,940 - mmedit - INFO - Iter [4/100]\tlr_generator: 2.500e-05, eta: 0:11:29, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:17,829 - mmedit - INFO - Iter [5/100]\tlr_generator: 2.500e-05, eta: 0:09:22, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0796, loss: 0.0796\n","2021-07-01 12:07:18,712 - mmedit - INFO - Iter [6/100]\tlr_generator: 2.500e-05, eta: 0:07:57, time: 0.884, data_time: 0.004, memory: 3518, loss_pix: 0.0680, loss: 0.0680\n","2021-07-01 12:07:19,594 - mmedit - INFO - Iter [7/100]\tlr_generator: 2.500e-05, eta: 0:06:56, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0607, loss: 0.0607\n","2021-07-01 12:07:20,481 - mmedit - INFO - Iter [8/100]\tlr_generator: 2.500e-05, eta: 0:06:10, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0598, loss: 0.0598\n","2021-07-01 12:07:21,361 - mmedit - INFO - Iter [9/100]\tlr_generator: 2.500e-05, eta: 0:05:35, time: 0.880, data_time: 0.003, memory: 3518, loss_pix: 0.0664, loss: 0.0664\n","2021-07-01 12:07:22,274 - mmedit - INFO - Iter [10/100]\tlr_generator: 2.500e-05, eta: 0:05:06, time: 0.913, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:07:23,161 - mmedit - INFO - Iter [11/100]\tlr_generator: 2.500e-05, eta: 0:04:42, time: 0.887, data_time: 0.005, memory: 3518, loss_pix: 0.0771, loss: 0.0771\n","2021-07-01 12:07:24,058 - mmedit - INFO - Iter [12/100]\tlr_generator: 2.500e-05, eta: 0:04:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0521, loss: 0.0521\n","2021-07-01 12:07:24,944 - mmedit - INFO - Iter [13/100]\tlr_generator: 2.500e-05, eta: 0:04:05, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:07:25,835 - mmedit - INFO - Iter [14/100]\tlr_generator: 2.500e-05, eta: 0:03:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0515, loss: 0.0515\n","2021-07-01 12:07:26,723 - mmedit - INFO - Iter [15/100]\tlr_generator: 2.500e-05, eta: 0:03:38, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0674, loss: 0.0674\n","2021-07-01 12:07:27,609 - mmedit - INFO - Iter [16/100]\tlr_generator: 2.500e-05, eta: 0:03:26, time: 0.886, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:28,498 - mmedit - INFO - Iter [17/100]\tlr_generator: 2.500e-05, eta: 0:03:16, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0670, loss: 0.0670\n","2021-07-01 12:07:29,388 - mmedit - INFO - Iter [18/100]\tlr_generator: 2.500e-05, eta: 0:03:07, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0663, loss: 0.0663\n","2021-07-01 12:07:30,284 - mmedit - INFO - Iter [19/100]\tlr_generator: 2.500e-05, eta: 0:02:59, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0633, loss: 0.0633\n","2021-07-01 12:07:31,176 - mmedit - INFO - Iter [20/100]\tlr_generator: 2.500e-05, eta: 0:02:51, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0482, loss: 0.0482\n","2021-07-01 12:07:32,073 - mmedit - INFO - Iter [21/100]\tlr_generator: 2.500e-05, eta: 0:02:44, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0743, loss: 0.0743\n","2021-07-01 12:07:32,966 - mmedit - INFO - Iter [22/100]\tlr_generator: 2.500e-05, eta: 0:02:38, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0690, loss: 0.0690\n","2021-07-01 12:07:33,858 - mmedit - INFO - Iter [23/100]\tlr_generator: 2.500e-05, eta: 0:02:32, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0437, loss: 0.0437\n","2021-07-01 12:07:34,750 - mmedit - INFO - Iter [24/100]\tlr_generator: 2.500e-05, eta: 0:02:27, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0579, loss: 0.0579\n","2021-07-01 12:07:35,642 - mmedit - INFO - Iter [25/100]\tlr_generator: 2.500e-05, eta: 0:02:22, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0781, loss: 0.0781\n","2021-07-01 12:07:36,533 - mmedit - INFO - Iter [26/100]\tlr_generator: 2.500e-05, eta: 0:02:17, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:07:37,427 - mmedit - INFO - Iter [27/100]\tlr_generator: 2.500e-05, eta: 0:02:13, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:07:38,321 - mmedit - INFO - Iter [28/100]\tlr_generator: 2.500e-05, eta: 0:02:08, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0567, loss: 0.0567\n","2021-07-01 12:07:39,212 - mmedit - INFO - Iter [29/100]\tlr_generator: 2.500e-05, eta: 0:02:04, time: 0.891, data_time: 0.003, memory: 3518, loss_pix: 0.0846, loss: 0.0846\n","2021-07-01 12:07:40,104 - mmedit - INFO - Iter [30/100]\tlr_generator: 2.500e-05, eta: 0:02:01, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0658, loss: 0.0658\n","2021-07-01 12:07:40,993 - mmedit - INFO - Iter [31/100]\tlr_generator: 2.500e-05, eta: 0:01:57, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0502, loss: 0.0502\n","2021-07-01 12:07:41,885 - mmedit - INFO - Iter [32/100]\tlr_generator: 2.500e-05, eta: 0:01:54, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0622, loss: 0.0622\n","2021-07-01 12:07:42,787 - mmedit - INFO - Iter [33/100]\tlr_generator: 2.500e-05, eta: 0:01:50, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0657, loss: 0.0657\n","2021-07-01 12:07:43,674 - mmedit - INFO - Iter [34/100]\tlr_generator: 2.500e-05, eta: 0:01:47, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0643, loss: 0.0643\n","2021-07-01 12:07:44,567 - mmedit - INFO - Iter [35/100]\tlr_generator: 2.500e-05, eta: 0:01:44, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0898, loss: 0.0898\n","2021-07-01 12:07:45,458 - mmedit - INFO - Iter [36/100]\tlr_generator: 2.500e-05, eta: 0:01:41, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0865, loss: 0.0865\n","2021-07-01 12:07:46,341 - mmedit - INFO - Iter [37/100]\tlr_generator: 2.500e-05, eta: 0:01:38, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0511, loss: 0.0511\n","2021-07-01 12:07:47,225 - mmedit - INFO - Iter [38/100]\tlr_generator: 2.500e-05, eta: 0:01:36, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0673, loss: 0.0673\n","2021-07-01 12:07:48,109 - mmedit - INFO - Iter [39/100]\tlr_generator: 2.500e-05, eta: 0:01:33, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0653, loss: 0.0653\n","2021-07-01 12:07:48,990 - mmedit - INFO - Iter [40/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0828, loss: 0.0828\n","2021-07-01 12:07:49,874 - mmedit - INFO - Iter [41/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.885, data_time: 0.003, memory: 3518, loss_pix: 0.0788, loss: 0.0788\n","2021-07-01 12:07:50,755 - mmedit - INFO - Iter [42/100]\tlr_generator: 2.500e-05, eta: 0:01:26, time: 0.881, data_time: 0.005, memory: 3518, loss_pix: 0.0605, loss: 0.0605\n","2021-07-01 12:07:51,638 - mmedit - INFO - Iter [43/100]\tlr_generator: 2.500e-05, eta: 0:01:24, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0539, loss: 0.0539\n","2021-07-01 12:07:52,518 - mmedit - INFO - Iter [44/100]\tlr_generator: 2.500e-05, eta: 0:01:21, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0503, loss: 0.0503\n","2021-07-01 12:07:53,395 - mmedit - INFO - Iter [45/100]\tlr_generator: 2.500e-05, eta: 0:01:19, time: 0.877, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:07:54,273 - mmedit - INFO - Iter [46/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0555, loss: 0.0555\n","2021-07-01 12:07:55,159 - mmedit - INFO - Iter [47/100]\tlr_generator: 2.500e-05, eta: 0:01:15, time: 0.886, data_time: 0.007, memory: 3518, loss_pix: 0.0806, loss: 0.0806\n","2021-07-01 12:07:56,040 - mmedit - INFO - Iter [48/100]\tlr_generator: 2.500e-05, eta: 0:01:13, time: 0.881, data_time: 0.003, memory: 3518, loss_pix: 0.0576, loss: 0.0576\n","2021-07-01 12:07:56,919 - mmedit - INFO - Iter [49/100]\tlr_generator: 2.500e-05, eta: 0:01:11, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0871, loss: 0.0871\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:08:32,618 - mmedit - INFO - Iter(val) [50]\tPSNR: 20.9899, SSIM: 0.5295\n","2021-07-01 12:08:33,591 - mmedit - INFO - Iter [51/100]\tlr_generator: 2.500e-05, eta: 0:01:40, time: 35.792, data_time: 34.822, memory: 3518, loss_pix: 0.0773, loss: 0.0773\n","2021-07-01 12:08:34,462 - mmedit - INFO - Iter [52/100]\tlr_generator: 2.500e-05, eta: 0:01:37, time: 0.871, data_time: 0.003, memory: 3518, loss_pix: 0.0687, loss: 0.0687\n","2021-07-01 12:08:35,326 - mmedit - INFO - Iter [53/100]\tlr_generator: 2.500e-05, eta: 0:01:34, time: 0.864, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:36,192 - mmedit - INFO - Iter [54/100]\tlr_generator: 2.500e-05, eta: 0:01:31, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0575, loss: 0.0575\n","2021-07-01 12:08:37,069 - mmedit - INFO - Iter [55/100]\tlr_generator: 2.500e-05, eta: 0:01:28, time: 0.876, data_time: 0.003, memory: 3518, loss_pix: 0.0842, loss: 0.0842\n","2021-07-01 12:08:37,942 - mmedit - INFO - Iter [56/100]\tlr_generator: 2.500e-05, eta: 0:01:25, time: 0.873, data_time: 0.003, memory: 3518, loss_pix: 0.0836, loss: 0.0836\n","2021-07-01 12:08:38,808 - mmedit - INFO - Iter [57/100]\tlr_generator: 2.500e-05, eta: 0:01:22, time: 0.867, data_time: 0.003, memory: 3518, loss_pix: 0.0580, loss: 0.0580\n","2021-07-01 12:08:39,679 - mmedit - INFO - Iter [58/100]\tlr_generator: 2.500e-05, eta: 0:01:20, time: 0.870, data_time: 0.003, memory: 3518, loss_pix: 0.0449, loss: 0.0449\n","2021-07-01 12:08:40,557 - mmedit - INFO - Iter [59/100]\tlr_generator: 2.500e-05, eta: 0:01:17, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0702, loss: 0.0702\n","2021-07-01 12:08:41,430 - mmedit - INFO - Iter [60/100]\tlr_generator: 2.500e-05, eta: 0:01:14, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:42,308 - mmedit - INFO - Iter [61/100]\tlr_generator: 2.500e-05, eta: 0:01:12, time: 0.878, data_time: 0.003, memory: 3518, loss_pix: 0.0716, loss: 0.0716\n","2021-07-01 12:08:43,182 - mmedit - INFO - Iter [62/100]\tlr_generator: 2.500e-05, eta: 0:01:09, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0489, loss: 0.0489\n","2021-07-01 12:08:44,056 - mmedit - INFO - Iter [63/100]\tlr_generator: 2.500e-05, eta: 0:01:07, time: 0.874, data_time: 0.003, memory: 3518, loss_pix: 0.0566, loss: 0.0566\n","2021-07-01 12:08:44,932 - mmedit - INFO - Iter [64/100]\tlr_generator: 2.500e-05, eta: 0:01:05, time: 0.875, data_time: 0.003, memory: 3518, loss_pix: 0.0597, loss: 0.0597\n","2021-07-01 12:08:45,819 - mmedit - INFO - Iter [65/100]\tlr_generator: 2.500e-05, eta: 0:01:02, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0640, loss: 0.0640\n","2021-07-01 12:08:46,698 - mmedit - INFO - Iter [66/100]\tlr_generator: 2.500e-05, eta: 0:01:00, time: 0.879, data_time: 0.003, memory: 3518, loss_pix: 0.0665, loss: 0.0665\n","2021-07-01 12:08:47,580 - mmedit - INFO - Iter [67/100]\tlr_generator: 2.500e-05, eta: 0:00:58, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0675, loss: 0.0675\n","2021-07-01 12:08:48,464 - mmedit - INFO - Iter [68/100]\tlr_generator: 2.500e-05, eta: 0:00:56, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0641, loss: 0.0641\n","2021-07-01 12:08:49,347 - mmedit - INFO - Iter [69/100]\tlr_generator: 2.500e-05, eta: 0:00:54, time: 0.883, data_time: 0.003, memory: 3518, loss_pix: 0.0603, loss: 0.0603\n","2021-07-01 12:08:50,229 - mmedit - INFO - Iter [70/100]\tlr_generator: 2.500e-05, eta: 0:00:51, time: 0.882, data_time: 0.003, memory: 3518, loss_pix: 0.0478, loss: 0.0478\n","2021-07-01 12:08:51,113 - mmedit - INFO - Iter [71/100]\tlr_generator: 2.500e-05, eta: 0:00:49, time: 0.884, data_time: 0.003, memory: 3518, loss_pix: 0.0691, loss: 0.0691\n","2021-07-01 12:08:52,000 - mmedit - INFO - Iter [72/100]\tlr_generator: 2.500e-05, eta: 0:00:47, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0861, loss: 0.0861\n","2021-07-01 12:08:52,890 - mmedit - INFO - Iter [73/100]\tlr_generator: 2.500e-05, eta: 0:00:45, time: 0.890, data_time: 0.003, memory: 3518, loss_pix: 0.0688, loss: 0.0688\n","2021-07-01 12:08:53,792 - mmedit - INFO - Iter [74/100]\tlr_generator: 2.500e-05, eta: 0:00:43, time: 0.903, data_time: 0.003, memory: 3518, loss_pix: 0.0787, loss: 0.0787\n","2021-07-01 12:08:54,688 - mmedit - INFO - Iter [75/100]\tlr_generator: 2.500e-05, eta: 0:00:41, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0744, loss: 0.0744\n","2021-07-01 12:08:55,582 - mmedit - INFO - Iter [76/100]\tlr_generator: 2.500e-05, eta: 0:00:39, time: 0.895, data_time: 0.003, memory: 3518, loss_pix: 0.0792, loss: 0.0792\n","2021-07-01 12:08:56,476 - mmedit - INFO - Iter [77/100]\tlr_generator: 2.500e-05, eta: 0:00:38, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0645, loss: 0.0645\n","2021-07-01 12:08:57,368 - mmedit - INFO - Iter [78/100]\tlr_generator: 2.500e-05, eta: 0:00:36, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0475, loss: 0.0475\n","2021-07-01 12:08:58,261 - mmedit - INFO - Iter [79/100]\tlr_generator: 2.500e-05, eta: 0:00:34, time: 0.893, data_time: 0.003, memory: 3518, loss_pix: 0.0627, loss: 0.0627\n","2021-07-01 12:08:59,159 - mmedit - INFO - Iter [80/100]\tlr_generator: 2.500e-05, eta: 0:00:32, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0626, loss: 0.0626\n","2021-07-01 12:09:00,055 - mmedit - INFO - Iter [81/100]\tlr_generator: 2.500e-05, eta: 0:00:30, time: 0.896, data_time: 0.004, memory: 3518, loss_pix: 0.0681, loss: 0.0681\n","2021-07-01 12:09:00,954 - mmedit - INFO - Iter [82/100]\tlr_generator: 2.500e-05, eta: 0:00:28, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0671, loss: 0.0671\n","2021-07-01 12:09:01,860 - mmedit - INFO - Iter [83/100]\tlr_generator: 2.500e-05, eta: 0:00:27, time: 0.906, data_time: 0.003, memory: 3518, loss_pix: 0.0825, loss: 0.0825\n","2021-07-01 12:09:02,760 - mmedit - INFO - Iter [84/100]\tlr_generator: 2.500e-05, eta: 0:00:25, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0594, loss: 0.0594\n","2021-07-01 12:09:03,658 - mmedit - INFO - Iter [85/100]\tlr_generator: 2.500e-05, eta: 0:00:23, time: 0.898, data_time: 0.003, memory: 3518, loss_pix: 0.0446, loss: 0.0446\n","2021-07-01 12:09:04,555 - mmedit - INFO - Iter [86/100]\tlr_generator: 2.500e-05, eta: 0:00:22, time: 0.897, data_time: 0.003, memory: 3518, loss_pix: 0.0491, loss: 0.0491\n","2021-07-01 12:09:05,452 - mmedit - INFO - Iter [87/100]\tlr_generator: 2.500e-05, eta: 0:00:20, time: 0.896, data_time: 0.003, memory: 3518, loss_pix: 0.0450, loss: 0.0450\n","2021-07-01 12:09:06,351 - mmedit - INFO - Iter [88/100]\tlr_generator: 2.500e-05, eta: 0:00:18, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0795, loss: 0.0795\n","2021-07-01 12:09:07,257 - mmedit - INFO - Iter [89/100]\tlr_generator: 2.500e-05, eta: 0:00:17, time: 0.905, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:08,161 - mmedit - INFO - Iter [90/100]\tlr_generator: 2.500e-05, eta: 0:00:15, time: 0.904, data_time: 0.003, memory: 3518, loss_pix: 0.0588, loss: 0.0588\n","2021-07-01 12:09:09,063 - mmedit - INFO - Iter [91/100]\tlr_generator: 2.500e-05, eta: 0:00:13, time: 0.902, data_time: 0.003, memory: 3518, loss_pix: 0.0614, loss: 0.0614\n","2021-07-01 12:09:09,955 - mmedit - INFO - Iter [92/100]\tlr_generator: 2.500e-05, eta: 0:00:12, time: 0.892, data_time: 0.003, memory: 3518, loss_pix: 0.0599, loss: 0.0599\n","2021-07-01 12:09:10,849 - mmedit - INFO - Iter [93/100]\tlr_generator: 2.500e-05, eta: 0:00:10, time: 0.894, data_time: 0.003, memory: 3518, loss_pix: 0.0522, loss: 0.0522\n","2021-07-01 12:09:11,749 - mmedit - INFO - Iter [94/100]\tlr_generator: 2.500e-05, eta: 0:00:09, time: 0.900, data_time: 0.003, memory: 3518, loss_pix: 0.0667, loss: 0.0667\n","2021-07-01 12:09:12,638 - mmedit - INFO - Iter [95/100]\tlr_generator: 2.500e-05, eta: 0:00:07, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0558, loss: 0.0558\n","2021-07-01 12:09:13,576 - mmedit - INFO - Iter [96/100]\tlr_generator: 2.500e-05, eta: 0:00:06, time: 0.938, data_time: 0.052, memory: 3518, loss_pix: 0.0577, loss: 0.0577\n","2021-07-01 12:09:14,463 - mmedit - INFO - Iter [97/100]\tlr_generator: 2.500e-05, eta: 0:00:04, time: 0.887, data_time: 0.003, memory: 3518, loss_pix: 0.0574, loss: 0.0574\n","2021-07-01 12:09:15,351 - mmedit - INFO - Iter [98/100]\tlr_generator: 2.500e-05, eta: 0:00:02, time: 0.888, data_time: 0.003, memory: 3518, loss_pix: 0.0578, loss: 0.0578\n","2021-07-01 12:09:16,240 - mmedit - INFO - Iter [99/100]\tlr_generator: 2.500e-05, eta: 0:00:01, time: 0.889, data_time: 0.003, memory: 3518, loss_pix: 0.0556, loss: 0.0556\n","[>>] 2/2, 0.1 task/s, elapsed: 34s, ETA: 0s\n","\n","2021-07-01 12:09:52,294 - mmedit - INFO - Saving checkpoint at 100 iterations\n","2021-07-01 12:09:52,433 - mmedit - INFO - Iter(val) [100]\tPSNR: 21.4372, SSIM: 0.5687\n"]}],"source":["# BasicVSR(视频超分辨率 - 循环)\n","!./tools/dist_train.sh ./demo_files/demo_config_BasicVSR.py 1 "]},{"cell_type":"markdown","metadata":{"id":"QT0zwBFt7J13"},"source":["**本教程到此结束。有关更高级的用法,请参阅我们的[综合教程]()。享受使用 MMEditing 的乐趣!**"]}],"metadata":{"accelerator":"GPU","colab":{"collapsed_sections":[],"name":"restorer_basic_tutorial.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3.7.7 64-bit ('pre-commit': conda)","name":"python377jvsc74a57bd04974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"},"language_info":{"name":"python","version":""},"metadata":{"interpreter":{"hash":"4974e937eb671323d80c6d61c9a5d7e99245fcc571fd7f47cadafec83c412660"}}},"nbformat":4,"nbformat_minor":2} diff --git a/demo/translation_demo.py b/demo/translation_demo.py deleted file mode 100644 index 149a2aaeb3..0000000000 --- a/demo/translation_demo.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -import argparse -import os -import sys - -import mmengine -from mmengine import DictAction -from torchvision import utils - -# yapf: disable -sys.path.append(os.path.abspath(os.path.join(__file__, '../..'))) # isort:skip # noqa - -from mmagic.apis import init_model, sample_img2img_model # isort:skip # noqa -# yapf: enable - - -def parse_args(): - parser = argparse.ArgumentParser(description='Translation demo') - parser.add_argument('config', help='test config file path') - parser.add_argument('checkpoint', help='checkpoint file') - parser.add_argument('image_path', help='Image file path') - parser.add_argument( - '--target-domain', type=str, default=None, help='Desired image domain') - parser.add_argument( - '--save-path', - type=str, - default='./work_dirs/demos/translation_sample.png', - help='path to save translation sample') - parser.add_argument( - '--device', type=str, default='cuda:0', help='CUDA device id') - # args for inference/sampling - parser.add_argument( - '--sample-cfg', - nargs='+', - action=DictAction, - help='Other customized kwargs for sampling function') - - args = parser.parse_args() - return args - - -def main(): - args = parse_args() - model = init_model( - args.config, checkpoint=args.checkpoint, device=args.device) - - if args.sample_cfg is None: - args.sample_cfg = dict() - - results = sample_img2img_model(model, args.image_path, args.target_domain, - **args.sample_cfg) - results = (results[:, [2, 1, 0]] + 1.) / 2. - - # save images - mmengine.mkdir_or_exist(os.path.dirname(args.save_path)) - utils.save_image(results, args.save_path) - - -if __name__ == '__main__': - main() diff --git a/demo/unconditional_demo.py b/demo/unconditional_demo.py deleted file mode 100644 index da017568f9..0000000000 --- a/demo/unconditional_demo.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -import argparse -import os -import sys - -import mmengine -from mmengine import DictAction -from torchvision import utils - -# yapf: disable -sys.path.append(os.path.abspath(os.path.join(__file__, '../..'))) # isort:skip # noqa - -from mmagic.apis import init_model, sample_unconditional_model # isort:skip # noqa -# yapf: enable - - -def parse_args(): - parser = argparse.ArgumentParser(description='Generation demo') - parser.add_argument('config', help='test config file path') - parser.add_argument('checkpoint', help='checkpoint file') - parser.add_argument( - '--save-path', - type=str, - default='./work_dirs/demos/unconditional_samples.png', - help='path to save unconditional samples') - parser.add_argument( - '--device', type=str, default='cuda:0', help='CUDA device id') - - # args for inference/sampling - parser.add_argument( - '--num-batches', type=int, default=4, help='Batch size in inference') - parser.add_argument( - '--num-samples', - type=int, - default=12, - help='The total number of samples') - parser.add_argument( - '--sample-model', - type=str, - default='ema', - help='Which model to use for sampling') - parser.add_argument( - '--sample-cfg', - nargs='+', - action=DictAction, - help='Other customized kwargs for sampling function') - - # args for image grid - parser.add_argument( - '--padding', type=int, default=0, help='Padding in the image grid.') - parser.add_argument( - '--nrow', - type=int, - default=6, - help='Number of images displayed in each row of the grid') - - args = parser.parse_args() - return args - - -def main(): - args = parse_args() - model = init_model( - args.config, checkpoint=args.checkpoint, device=args.device) - - if args.sample_cfg is None: - args.sample_cfg = dict() - - results = sample_unconditional_model(model, args.num_samples, - args.num_batches, args.sample_model, - **args.sample_cfg) - - results = results / 255 - results = results[:, [2, 1, 0]] - - # save images - mmengine.mkdir_or_exist(os.path.dirname(args.save_path)) - utils.save_image( - results, args.save_path, nrow=args.nrow, padding=args.padding) - - -if __name__ == '__main__': - main() diff --git a/demo/video_interpolation_demo.py b/demo/video_interpolation_demo.py deleted file mode 100644 index 02ac110995..0000000000 --- a/demo/video_interpolation_demo.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (c) OpenMMLab. All rights reserved. -import argparse - -import torch - -from mmagic.apis import init_model, video_interpolation_inference -from mmagic.utils import modify_args - -VIDEO_EXTENSIONS = ('.mp4', '.mov', '.avi') - - -def parse_args(): - modify_args() - parser = argparse.ArgumentParser(description='Restoration demo') - parser.add_argument('config', help='test config file path') - parser.add_argument('checkpoint', help='checkpoint file') - parser.add_argument('input_dir', help='directory of the input video') - parser.add_argument('output_dir', help='directory of the output video') - parser.add_argument( - '--fps', - type=float, - default=0, - help='frame rate of the output video, which is needed when ' - '`fps-multiplier` is 0 and a video is desired as output.') - parser.add_argument( - '--fps-multiplier', - type=float, - default=0, - help='multiply the fps based on the input video, if `fps-multiplier` ' - 'is 0, `fps` will be utilized.') - parser.add_argument( - '--start-idx', - type=int, - default=0, - help='the index of the first frame to be processed in the sequence') - parser.add_argument( - '--end-idx', - type=int, - default=None, - help='The index corresponds to the last interpolated frame in the' - 'sequence. If it is None, interpolate to the last frame of video' - 'or sequence. Default: None.') - parser.add_argument( - '--batch-size', - type=int, - default=4, - help='batch size of video interpolation model') - parser.add_argument( - '--filename-tmpl', - default='{:08d}.png', - help='template of the file names') - parser.add_argument('--device', type=int, default=0, help='CUDA device id') - args = parser.parse_args() - return args - - -def main(): - """Demo for video interpolation models. - - Note that we accept video as input(output), when 'input_dir'('output_dir') - is set to the path to the video. But using videos introduces video - compression, which lower the visual quality. If you want actual quality, - please save them as separate images (.png). - """ - - args = parse_args() - - if args.device < 0 or not torch.cuda.is_available(): - device = torch.device('cpu') - else: - device = torch.device('cuda', args.device) - - model = init_model(args.config, args.checkpoint, device=device) - - video_interpolation_inference( - model=model, - input_dir=args.input_dir, - start_idx=args.start_idx, - end_idx=args.end_idx, - batch_size=args.batch_size, - fps_multiplier=args.fps_multiplier, - fps=args.fps, - output_dir=args.output_dir, - filename_tmpl=args.filename_tmpl) - - -if __name__ == '__main__': - main() diff --git a/mmagic/apis/__init__.py b/mmagic/apis/__init__.py index 7b2c6484a6..8180750e93 100644 --- a/mmagic/apis/__init__.py +++ b/mmagic/apis/__init__.py @@ -1,18 +1,4 @@ # Copyright (c) OpenMMLab. All rights reserved. -from .inferencers import (Inferencers, calculate_grid_size, - colorization_inference, delete_cfg, init_model, - inpainting_inference, matting_inference, - restoration_face_inference, restoration_inference, - restoration_video_inference, - sample_conditional_model, sample_img2img_model, - sample_unconditional_model, set_random_seed, - video_interpolation_inference) +from .inferencers import Inferencers -__all__ = [ - 'init_model', 'delete_cfg', 'set_random_seed', 'matting_inference', - 'inpainting_inference', 'restoration_inference', - 'restoration_video_inference', 'restoration_face_inference', - 'video_interpolation_inference', 'sample_conditional_model', - 'sample_unconditional_model', 'sample_img2img_model', - 'colorization_inference', 'calculate_grid_size', 'Inferencers' -] +__all__ = ['Inferencers'] diff --git a/mmagic/apis/inferencers/__init__.py b/mmagic/apis/inferencers/__init__.py index 4bcf954b69..cc4c378237 100644 --- a/mmagic/apis/inferencers/__init__.py +++ b/mmagic/apis/inferencers/__init__.py @@ -9,18 +9,6 @@ from .controlnet_animation_inferencer import ControlnetAnimationInferencer from .eg3d_inferencer import EG3DInferencer from .image_super_resolution_inferencer import ImageSuperResolutionInferencer -# yapf: disable -from .inference_functions import (calculate_grid_size, colorization_inference, - delete_cfg, init_model, inpainting_inference, - matting_inference, - restoration_face_inference, - restoration_inference, - restoration_video_inference, - sample_conditional_model, - sample_img2img_model, - sample_unconditional_model, set_random_seed, - video_interpolation_inference) -# yapf: enable from .inpainting_inferencer import InpaintingInferencer from .matting_inferencer import MattingInferencer from .text2image_inferencer import Text2ImageInferencer @@ -30,15 +18,10 @@ from .video_restoration_inferencer import VideoRestorationInferencer __all__ = [ - 'init_model', 'delete_cfg', 'set_random_seed', 'matting_inference', - 'inpainting_inference', 'restoration_inference', - 'restoration_video_inference', 'restoration_face_inference', - 'video_interpolation_inference', 'sample_conditional_model', - 'sample_unconditional_model', 'sample_img2img_model', - 'colorization_inference', 'calculate_grid_size', 'ColorizationInferencer', - 'ConditionalInferencer', 'EG3DInferencer', 'InpaintingInferencer', - 'MattingInferencer', 'ImageSuperResolutionInferencer', - 'Text2ImageInferencer', 'TranslationInferencer', 'UnconditionalInferencer', + 'ColorizationInferencer', 'ConditionalInferencer', 'EG3DInferencer', + 'InpaintingInferencer', 'MattingInferencer', + 'ImageSuperResolutionInferencer', 'Text2ImageInferencer', + 'TranslationInferencer', 'UnconditionalInferencer', 'VideoInterpolationInferencer', 'VideoRestorationInferencer', 'ControlnetAnimationInferencer' ] diff --git a/mmagic/apis/inferencers/inference_functions.py b/mmagic/apis/inferencers/inference_functions.py index 639f7efe37..c0a57b3721 100644 --- a/mmagic/apis/inferencers/inference_functions.py +++ b/mmagic/apis/inferencers/inference_functions.py @@ -1,27 +1,17 @@ # Copyright (c) OpenMMLab. All rights reserved. -import glob import math -import os -import os.path as osp -import cv2 import mmcv import numpy as np import torch -from mmengine import Config, is_list_of +from mmengine import Config from mmengine.config import ConfigDict -from mmengine.dataset import Compose -from mmengine.dataset.utils import default_collate as collate from mmengine.fileio import get_file_backend from mmengine.registry import init_default_scope from mmengine.runner import load_checkpoint from mmengine.runner import set_random_seed as set_random_seed_engine -from mmengine.utils import ProgressBar -from torch.nn.parallel import scatter -from mmagic.models.base_models import BaseTranslationModel from mmagic.registry import MODELS -from mmagic.structures import DataSample VIDEO_EXTENSIONS = ('.mp4', '.mov', '.avi') FILE_CLIENT = get_file_backend(backend_args={'backend': 'local'}) @@ -96,427 +86,6 @@ def init_model(config, checkpoint=None, device='cuda:0'): return model -@torch.no_grad() -def sample_unconditional_model(model, - num_samples=16, - num_batches=4, - sample_model='ema', - **kwargs): - """Sampling from unconditional models. - - Args: - model (nn.Module): Unconditional models in MMGeneration. - num_samples (int, optional): The total number of samples. - Defaults to 16. - num_batches (int, optional): The number of batch size for inference. - Defaults to 4. - sample_model (str, optional): Which model you want to use. ['ema', - 'orig']. Defaults to 'ema'. - - Returns: - Tensor: Generated image tensor. - """ - # set eval mode - model.eval() - # construct sampling list for batches - n_repeat = num_samples // num_batches - batches_list = [num_batches] * n_repeat - - if num_samples % num_batches > 0: - batches_list.append(num_samples % num_batches) - res_list = [] - - # inference - for batches in batches_list: - res = model( - dict(num_batches=batches, sample_model=sample_model), **kwargs) - res_list.extend([item.fake_img.data.cpu() for item in res]) - - results = torch.stack(res_list, dim=0) - return results - - -@torch.no_grad() -def sample_conditional_model(model, - num_samples=16, - num_batches=4, - sample_model='ema', - label=None, - **kwargs): - """Sampling from conditional models. - - Args: - model (nn.Module): Conditional models in MMGeneration. - num_samples (int, optional): The total number of samples. - Defaults to 16. - num_batches (int, optional): The number of batch size for inference. - Defaults to 4. - sample_model (str, optional): Which model you want to use. ['ema', - 'orig']. Defaults to 'ema'. - label (int | torch.Tensor | list[int], optional): Labels used to - generate images. Default to None., - - Returns: - Tensor: Generated image tensor. - """ - # set eval mode - model.eval() - # construct sampling list for batches - n_repeat = num_samples // num_batches - batches_list = [num_batches] * n_repeat - - # check and convert the input labels - if isinstance(label, int): - label = torch.LongTensor([label] * num_samples) - elif isinstance(label, torch.Tensor): - label = label.type(torch.int64) - if label.numel() == 1: - # repeat single tensor - # call view(-1) to avoid nested tensor like [[[1]]] - label = label.view(-1).repeat(num_samples) - else: - # flatten multi tensors - label = label.view(-1) - elif isinstance(label, list): - if is_list_of(label, int): - label = torch.LongTensor(label) - # `nargs='+'` parse single integer as list - if label.numel() == 1: - # repeat single tensor - label = label.repeat(num_samples) - else: - raise TypeError('Only support `int` for label list elements, ' - f'but receive {type(label[0])}') - elif label is None: - pass - else: - raise TypeError('Only support `int`, `torch.Tensor`, `list[int]` or ' - f'None as label, but receive {type(label)}.') - - # check the length of the (converted) label - if label is not None and label.size(0) != num_samples: - raise ValueError('Number of elements in the label list should be ONE ' - 'or the length of `num_samples`. Requires ' - f'{num_samples}, but receive {label.size(0)}.') - - # make label list - label_list = [] - for n in range(n_repeat): - if label is None: - label_list.append(None) - else: - label_list.append(label[n * num_batches:(n + 1) * num_batches]) - - if num_samples % num_batches > 0: - batches_list.append(num_samples % num_batches) - if label is None: - label_list.append(None) - else: - label_list.append(label[(n + 1) * num_batches:]) - - res_list = [] - - # inference - for batches, labels in zip(batches_list, label_list): - res = model( - dict( - num_batches=batches, labels=labels, sample_model=sample_model), - **kwargs) - res_list.extend([item.fake_img.data.cpu() for item in res]) - results = torch.stack(res_list, dim=0) - return results - - -def inpainting_inference(model, masked_img, mask): - """Inference image with the model. - - Args: - model (nn.Module): The loaded model. - masked_img (str): File path of image with mask. - mask (str): Mask file path. - - Returns: - Tensor: The predicted inpainting result. - """ - device = next(model.parameters()).device # model device - - # build the data pipeline - infer_pipeline = [ - dict(type='LoadImageFromFile', key='gt', channel_order='bgr'), - dict( - type='LoadMask', - mask_mode='file', - ), - dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), - ] - - test_pipeline = Compose(infer_pipeline) - # prepare data - data = dict(gt_path=masked_img, mask_path=mask) - _data = test_pipeline(data) - data = dict() - data['inputs'] = _data['inputs'] / 255.0 - data = collate([data]) - data['data_samples'] = DataSample.stack([_data['data_samples']]) - if 'cuda' in str(device): - data = scatter(data, [device])[0] - data['data_samples'].mask.data = scatter( - data['data_samples'].mask.data, [device])[0] / 255.0 - # else: - # data.pop('meta') - # forward the model - with torch.no_grad(): - result, x = model(mode='tensor', **data) - - result = result.cpu() - masks = _data['data_samples'].mask.data * 255 - masked_imgs = data['inputs'][0].cpu() - result = result[0] * masks + masked_imgs * (1. - masks) - return result - - -def matting_inference(model, img, trimap): - """Inference image(s) with the model. - - Args: - model (nn.Module): The loaded model. - img (str): Image file path. - trimap (str): Trimap file path. - - Returns: - np.ndarray: The predicted alpha matte. - """ - cfg = model.cfg - device = next(model.parameters()).device # model device - # remove alpha from test_pipeline - keys_to_remove = ['alpha', 'ori_alpha'] - for key in keys_to_remove: - for pipeline in list(cfg.test_pipeline): - if 'key' in pipeline and key == pipeline['key']: - cfg.test_pipeline.remove(pipeline) - if 'keys' in pipeline and key in pipeline['keys']: - pipeline['keys'].remove(key) - if len(pipeline['keys']) == 0: - cfg.test_pipeline.remove(pipeline) - if 'meta_keys' in pipeline and key in pipeline['meta_keys']: - pipeline['meta_keys'].remove(key) - # build the data pipeline - test_pipeline = Compose(cfg.test_pipeline) - # prepare data - data = dict(merged_path=img, trimap_path=trimap) - _data = test_pipeline(data) - trimap = _data['data_samples'].trimap - data = dict() - data['inputs'] = torch.cat([_data['inputs'], trimap], dim=0).float() - data = collate([data]) - data['data_samples'] = DataSample.stack([_data['data_samples']]) - if 'cuda' in str(device): - data = scatter(data, [device])[0] - # forward the model - with torch.no_grad(): - result = model(mode='predict', **data) - result = result[0].output - result = result.pred_alpha.data - return result.cpu().numpy() - - -def sample_img2img_model(model, image_path, target_domain=None, **kwargs): - """Sampling from translation models. - - Args: - model (nn.Module): The loaded model. - image_path (str): File path of input image. - style (str): Target style of output image. - Returns: - Tensor: Translated image tensor. - """ - assert isinstance(model, BaseTranslationModel) - - # get source domain and target domain - if target_domain is None: - target_domain = model._default_domain - source_domain = model.get_other_domains(target_domain)[0] - - cfg = model.cfg - # build the data pipeline - test_pipeline = Compose(cfg.test_pipeline) - - # prepare data - data = dict() - # dirty code to deal with test data pipeline - data['pair_path'] = image_path - data[f'img_{source_domain}_path'] = image_path - data[f'img_{target_domain}_path'] = image_path - - data = collate([test_pipeline(data)]) - data = model.data_preprocessor(data, False) - inputs_dict = data['inputs'] - - source_image = inputs_dict[f'img_{source_domain}'] - - # forward the model - with torch.no_grad(): - results = model( - source_image, - test_mode=True, - target_domain=target_domain, - **kwargs) - output = results['target'] - return output - - -def restoration_inference(model, img, ref=None): - """Inference image with the model. - - Args: - model (nn.Module): The loaded model. - img (str): File path of input image. - ref (str | None): File path of reference image. Default: None. - - Returns: - Tensor: The predicted restoration result. - """ - cfg = model.cfg - device = next(model.parameters()).device # model device - - # select the data pipeline - if cfg.get('demo_pipeline', None): - test_pipeline = cfg.demo_pipeline - elif cfg.get('test_pipeline', None): - test_pipeline = cfg.test_pipeline - else: - test_pipeline = cfg.val_pipeline - - # remove gt from test_pipeline - keys_to_remove = ['gt', 'gt_path'] - for key in keys_to_remove: - for pipeline in list(test_pipeline): - if 'key' in pipeline and key == pipeline['key']: - test_pipeline.remove(pipeline) - if 'keys' in pipeline and key in pipeline['keys']: - pipeline['keys'].remove(key) - if len(pipeline['keys']) == 0: - test_pipeline.remove(pipeline) - if 'meta_keys' in pipeline and key in pipeline['meta_keys']: - pipeline['meta_keys'].remove(key) - # build the data pipeline - test_pipeline = Compose(test_pipeline) - # prepare data - if ref: # Ref-SR - data = dict(img_path=img, ref_path=ref) - else: # SISR - data = dict(img_path=img) - _data = test_pipeline(data) - data = dict() - data['inputs'] = dict(img=(_data['inputs'] / 255.0)) - data = collate([data]) - if ref: - data['data_samples'] = [_data['data_samples']] - if 'cuda' in str(device): - data = scatter(data, [device])[0] - if ref: - data['data_samples'][0].img_lq.data = data['data_samples'][ - 0].img_lq.data.to(device) - data['data_samples'][0].ref_lq.data = data['data_samples'][ - 0].ref_lq.data.to(device) - data['data_samples'][0].ref_img.data = data['data_samples'][ - 0].ref_img.data.to(device) - # forward the model - with torch.no_grad(): - result = model(mode='tensor', **data) - result = result[0] - return result - - -try: - from facexlib.utils.face_restoration_helper import FaceRestoreHelper - has_facexlib = True -except ImportError: - has_facexlib = False - - -def restoration_face_inference(model, img, upscale_factor=1, face_size=1024): - """Inference image with the model. - - Args: - model (nn.Module): The loaded model. - img (str): File path of input image. - upscale_factor (int, optional): The number of times the input image - is upsampled. Default: 1. - face_size (int, optional): The size of the cropped and aligned faces. - Default: 1024. - - Returns: - Tensor: The predicted restoration result. - """ - device = next(model.parameters()).device # model device - - # build the data pipeline - if model.cfg.get('demo_pipeline', None): - test_pipeline = model.cfg.demo_pipeline - elif model.cfg.get('test_pipeline', None): - test_pipeline = model.cfg.test_pipeline - else: - test_pipeline = model.cfg.val_pipeline - - # remove gt from test_pipeline - keys_to_remove = ['gt', 'gt_path'] - for key in keys_to_remove: - for pipeline in list(test_pipeline): - if 'key' in pipeline and key == pipeline['key']: - test_pipeline.remove(pipeline) - if 'keys' in pipeline and key in pipeline['keys']: - pipeline['keys'].remove(key) - if len(pipeline['keys']) == 0: - test_pipeline.remove(pipeline) - if 'meta_keys' in pipeline and key in pipeline['meta_keys']: - pipeline['meta_keys'].remove(key) - # build the data pipeline - test_pipeline = Compose(test_pipeline) - - # face helper for detecting and aligning faces - assert has_facexlib, 'Please install FaceXLib to use the demo.' - face_helper = FaceRestoreHelper( - upscale_factor, - face_size=face_size, - crop_ratio=(1, 1), - det_model='retinaface_resnet50', - template_3points=True, - save_ext='png', - device=device) - - face_helper.read_image(img) - # get face landmarks for each face - face_helper.get_face_landmarks_5( - only_center_face=False, eye_dist_threshold=None) - # align and warp each face - face_helper.align_warp_face() - - for i, img in enumerate(face_helper.cropped_faces): - # prepare data - mmcv.imwrite(img, 'demo/tmp.png') - data = dict(lq=img.astype(np.float32), img_path='demo/tmp.png') - _data = test_pipeline(data) - data = dict() - data['inputs'] = _data['inputs'] / 255. - data = collate([data]) - if 'cuda' in str(device): - data = scatter(data, [device])[0] - - with torch.no_grad(): - output = model(mode='tensor', **data) - - output = output.squeeze(0).permute(1, 2, 0)[:, :, [2, 1, 0]] - output = output.cpu().numpy() * 255 # (0, 255) - face_helper.add_restored_face(output) - - face_helper.get_inverse_affine(None) - restored_img = face_helper.paste_faces_to_input_image(upsample_img=None) - - return restored_img - - def pad_sequence(data, window_size): """Pad frame sequence data. @@ -539,108 +108,6 @@ def pad_sequence(data, window_size): return data -def restoration_video_inference(model, - img_dir, - window_size, - start_idx, - filename_tmpl, - max_seq_len=None): - """Inference image with the model. - - Args: - model (nn.Module): The loaded model. - img_dir (str): Directory of the input video. - window_size (int): The window size used in sliding-window framework. - This value should be set according to the settings of the network. - A value smaller than 0 means using recurrent framework. - start_idx (int): The index corresponds to the first frame in the - sequence. - filename_tmpl (str): Template for file name. - max_seq_len (int | None): The maximum sequence length that the model - processes. If the sequence length is larger than this number, - the sequence is split into multiple segments. If it is None, - the entire sequence is processed at once. - - Returns: - Tensor: The predicted restoration result. - """ - - device = next(model.parameters()).device # model device - - # build the data pipeline - if model.cfg.get('demo_pipeline', None): - test_pipeline = model.cfg.demo_pipeline - elif model.cfg.get('test_pipeline', None): - test_pipeline = model.cfg.test_pipeline - else: - test_pipeline = model.cfg.val_pipeline - - # check if the input is a video - file_extension = osp.splitext(img_dir)[1] - if file_extension in VIDEO_EXTENSIONS: - video_reader = mmcv.VideoReader(img_dir) - # load the images - data = dict(img=[], img_path=None, key=img_dir) - for frame in video_reader: - data['img'].append(np.flip(frame, axis=2)) - - # remove the data loading pipeline - tmp_pipeline = [] - for pipeline in test_pipeline: - if pipeline['type'] not in [ - 'GenerateSegmentIndices', 'LoadImageFromFile' - ]: - tmp_pipeline.append(pipeline) - test_pipeline = tmp_pipeline - else: - # the first element in the pipeline must be 'GenerateSegmentIndices' - if test_pipeline[0]['type'] != 'GenerateSegmentIndices': - raise TypeError('The first element in the pipeline must be ' - f'"GenerateSegmentIndices", but got ' - f'"{test_pipeline[0]["type"]}".') - - # specify start_idx and filename_tmpl - test_pipeline[0]['start_idx'] = start_idx - test_pipeline[0]['filename_tmpl'] = filename_tmpl - - # prepare data - sequence_length = len(glob.glob(osp.join(img_dir, '*'))) - lq_folder = osp.dirname(img_dir) - key = osp.basename(img_dir) - data = dict( - img_path=lq_folder, - gt_path='', - key=key, - sequence_length=sequence_length) - - # compose the pipeline - test_pipeline = Compose(test_pipeline) - data = test_pipeline(data) - data = data['inputs'].unsqueeze(0) / 255.0 # in cpu - - # forward the model - with torch.no_grad(): - if window_size > 0: # sliding window framework - data = pad_sequence(data, window_size) - result = [] - for i in range(0, data.size(1) - 2 * (window_size // 2)): - data_i = data[:, i:i + window_size].to(device) - result.append(model(inputs=data_i, mode='tensor').cpu()) - result = torch.stack(result, dim=1) - else: # recurrent framework - if max_seq_len is None: - result = model(inputs=data.to(device), mode='tensor').cpu() - else: - result = [] - for i in range(0, data.size(1), max_seq_len): - result.append( - model( - inputs=data[:, i:i + max_seq_len].to(device), - mode='tensor').cpu()) - result = torch.cat(result, dim=1) - return result - - def read_image(filepath): """Read image from file. @@ -683,192 +150,6 @@ def read_frames(source, start_index, num_frames, from_video, end_index): return images -def video_interpolation_inference(model, - input_dir, - output_dir, - start_idx=0, - end_idx=None, - batch_size=4, - fps_multiplier=0, - fps=0, - filename_tmpl='{:08d}.png'): - """Inference image with the model. - - Args: - model (nn.Module): The loaded model. - input_dir (str): Directory of the input video. - output_dir (str): Directory of the output video. - start_idx (int): The index corresponding to the first frame in the - sequence. Default: 0 - end_idx (int | None): The index corresponding to the last interpolated - frame in the sequence. If it is None, interpolate to the last - frame of video or sequence. Default: None - batch_size (int): Batch size. Default: 4 - fps_multiplier (float): multiply the fps based on the input video. - Default: 0. - fps (float): frame rate of the output video. Default: 0. - filename_tmpl (str): template of the file names. Default: '{:08d}.png' - """ - - device = next(model.parameters()).device # model device - - # build the data pipeline - if model.cfg.get('demo_pipeline', None): - test_pipeline = model.cfg.demo_pipeline - elif model.cfg.get('test_pipeline', None): - test_pipeline = model.cfg.test_pipeline - else: - test_pipeline = model.cfg.val_pipeline - - # remove the data loading pipeline - tmp_pipeline = [] - for pipeline in test_pipeline: - if pipeline['type'] not in [ - 'GenerateSegmentIndices', 'LoadImageFromFile' - ]: - tmp_pipeline.append(pipeline) - test_pipeline = tmp_pipeline - - # compose the pipeline - test_pipeline = Compose(test_pipeline) - - # check if the input is a video - input_file_extension = os.path.splitext(input_dir)[1] - if input_file_extension in VIDEO_EXTENSIONS: - source = mmcv.VideoReader(input_dir) - input_fps = source.fps - length = source.frame_cnt - from_video = True - h, w = source.height, source.width - if fps_multiplier: - assert fps_multiplier > 0, '`fps_multiplier` cannot be negative' - output_fps = fps_multiplier * input_fps - else: - output_fps = fps if fps > 0 else input_fps * 2 - else: - files = os.listdir(input_dir) - files = [osp.join(input_dir, f) for f in files] - files.sort() - source = files - length = files.__len__() - from_video = False - example_frame = read_image(files[0]) - h, w = example_frame.shape[:2] - output_fps = fps - - # check if the output is a video - output_file_extension = os.path.splitext(output_dir)[1] - if output_file_extension in VIDEO_EXTENSIONS: - fourcc = cv2.VideoWriter_fourcc(*'mp4v') - target = cv2.VideoWriter(output_dir, fourcc, output_fps, (w, h)) - to_video = True - else: - to_video = False - - end_idx = min(end_idx, length) if end_idx is not None else length - - # calculate step args - step_size = model.step_frames * batch_size - lenth_per_step = model.required_frames + model.step_frames * ( - batch_size - 1) - repeat_frame = model.required_frames - model.step_frames - - prog_bar = ProgressBar( - math.ceil( - (end_idx + step_size - lenth_per_step - start_idx) / step_size)) - output_index = start_idx - for start_index in range(start_idx, end_idx, step_size): - images = read_frames( - source, start_index, lenth_per_step, from_video, end_index=end_idx) - - # data prepare - data = dict(img=images, inputs_path=None, key=input_dir) - data = test_pipeline(data)['inputs'] / 255.0 - data = collate([data]) - # data.shape: [1, t, c, h, w] - - # forward the model - data = model.split_frames(data) - input_tensors = data.clone().detach() - with torch.no_grad(): - output = model(data.to(device), mode='tensor') - if len(output.shape) == 4: - output = output.unsqueeze(1) - output_tensors = output.cpu() - if len(output_tensors.shape) == 4: - output_tensors = output_tensors.unsqueeze(1) - result = model.merge_frames(input_tensors, output_tensors) - if not start_idx == start_index: - result = result[repeat_frame:] - prog_bar.update() - - # save frames - if to_video: - for frame in result: - target.write(frame) - else: - for frame in result: - save_path = osp.join(output_dir, - filename_tmpl.format(output_index)) - mmcv.imwrite(frame, save_path) - output_index += 1 - - if start_index + lenth_per_step >= end_idx: - break - - print() - print(f'Output dir: {output_dir}') - if to_video: - target.release() - - -def colorization_inference(model, img): - """Inference image with the model. - - Args: - model (nn.Module): The loaded model. - img (str): Image file path. - - Returns: - Tensor: The predicted colorization result. - """ - device = next(model.parameters()).device - - # build the data pipeline - test_pipeline = Compose(model.cfg.test_pipeline) - # prepare data - data = dict(img_path=img) - _data = test_pipeline(data) - data = dict() - data['inputs'] = _data['inputs'] / 255.0 - data = collate([data]) - data['data_samples'] = [_data['data_samples']] - if 'cuda' in str(device): - data = scatter(data, [device])[0] - if not data['data_samples'][0].empty_box: - data['data_samples'][0].cropped_img.data = scatter( - data['data_samples'][0].cropped_img.data, [device])[0] / 255.0 - - data['data_samples'][0].box_info.data = scatter( - data['data_samples'][0].box_info.data, [device])[0] - - data['data_samples'][0].box_info_2x.data = scatter( - data['data_samples'][0].box_info_2x.data, [device])[0] - - data['data_samples'][0].box_info_4x.data = scatter( - data['data_samples'][0].box_info_4x.data, [device])[0] - - data['data_samples'][0].box_info_8x.data = scatter( - data['data_samples'][0].box_info_8x.data, [device])[0] - data['data_samples'] = DataSample.stack(data['data_samples']) - - # forward the model - with torch.no_grad(): - result = model(mode='tensor', **data) - - return result - - def calculate_grid_size(num_batches: int = 1, aspect_ratio: int = 1) -> int: """Calculate the number of images per row (nrow) to make the grid closer to square when formatting a batch of images to grid. diff --git a/tests/test_apis/test_inferencers/test_inference_functions.py b/tests/test_apis/test_inferencers/test_inference_functions.py index 78d7b668b6..a8a493b57e 100644 --- a/tests/test_apis/test_inferencers/test_inference_functions.py +++ b/tests/test_apis/test_inferencers/test_inference_functions.py @@ -1,23 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. -import os.path as osp -import platform -import unittest - import pytest -import torch -from mmengine import Config -from mmengine.runner import load_checkpoint - -from mmagic.apis import (calculate_grid_size, colorization_inference, - init_model, inpainting_inference, matting_inference, - restoration_face_inference, restoration_inference, - restoration_video_inference, sample_conditional_model, - sample_img2img_model, sample_unconditional_model, - set_random_seed, video_interpolation_inference) -from mmagic.registry import MODELS -from mmagic.utils import register_all_modules, tensor2img -register_all_modules() +from mmagic.apis.inferencers.inference_functions import (calculate_grid_size, + init_model, + set_random_seed) def test_init_model(): @@ -27,283 +13,6 @@ def test_init_model(): init_model(['dog']) -@pytest.mark.skipif( - 'win' in platform.system().lower() and 'cu' in torch.__version__, - reason='skip on windows-cuda due to limited RAM.') -def test_colorization_inference(): - register_all_modules() - - if not torch.cuda.is_available(): - # RoI pooling only support in GPU - return unittest.skip('test requires GPU and torch+cuda') - - if torch.cuda.is_available(): - device = torch.device('cuda', 0) - else: - device = torch.device('cpu') - - config = osp.join( - osp.dirname(__file__), - '../../..', - 'configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py' # noqa - ) - checkpoint = None - - cfg = Config.fromfile(config) - model = MODELS.build(cfg.model) - - if checkpoint is not None: - checkpoint = load_checkpoint(model, checkpoint) - - model.cfg = cfg - model.to(device) - model.eval() - - img_path = osp.join( - osp.dirname(__file__), '..', '..', - 'data/image/img_root/horse/horse.jpeg') - - result = colorization_inference(model, img_path) - assert tensor2img(result)[..., ::-1].shape == (256, 256, 3) - - -def test_unconditional_inference(): - cfg = osp.join( - osp.dirname(__file__), '..', '..', '..', 'configs', 'dcgan', - 'dcgan_Glr4e-4_Dlr1e-4_1xb128-5kiters_mnist-64x64.py') - cfg = Config.fromfile(cfg) - model = MODELS.build(cfg.model) - model.eval() - - # test num_samples can be divided by num_batches - results = sample_unconditional_model( - model, num_samples=4, sample_model='orig') - assert results.shape == (4, 1, 64, 64) - - # test num_samples can not be divided by num_batches - results = sample_unconditional_model( - model, num_samples=4, num_batches=3, sample_model='orig') - assert results.shape == (4, 1, 64, 64) - - -def test_conditional_inference(): - cfg = osp.join( - osp.dirname(__file__), '..', '..', '..', 'configs', 'sngan_proj', - 'sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py') - cfg = Config.fromfile(cfg) - model = MODELS.build(cfg.model) - model.eval() - - # test label is int - results = sample_conditional_model( - model, label=1, num_samples=4, sample_model='orig') - assert results.shape == (4, 3, 32, 32) - # test label is tensor - results = sample_conditional_model( - model, - label=torch.FloatTensor([1.]), - num_samples=4, - sample_model='orig') - assert results.shape == (4, 3, 32, 32) - - # test label is multi tensor - results = sample_conditional_model( - model, - label=torch.FloatTensor([1., 2., 3., 4.]), - num_samples=4, - sample_model='orig') - assert results.shape == (4, 3, 32, 32) - - # test label is list of int - results = sample_conditional_model( - model, label=[1, 2, 3, 4], num_samples=4, sample_model='orig') - assert results.shape == (4, 3, 32, 32) - - # test label is None - results = sample_conditional_model( - model, num_samples=4, sample_model='orig') - assert results.shape == (4, 3, 32, 32) - - # test label is invalid - with pytest.raises(TypeError): - results = sample_conditional_model( - model, label='1', num_samples=4, sample_model='orig') - - # test length of label is not same as num_samples - with pytest.raises(ValueError): - results = sample_conditional_model( - model, label=[1, 2], num_samples=4, sample_model='orig') - - # test num_samples can not be divided by num_batches - results = sample_conditional_model( - model, num_samples=3, num_batches=2, sample_model='orig') - assert results.shape == (3, 3, 32, 32) - - -def test_inference(): - if torch.cuda.is_available(): - device = torch.device('cuda', 0) - else: - device = torch.device('cpu') - - data_root = osp.join(osp.dirname(__file__), '../../../') - config = data_root + 'configs/dim/dim_stage3-v16-pln_1xb1-1000k_comp1k.py' - checkpoint = 'https://download.openmmlab.com/mmediting/mattors/dim/dim_' +\ - 'stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth' - - img_path = data_root + 'tests/data/matting_dataset/merged/GT05.jpg' - trimap_path = data_root + 'tests/data/matting_dataset/trimap/GT05.png' - - model = init_model(config, checkpoint, device=device) - - pred_alpha = matting_inference(model, img_path, trimap_path) - assert pred_alpha.shape == (552, 800) - - -def test_inpainting_inference(): - register_all_modules() - - if torch.cuda.is_available(): - device = torch.device('cuda', 0) - else: - device = torch.device('cpu') - - checkpoint = None - - data_root = osp.join(osp.dirname(__file__), '../../') - config_file = osp.join(data_root, 'configs', 'gl_test.py') - - cfg = Config.fromfile(config_file) - model = MODELS.build(cfg.model_inference) - - if checkpoint is not None: - checkpoint = load_checkpoint(model, checkpoint) - - model.cfg = cfg - model.to(device) - model.eval() - - masked_img_path = data_root + 'data/inpainting/celeba_test.png' - mask_path = data_root + 'data/inpainting/bbox_mask.png' - - result = inpainting_inference(model, masked_img_path, mask_path) - assert result.detach().cpu().numpy().shape == (3, 256, 256) - - -@pytest.mark.skipif( - 'win' in platform.system().lower() and 'cu' in torch.__version__, - reason='skip on windows-cuda due to limited RAM.') -def test_restoration_face_inference(): - if torch.cuda.is_available(): - device = torch.device('cuda', 0) - else: - device = torch.device('cpu') - - data_root = osp.join(osp.dirname(__file__), '../../../') - config = data_root + 'configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py' # noqa - - checkpoint = None - - img_path = data_root + 'tests/data/image/face/000001.png' - - model = init_model(config, checkpoint, device=device) - - output = restoration_face_inference(model, img_path, 1, 1024) - assert output.shape == (256, 256, 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_restoration_inference(): - if torch.cuda.is_available(): - device = torch.device('cuda', 0) - else: - device = torch.device('cpu') - - data_root = osp.join(osp.dirname(__file__), '../../../') - config = data_root + 'configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py' # noqa - checkpoint = None - - img_path = data_root + 'tests/data/image/lq/baboon_x4.png' - - model = init_model(config, checkpoint, device=device) - - output = restoration_inference(model, img_path) - assert output.detach().cpu().numpy().shape == (3, 480, 500) - - -def test_restoration_video_inference(): - if torch.cuda.is_available(): - device = torch.device('cuda', 0) - else: - device = torch.device('cpu') - - data_root = osp.join(osp.dirname(__file__), '../../../') - config = osp.join(data_root, 'configs/basicvsr/basicvsr_2xb4_reds4.py') - checkpoint = None - - input_dir = osp.join(data_root, 'tests/data/frames/sequence/gt/sequence_1') - - model = init_model(config, checkpoint, device=device) - - output = restoration_video_inference(model, input_dir, 0, 0, '{:08d}.png', - None) - assert output.detach().numpy().shape == (1, 2, 3, 256, 448) - - input_video = data_root + 'tests/data/frames/test_inference.mp4' - output = restoration_video_inference( - model, input_video, 0, 0, '{:08d}.png', max_seq_len=3) - - output = restoration_video_inference(model, input_video, 3, 0, - '{:08d}.png') - - -def test_translation_inference(): - cfg = osp.join( - osp.dirname(__file__), '..', '..', '..', 'configs', 'pix2pix', - 'pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py') - cfg = Config.fromfile(cfg) - model = init_model(cfg, device='cpu') - model.eval() - data_path = osp.join( - osp.dirname(__file__), '..', '..', 'data', 'unpaired', 'trainA', - '1.jpg') - # test num_samples can be divided by num_batches - results = sample_img2img_model( - model, image_path=data_path, target_domain='photo') - print(results.shape) - assert results.shape == (1, 3, 256, 256) - - # test target domain is None - results = sample_img2img_model(model, image_path=data_path) - assert results.shape == (1, 3, 256, 256) - - -def test_video_interpolation_inference(): - if torch.cuda.is_available(): - device = torch.device('cuda', 0) - else: - device = torch.device('cpu') - - data_root = osp.join(osp.dirname(__file__), '../../../') - config = data_root + 'configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py' - checkpoint = None - - model = init_model(config, checkpoint, device=device) - - input_dir = data_root + 'tests/data/frames/test_inference.mp4' - video_interpolation_inference( - model=model, - input_dir=input_dir, - output_dir='out/result_video.mp4', - fps=60.0) - - input_dir = osp.join(data_root, 'tests/data/frames/sequence/gt/sequence_1') - video_interpolation_inference( - model=model, input_dir=input_dir, output_dir='out', fps=60.0) - - def test_calculate_grid_size(): inp_batch_size = (10, 13, 20, 1, 4) target_nrow = (4, 4, 5, 1, 2) From babe8ff68c146c556ebdb1567e7c916e20871b55 Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Mon, 24 Apr 2023 20:39:33 +0800 Subject: [PATCH 36/42] [Enhancement] miscs for renaming MMagic (#1798) * fix lines * revise community * revise get_started * rename packinputs * revise migration * revise user_guides * revise all * rename tests --- README.md | 4 +- README_zh-CN.md | 5 +- .../_base_/datasets/basicvsr_test_config.py | 8 +-- configs/_base_/datasets/cifar10_noaug.py | 2 +- configs/_base_/datasets/cifar10_nopad.py | 4 +- .../deblurring-defocus_test_config.py | 2 +- .../datasets/deblurring-motion_test_config.py | 2 +- .../datasets/decompression_test_config.py | 2 +- .../denoising-gaussian_color_test_config.py | 2 +- .../denoising-gaussian_gray_test_config.py | 2 +- .../datasets/denoising-real_test_config.py | 2 +- .../_base_/datasets/deraining_test_config.py | 2 +- configs/_base_/datasets/ffhq_flip.py | 4 +- .../grow_scale_imgs_ffhq_styleganv1.py | 2 +- configs/_base_/datasets/imagenet_128.py | 4 +- configs/_base_/datasets/imagenet_256.py | 4 +- configs/_base_/datasets/imagenet_512.py | 4 +- configs/_base_/datasets/imagenet_64.py | 4 +- configs/_base_/datasets/imagenet_noaug_128.py | 4 +- configs/_base_/datasets/liif_test_config.py | 2 +- configs/_base_/datasets/lsun_stylegan.py | 4 +- .../datasets/paired_imgs_256x256_crop.py | 4 +- .../_base_/datasets/sisr_x2_test_config.py | 2 +- .../_base_/datasets/sisr_x3_test_config.py | 2 +- .../_base_/datasets/sisr_x4_test_config.py | 2 +- configs/_base_/datasets/tdan_test_config.py | 4 +- .../datasets/unconditional_imgs_128x128.py | 2 +- .../datasets/unconditional_imgs_64x64.py | 2 +- .../unconditional_imgs_flip_512x512.py | 2 +- ...tional_imgs_flip_lanczos_resize_256x256.py | 2 +- .../_base_/datasets/unpaired_imgs_256x256.py | 4 +- configs/_base_/models/base_edvr.py | 6 +- configs/_base_/models/base_glean.py | 1 - configs/_base_/models/base_liif.py | 6 +- configs/_base_/models/base_tof.py | 5 +- .../aot-gan_smpgan_4xb4_places-512x512.py | 4 +- configs/basicvsr/basicvsr_2xb4_reds4.py | 6 +- configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py | 6 +- ...pp_c128n25_600k_ntire-decompress-track1.py | 4 +- .../basicvsr-pp_c128n25_600k_ntire-vsr.py | 4 +- .../cain/cain_g1b32_1xb5_vimeo90k-triplet.py | 7 +- configs/controlnet/controlnet-1xb1-fill50k.py | 2 +- ...-resnet-in_1xb1-250kiters_summer2winter.py | 2 +- ...d0-resnet-in_1xb1-270kiters_horse2zebra.py | 2 +- ...gan-id0-resnet-in_1xb1-80kiters_facades.py | 2 +- ...-resnet-in_1xb1-250kiters_summer2winter.py | 2 +- ...an-resnet-in_1xb1-270kiters_horse2zebra.py | 2 +- ...n_lsgan-resnet-in_1xb1-80kiters_facades.py | 2 +- ...4e-4_Dlr1e-4_1xb128-5kiters_mnist-64x64.py | 2 +- .../deepfillv1_4xb4_celeba-256x256.py | 2 +- .../deepfillv1_8xb2_places-256x256.py | 2 +- .../deepfillv2_8xb2_celeba-256x256.py | 2 +- .../deepfillv2_8xb2_places-256x256.py | 2 +- .../dic/dic_x8c48b6_4xb2-150k_celeba-hq.py | 6 +- .../dim/dim_stage1-v16_1xb1-1000k_comp1k.py | 4 +- ...age1-v16_1xb1-1000k_comp1k_online-merge.py | 2 +- .../dreambooth-finetune_text_encoder.py | 2 +- configs/dreambooth/dreambooth-lora.py | 2 +- configs/dreambooth/dreambooth.py | 2 +- .../edsr/edsr_x2c64b16_1xb16-300k_div2k.py | 4 +- .../edsr/edsr_x3c64b16_1xb16-300k_div2k.py | 5 +- .../edsr/edsr_x4c64b16_1xb16-300k_div2k.py | 4 +- .../eg3d_cvt-official-rgb_afhq-512x512.py | 2 +- .../eg3d_cvt-official-rgb_ffhq-512x512.py | 2 +- .../eg3d_cvt-official-rgb_shapenet-128x128.py | 2 +- ...rgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py | 4 +- .../flavr_in4out1_8xb4_vimeo90k-septuplet.py | 7 +- configs/gca/baseline_r34_4xb10-200k_comp1k.py | 4 +- .../baseline_r34_4xb10-dimaug-200k_comp1k.py | 4 +- configs/gca/gca_r34_4xb10-200k_comp1k.py | 4 +- .../gca/gca_r34_4xb10-dimaug-200k_comp1k.py | 4 +- ...n_in128out1024_4xb2-300k_ffhq-celeba-hq.py | 6 +- configs/glean/glean_x16_2xb8_cat.py | 4 +- configs/glean/glean_x16_2xb8_ffhq.py | 4 +- configs/glean/glean_x8_2xb8_cat.py | 6 +- .../global_local/gl_8xb12_celeba-256x256.py | 2 +- .../global_local/gl_8xb12_places-256x256.py | 2 +- .../indexnet_mobv2-dimaug_1xb16-78k_comp1k.py | 4 +- .../indexnet_mobv2_1xb16-78k_comp1k.py | 4 +- configs/inst_colorization/README_zh-CN.md | 2 +- ...zatioon_full_official_cocostuff-256x256.py | 2 +- ...eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py | 4 +- ...4eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py | 4 +- .../pconv_stage1_8xb12_places-256x256.py | 2 +- .../pconv_stage1_8xb1_celeba-256x256.py | 2 +- .../pconv_stage2_4xb2_celeba-256x256.py | 2 +- .../pconv_stage2_4xb2_places-256x256.py | 2 +- .../pggan_8xb4-12Mimg_celeba-hq-1024x1024.py | 2 +- ...gan_8xb4-12Mimgs_celeba-cropped-128x128.py | 4 +- ...illa-unet-bn_1xb1-220kiters_aerial2maps.py | 2 +- ...illa-unet-bn_1xb1-220kiters_maps2aerial.py | 2 +- ...x_vanilla-unet-bn_1xb1-80kiters_facades.py | 2 +- ...-jitter-flip-1xb4-190kiters_edges2shoes.py | 2 +- ...onfig-c_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-d_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-e_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...nfig-f_c1_8xb2-1600kiters_ffhq-256-1024.py | 2 +- ...onfig-f_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-f_c2_8xb3-1100kiters_ffhq-256-896.py | 2 +- ...onfig-g_c1_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-h_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-i_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-j_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- ...onfig-k_c2_8xb3-1100kiters_ffhq-256-512.py | 2 +- configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py | 4 +- configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py | 4 +- configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py | 4 +- ...gan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py | 8 +-- ...t_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py | 4 +- .../restormer/restormer_official_dpdd-dual.py | 4 +- configs/singan/singan_balloons.py | 2 +- configs/singan/singan_fish.py | 2 +- .../srcnn/srcnn_x4k915_1xb16-1000k_div2k.py | 4 +- .../msrresnet_x4c64b16_1xb16-1000k_div2k.py | 4 +- .../stylegan2_c2_8xb4_lsun-car-384x512.py | 2 +- ...x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py | 2 +- ...6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py | 4 +- ...d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py | 4 +- ...d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py | 4 +- ...8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py | 4 +- ...ir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py | 4 +- ...ir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py | 4 +- ...ir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py | 4 +- .../tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py | 6 +- configs/tof/tof_x4_official_vimeo90k.py | 4 +- .../ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py | 6 +- docs/en/community/contributing.md | 15 ++-- docs/en/community/projects.md | 2 +- docs/en/get_started/install.md | 23 ++++++- docs/en/get_started/overview.md | 50 ++++---------- docs/en/howto/dataset.md | 6 +- docs/en/howto/models.md | 4 +- docs/en/howto/transforms.md | 14 ++-- docs/en/index.rst | 22 +++--- docs/en/migration/amp.md | 4 +- docs/en/migration/eval_test.md | 4 +- docs/en/migration/optimizers.md | 9 ++- docs/en/user_guides/config.md | 29 ++++---- docs/en/user_guides/dataset_prepare.md | 2 +- docs/en/user_guides/train_test.md | 2 +- docs/en/user_guides/visualization.md | 4 +- docs/zh_cn/community/contributing.md | 12 ++-- docs/zh_cn/get_started/overview.md | 68 ++++++------------- docs/zh_cn/user_guides/dataset_prepare.md | 2 +- .../apis/inferencers/inpainting_inferencer.py | 2 +- mmagic/datasets/transforms/__init__.py | 18 ++--- mmagic/datasets/transforms/formatting.py | 8 +-- mmagic/models/base_models/base_mattor.py | 4 +- projects/README.md | 2 +- projects/example_project/README.md | 6 +- .../glide_ddim-classifier-free_laion-64x64.py | 3 +- setup.py | 3 +- tests/configs/gl_test.py | 2 +- .../test_basic_conditional_dataset.py | 4 +- .../test_paired_image_dataset.py | 2 +- tests/test_datasets/test_singan_dataset.py | 2 +- .../test_transforms/test_formatting.py | 10 +-- .../test_unpaired_image_dataset.py | 2 +- .../test_metrics/test_equivariance.py | 4 +- .../test_evaluation/test_metrics/test_fid.py | 2 +- .../test_metrics/test_inception_score.py | 2 +- .../test_evaluation/test_metrics/test_ppl.py | 4 +- .../test_metrics/test_precision_and_recall.py | 4 +- tests/test_mmagic.py | 10 +-- .../test_base_models/test_base_mattor.py | 6 +- ...processor.py => test_data_preprocessor.py} | 0 .../test_editors/test_dim/test_dim.py | 4 +- .../test_editors/test_gca/test_gca.py | 4 +- .../test_indexnet/test_indexnet.py | 6 +- ...dit_data_sample.py => test_data_sample.py} | 10 +-- .../unconditional_gans/README.md | 4 +- 171 files changed, 387 insertions(+), 421 deletions(-) rename tests/test_models/test_data_preprocessors/{test_edit_data_preprocessor.py => test_data_preprocessor.py} (100%) rename tests/test_structures/{test_edit_data_sample.py => test_data_sample.py} (97%) diff --git a/README.md b/README.md index 87c7f4322e..e5042eada5 100644 --- a/README.md +++ b/README.md @@ -189,9 +189,11 @@ python -c "import mmagic; print(mmagic.__version__)" ``` **Getting Started** + Please see [quick run](docs/en/get_started/quick_run.md) and [inference](docs/en/user_guides/inference.md) for the basic usage of MMagic. **Install MMagic from source** + You can also experiment on the latest developed version rather than the stable release by installing MMagic from source with the following commands: ```shell @@ -395,7 +397,7 @@ If MMagic is helpful to your research, please cite it as below. ```bibtex @misc{mmagic2023, - title = {{MMagic}: {OpenMMLab} Image and Video Editing Toolbox}, + title = {{MMagic}: {OpenMMLab} Multimodal Advanced, Generative, and Intelligent Creation Toolbox}, author = {{MMagic Contributors}}, howpublished = {\url{https://github.com/open-mmlab/mmagic}}, year = {2023} diff --git a/README_zh-CN.md b/README_zh-CN.md index f334df89e1..5bf5a04d39 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -102,7 +102,7 @@ - 支持本地可视化以及使用 tensorboard 或 wandb的可视化. - 支持 33+ 算法 Pytorch 2.0 加速. -**MMagic** 已经支持了[MMEditing](https://github.com/open-mmlab/mmediting) and [MMGeneration](https://github.com/open-mmlab/mmgeneration)和[MMGeneration](https://github.com/open-mmlab/mmgeneration)中的全量任务、模型、优化函数和评价指标 ,并基于[MMEngine](https://github.com/open-mmlab/mmengine)统一了各组件接口 😍。 +**MMagic** 已经支持了[MMEditing](https://github.com/open-mmlab/mmediting)和[MMGeneration](https://github.com/open-mmlab/mmgeneration)中的全量任务、模型、优化函数和评价指标 ,并基于[MMEngine](https://github.com/open-mmlab/mmengine)统一了各组件接口 😍。 如果想了解更多版本更新细节和历史信息,请阅读[更新日志](docs/zh_cn/changelog.md)。如果想从[旧版本](https://github.com/open-mmlab/mmagic/tree/master) MMEditing 0.x 迁移到新版本 MMagic 1.x,请阅读[迁移文档](docs/zh_cn/migration/overview.md)。 @@ -190,6 +190,7 @@ python -c "import mmagic; print(mmagic.__version__)" 请参考[快速运行](docs/zh_cn/get_started/quick_run.md)和[推理演示](docs/zh_cn/user_guides/inference.md)获取 MMagic 的基本用法。 **从源码安装 MMagic** + 使用以下命令从源码安装 MMagic,你可以选择不使用已发布的稳定版本,而在最新开发的版本上进行实验。 ``` @@ -391,7 +392,7 @@ MMagic 是一款由不同学校和公司共同贡献的开源项目。我们感 ```bibtex @misc{mmagic2023, - title = {{MMagic}: {OpenMMLab} Image and Video Editing Toolbox}, + title = {{MMagic}: {OpenMMLab} Multimodal Advanced, Generative, and Intelligent Creation Toolbox}, author = {{MMagic Contributors}}, howpublished = {\url{https://github.com/open-mmlab/mmagic}}, year = {2023} diff --git a/configs/_base_/datasets/basicvsr_test_config.py b/configs/_base_/datasets/basicvsr_test_config.py index 7f16b094a3..6cee01120d 100644 --- a/configs/_base_/datasets/basicvsr_test_config.py +++ b/configs/_base_/datasets/basicvsr_test_config.py @@ -5,7 +5,7 @@ dict(type='GenerateSegmentIndices', interval_list=[1]), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] reds_dataloader = dict( @@ -39,7 +39,7 @@ dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), dict(type='MirrorSequence', keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] vimeo_90k_bd_dataloader = dict( @@ -96,7 +96,7 @@ filename_tmpl='{:04d}.png'), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] udm10_dataloader = dict( @@ -123,7 +123,7 @@ dict(type='GenerateSegmentIndices', interval_list=[1]), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] vid4_bd_dataloader = dict( num_workers=1, diff --git a/configs/_base_/datasets/cifar10_noaug.py b/configs/_base_/datasets/cifar10_noaug.py index c135542120..32b0c14d4d 100644 --- a/configs/_base_/datasets/cifar10_noaug.py +++ b/configs/_base_/datasets/cifar10_noaug.py @@ -1,4 +1,4 @@ -cifar_pipeline = [dict(type='PackEditInputs')] +cifar_pipeline = [dict(type='PackInputs')] cifar_dataset = dict( type='CIFAR10', data_root='./data', diff --git a/configs/_base_/datasets/cifar10_nopad.py b/configs/_base_/datasets/cifar10_nopad.py index 60ccf227fe..201de10214 100644 --- a/configs/_base_/datasets/cifar10_nopad.py +++ b/configs/_base_/datasets/cifar10_nopad.py @@ -1,6 +1,6 @@ cifar_pipeline = [ dict(type='Flip', keys=['gt'], flip_ratio=0.5, direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] cifar_dataset = dict( type='CIFAR10', @@ -10,7 +10,7 @@ pipeline=cifar_pipeline) # test dataset do not use flip -cifar_pipeline_test = [dict(type='PackEditInputs')] +cifar_pipeline_test = [dict(type='PackInputs')] cifar_dataset_test = dict( type='CIFAR10', data_root='./data', diff --git a/configs/_base_/datasets/deblurring-defocus_test_config.py b/configs/_base_/datasets/deblurring-defocus_test_config.py index 360f10b8fa..a64326ade5 100644 --- a/configs/_base_/datasets/deblurring-defocus_test_config.py +++ b/configs/_base_/datasets/deblurring-defocus_test_config.py @@ -23,7 +23,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] dpdd_data_root = 'data/DPDD' diff --git a/configs/_base_/datasets/deblurring-motion_test_config.py b/configs/_base_/datasets/deblurring-motion_test_config.py index a863d70df4..87bf1d8341 100644 --- a/configs/_base_/datasets/deblurring-motion_test_config.py +++ b/configs/_base_/datasets/deblurring-motion_test_config.py @@ -11,7 +11,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] gopro_data_root = 'data/GoPro' diff --git a/configs/_base_/datasets/decompression_test_config.py b/configs/_base_/datasets/decompression_test_config.py index 044b3f3e65..84a38db591 100644 --- a/configs/_base_/datasets/decompression_test_config.py +++ b/configs/_base_/datasets/decompression_test_config.py @@ -17,7 +17,7 @@ params=dict(quality=[quality, quality]), bgr2rgb=True, keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] classic5_data_root = 'data/Classic5' diff --git a/configs/_base_/datasets/denoising-gaussian_color_test_config.py b/configs/_base_/datasets/denoising-gaussian_color_test_config.py index 7950bebf35..4c4b81565d 100644 --- a/configs/_base_/datasets/denoising-gaussian_color_test_config.py +++ b/configs/_base_/datasets/denoising-gaussian_color_test_config.py @@ -20,7 +20,7 @@ gaussian_sigma=[sigma, sigma], gaussian_gray_noise_prob=0), keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] data_root = 'data/denoising_gaussian_test' diff --git a/configs/_base_/datasets/denoising-gaussian_gray_test_config.py b/configs/_base_/datasets/denoising-gaussian_gray_test_config.py index 774869fd07..ec12a18b20 100644 --- a/configs/_base_/datasets/denoising-gaussian_gray_test_config.py +++ b/configs/_base_/datasets/denoising-gaussian_gray_test_config.py @@ -22,7 +22,7 @@ gaussian_sigma=[sigma, sigma], gaussian_gray_noise_prob=1), keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] data_root = 'data/denoising_gaussian_test' diff --git a/configs/_base_/datasets/denoising-real_test_config.py b/configs/_base_/datasets/denoising-real_test_config.py index 88a069f850..d65520b10a 100644 --- a/configs/_base_/datasets/denoising-real_test_config.py +++ b/configs/_base_/datasets/denoising-real_test_config.py @@ -11,7 +11,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] sidd_data_root = 'data/SIDD' diff --git a/configs/_base_/datasets/deraining_test_config.py b/configs/_base_/datasets/deraining_test_config.py index 2e633f08b9..d4de0fc8e7 100644 --- a/configs/_base_/datasets/deraining_test_config.py +++ b/configs/_base_/datasets/deraining_test_config.py @@ -11,7 +11,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] rain100h_data_root = 'data/Rain100H' diff --git a/configs/_base_/datasets/ffhq_flip.py b/configs/_base_/datasets/ffhq_flip.py index f707bdf594..1c9cc9833a 100644 --- a/configs/_base_/datasets/ffhq_flip.py +++ b/configs/_base_/datasets/ffhq_flip.py @@ -3,12 +3,12 @@ train_pipeline = [ dict(type='LoadImageFromFile', key='gt'), dict(type='Flip', keys=['gt'], direction='horizontal'), - dict(type='PackEditInputs', keys='gt') + dict(type='PackInputs', keys='gt') ] val_pipeline = [ dict(type='LoadImageFromFile', key='gt'), - dict(type='PackEditInputs', keys=['gt']) + dict(type='PackInputs', keys=['gt']) ] # `batch_size` and `data_root` need to be set. diff --git a/configs/_base_/datasets/grow_scale_imgs_ffhq_styleganv1.py b/configs/_base_/datasets/grow_scale_imgs_ffhq_styleganv1.py index 4f24b49622..799e89254a 100644 --- a/configs/_base_/datasets/grow_scale_imgs_ffhq_styleganv1.py +++ b/configs/_base_/datasets/grow_scale_imgs_ffhq_styleganv1.py @@ -3,7 +3,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='gt'), dict(type='Flip', keys='gt', direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] train_dataloader = dict( diff --git a/configs/_base_/datasets/imagenet_128.py b/configs/_base_/datasets/imagenet_128.py index d18558bb83..b7ca35db3f 100644 --- a/configs/_base_/datasets/imagenet_128.py +++ b/configs/_base_/datasets/imagenet_128.py @@ -8,14 +8,14 @@ dict(type='RandomCropLongEdge', keys='gt'), dict(type='Resize', scale=(128, 128), keys='gt', backend='pillow'), dict(type='Flip', keys='gt', flip_ratio=0.5, direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ dict(type='LoadImageFromFile', key='gt'), dict(type='CenterCropLongEdge', keys='gt'), dict(type='Resize', scale=(128, 128), keys='gt', backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] train_dataloader = dict( diff --git a/configs/_base_/datasets/imagenet_256.py b/configs/_base_/datasets/imagenet_256.py index e0e15cd319..efb3808fce 100644 --- a/configs/_base_/datasets/imagenet_256.py +++ b/configs/_base_/datasets/imagenet_256.py @@ -8,14 +8,14 @@ dict(type='RandomCropLongEdge', keys=['img']), dict(type='Resize', scale=(256, 256), keys=['img'], backend='pillow'), dict(type='Flip', keys=['img'], flip_ratio=0.5, direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='CenterCropLongEdge', keys=['img']), dict(type='Resize', scale=(256, 256), backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] train_dataloader = dict( diff --git a/configs/_base_/datasets/imagenet_512.py b/configs/_base_/datasets/imagenet_512.py index 9c9a938b63..605a896d9c 100644 --- a/configs/_base_/datasets/imagenet_512.py +++ b/configs/_base_/datasets/imagenet_512.py @@ -8,14 +8,14 @@ dict(type='RandomCropLongEdge', keys='gt'), dict(type='Resize', scale=(512, 512), keys='gt', backend='pillow'), dict(type='Flip', keys='gt', flip_ratio=0.5, direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ dict(type='LoadImageFromFile', key='gt'), dict(type='CenterCropLongEdge', keys='gt'), dict(type='Resize', scale=(512, 512), keys='gt', backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] train_dataloader = dict( diff --git a/configs/_base_/datasets/imagenet_64.py b/configs/_base_/datasets/imagenet_64.py index 7acd86fd46..4ef0413aba 100644 --- a/configs/_base_/datasets/imagenet_64.py +++ b/configs/_base_/datasets/imagenet_64.py @@ -8,14 +8,14 @@ dict(type='RandomCropLongEdge', keys='gt'), dict(type='Resize', scale=(64, 64), keys='gt', backend='pillow'), dict(type='Flip', keys='gt', flip_ratio=0.5, direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ dict(type='LoadImageFromFile', key='gt'), dict(type='CenterCropLongEdge', keys='gt'), dict(type='Resize', scale=(64, 64), keys='gt', backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] train_dataloader = dict( diff --git a/configs/_base_/datasets/imagenet_noaug_128.py b/configs/_base_/datasets/imagenet_noaug_128.py index 8bc51071f0..bbb0b2d061 100644 --- a/configs/_base_/datasets/imagenet_noaug_128.py +++ b/configs/_base_/datasets/imagenet_noaug_128.py @@ -9,14 +9,14 @@ dict(type='LoadImageFromFile', key='img'), dict(type='CenterCropLongEdge'), dict(type='Resize', scale=(128, 128), backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='CenterCropLongEdge'), dict(type='Resize', scale=(128, 128), backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] train_dataloader = dict( diff --git a/configs/_base_/datasets/liif_test_config.py b/configs/_base_/datasets/liif_test_config.py index de8e1845a4..ef86bb6162 100644 --- a/configs/_base_/datasets/liif_test_config.py +++ b/configs/_base_/datasets/liif_test_config.py @@ -10,7 +10,7 @@ dict( type='RandomDownSampling', scale_min=scale_test, scale_max=scale_test), dict(type='GenerateCoordinateAndCell', scale=scale_test, reshape_gt=False), - dict(type='PackEditInputs') + dict(type='PackInputs') ] for scale_test in scale_test_list] # test config for Set5 diff --git a/configs/_base_/datasets/lsun_stylegan.py b/configs/_base_/datasets/lsun_stylegan.py index c6cc76b78d..d5efcfc5a3 100644 --- a/configs/_base_/datasets/lsun_stylegan.py +++ b/configs/_base_/datasets/lsun_stylegan.py @@ -2,12 +2,12 @@ train_pipeline = [ dict(type='LoadImageFromFile', key='gt'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ dict(type='LoadImageFromFile', key='gt'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # `batch_size` and `data_root` need to be set. diff --git a/configs/_base_/datasets/paired_imgs_256x256_crop.py b/configs/_base_/datasets/paired_imgs_256x256_crop.py index 261f3f8728..c2f7444189 100644 --- a/configs/_base_/datasets/paired_imgs_256x256_crop.py +++ b/configs/_base_/datasets/paired_imgs_256x256_crop.py @@ -28,7 +28,7 @@ # f'img_{domain_b}': f'img_{domain_b}' # }), # dict( - # type='PackEditInputs', + # type='PackInputs', # keys=[f'img_{domain_a}', f'img_{domain_b}'], # data_keys=[f'img_{domain_a}', f'img_{domain_b}']) ] @@ -64,7 +64,7 @@ # f'img_{domain_b}': f'img_{domain_b}' # }), # dict( - # type='PackEditInputs', + # type='PackInputs', # keys=[f'img_{domain_a}', f'img_{domain_b}'], # data_keys=[f'img_{domain_a}', f'img_{domain_b}']) ] diff --git a/configs/_base_/datasets/sisr_x2_test_config.py b/configs/_base_/datasets/sisr_x2_test_config.py index 872644b86f..9dcd493407 100644 --- a/configs/_base_/datasets/sisr_x2_test_config.py +++ b/configs/_base_/datasets/sisr_x2_test_config.py @@ -11,7 +11,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # test config for Set5 diff --git a/configs/_base_/datasets/sisr_x3_test_config.py b/configs/_base_/datasets/sisr_x3_test_config.py index 42a21f6488..f74365d733 100644 --- a/configs/_base_/datasets/sisr_x3_test_config.py +++ b/configs/_base_/datasets/sisr_x3_test_config.py @@ -11,7 +11,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # test config for Set5 diff --git a/configs/_base_/datasets/sisr_x4_test_config.py b/configs/_base_/datasets/sisr_x4_test_config.py index cd40e3e271..0f0e5bf42f 100644 --- a/configs/_base_/datasets/sisr_x4_test_config.py +++ b/configs/_base_/datasets/sisr_x4_test_config.py @@ -11,7 +11,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # test config for Set5 diff --git a/configs/_base_/datasets/tdan_test_config.py b/configs/_base_/datasets/tdan_test_config.py index f6610b108f..a4c1754565 100644 --- a/configs/_base_/datasets/tdan_test_config.py +++ b/configs/_base_/datasets/tdan_test_config.py @@ -5,7 +5,7 @@ dict(type='GenerateFrameIndiceswithPadding', padding='reflection'), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] SPMC_bd_dataloader = dict( @@ -63,7 +63,7 @@ dict(type='GenerateFrameIndiceswithPadding', padding='reflection'), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] vid4_bd_dataloader = dict( num_workers=1, diff --git a/configs/_base_/datasets/unconditional_imgs_128x128.py b/configs/_base_/datasets/unconditional_imgs_128x128.py index 261dfcfcde..555b9e1919 100644 --- a/configs/_base_/datasets/unconditional_imgs_128x128.py +++ b/configs/_base_/datasets/unconditional_imgs_128x128.py @@ -4,7 +4,7 @@ train_pipeline = [ dict(type='LoadImageFromFile', key='gt'), dict(type='Resize', keys='gt', scale=(128, 128)), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # `batch_size` and `data_root` need to be set. diff --git a/configs/_base_/datasets/unconditional_imgs_64x64.py b/configs/_base_/datasets/unconditional_imgs_64x64.py index 33a0737b90..64b35d9cb6 100644 --- a/configs/_base_/datasets/unconditional_imgs_64x64.py +++ b/configs/_base_/datasets/unconditional_imgs_64x64.py @@ -3,7 +3,7 @@ train_pipeline = [ dict(type='LoadImageFromFile', key='gt'), dict(type='Resize', keys='gt', scale=(64, 64)), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # `batch_size` and `data_root` need to be set. diff --git a/configs/_base_/datasets/unconditional_imgs_flip_512x512.py b/configs/_base_/datasets/unconditional_imgs_flip_512x512.py index fd61ee3bcc..a8a208ad33 100644 --- a/configs/_base_/datasets/unconditional_imgs_flip_512x512.py +++ b/configs/_base_/datasets/unconditional_imgs_flip_512x512.py @@ -5,7 +5,7 @@ dict(type='LoadImageFromFile', key='gt'), dict(type='Resize', keys='gt', scale=(512, 512)), dict(type='Flip', keys=['gt'], direction='horizontal'), # TODO: - dict(type='PackEditInputs') + dict(type='PackInputs') ] # `batch_size` and `data_root` need to be set. diff --git a/configs/_base_/datasets/unconditional_imgs_flip_lanczos_resize_256x256.py b/configs/_base_/datasets/unconditional_imgs_flip_lanczos_resize_256x256.py index 73160eff94..d5fa9db67c 100644 --- a/configs/_base_/datasets/unconditional_imgs_flip_lanczos_resize_256x256.py +++ b/configs/_base_/datasets/unconditional_imgs_flip_lanczos_resize_256x256.py @@ -9,7 +9,7 @@ interpolation='lanczos', backend='pillow'), dict(type='Flip', keys=['gt'], direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # `batch_size` and `data_root` need to be set. diff --git a/configs/_base_/datasets/unpaired_imgs_256x256.py b/configs/_base_/datasets/unpaired_imgs_256x256.py index f05967c6ca..7c99405b1e 100644 --- a/configs/_base_/datasets/unpaired_imgs_256x256.py +++ b/configs/_base_/datasets/unpaired_imgs_256x256.py @@ -31,7 +31,7 @@ # f'img_{domain_b}': f'img_{domain_b}' # }), # dict( - # type='PackEditInputs', + # type='PackInputs', # keys=[f'img_{domain_a}', f'img_{domain_b}'], # data_keys=[f'img_{domain_a}', f'img_{domain_b}']) ] @@ -59,7 +59,7 @@ # f'img_{domain_b}': f'img_{domain_b}' # }), # dict( - # type='PackEditInputs', + # type='PackInputs', # keys=[f'img_{domain_a}', f'img_{domain_b}'], # data_keys=[f'img_{domain_a}', f'img_{domain_b}']) ] diff --git a/configs/_base_/models/base_edvr.py b/configs/_base_/models/base_edvr.py index a4b94d2da3..942d5046aa 100644 --- a/configs/_base_/models/base_edvr.py +++ b/configs/_base_/models/base_edvr.py @@ -25,7 +25,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ @@ -40,7 +40,7 @@ key='gt', color_type='color', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ @@ -50,7 +50,7 @@ key='img', color_type='color', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] data_root = 'data/REDS' diff --git a/configs/_base_/models/base_glean.py b/configs/_base_/models/base_glean.py index 4a9eaa4c0a..ba247c50d4 100644 --- a/configs/_base_/models/base_glean.py +++ b/configs/_base_/models/base_glean.py @@ -46,5 +46,4 @@ logger=dict(type='LoggerHook', interval=100), param_scheduler=dict(type='ParamSchedulerHook'), sampler_seed=dict(type='DistSamplerSeedHook'), - # visualization=dict(type='EditVisualizationHook', bgr_order=True), ) diff --git a/configs/_base_/models/base_liif.py b/configs/_base_/models/base_liif.py index a8a9d8a400..675f18cf17 100644 --- a/configs/_base_/models/base_liif.py +++ b/configs/_base_/models/base_liif.py @@ -26,7 +26,7 @@ type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), dict(type='GenerateCoordinateAndCell', sample_quantity=2304), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ dict( @@ -37,7 +37,7 @@ imdecode_backend='cv2'), dict(type='RandomDownSampling', scale_min=scale_max, scale_max=scale_max), dict(type='GenerateCoordinateAndCell', reshape_gt=False), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # test_pipeline = [ # dict( @@ -54,7 +54,7 @@ # imdecode_backend='cv2'), # dict(type='GenerateCoordinateAndCell', scale=scale_test, # reshape_gt=False), -# dict(type='PackEditInputs') +# dict(type='PackInputs') # ] # dataset settings diff --git a/configs/_base_/models/base_tof.py b/configs/_base_/models/base_tof.py index 921c36f584..fa440b09ba 100644 --- a/configs/_base_/models/base_tof.py +++ b/configs/_base_/models/base_tof.py @@ -11,7 +11,7 @@ key='gt', channel_order='rgb', imdecode_backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ @@ -20,7 +20,7 @@ key='img', channel_order='rgb', imdecode_backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings @@ -106,5 +106,4 @@ logger=dict(type='LoggerHook', interval=100), param_scheduler=dict(type='ParamSchedulerHook'), sampler_seed=dict(type='DistSamplerSeedHook'), - # visualization=dict(type='EditVisualizationHook'), ) diff --git a/configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py b/configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py index b5ac3c8913..a1173547dd 100644 --- a/configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py +++ b/configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py @@ -97,7 +97,7 @@ saturation=0.5, hue=0.5), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = [ @@ -118,7 +118,7 @@ crop_size=(512, 512), ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] train_dataloader = dict( diff --git a/configs/basicvsr/basicvsr_2xb4_reds4.py b/configs/basicvsr/basicvsr_2xb4_reds4.py index c71bca7b86..c9c434d177 100644 --- a/configs/basicvsr/basicvsr_2xb4_reds4.py +++ b/configs/basicvsr/basicvsr_2xb4_reds4.py @@ -40,20 +40,20 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict(type='GenerateSegmentIndices', interval_list=[1]), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ dict(type='GenerateSegmentIndices', interval_list=[1]), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] data_root = 'data/REDS' diff --git a/configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py b/configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py index fbf80b4266..678fad8ad1 100644 --- a/configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py +++ b/configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py @@ -19,20 +19,20 @@ type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), dict(type='MirrorSequence', keys=['img', 'gt']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ dict(type='GenerateSegmentIndices', interval_list=[1]), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ dict(type='GenerateSegmentIndices', interval_list=[1]), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] data_root = 'data' diff --git a/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track1.py b/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track1.py index 5993834bb3..28ecf7b286 100644 --- a/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track1.py +++ b/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track1.py @@ -31,13 +31,13 @@ filename_tmpl='{:03d}.png'), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ dict(type='GenerateSegmentIndices', interval_list=[1]), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_dataloader = dict( diff --git a/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-vsr.py b/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-vsr.py index 2760cab88b..b7d22507b3 100644 --- a/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-vsr.py +++ b/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-vsr.py @@ -25,14 +25,14 @@ dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), dict(type='MirrorSequence', keys=['img', 'gt']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ dict(type='GenerateSegmentIndices', interval_list=[1]), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='MirrorSequence', keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_dataloader = dict( diff --git a/configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py b/configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py index a9470e6623..8c88a053d0 100644 --- a/configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py +++ b/configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py @@ -47,7 +47,7 @@ saturation=0.05, hue=0.05), dict(type='TemporalReverse', keys=['img'], reverse_ratio=0.5), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ @@ -61,7 +61,7 @@ key='gt', channel_order='rgb', imdecode_backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ @@ -70,7 +70,7 @@ key='img', channel_order='rgb', imdecode_backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings @@ -148,7 +148,6 @@ timer=dict(type='IterTimerHook'), logger=dict(type='LoggerHook', interval=100), sampler_seed=dict(type='DistSamplerSeedHook'), - # visualization=dict(type='EditVisualizationHook'), param_scheduler=dict( type='ReduceLRSchedulerHook', by_epoch=True, diff --git a/configs/controlnet/controlnet-1xb1-fill50k.py b/configs/controlnet/controlnet-1xb1-fill50k.py index c556f70f6d..7b14f00622 100644 --- a/configs/controlnet/controlnet-1xb1-fill50k.py +++ b/configs/controlnet/controlnet-1xb1-fill50k.py @@ -45,7 +45,7 @@ dict(type='LoadImageFromFile', key='source', channel_order='rgb'), dict(type='LoadImageFromFile', key='target', channel_order='rgb'), dict( - type='PackEditInputs', + type='PackInputs', keys=['source', 'target'], data_keys='prompt', meta_keys=[ diff --git a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py index ba39bd8fb8..1f9ecb42b7 100644 --- a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py +++ b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py @@ -30,7 +30,7 @@ f'img_{domain_b}': f'img_{domain_b}' }) pack_input = dict( - type='PackEditInputs', + type='PackInputs', keys=[f'img_{domain_a}', f'img_{domain_b}'], data_keys=[f'img_{domain_a}', f'img_{domain_b}']) diff --git a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py index c9990d0b10..f14b53a455 100644 --- a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py +++ b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py @@ -31,7 +31,7 @@ f'img_{domain_b}': f'img_{domain_b}' }) pack_input = dict( - type='PackEditInputs', + type='PackInputs', keys=[f'img_{domain_a}', f'img_{domain_b}'], data_keys=[f'img_{domain_a}', f'img_{domain_b}']) diff --git a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py index 824d100839..349b5887a2 100644 --- a/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py +++ b/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py @@ -39,7 +39,7 @@ f'img_{domain_b}': f'img_{domain_b}' }) pack_input = dict( - type='PackEditInputs', + type='PackInputs', keys=[f'img_{domain_a}', f'img_{domain_b}'], data_keys=[f'img_{domain_a}', f'img_{domain_b}']) diff --git a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py index e6fb4aeede..5a7f148295 100644 --- a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py +++ b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py @@ -30,7 +30,7 @@ f'img_{domain_b}': f'img_{domain_b}' }) pack_input = dict( - type='PackEditInputs', + type='PackInputs', keys=[f'img_{domain_a}', f'img_{domain_b}'], data_keys=[f'img_{domain_a}', f'img_{domain_b}']) diff --git a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py index 3bdcf09c56..b8dce3b5f1 100644 --- a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py +++ b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py @@ -31,7 +31,7 @@ f'img_{domain_b}': f'img_{domain_b}' }) pack_input = dict( - type='PackEditInputs', + type='PackInputs', keys=[f'img_{domain_a}', f'img_{domain_b}'], data_keys=[f'img_{domain_a}', f'img_{domain_b}']) diff --git a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py index a57a5b2fc1..42e5320946 100644 --- a/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py +++ b/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py @@ -39,7 +39,7 @@ f'img_{domain_b}': f'img_{domain_b}' }) pack_input = dict( - type='PackEditInputs', + type='PackInputs', keys=[f'img_{domain_a}', f'img_{domain_b}'], data_keys=[f'img_{domain_a}', f'img_{domain_b}']) 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 8bc5e690e5..ce2f949ba3 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 @@ -15,7 +15,7 @@ train_pipeline = [ dict(type='LoadImageFromFile', key='gt', color_type='grayscale'), dict(type='Resize', keys='gt', scale=(64, 64)), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # set ``batch_size``` and ``data_root``` diff --git a/configs/deepfillv1/deepfillv1_4xb4_celeba-256x256.py b/configs/deepfillv1/deepfillv1_4xb4_celeba-256x256.py index 6c1a890e66..d17131c85c 100644 --- a/configs/deepfillv1/deepfillv1_4xb4_celeba-256x256.py +++ b/configs/deepfillv1/deepfillv1_4xb4_celeba-256x256.py @@ -33,7 +33,7 @@ keep_ratio=False, ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = train_pipeline diff --git a/configs/deepfillv1/deepfillv1_8xb2_places-256x256.py b/configs/deepfillv1/deepfillv1_8xb2_places-256x256.py index c1ad8480c5..d9f75584d8 100644 --- a/configs/deepfillv1/deepfillv1_8xb2_places-256x256.py +++ b/configs/deepfillv1/deepfillv1_8xb2_places-256x256.py @@ -32,7 +32,7 @@ keep_ratio=False, ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = train_pipeline diff --git a/configs/deepfillv2/deepfillv2_8xb2_celeba-256x256.py b/configs/deepfillv2/deepfillv2_8xb2_celeba-256x256.py index 8a7dd175d5..1bdc817b5f 100644 --- a/configs/deepfillv2/deepfillv2_8xb2_celeba-256x256.py +++ b/configs/deepfillv2/deepfillv2_8xb2_celeba-256x256.py @@ -34,7 +34,7 @@ keep_ratio=False, ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = train_pipeline diff --git a/configs/deepfillv2/deepfillv2_8xb2_places-256x256.py b/configs/deepfillv2/deepfillv2_8xb2_places-256x256.py index 0c9dbe71c9..641a5bd94a 100644 --- a/configs/deepfillv2/deepfillv2_8xb2_places-256x256.py +++ b/configs/deepfillv2/deepfillv2_8xb2_places-256x256.py @@ -34,7 +34,7 @@ keep_ratio=False, ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = train_pipeline diff --git a/configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py b/configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py index e32d9364e2..94ca026d20 100644 --- a/configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py +++ b/configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py @@ -51,7 +51,7 @@ ori_size=128, target_size=32, sigma=1.0), - dict(type='PackEditInputs') + dict(type='PackInputs') ] valid_pipeline = [ dict( @@ -74,7 +74,7 @@ output_keys=['img'], interpolation='bicubic', backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = valid_pipeline @@ -99,7 +99,7 @@ output_keys=['img'], interpolation='bicubic', backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py b/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py index 8df6763160..94000606d6 100644 --- a/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py +++ b/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py @@ -49,7 +49,7 @@ scale=(320, 320), keep_ratio=False), dict(type='GenerateTrimap', kernel_size=(1, 30)), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = [ dict( @@ -63,7 +63,7 @@ color_type='grayscale', save_original_img=True), dict(type='LoadImageFromFile', key='merged'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] train_dataloader = dict(batch_size=1, dataset=dict(pipeline=train_pipeline)) diff --git a/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k_online-merge.py b/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k_online-merge.py index 99845d31d0..e94b2462a7 100644 --- a/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k_online-merge.py +++ b/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k_online-merge.py @@ -19,7 +19,7 @@ scale=(320, 320), keep_ratio=False), dict(type='GenerateTrimap', kernel_size=(1, 30)), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) diff --git a/configs/dreambooth/dreambooth-finetune_text_encoder.py b/configs/dreambooth/dreambooth-finetune_text_encoder.py index c9f86a2a20..7cfcf0ca41 100644 --- a/configs/dreambooth/dreambooth-finetune_text_encoder.py +++ b/configs/dreambooth/dreambooth-finetune_text_encoder.py @@ -47,7 +47,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='Resize', scale=(512, 512)), - dict(type='PackEditInputs') + dict(type='PackInputs') ] dataset = dict( type='DreamBoothDataset', diff --git a/configs/dreambooth/dreambooth-lora.py b/configs/dreambooth/dreambooth-lora.py index 1e0ff43b71..b411aaf0ee 100644 --- a/configs/dreambooth/dreambooth-lora.py +++ b/configs/dreambooth/dreambooth-lora.py @@ -51,7 +51,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='Resize', scale=(512, 512)), - dict(type='PackEditInputs') + dict(type='PackInputs') ] dataset = dict( type='DreamBoothDataset', diff --git a/configs/dreambooth/dreambooth.py b/configs/dreambooth/dreambooth.py index 0ba329404d..4171626bed 100644 --- a/configs/dreambooth/dreambooth.py +++ b/configs/dreambooth/dreambooth.py @@ -46,7 +46,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='Resize', scale=(512, 512)), - dict(type='PackEditInputs') + dict(type='PackInputs') ] dataset = dict( type='DreamBoothDataset', diff --git a/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py b/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py index 56d07ce68c..d3fa3a4808 100644 --- a/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py +++ b/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py @@ -52,7 +52,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict( @@ -67,7 +67,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/edsr/edsr_x3c64b16_1xb16-300k_div2k.py b/configs/edsr/edsr_x3c64b16_1xb16-300k_div2k.py index 08476bcd3e..da05aac509 100644 --- a/configs/edsr/edsr_x3c64b16_1xb16-300k_div2k.py +++ b/configs/edsr/edsr_x3c64b16_1xb16-300k_div2k.py @@ -54,7 +54,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict( @@ -69,7 +69,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings @@ -138,5 +138,4 @@ logger=dict(type='LoggerHook', interval=100), param_scheduler=dict(type='ParamSchedulerHook'), sampler_seed=dict(type='DistSamplerSeedHook'), - # visualization=dict(type='EditVisualizationHook', bgr_order=True), ) diff --git a/configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py b/configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py index 1f979a6e73..d7a09ab661 100644 --- a/configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py +++ b/configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py @@ -54,7 +54,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict( @@ -69,7 +69,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py b/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py index 4b76ae2e9c..af8a699f37 100644 --- a/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py +++ b/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py @@ -53,7 +53,7 @@ test_pipeline = [ dict(type='LoadImageFromFile', key='img', color_type='color'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_dataset = dict( type='BasicConditionalDataset', diff --git a/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py b/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py index b5e6bdac5c..59a01e49cd 100644 --- a/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py +++ b/configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py @@ -56,7 +56,7 @@ test_pipeline = [ dict(type='LoadImageFromFile', key='img', color_type='color'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_dataset = dict( type='BasicConditionalDataset', diff --git a/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py b/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py index 8d9e55a346..262e3d8afc 100644 --- a/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py +++ b/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py @@ -56,7 +56,7 @@ test_pipeline = [ dict(type='LoadImageFromFile', key='img', color_type='color'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_dataset = dict( type='BasicConditionalDataset', diff --git a/configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py b/configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py index 38667f8df7..2e0e123a00 100644 --- a/configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py +++ b/configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py @@ -48,7 +48,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict( @@ -61,7 +61,7 @@ key='gt', color_type='color', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py b/configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py index 6316e4d721..3e47e4076b 100644 --- a/configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py +++ b/configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py @@ -53,7 +53,7 @@ saturation=0.05, hue=0.05), dict(type='TemporalReverse', keys=['img'], reverse_ratio=0.5), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ @@ -67,7 +67,7 @@ key='gt', channel_order='rgb', imdecode_backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ @@ -76,7 +76,7 @@ key='img', channel_order='rgb', imdecode_backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings @@ -156,7 +156,6 @@ timer=dict(type='IterTimerHook'), logger=dict(type='LoggerHook', interval=100), sampler_seed=dict(type='DistSamplerSeedHook'), - # visualization=dict(type='EditVisualizationHook'), param_scheduler=dict( type='ReduceLRSchedulerHook', by_epoch=True, diff --git a/configs/gca/baseline_r34_4xb10-200k_comp1k.py b/configs/gca/baseline_r34_4xb10-200k_comp1k.py index 9daa69b694..cb1e7566ff 100644 --- a/configs/gca/baseline_r34_4xb10-200k_comp1k.py +++ b/configs/gca/baseline_r34_4xb10-200k_comp1k.py @@ -67,7 +67,7 @@ dict(type='RandomJitter'), dict(type='MergeFgAndBg'), dict(type='FormatTrimap', to_onehot=True), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = [ dict( @@ -82,7 +82,7 @@ save_original_img=True), dict(type='LoadImageFromFile', key='merged'), dict(type='FormatTrimap', to_onehot=True), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] train_dataloader = dict( diff --git a/configs/gca/baseline_r34_4xb10-dimaug-200k_comp1k.py b/configs/gca/baseline_r34_4xb10-dimaug-200k_comp1k.py index b591df3552..fd8d899ea9 100644 --- a/configs/gca/baseline_r34_4xb10-dimaug-200k_comp1k.py +++ b/configs/gca/baseline_r34_4xb10-dimaug-200k_comp1k.py @@ -23,7 +23,7 @@ keep_ratio=False), dict(type='GenerateTrimap', kernel_size=(1, 30)), dict(type='FormatTrimap', to_onehot=False), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = [ @@ -39,7 +39,7 @@ save_original_img=True), dict(type='LoadImageFromFile', key='merged'), dict(type='FormatTrimap', to_onehot=False), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) diff --git a/configs/gca/gca_r34_4xb10-200k_comp1k.py b/configs/gca/gca_r34_4xb10-200k_comp1k.py index 2bb0a73d76..750c98116e 100644 --- a/configs/gca/gca_r34_4xb10-200k_comp1k.py +++ b/configs/gca/gca_r34_4xb10-200k_comp1k.py @@ -67,7 +67,7 @@ dict(type='RandomJitter'), dict(type='MergeFgAndBg'), dict(type='FormatTrimap', to_onehot=True), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = [ @@ -83,7 +83,7 @@ save_original_img=True), dict(type='LoadImageFromFile', key='merged'), dict(type='FormatTrimap', to_onehot=True), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] train_dataloader = dict( diff --git a/configs/gca/gca_r34_4xb10-dimaug-200k_comp1k.py b/configs/gca/gca_r34_4xb10-dimaug-200k_comp1k.py index b8bf47e051..b2fc25636e 100644 --- a/configs/gca/gca_r34_4xb10-dimaug-200k_comp1k.py +++ b/configs/gca/gca_r34_4xb10-dimaug-200k_comp1k.py @@ -23,7 +23,7 @@ keep_ratio=False), dict(type='GenerateTrimap', kernel_size=(1, 30)), dict(type='FormatTrimap', to_onehot=False), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = [ @@ -39,7 +39,7 @@ save_original_img=True), dict(type='LoadImageFromFile', key='merged'), dict(type='FormatTrimap', to_onehot=False), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) 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 4c1e0732d7..9f9d9c0b0e 100644 --- a/configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py +++ b/configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py @@ -115,7 +115,7 @@ keys=['img', 'gt'], flip_ratio=0.5, direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ @@ -129,7 +129,7 @@ key='gt', color_type='color', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ @@ -144,7 +144,7 @@ target_size=(128, 128), resize_opt=['area'], resize_prob=[1]), keys=['img'], ), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/glean/glean_x16_2xb8_cat.py b/configs/glean/glean_x16_2xb8_cat.py index 1ed04b7c1b..a1286645e7 100644 --- a/configs/glean/glean_x16_2xb8_cat.py +++ b/configs/glean/glean_x16_2xb8_cat.py @@ -69,7 +69,7 @@ keys=['img', 'gt'], flip_ratio=0.5, direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ dict( @@ -82,7 +82,7 @@ key='gt', color_type='color', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/glean/glean_x16_2xb8_ffhq.py b/configs/glean/glean_x16_2xb8_ffhq.py index 57f417a9c5..b44e2f6f85 100644 --- a/configs/glean/glean_x16_2xb8_ffhq.py +++ b/configs/glean/glean_x16_2xb8_ffhq.py @@ -69,7 +69,7 @@ keys=['img', 'gt'], flip_ratio=0.5, direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ dict( @@ -82,7 +82,7 @@ key='gt', color_type='color', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/glean/glean_x8_2xb8_cat.py b/configs/glean/glean_x8_2xb8_cat.py index 2f90585219..a97305e00a 100644 --- a/configs/glean/glean_x8_2xb8_cat.py +++ b/configs/glean/glean_x8_2xb8_cat.py @@ -69,7 +69,7 @@ keys=['img', 'gt'], flip_ratio=0.5, direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ dict( @@ -82,7 +82,7 @@ key='gt', color_type='color', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] inference_pipeline = [ @@ -97,7 +97,7 @@ keys=['img'], interpolation='bicubic', backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/global_local/gl_8xb12_celeba-256x256.py b/configs/global_local/gl_8xb12_celeba-256x256.py index 355ad5967b..78c0507427 100644 --- a/configs/global_local/gl_8xb12_celeba-256x256.py +++ b/configs/global_local/gl_8xb12_celeba-256x256.py @@ -40,7 +40,7 @@ keep_ratio=False, ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = train_pipeline diff --git a/configs/global_local/gl_8xb12_places-256x256.py b/configs/global_local/gl_8xb12_places-256x256.py index 622e4d8ed7..fa54595484 100644 --- a/configs/global_local/gl_8xb12_places-256x256.py +++ b/configs/global_local/gl_8xb12_places-256x256.py @@ -40,7 +40,7 @@ keep_ratio=False, ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = train_pipeline diff --git a/configs/indexnet/indexnet_mobv2-dimaug_1xb16-78k_comp1k.py b/configs/indexnet/indexnet_mobv2-dimaug_1xb16-78k_comp1k.py index 1538a77708..22bbef3a63 100644 --- a/configs/indexnet/indexnet_mobv2-dimaug_1xb16-78k_comp1k.py +++ b/configs/indexnet/indexnet_mobv2-dimaug_1xb16-78k_comp1k.py @@ -29,7 +29,7 @@ scale=(320, 320), keep_ratio=False), dict(type='GenerateTrimap', kernel_size=(1, 30)), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = [ @@ -44,7 +44,7 @@ color_type='grayscale', save_original_img=True), dict(type='LoadImageFromFile', key='merged'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) diff --git a/configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py b/configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py index 0b9266dcd4..85354600f7 100644 --- a/configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py +++ b/configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py @@ -60,7 +60,7 @@ keep_ratio=False, interpolation='bicubic'), dict(type='Flip', keys=['alpha', 'merged', 'fg', 'bg', 'trimap']), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = [ @@ -75,7 +75,7 @@ color_type='grayscale', save_original_img=True), dict(type='LoadImageFromFile', key='merged'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] train_dataloader = dict( diff --git a/configs/inst_colorization/README_zh-CN.md b/configs/inst_colorization/README_zh-CN.md index 38f9183ce1..9703101846 100644 --- a/configs/inst_colorization/README_zh-CN.md +++ b/configs/inst_colorization/README_zh-CN.md @@ -35,7 +35,7 @@ Image colorization is inherently an ill-posed problem with multi-modal uncertain 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/latest/user_guides/3_inference.html)。 +更多细节可以参考 [Tutorial 3: inference with pre-trained models](https://mmagic.readthedocs.io/en/latest/user_guides/3_inference.html)。 diff --git a/configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py b/configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py index f392cb763e..905bb63ae9 100644 --- a/configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py +++ b/configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py @@ -55,5 +55,5 @@ keys=['img', 'cropped_img'], scale=(256, 256), keep_ratio=False), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] diff --git a/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py b/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py index 46349eccc2..8ce1496cce 100644 --- a/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py +++ b/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py @@ -37,13 +37,13 @@ type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), dict(type='PairedRandomCrop', gt_patch_size=256), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py b/configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py index b7ec34a455..85ec75b6a7 100644 --- a/configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py +++ b/configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py @@ -37,13 +37,13 @@ type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), dict(type='PairedRandomCrop', gt_patch_size=256), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/partial_conv/pconv_stage1_8xb12_places-256x256.py b/configs/partial_conv/pconv_stage1_8xb12_places-256x256.py index 20c7470785..47d348b975 100644 --- a/configs/partial_conv/pconv_stage1_8xb12_places-256x256.py +++ b/configs/partial_conv/pconv_stage1_8xb12_places-256x256.py @@ -48,7 +48,7 @@ keep_ratio=False, ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = train_pipeline diff --git a/configs/partial_conv/pconv_stage1_8xb1_celeba-256x256.py b/configs/partial_conv/pconv_stage1_8xb1_celeba-256x256.py index 4d9ead7f1f..8f6eec7ba7 100644 --- a/configs/partial_conv/pconv_stage1_8xb1_celeba-256x256.py +++ b/configs/partial_conv/pconv_stage1_8xb1_celeba-256x256.py @@ -48,7 +48,7 @@ keep_ratio=False, ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = train_pipeline diff --git a/configs/partial_conv/pconv_stage2_4xb2_celeba-256x256.py b/configs/partial_conv/pconv_stage2_4xb2_celeba-256x256.py index 5478ce931e..b7d4363c36 100644 --- a/configs/partial_conv/pconv_stage2_4xb2_celeba-256x256.py +++ b/configs/partial_conv/pconv_stage2_4xb2_celeba-256x256.py @@ -48,7 +48,7 @@ keep_ratio=False, ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = train_pipeline diff --git a/configs/partial_conv/pconv_stage2_4xb2_places-256x256.py b/configs/partial_conv/pconv_stage2_4xb2_places-256x256.py index 464ac414c8..6c1f78f1cb 100644 --- a/configs/partial_conv/pconv_stage2_4xb2_places-256x256.py +++ b/configs/partial_conv/pconv_stage2_4xb2_places-256x256.py @@ -48,7 +48,7 @@ keep_ratio=False, ), dict(type='GetMaskedImage'), - dict(type='PackEditInputs'), + dict(type='PackInputs'), ] test_pipeline = train_pipeline diff --git a/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py b/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py index acd7127231..74add31c56 100644 --- a/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py +++ b/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py @@ -52,7 +52,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='gt'), dict(type='Flip', keys='gt', direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] train_dataloader = dict( diff --git a/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py b/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py index 205482d394..2ffbf7befd 100644 --- a/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py +++ b/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py @@ -39,12 +39,12 @@ dict(type='LoadImageFromFile', key='gt'), dict(type='Resize', keys='gt', scale=(128, 128)), dict(type='Flip', keys='gt', direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ dict(type='LoadImageFromFile', key='gt'), dict(type='Resize', keys='gt', scale=(128, 128)), - dict(type='PackEditInputs') + dict(type='PackInputs') ] train_dataloader = dict( diff --git a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py index f7adb1e04c..2463967733 100644 --- a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py +++ b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py @@ -35,7 +35,7 @@ f'img_{domain_b}': f'img_{domain_b}' }) pack_input = dict( - type='PackEditInputs', + type='PackInputs', keys=[f'img_{domain_a}', f'img_{domain_b}'], data_keys=[f'img_{domain_a}', f'img_{domain_b}']) diff --git a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py index ed86774850..e43d010efa 100644 --- a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py +++ b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py @@ -35,7 +35,7 @@ f'img_{domain_b}': f'img_{domain_b}' }) pack_input = dict( - type='PackEditInputs', + type='PackInputs', keys=[f'img_{domain_a}', f'img_{domain_b}'], data_keys=[f'img_{domain_a}', f'img_{domain_b}']) diff --git a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py index 79315c3166..20551f24b8 100644 --- a/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py +++ b/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py @@ -34,7 +34,7 @@ f'img_{domain_b}': f'img_{domain_b}' }) pack_input = dict( - type='PackEditInputs', + type='PackInputs', keys=[f'img_{domain_a}', f'img_{domain_b}'], data_keys=[f'img_{domain_a}', f'img_{domain_b}']) diff --git a/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py b/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py index 30b09cc073..fb832982b4 100644 --- a/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py +++ b/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py @@ -49,7 +49,7 @@ f'img_{domain_b}': f'img_{domain_b}' }) pack_input = dict( - type='PackEditInputs', + type='PackInputs', keys=[f'img_{domain_a}', f'img_{domain_b}'], data_keys=[f'img_{domain_a}', f'img_{domain_b}']) diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py index 4792cbb211..708dd6fa70 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py @@ -40,7 +40,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py index 2a0cc07d4b..8adc239f72 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py @@ -39,7 +39,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py index df0c6e3b00..f5eb0e1835 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py @@ -45,7 +45,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py index 2c8ba539fc..5c62cc40e3 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py @@ -14,7 +14,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py index bdb84f4fd2..01efc7fa80 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py @@ -43,7 +43,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py index 42eb586f6e..18cdf9b16d 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py @@ -43,7 +43,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py index 7ed42ffa15..f0ed9d54e4 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py @@ -47,7 +47,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py index bfdba277da..38d2da92a2 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py @@ -42,7 +42,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py index deb51fd3a7..61ec4c2003 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py @@ -41,7 +41,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py index 90e0ff94c8..8d442a4a1a 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py @@ -47,7 +47,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py b/configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py index 18a30b12be..b53fb59d27 100644 --- a/configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py +++ b/configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py @@ -46,7 +46,7 @@ pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Resize', scale=(256, 256)), - dict(type='PackEditInputs', keys=['img']) + dict(type='PackInputs', keys=['img']) ] val_dataloader = dict( diff --git a/configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py b/configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py index 469e7b4cb0..d823df6f11 100644 --- a/configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py +++ b/configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py @@ -49,7 +49,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict( @@ -64,7 +64,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py b/configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py index 1bcc90b9b8..df686dc5d2 100644 --- a/configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py +++ b/configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py @@ -49,7 +49,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict( @@ -64,7 +64,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py b/configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py index 5e938c176a..588af73550 100644 --- a/configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py +++ b/configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py @@ -49,7 +49,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict( @@ -64,7 +64,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/real_basicvsr/realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py b/configs/real_basicvsr/realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py index 74eef2d1bc..45cb46aad2 100644 --- a/configs/real_basicvsr/realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py +++ b/configs/real_basicvsr/realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py @@ -191,7 +191,7 @@ keys=['img'], ), dict(type='Clip', keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ @@ -201,7 +201,7 @@ filename_tmpl='{:04d}.png'), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_pipeline = [ @@ -211,13 +211,13 @@ filename_tmpl='{:08d}.png'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ dict(type='GenerateSegmentIndices', interval_list=[1]), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] data_root = 'data' diff --git a/configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py b/configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py index b361c6e8e5..ed62cb475a 100644 --- a/configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py +++ b/configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py @@ -171,13 +171,13 @@ sigma=0, weight=0.5, threshold=10), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/restormer/restormer_official_dpdd-dual.py b/configs/restormer/restormer_official_dpdd-dual.py index 94b611e395..44d0b6d3cf 100644 --- a/configs/restormer/restormer_official_dpdd-dual.py +++ b/configs/restormer/restormer_official_dpdd-dual.py @@ -6,11 +6,11 @@ work_dir = f'./work_dirs/{experiment_name}' save_dir = './work_dirs/' -# modify PackEditInputs +# modify PackInputs test_dataloader = _base_.test_dataloader for dataloader in test_dataloader: test_pipeline = dataloader['dataset']['pipeline'] - test_pipeline[4] = dict(type='PackEditInputs', keys=['imgL', 'imgR']) + test_pipeline[4] = dict(type='PackInputs', keys=['imgL', 'imgR']) # model settings model = dict( diff --git a/configs/singan/singan_balloons.py b/configs/singan/singan_balloons.py index 0e1b6ff3c9..a101360c78 100644 --- a/configs/singan/singan_balloons.py +++ b/configs/singan/singan_balloons.py @@ -19,7 +19,7 @@ # DATA pipeline = [ dict( - type='PackEditInputs', + type='PackInputs', keys=[f'real_scale{i}' for i in range(num_scales)] + ['input_sample']) ] data_root = './data/singan/balloons.png' diff --git a/configs/singan/singan_fish.py b/configs/singan/singan_fish.py index 7c6fbfe5e1..aedde873a5 100644 --- a/configs/singan/singan_fish.py +++ b/configs/singan/singan_fish.py @@ -43,7 +43,7 @@ pipeline = [ dict( - type='PackEditInputs', + type='PackInputs', keys=[f'real_scale{i}' for i in range(num_scales)] + ['input_sample']) ] dataset = dict( diff --git a/configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py b/configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py index d6679b8df7..2f8531bbd6 100644 --- a/configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py +++ b/configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py @@ -47,7 +47,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict( @@ -62,7 +62,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py b/configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py index 984c55100d..5637084eb7 100644 --- a/configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py +++ b/configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py @@ -47,7 +47,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict( @@ -60,7 +60,7 @@ key='gt', color_type='color', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py b/configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py index dfec6ba6b5..6d2ef8cea9 100644 --- a/configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py +++ b/configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py @@ -51,7 +51,7 @@ padding=((64, 64), (0, 0), (0, 0)), ), dict(type='Flip', keys=['gt'], direction='horizontal'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = train_pipeline 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 index 7739c9f4c2..cc2ee6f2d1 100644 --- 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 @@ -40,7 +40,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] test_dataloader = dict( 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 index 8affa9c269..20afd7bfff 100644 --- a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py @@ -56,7 +56,7 @@ type='RandomJPEGCompression', params=dict(quality=[quality, quality], color_type='color'), keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ @@ -76,7 +76,7 @@ type='RandomJPEGCompression', params=dict(quality=[quality, quality], color_type='color'), keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings 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 index 0a36827ea6..ceb9485d01 100644 --- a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py @@ -53,7 +53,7 @@ type='RandomJPEGCompression', params=dict(quality=[quality, quality], color_type='grayscale'), keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ @@ -71,7 +71,7 @@ type='RandomJPEGCompression', params=dict(quality=[quality, quality], color_type='grayscale'), keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings 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 index b89ae76c15..64ec54c42f 100644 --- a/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py +++ b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py @@ -65,7 +65,7 @@ gaussian_sigma=[sigma * 255, sigma * 255], gaussian_gray_noise_prob=0), keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ @@ -89,7 +89,7 @@ gaussian_sigma=[sigma * 255, sigma * 255], gaussian_gray_noise_prob=0), keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings 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 index 3291dfaf5a..9ef462ca17 100644 --- a/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py +++ b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py @@ -62,7 +62,7 @@ gaussian_sigma=[sigma, sigma], gaussian_gray_noise_prob=0), keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] val_pipeline = [ @@ -84,7 +84,7 @@ gaussian_sigma=[sigma, sigma], gaussian_gray_noise_prob=0), keys=['img']), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py index 618d684936..94e860ba71 100644 --- a/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +++ b/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py @@ -58,7 +58,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ @@ -74,7 +74,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py index 1ef576431d..a483b854ac 100644 --- a/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +++ b/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py @@ -58,7 +58,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ @@ -74,7 +74,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py index 1d28407c74..8eb1045050 100644 --- a/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +++ b/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py @@ -58,7 +58,7 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ @@ -74,7 +74,7 @@ color_type='color', channel_order='rgb', imdecode_backend='cv2'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py b/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py index bd1f6d97c7..20472dcca1 100644 --- a/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py +++ b/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py @@ -45,20 +45,20 @@ 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') + dict(type='PackInputs') ] val_pipeline = [ dict(type='GenerateFrameIndiceswithPadding', padding='reflection'), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), dict(type='LoadImageFromFile', key='gt', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ dict(type='GenerateSegmentIndices', interval_list=[1]), dict(type='LoadImageFromFile', key='img', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] data_root = 'data' diff --git a/configs/tof/tof_x4_official_vimeo90k.py b/configs/tof/tof_x4_official_vimeo90k.py index ed78f739d6..90cd5cf060 100644 --- a/configs/tof/tof_x4_official_vimeo90k.py +++ b/configs/tof/tof_x4_official_vimeo90k.py @@ -28,7 +28,7 @@ key='gt', color_type='color', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ @@ -38,7 +38,7 @@ key='img', color_type='color', channel_order='rgb'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] data_root = 'data/Vid4' diff --git a/configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py b/configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py index 289fac373e..916cdfad75 100644 --- a/configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py +++ b/configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py @@ -87,7 +87,7 @@ direction='vertical'), dict( type='RandomTransposeHW', keys=['ref', 'ref_lq'], transpose_ratio=0.5), - dict(type='PackEditInputs') + dict(type='PackInputs') ] valid_pipeline = [ dict( @@ -121,7 +121,7 @@ output_keys=['img_lq', 'ref_lq'], interpolation='bicubic', backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] demo_pipeline = [ dict( @@ -154,7 +154,7 @@ output_keys=['img_lq', 'ref_lq'], interpolation='bicubic', backend='pillow'), - dict(type='PackEditInputs') + dict(type='PackInputs') ] # dataset settings diff --git a/docs/en/community/contributing.md b/docs/en/community/contributing.md index e73b9acf82..20a5814e89 100644 --- a/docs/en/community/contributing.md +++ b/docs/en/community/contributing.md @@ -1,6 +1,6 @@ # Contributing guidance -Welcome to the mmagic community, we are committed to building a toolbox for cutting-edge image, video and 3D content generation, editing and processing techniques. +Welcome to the MMagic community, we are committed to building a Multimodal Advanced, Generative, and Intelligent Creation Toolbox. This section introduces following contents: @@ -29,7 +29,6 @@ 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** @@ -116,16 +115,16 @@ 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` +After configuring the pre-commit, we should create a branch based on the main 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: +In subsequent development, if the main branch of the local repository is behind the main branch of "upstream", we need to pull the upstream for synchronization, and then execute the above command: ```shell -git pull upstream master +git pull upstream main ``` #### 4. Commit the code and pass the unit test @@ -188,18 +187,18 @@ mmagic will run unit test for the posted Pull Request on different platforms (Li #### 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: +If your local branch conflicts with the latest main 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 +git rebase upstream/main ``` or ```shell git fetch --all --prune -git merge upstream/master +git merge upstream/main ``` 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. diff --git a/docs/en/community/projects.md b/docs/en/community/projects.md index 0c8a98add3..431fbcbd03 100644 --- a/docs/en/community/projects.md +++ b/docs/en/community/projects.md @@ -2,7 +2,7 @@ Welcome to the MMagic community! The MMagic 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 MMagic for image, video, 3D content generation, editing and processing. +The goal of this ecosystem is to support, accelerate, and aid in your exploration with MMagic for AIGC such as image, video, 3D content generation, editing and processing. Here are a few projects that are built upon MMagic. They are examples of how to use MMagic as a library, to make your projects more maintainable. Please find more projects in [MMagic Ecosystem](https://openmmlab.com/ecosystem). diff --git a/docs/en/get_started/install.md b/docs/en/get_started/install.md index 2114176894..a9ed54beb6 100644 --- a/docs/en/get_started/install.md +++ b/docs/en/get_started/install.md @@ -19,7 +19,7 @@ In this section, we demonstrate how to prepare an environment with PyTorch. MMagic works on Linux, Windows, and macOS. It requires: -- Python >= 3.6 +- Python >= 3.7 - [PyTorch](https://pytorch.org/) >= 1.8 - [MMCV](https://github.com/open-mmlab/mmcv) >= 2.0.0 @@ -71,12 +71,29 @@ mim install 'mmengine' Or +```shell +pip install mmengine +``` + +Or + ```shell pip install git+https://github.com/open-mmlab/mmengine.git ``` **Step 2.** Install MMagic. -Install [MMagic](https://github.com/open-mmlab/mmagic) from the source code. + +```shell +mim install 'mmagic' +``` + +Or + +```shell +pip install mmagic +``` + +Or install [MMagic](https://github.com/open-mmlab/mmagic) from the source code. ```shell git clone https://github.com/open-mmlab/mmagic.git @@ -85,7 +102,7 @@ pip3 install -e . -v ``` **Step 5.** -Verification. +Verify MMagic has been successfully installed. ```shell cd ~ diff --git a/docs/en/get_started/overview.md b/docs/en/get_started/overview.md index 1dd2599e8a..ce790e1b35 100644 --- a/docs/en/get_started/overview.md +++ b/docs/en/get_started/overview.md @@ -10,7 +10,7 @@ Welcome to MMagic! In this section, you will know about ## What is MMagic? -MMagic is an open-source toolbox for professional AI researchers and machine learning engineers to explore image and video processing, editing and synthesis. +MMagic (**M**ultimodal **A**dvanced, **G**enerative, and **I**ntelligent **C**reation) is an open-source AIGC toolbox for professional AI researchers and machine learning engineers to explore image and video processing, editing and generation. MMagic allows researchers and engineers to use pre-trained state-of-the-art models, train and develop new customized models easily. @@ -24,65 +24,41 @@ MMagic supports various foundamental generative models, including: MMagic supports various applications, including: +- Text-to-Image +- Image-to-image translation +- 3D-aware generation - Image super-resolution - Video super-resolution - Video frame interpolation - Image inpainting - Image matting -- Image-to-image translation +- Image restoration +- Image colorization +- Image generation - And many other applications are coming soon! -
    - -
    -
    -