diff --git a/tutorials/generative/2d_super_resolution/2d_stable_diffusion_v2_super_resolution-lightning.ipynb b/tutorials/generative/2d_super_resolution/2d_stable_diffusion_v2_super_resolution-lightning.ipynb new file mode 100644 index 00000000..dfc9d932 --- /dev/null +++ b/tutorials/generative/2d_super_resolution/2d_stable_diffusion_v2_super_resolution-lightning.ipynb @@ -0,0 +1,1704 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "bc11fdc9", + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright (c) MONAI Consortium\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "id": "95c08725", + "metadata": {}, + "source": [ + "# Super-resolution using Stable Diffusion v2 Upscalers\n", + "\n", + "Tutorial to illustrate the super-resolution task on medical images using Latent Diffusion Models (LDMs) [1]. For that, we will use an autoencoder to obtain a latent representation of the high-resolution images. Then, we train a diffusion model to infer this latent representation when conditioned on a low-resolution image.\n", + "\n", + "To improve the performance of our models, we will use a method called \"noise conditioning augmentation\" (introduced in [2] and used in Stable Diffusion v2.0 and Imagen Video [3]). During the training, we add noise to the low-resolution images using a random signal-to-noise ratio, and we condition the diffusion models on the amount of noise added. At sampling time, we use a fixed signal-to-noise ratio, representing a small amount of augmentation that aids in removing artefacts in the samples.\n", + "\n", + "\n", + "[1] - Rombach et al. \"High-Resolution Image Synthesis with Latent Diffusion Models\" https://arxiv.org/abs/2112.10752\n", + "\n", + "[2] - Ho et al. \"Cascaded diffusion models for high fidelity image generation\" https://arxiv.org/abs/2106.15282\n", + "\n", + "[3] - Ho et al. \"High Definition Video Generation with Diffusion Models\" https://arxiv.org/abs/2210.02303" + ] + }, + { + "cell_type": "markdown", + "id": "b839bf2d", + "metadata": {}, + "source": [ + "## Set up environment using Colab\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "77f7e633", + "metadata": {}, + "outputs": [], + "source": [ + "!python -c \"import monai\" || pip install -q \"monai-weekly[tqdm]\"\n", + "!python -c \"import pytorch_lightning\" || pip install pytorch-lightning\n", + "!python -c \"import matplotlib\" || pip install -q matplotlib\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "id": "214066de", + "metadata": {}, + "source": [ + "## Set up imports" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "de71fe08", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 17:22:32,886 - WARNING[XFORMERS]: xFormers can't load C++/CUDA extensions. xFormers was built for:\n", + " PyTorch 1.13.1+cu117 with CUDA 1107 (you have 1.12.1)\n", + " Python 3.8.16 (you have 3.8.16)\n", + " Please reinstall xformers (see https://github.com/facebookresearch/xformers#installing-xformers)\n", + " Memory-efficient attention, SwiGLU, sparse and more won't be available.\n", + " Set XFORMERS_MORE_DETAILS=1 for more details\n", + "2023-05-12 17:22:35,069 - Created a temporary directory at /tmp/tmph4_v9gin\n", + "2023-05-12 17:22:35,071 - Writing /tmp/tmph4_v9gin/_remote_module_non_scriptable.py\n", + "MONAI version: 1.2.dev2304\n", + "Numpy version: 1.23.5\n", + "Pytorch version: 1.12.1\n", + "MONAI flags: HAS_EXT = False, USE_COMPILED = False, USE_META_DICT = False\n", + "MONAI rev id: 9a57be5aab9f2c2a134768c0c146399150e247a0\n", + "MONAI __file__: /home/ol18/miniconda3/envs/monai_generative/lib/python3.8/site-packages/monai_weekly-1.2.dev2304-py3.8.egg/monai/__init__.py\n", + "\n", + "Optional dependencies:\n", + "Pytorch Ignite version: 0.4.10\n", + "ITK version: 5.3.0\n", + "Nibabel version: 5.1.0\n", + "scikit-image version: 0.20.0\n", + "Pillow version: 9.4.0\n", + "Tensorboard version: 2.12.1\n", + "gdown version: 4.7.1\n", + "TorchVision version: 0.13.1\n", + "tqdm version: 4.65.0\n", + "lmdb version: 1.4.0\n", + "psutil version: 5.9.4\n", + "pandas version: 2.0.0\n", + "einops version: 0.6.0\n", + "transformers version: 4.21.3\n", + "mlflow version: 2.2.2\n", + "pynrrd version: 1.0.0\n", + "\n", + "For details about installing the optional dependencies, please visit:\n", + " https://docs.monai.io/en/latest/installation.html#installing-the-recommended-dependencies\n", + "\n" + ] + } + ], + "source": [ + "import os\n", + "import shutil\n", + "import tempfile\n", + "from pathlib import Path\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import torch\n", + "import torch.nn.functional as F\n", + "from monai import transforms\n", + "from monai.apps import MedNISTDataset\n", + "from monai.config import print_config\n", + "from monai.data import CacheDataset, ThreadDataLoader\n", + "from monai.utils import first, set_determinism\n", + "from torch.cuda.amp import GradScaler, autocast\n", + "from torch import nn\n", + "from tqdm.notebook import tqdm\n", + "\n", + "from generative.losses import PatchAdversarialLoss, PerceptualLoss\n", + "from generative.networks.nets import AutoencoderKL, DiffusionModelUNet, PatchDiscriminator\n", + "from generative.networks.schedulers import DDPMScheduler\n", + "\n", + "import pytorch_lightning as pl\n", + "from pytorch_lightning.callbacks.model_checkpoint import ModelCheckpoint\n", + "\n", + "print_config()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "9f0a17bc", + "metadata": {}, + "outputs": [], + "source": [ + "# for reproducibility purposes set a seed\n", + "set_determinism(42)" + ] + }, + { + "cell_type": "markdown", + "id": "c0dde922", + "metadata": {}, + "source": [ + "## Setup a data directory and download dataset\n", + "Specify a MONAI_DATA_DIRECTORY variable, where the data will be downloaded. If not specified a temporary directory will be used." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ded618a7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/tmp/tmphf3tvpfi\n" + ] + } + ], + "source": [ + "directory = os.environ.get(\"MONAI_DATA_DIRECTORY\")\n", + "root_dir = tempfile.mkdtemp() if directory is None else directory\n", + "print(root_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "298d964a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MedNIST.tar.gz: 59.0MB [00:01, 36.4MB/s] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 17:22:36,915 - INFO - Downloaded: /tmp/tmphf3tvpfi/MedNIST.tar.gz\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 17:22:37,020 - INFO - Verified 'MedNIST.tar.gz', md5: 0bc7306e7427e00ad1c5526a6677552d.\n", + "2023-05-12 17:22:37,022 - INFO - Writing into directory: /tmp/tmphf3tvpfi.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading dataset: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████| 47164/47164 [00:35<00:00, 1323.43it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 17:23:21,457 - INFO - Verified 'MedNIST.tar.gz', md5: 0bc7306e7427e00ad1c5526a6677552d.\n", + "2023-05-12 17:23:21,459 - INFO - File exists: /tmp/tmphf3tvpfi/MedNIST.tar.gz, skipped downloading.\n", + "2023-05-12 17:23:21,460 - INFO - Non-empty folder exists in /tmp/tmphf3tvpfi/MedNIST, skipped extracting.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "Loading dataset: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████| 5895/5895 [00:04<00:00, 1319.58it/s]\n" + ] + } + ], + "source": [ + "train_data = MedNISTDataset(root_dir=root_dir, section=\"training\",\n", + " download=True, seed=0)\n", + "train_datalist = [{\"image\": item[\"image\"]} for item in train_data.data if item[\"class_name\"] == \"HeadCT\"]\n", + "val_data = MedNISTDataset(root_dir=root_dir, section=\"validation\",\n", + " download=True, seed=0)\n", + "val_datalist = [{\"image\": item[\"image\"]} for item in val_data.data if item[\"class_name\"] == \"HeadCT\"]" + ] + }, + { + "cell_type": "markdown", + "id": "46bafb78", + "metadata": {}, + "source": [ + "## Setup utils functions" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4f8eff03", + "metadata": {}, + "outputs": [], + "source": [ + "def get_train_transforms():\n", + " image_size = 64\n", + " train_transforms = transforms.Compose(\n", + " [\n", + " transforms.LoadImaged(keys=[\"image\"]),\n", + " transforms.EnsureChannelFirstd(keys=[\"image\"]),\n", + " transforms.ScaleIntensityRanged(keys=[\"image\"], a_min=0.0, a_max=255.0, b_min=0.0,\n", + " b_max=1.0, clip=True),\n", + " transforms.RandAffined(\n", + " keys=[\"image\"],\n", + " rotate_range=[(-np.pi / 36, np.pi / 36), (-np.pi / 36, np.pi / 36)],\n", + " translate_range=[(-1, 1), (-1, 1)],\n", + " scale_range=[(-0.05, 0.05), (-0.05, 0.05)],\n", + " spatial_size=[image_size, image_size],\n", + " padding_mode=\"zeros\",\n", + " prob=0.5,\n", + " ),\n", + " transforms.CopyItemsd(keys=[\"image\"], times=1, names=[\"low_res_image\"]),\n", + " transforms.Resized(keys=[\"low_res_image\"], spatial_size=(16, 16)),\n", + " ]\n", + " )\n", + " return train_transforms\n", + "\n", + "def get_val_transforms():\n", + " val_transforms = transforms.Compose(\n", + " [\n", + " transforms.LoadImaged(keys=[\"image\"]),\n", + " transforms.EnsureChannelFirstd(keys=[\"image\"]),\n", + " transforms.ScaleIntensityRanged(keys=[\"image\"], a_min=0.0, a_max=255.0, b_min=0.0, \n", + " b_max=1.0, clip=True),\n", + " transforms.CopyItemsd(keys=[\"image\"], times=1, names=[\"low_res_image\"]),\n", + " transforms.Resized(keys=[\"low_res_image\"], spatial_size=(16, 16)),\n", + " ]\n", + " )\n", + " return val_transforms\n", + "\n", + " \n", + "def get_datasets():\n", + " train_transforms = get_train_transforms()\n", + " val_transforms = get_val_transforms()\n", + " train_ds = CacheDataset(data=train_datalist[:320], transform=train_transforms)\n", + " val_ds = CacheDataset(data=val_datalist[:32], transform=val_transforms)\n", + " return train_ds, val_ds\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "d80e045b", + "metadata": {}, + "source": [ + "## Define the LightningModule for AutoEncoder (transforms, network, loaders, etc)\n", + "The LightningModule contains a refactoring of your training code. The following module is a reformating of the code in 2d_stable_diffusion_v2_super_resolution.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d5d1caff", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "class AutoEncoder(pl.LightningModule):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.data_dir = root_dir\n", + " self.autoencoderkl = AutoencoderKL(spatial_dims=2,\n", + " in_channels=1,\n", + " out_channels=1,\n", + " num_channels=(256, 512, 512),\n", + " latent_channels=3,\n", + " num_res_blocks=2,\n", + " norm_num_groups=32,\n", + " attention_levels=(False, False, True))\n", + " self.discriminator = PatchDiscriminator(spatial_dims=2, in_channels=1,\n", + " num_layers_d=3, num_channels=64)\n", + " self.perceptual_loss = PerceptualLoss(spatial_dims=2, network_type=\"alex\")\n", + " self.perceptual_weight = 0.002\n", + " self.autoencoder_warm_up_n_epochs = 10\n", + " self.automatic_optimization = False\n", + " self.adv_loss = PatchAdversarialLoss(criterion=\"least_squares\")\n", + " self.adv_weight = 0.005\n", + " self.kl_weight = 1e-6\n", + " \n", + " def forward(self, z):\n", + " return self.autoencoderkl(z)\n", + "\n", + " def prepare_data(self):\n", + " self.train_ds, self.val_ds = get_datasets()\n", + " \n", + " def train_dataloader(self):\n", + " return ThreadDataLoader(self.train_ds, batch_size=16, shuffle=True,\n", + " num_workers=4, persistent_workers=True)\n", + " \n", + " def val_dataloader(self):\n", + " return ThreadDataLoader(self.val_ds, batch_size=16, shuffle=False,\n", + " num_workers=4)\n", + " \n", + " def _compute_loss_generator(self, images, reconstruction, z_mu, z_sigma):\n", + " recons_loss = F.l1_loss(reconstruction.float(), images.float())\n", + " p_loss = self.perceptual_loss(reconstruction.float(), images.float())\n", + " kl_loss = 0.5 * torch.sum(z_mu.pow(2) + z_sigma.pow(2) - torch.log(z_sigma.pow(2)) - 1, dim=[1, 2, 3])\n", + " kl_loss = torch.sum(kl_loss) / kl_loss.shape[0]\n", + " loss_g = recons_loss + (self.kl_weight * kl_loss) + (self.perceptual_weight * p_loss)\n", + " return loss_g,recons_loss\n", + " \n", + " def _compute_loss_discriminator(self, images, reconstruction):\n", + " logits_fake = self.discriminator(reconstruction.contiguous().detach())[-1]\n", + " loss_d_fake = self.adv_loss(logits_fake, target_is_real=False, for_discriminator=True)\n", + " logits_real = self.discriminator(images.contiguous().detach())[-1]\n", + " loss_d_real = self.adv_loss(logits_real, target_is_real=True, for_discriminator=True)\n", + " discriminator_loss = (loss_d_fake + loss_d_real) * 0.5\n", + " loss_d = self.adv_weight * discriminator_loss\n", + " return loss_d, discriminator_loss\n", + " \n", + " def training_step(self, batch, batch_idx):\n", + " optimizer_g, optimizer_d = self.optimizers()\n", + " images = batch[\"image\"]\n", + " reconstruction, z_mu, z_sigma = self.forward(images)\n", + " loss_g, recons_loss = self._compute_loss_generator(images, reconstruction, z_mu, z_sigma)\n", + " self.log(\"recons_loss\", recons_loss, batch_size=16, prog_bar=True)\n", + "\n", + " if self.current_epoch > self.autoencoder_warm_up_n_epochs:\n", + " logits_fake = self.discriminator(reconstruction.contiguous().float())[-1]\n", + " generator_loss = self.adv_loss(logits_fake, target_is_real=True, for_discriminator=False)\n", + " loss_g += self.adv_weight * generator_loss\n", + " self.log(\"gen_loss\", generator_loss, batch_size=16, prog_bar=True)\n", + " \n", + " \n", + "\n", + " self.log(\"loss_g\", loss_g, batch_size=16, prog_bar=True)\n", + " self.manual_backward(loss_g)\n", + " optimizer_g.step()\n", + " optimizer_g.zero_grad()\n", + " self.untoggle_optimizer(optimizer_g)\n", + "\n", + " if self.current_epoch > self.autoencoder_warm_up_n_epochs:\n", + " loss_d, discriminator_loss = self._compute_loss_discriminator(images, reconstruction)\n", + " self.log(\"disc_loss\", loss_d, batch_size=16, prog_bar=True)\n", + " self.log(\"train_loss_d\", loss_d, batch_size=16, prog_bar=True)\n", + " self.manual_backward(loss_d)\n", + " optimizer_d.step()\n", + " optimizer_d.zero_grad()\n", + " self.untoggle_optimizer(optimizer_d)\n", + "\n", + " \n", + " \n", + " def validation_step(self, batch, batch_idx):\n", + " images = batch[\"image\"]\n", + " reconstruction, z_mu, z_sigma = self.autoencoderkl(images)\n", + " recons_loss = F.l1_loss(images.float(), reconstruction.float())\n", + " self.log(\"val_loss_d\", recons_loss, batch_size=1, prog_bar=True)\n", + " self.images = images\n", + " self.reconstruction = reconstruction\n", + "\n", + "\n", + " def on_validation_epoch_end(self):\n", + " # ploting reconstruction\n", + " plt.figure(figsize=(2, 2))\n", + " plt.imshow(torch.cat([self.images[0, 0].cpu(), \n", + " self.reconstruction[0, 0].cpu()],\n", + " dim=1), vmin=0, vmax=1, cmap=\"gray\")\n", + " plt.tight_layout()\n", + " plt.axis(\"off\")\n", + " plt.show()\n", + " \n", + "\n", + " def configure_optimizers(self):\n", + " optimizer_g = torch.optim.Adam(self.autoencoderkl.parameters(), lr=5e-5)\n", + " optimizer_d = torch.optim.Adam(self.discriminator.parameters(), lr=1e-4)\n", + " return [optimizer_g, optimizer_d], []\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "id": "c16de505", + "metadata": {}, + "source": [ + "## Train Autoencoder" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9d903aaa", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The parameter 'pretrained' is deprecated since 0.13 and will be removed in 0.15, please use 'weights' instead.\n", + "Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and will be removed in 0.15. The current behavior is equivalent to passing `weights=AlexNet_Weights.IMAGENET1K_V1`. You can also use `weights=AlexNet_Weights.DEFAULT` to get the most up-to-date weights.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 17:23:29,608 - GPU available: True (cuda), used: True\n", + "2023-05-12 17:23:29,609 - TPU available: False, using: 0 TPU cores\n", + "2023-05-12 17:23:29,610 - IPU available: False, using: 0 IPUs\n", + "2023-05-12 17:23:29,611 - HPU available: False, using: 0 HPUs\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading dataset: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████| 320/320 [00:00<00:00, 858.75it/s]\n", + "Loading dataset: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 32/32 [00:00<00:00, 284.05it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 17:23:30,118 - Missing logger folder: /tmp/tmphf3tvpfi/lightning_logs\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "Checkpoint directory /tmp/tmphf3tvpfi exists and is not empty.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 17:23:31,637 - LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n", + "2023-05-12 17:23:31,652 - \n", + " | Name | Type | Params\n", + "---------------------------------------------------------\n", + "0 | autoencoderkl | AutoencoderKL | 75.1 M\n", + "1 | discriminator | PatchDiscriminator | 2.8 M \n", + "2 | perceptual_loss | PerceptualLoss | 2.5 M \n", + "3 | adv_loss | PatchAdversarialLoss | 0 \n", + "---------------------------------------------------------\n", + "77.8 M Trainable params\n", + "2.5 M Non-trainable params\n", + "80.3 M Total params\n", + "321.225 Total estimated model params size (MB)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The number of training batches (20) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e345b86c597145adad868d37e0416041", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Training: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 17:41:32,347 - `Trainer.fit` stopped: `max_epochs=75` reached.\n" + ] + } + ], + "source": [ + "n_epochs = 75 \n", + "val_interval = 10\n", + "\n", + " \n", + "# initialise the LightningModule\n", + "ae_net = AutoEncoder()\n", + "\n", + "# set up checkpoints\n", + "\n", + "checkpoint_callback = ModelCheckpoint(dirpath=root_dir, filename=\"best_metric_model\")\n", + "\n", + " \n", + "# initialise Lightning's trainer.\n", + "trainer = pl.Trainer(devices=1,\n", + " max_epochs=n_epochs,\n", + " check_val_every_n_epoch=val_interval,\n", + " num_sanity_val_steps=0,\n", + " callbacks=checkpoint_callback,\n", + " default_root_dir=root_dir)\n", + "\n", + "# train\n", + "trainer.fit(ae_net)" + ] + }, + { + "cell_type": "markdown", + "id": "c7108b87", + "metadata": {}, + "source": [ + "## Rescaling factor\n", + "\n", + "As mentioned in Rombach et al. [1] Section 4.3.2 and D.1, the signal-to-noise ratio (induced by the scale of the latent space) became crucial in image-to-image translation models (such as the ones used for super-resolution). For this reason, we will compute the component-wise standard deviation to be used as scaling factor." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ccb6ba9f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Scaling factor set to 0.5302040576934814\n" + ] + } + ], + "source": [ + "def get_scale_factor():\n", + " ae_net.eval()\n", + " device = torch.device(\"cuda:0\")\n", + " ae_net.to(device)\n", + "\n", + " train_loader = ae_net.train_dataloader()\n", + " check_data = first(train_loader)\n", + " z = ae_net.autoencoderkl.encode_stage_2_inputs(check_data[\"image\"].to(ae_net.device))\n", + " print(f\"Scaling factor set to {1/torch.std(z)}\")\n", + " scale_factor = 1 / torch.std(z)\n", + " return scale_factor\n", + "\n", + "scale_factor = get_scale_factor()" + ] + }, + { + "cell_type": "markdown", + "id": "3baa2b0f", + "metadata": {}, + "source": [ + "## Define the LightningModule for DiffusionModelUnet (transforms, network, loaders, etc)\n", + "The LightningModule contains a refactoring of your training code. The following module is a reformating of the code in 2d_stable_diffusion_v2_super_resolution." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "731034ec", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [], + "source": [ + "class DiffusionUNET(pl.LightningModule):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.data_dir = root_dir\n", + " self.unet = DiffusionModelUNet(\n", + " spatial_dims=2,\n", + " in_channels=4,\n", + " out_channels=3,\n", + " num_res_blocks=2,\n", + " num_channels=(256, 256, 512, 1024),\n", + " attention_levels=(False, False, True, True),\n", + " num_head_channels=(0, 0, 64, 64),\n", + " )\n", + " self.max_noise_level = 350\n", + " self.scheduler = DDPMScheduler(num_train_timesteps=1000, \n", + " beta_schedule=\"linear\",\n", + " beta_start=0.0015,\n", + " beta_end=0.0195)\n", + " self.z = ae_net.autoencoderkl.eval()\n", + "\n", + "\n", + " def forward(self, x, timesteps, low_res_timesteps):\n", + " return self.unet(x=x, \n", + " timesteps=timesteps,\n", + " class_labels=low_res_timesteps)\n", + " \n", + " \n", + " def prepare_data(self):\n", + " self.train_ds, self.val_ds = get_datasets()\n", + " \n", + " def train_dataloader(self):\n", + " return ThreadDataLoader(self.train_ds, batch_size=16, shuffle=True,\n", + " num_workers=4, persistent_workers=True)\n", + " \n", + " def val_dataloader(self):\n", + " return ThreadDataLoader(self.val_ds, batch_size=16, shuffle=False,\n", + " num_workers=4)\n", + " \n", + " def _calculate_loss(self, batch, batch_idx, plt_image=False):\n", + " images = batch[\"image\"]\n", + " low_res_image = batch[\"low_res_image\"] \n", + " with autocast(enabled=True):\n", + " with torch.no_grad():\n", + " latent = self.z.encode_stage_2_inputs(images) * scale_factor\n", + " \n", + " # Noise augmentation\n", + " noise = torch.randn_like(latent)\n", + " low_res_noise = torch.randn_like(low_res_image)\n", + " timesteps = torch.randint(0, self.scheduler.num_train_timesteps, (latent.shape[0],),\n", + " device=latent.device).long()\n", + " low_res_timesteps = torch.randint(\n", + " 0, self.max_noise_level, (low_res_image.shape[0],), device=latent.device\n", + " ).long()\n", + "\n", + " noisy_latent = self.scheduler.add_noise(original_samples=latent, \n", + " noise=noise, timesteps=timesteps)\n", + " noisy_low_res_image = self.scheduler.add_noise(\n", + " original_samples=low_res_image, noise=low_res_noise, \n", + " timesteps=low_res_timesteps\n", + " )\n", + "\n", + " latent_model_input = torch.cat([noisy_latent, noisy_low_res_image], dim=1)\n", + "\n", + " noise_pred = self.forward(latent_model_input, timesteps, low_res_timesteps)\n", + " loss = F.mse_loss(noise_pred.float(), noise.float())\n", + " \n", + " if plt_image:\n", + " # Sampling image during training\n", + " sampling_image = low_res_image[0].unsqueeze(0)\n", + " latents = torch.randn((1, 3, 16, 16)).to(sampling_image.device)\n", + " low_res_noise = torch.randn((1, 1, 16, 16)).to(sampling_image.device)\n", + " noise_level = 20\n", + " noise_level = torch.Tensor((noise_level,)).long().to(sampling_image.device)\n", + " \n", + " noisy_low_res_image = self.scheduler.add_noise(\n", + " original_samples=sampling_image,\n", + " noise=low_res_noise,\n", + " timesteps=noise_level,\n", + " )\n", + " self.scheduler.set_timesteps(num_inference_steps=1000)\n", + " for t in tqdm(self.scheduler.timesteps, ncols=110):\n", + " with autocast(enabled=True):\n", + " with torch.no_grad():\n", + " latent_model_input = torch.cat([latents, noisy_low_res_image], dim=1)\n", + " noise_pred = self.forward(latent_model_input, \n", + " torch.Tensor((t,)).to(sampling_image.device)\n", + " , noise_level)\n", + " latents, _ = self.scheduler.step(noise_pred, t, latents)\n", + " with torch.no_grad():\n", + " decoded = self.z.decode_stage_2_outputs(latents / scale_factor)\n", + " low_res_bicubic = nn.functional.interpolate(sampling_image, (64, 64), mode=\"bicubic\")\n", + " # plot images\n", + " \n", + " self.images = images\n", + " self.low_res_bicubic = low_res_bicubic\n", + " self.decoded = decoded\n", + " \n", + " return loss\n", + " \n", + " def _plot_image(self, images, low_res_bicubic, decoded):\n", + " plt.figure(figsize=(2, 2))\n", + " plt.style.use(\"default\")\n", + " plt.imshow(\n", + " torch.cat([images[0, 0].cpu(), low_res_bicubic[0, 0].cpu(), decoded[0, 0].cpu()], dim=1),\n", + " vmin=0,\n", + " vmax=1,\n", + " cmap=\"gray\",\n", + " )\n", + " plt.tight_layout()\n", + " plt.axis(\"off\")\n", + " plt.show()\n", + "\n", + " def training_step(self, batch, batch_idx):\n", + " loss = self._calculate_loss(batch, batch_idx)\n", + " self.log(\"train_loss\", loss, batch_size=16, prog_bar=True)\n", + " return loss\n", + " \n", + " def validation_step(self, batch, batch_idx):\n", + " loss = self._calculate_loss(batch, batch_idx, plt_image=True)\n", + " self.log(\"val_loss\", loss, batch_size=16, prog_bar=True)\n", + " return loss\n", + " \n", + " def on_validation_epoch_end(self):\n", + " self._plot_image(self.images, self.low_res_bicubic, self.decoded)\n", + "\n", + " def configure_optimizers(self):\n", + " optimizer = torch.optim.Adam(self.unet.parameters(), lr=5e-5)\n", + " return optimizer" + ] + }, + { + "cell_type": "markdown", + "id": "b386a0c2", + "metadata": {}, + "source": [ + "## Train Diffusion Model\n", + "\n", + "In order to train the diffusion model to perform super-resolution, we will need to concatenate the latent representation of the high-resolution with the low-resolution image. For this, we create a Diffusion model with `in_channels=4`. Since only the outputted latent representation is interesting, we set `out_channels=3`.\n", + "\n", + "As mentioned, we will use the conditioned augmentation (introduced in [2] section 3 and used on Stable Diffusion Upscalers and Imagen Video [3] Section 2.5) as it has been shown critical for cascaded diffusion models, as well for super-resolution tasks. For this, we apply Gaussian noise augmentation to the low-resolution images. We will use a scheduler low_res_scheduler to add this noise, with the t step defining the signal-to-noise ratio and use the t value to condition the diffusion model (inputted using class_labels argument)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "936bbb9c", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 17:41:38,503 - GPU available: True (cuda), used: True\n", + "2023-05-12 17:41:38,503 - TPU available: False, using: 0 TPU cores\n", + "2023-05-12 17:41:38,504 - IPU available: False, using: 0 IPUs\n", + "2023-05-12 17:41:38,504 - HPU available: False, using: 0 HPUs\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading dataset: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████| 320/320 [00:00<00:00, 773.44it/s]\n", + "Loading dataset: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 32/32 [00:00<00:00, 495.25it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 17:41:39,194 - LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n", + "2023-05-12 17:41:39,226 - \n", + " | Name | Type | Params\n", + "-------------------------------------------------\n", + "0 | unet | DiffusionModelUNet | 266 M \n", + "1 | scheduler | DDPMScheduler | 0 \n", + "2 | z | AutoencoderKL | 75.1 M\n", + "-------------------------------------------------\n", + "342 M Trainable params\n", + "0 Non-trainable params\n", + "342 M Total params\n", + "1,368.189 Total estimated model params size (MB)\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "71e4d5d2e391477aac58bfb05ecefb85", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Training: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "be43a3c9e09a4405a067d9fc887e151a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5aa3448de1094d0f82f2808b8131bb9e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9b9fad73a311409082600b576378c2b7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "323be58fabcb4ab4a9a128d9f6cc9b52", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4b79fa6a38cd49f7bb65fc6ad327af73", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "02c9a151f246464da9eebd015e6beb9d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cbaf0368cb304e6bbfa8ceac20f5a247", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2a95535f104048b2ac1756ff1db454f8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8959e5f59fb14792abea3737d90363ee", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Validation: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "40b8269d8e05404da709e1f212edc47c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-05-12 18:22:06,851 - `Trainer.fit` stopped: `max_epochs=200` reached.\n" + ] + } + ], + "source": [ + "n_epochs = 200\n", + "val_interval = 20\n", + "\n", + " \n", + "# initialise the LightningModule\n", + "d_net = DiffusionUNET()\n", + "\n", + "# set up checkpoints\n", + "\n", + "checkpoint_callback = ModelCheckpoint(dirpath=root_dir, filename=\"best_metric_model_dunet\")\n", + "\n", + " \n", + "# initialise Lightning's trainer.\n", + "trainer = pl.Trainer(devices=1,\n", + " max_epochs=n_epochs,\n", + " check_val_every_n_epoch=val_interval,\n", + " num_sanity_val_steps=0,\n", + " callbacks=checkpoint_callback,\n", + " default_root_dir=root_dir)\n", + "\n", + "# train\n", + "trainer.fit(d_net)" + ] + }, + { + "cell_type": "markdown", + "id": "30f24595", + "metadata": {}, + "source": [ + "### Plotting sampling example" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "155be091", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "631635b665454a2884dc88d7d466c50b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000 [00:00 x_t-1\n", + " latents, _ = scheduler.step(noise_pred, t, latents)\n", + "\n", + " with torch.no_grad():\n", + " decoded = ae_net.autoencoderkl.decode_stage_2_outputs(latents / scale_factor)\n", + " return sampling_image, images, decoded\n", + "\n", + "sampling_image, images, decoded = get_images_to_plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "32e16e69", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAw0AAAMVCAYAAAA1ZBgWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADgtklEQVR4nOz9d7xfVZX/j69Q0ntvkAqhtyC9ihpQQGwINlBUVFQY2+g4fgVh1FHH0WFGhFGRAT827KOAoCgdKQFCTSEJpPcESGjh/fvDX86s/Xrfu/bdnPdNbsLz+Xjk8Tjr7lP22Wfv9T4n+7XW7tZoNBoGAAAAAADQDttt6QoAAAAAAEDXho8GAAAAAAAI4aMBAAAAAABC+GgAAAAAAIAQPhoAAAAAACCEjwYAAAAAAAjhowEAAAAAAEL4aAAAAAAAgBA+GgAAAAAAIISPhs3E+eefb926dXtZx/7whz+0bt262bx581pbKce8efOsW7du9sMf/jDc7y9/+Yt169bN/vKXv3RaXQCgdXR0bJdSx6cBwLZLR98TNse7DbQWPhoyPPTQQ/aud73LxowZYz169LDRo0fbO9/5TnvooYe2dNUAXtFs+sG5++67t3RVtlnWr19v559/fpf7T4Ju3brZRz/60S1dDdjG6azf/y9/+cv261//ujWVzHDbbbfZ+eefb2vWrNmi9YBtAz4aAn75y1/aAQccYH/605/sve99r33nO9+xs846y2688UY74IAD7Fe/+lWHz/XP//zPtmHDhpdVj3e/+922YcMGGzdu3Ms6vpUcddRRtmHDBjvqqKO2dFUAoJNZv369XXDBBW1+NNTxaQBdnVb+/iub+6Phggsu6JIfDV3p3QY6xg5bugJdlTlz5ti73/1umzhxot100002bNiwquzcc8+1I4880t797nfbAw88YBMnTmz3PM8884z16dPHdthhB9thh5fX3Ntvv71tv/32L+vYVrPddttZz549t3Q1ALYqGo2GPfvss9arV68tXZWWUcenAXRlWvX7DzFd6d0GOgYzDe3w9a9/3davX2+XXXZZ4jDMzIYOHWqXXnqpPfPMM/a1r32t+vsmje/DDz9s73jHO2zQoEF2xBFHJGWeDRs22Mc//nEbOnSo9evXz04++WRbuHChdevWzc4///xqv7Z0f+PHj7cTTzzRbrnlFjvooIOsZ8+eNnHiRPuf//mf5BqrVq2yT33qU7b33ntb3759rX///nbCCSfY/fff/7LapS2t4jHHHGN77bWXPfDAA3b00Udb7969bfLkyXb11Vebmdlf//pXO/jgg61Xr142ZcoUu+GGG5Jzzp8/3z7ykY/YlClTrFevXjZkyBB729ve1qbOcdM1evXqZWPHjrWLLrrILr/88jZ1kddcc40deeSR1qdPH+vXr5+94Q1vQFb2CmT69Ol2wgknWP/+/a1v37523HHH2R133FGVr1mzxrbffnv7j//4j+pvK1assO22286GDBlijUaj+vuHP/xhGzlyZPaam8bnddddZwceeKD16tXLLr300up65513nu20007Wo0cPmzx5sv3rv/6rvfTSS8k5fvKTn9jUqVOtX79+1r9/f9t7773t29/+drLP448/bm9729ts8ODB1rt3bzvkkEPs97//fbZ+xxxzjB1zzDFNfz/zzDNt/PjxZvb3WIhNvu+CCy6wbt26Jb6pLZ/24osv2oUXXmiTJk2yHj162Pjx4+2f/umf7LnnnmuzfXL+q6Ns8ks/+9nP7IILLrAxY8ZYv3797K1vfautXbvWnnvuOTvvvPNs+PDh1rdvX3vve9/bVKfLL7/cXv3qV9vw4cOtR48etscee9gll1zSdK2XXnrJzj//fBs9erT17t3bjj32WHv44Ydt/PjxduaZZyb7dvRZQ9fi5fz++7Hj0XHSrVs3e+aZZ+yKK66oxtSmfrNp30cffdROPfVU69+/vw0ZMsTOPfdce/bZZ6tzRHFKOkY//elPm5nZhAkTquttOr69epiZLVy40N73vvfZiBEjrEePHrbnnnvaD37wg6brLViwwE455RTr06ePDR8+3P7hH/6haWy1R/Ru85e//KXynXvvvXf1zvHLX/7S9t57b+vZs6dNnTrVpk+fnpzzgQcesDPPPNMmTpxoPXv2tJEjR9r73vc+W7lyZdP1N12jZ8+eNmnSJLv00kvbjdW66qqrbOrUqdarVy8bPHiwnXbaafbkk0926D63Jfhvonb43e9+Z+PHj7cjjzyyzfKjjjrKxo8f3+YP9Nve9jbbZZdd7Mtf/nLywqGceeaZ9rOf/cze/e532yGHHGJ//etf7Q1veEOH6zh79mx761vfameddZadccYZ9oMf/MDOPPNMmzp1qu25555m9veXil//+tf2tre9zSZMmGBLly61Sy+91I4++mh7+OGHbfTo0R2+XsTq1avtxBNPtNNOO83e9ra32SWXXGKnnXaa/ehHP7LzzjvPPvShD9k73vEO+/rXv25vfetb7cknn7R+/fqZmdldd91lt912m5122mk2duxYmzdvnl1yySV2zDHH2MMPP2y9e/c2s787sWOPPda6detmn/vc56xPnz72ve99z3r06NFUnyuvvNLOOOMMmzZtmv3rv/6rrV+/3i655BI74ogjbPr06W06d9j2eOihh+zII4+0/v3722c+8xnbcccd7dJLL7Vjjjmm+pgdOHCg7bXXXnbTTTfZxz/+cTMzu+WWW6xbt262atUqe/jhh6vxdPPNN7frE5THHnvMTj/9dDv77LPtAx/4gE2ZMsXWr19vRx99tC1cuNDOPvts23nnne22226zz33uc7Z48WL71re+ZWZm119/vZ1++ul23HHH2b/+67+amdkjjzxit956q5177rlmZrZ06VI77LDDbP369fbxj3/chgwZYldccYWdfPLJdvXVV9ub3vSmWm03bNgwu+SSS+zDH/6wvelNb7I3v/nNZma2zz77tHvM+9//frviiivsrW99q33yk5+0O++8077yla/YI4880iTn6Ij/KuUrX/mK9erVyz772c/a7Nmz7eKLL7Ydd9zRtttuO1u9erWdf/75dscdd9gPf/hDmzBhgv1//9//Vx17ySWX2J577mknn3yy7bDDDva73/3OPvKRj9hLL71k55xzTrXf5z73Ofva175mJ510kk2bNs3uv/9+mzZtWvJSZ2YdftbQ9ajz+5/jyiuvtPe///120EEH2Qc/+EEzM5s0aVKyz6mnnmrjx4+3r3zlK3bHHXfYf/zHf9jq1auLP6rf/OY328yZM+3HP/6x/fu//7sNHTrUzP4+tqN6LF261A455JAqdmjYsGF2zTXX2FlnnWXr1q2z8847z8z+/h+fxx13nD3xxBP28Y9/3EaPHm1XXnml/fnPfy5uF8/s2bPtHe94h5199tn2rne9y77xjW/YSSedZN/97nftn/7pn+wjH/mImf19vJ966qn22GOP2Xbb/f3/wK+//np7/PHH7b3vfa+NHDnSHnroIbvsssvsoYcesjvuuKP6IJg+fbodf/zxNmrUKLvgggts48aN9qUvfanpI9HM7F/+5V/sC1/4gp166qn2/ve/35YvX24XX3yxHXXUUTZ9+nQbOHBgrfvdqmhAE2vWrGmYWeONb3xjuN/JJ5/cMLPGunXrGo1Go/HFL36xYWaN008/vWnfTWWbuOeeexpm1jjvvPOS/c4888yGmTW++MUvVn+7/PLLG2bWmDt3bvW3cePGNcyscdNNN1V/W7ZsWaNHjx6NT37yk9Xfnn322cbGjRuTa8ydO7fRo0ePxpe+9KXkb2bWuPzyy8N7vvHGGxtm1rjxxhurvx199NENM2v8v//3/6q/Pfroow0za2y33XaNO+64o/r7dddd13Sd9evXN13n9ttvb5hZ43/+53+qv33sYx9rdOvWrTF9+vTqbytXrmwMHjw4aZ+nnnqqMXDgwMYHPvCB5JxLlixpDBgwoOnvsHWyaVzcdddd7e5zyimnNLp3796YM2dO9bdFixY1+vXr1zjqqKOqv51zzjmNESNGVPYnPvGJxlFHHdUYPnx445JLLmk0Gn/va926dWt8+9vfztZt0/i89tprk79feOGFjT59+jRmzpyZ/P2zn/1sY/vtt2888cQTjUaj0Tj33HMb/fv3b7z44ovtXuO8885rmFnj5ptvrv721FNPNSZMmNAYP358Ne7bGttHH3104+ijj2465xlnnNEYN25cZS9fvrzJH21Cfdp9993XMLPG+9///mS/T33qUw0za/z5z3+u/tZR/9UeZtY455xzKnuTX9prr70azz//fPX3008/vdGtW7fGCSeckBx/6KGHJvfZaLTth6ZNm9aYOHFiZS9ZsqSxww47NE455ZRkv/PPP79hZo0zzjij+ltHnzV0LV7u77+OnU3oOGk0Go0+ffokfUX3Pfnkk5O/f+QjH2mYWeP+++9vNBrx77WO169//etN7w+5epx11lmNUaNGNVasWJH8/bTTTmsMGDCgGivf+ta3GmbW+NnPflbt88wzzzQmT57c9J7QFtG7zW233Vb9bdN7Q69evRrz58+v/n7ppZc2XaetcfzjH/+4yd+cdNJJjd69ezcWLlxY/W3WrFmNHXbYIXle8+bNa2y//faNf/mXf0nOOWPGjMYOO+zQ9PdtHeRJbfDUU0+ZmVX/E94em8rXrVuX/P1DH/pQ9hrXXnutmVn1xbyJj33sYx2u5x577JH8T8iwYcNsypQp9vjjj1d/69GjR/UFvnHjRlu5cqX17dvXpkyZYvfee2+Hr5Wjb9++dtppp1X2lClTbODAgbb77rvbwQcfXP1907avo9d5v/DCC7Zy5UqbPHmyDRw4MKnjtddea4ceeqjtt99+1d8GDx5s73znO5O6XH/99bZmzRo7/fTTbcWKFdW/7bff3g4++GC78cYbW3bf0HXZuHGj/fGPf7RTTjkl0R2PGjXK3vGOd9gtt9xSjd0jjzzSli5dao899piZ/X1G4aijjrIjjzzSbr75ZjP7++xDo9Ho8EzDhAkTbNq0acnffv7zn9uRRx5pgwYNSvrma17zGtu4caPddNNNZmY2cOBAe+aZZ+z6669v9/x/+MMf7KCDDqokkGZ/H4cf/OAHbd68efbwww93qJ6t4g9/+IOZmX3iE59I/v7JT37SzKzpf2U74r9Kec973mM77rhjZR988MHWaDTsfe97X7LfwQcfbE8++aS9+OKL1d+8H1q7dq2tWLHCjj76aHv88cdt7dq1Zmb2pz/9yV588cUO+e2OPmvoWtT9/W8FfmbL7P/616Yx1pk0Gg37xS9+YSeddJI1Go2k706bNs3Wrl1b/S7/4Q9/sFGjRtlb3/rW6vjevXtXMxcvlz322MMOPfTQyt703vDqV7/adt5556a/t/c+8eyzz9qKFSvskEMOMTOr6r1x40a74YYb7JRTTknUFpMnT7YTTjghqcsvf/lLe+mll+zUU09N2mLkyJG2yy67vOLeJ5AntcEmZ7DJebRHe85lwoQJ2WvMnz/ftttuu6Z9J0+e3OF6+sGziUGDBtnq1asr+6WXXrJvf/vb9p3vfMfmzp1rGzdurMqGDBnS4WvlGDt2bJMOcMCAAbbTTjs1/c3Mkjpu2LDBvvKVr9jll19uCxcuTCRdm36szf7eZt6RbELbbNasWWb2dwfTFv379+/ILcFWzvLly239+vU2ZcqUprLdd9/dXnrpJXvyySdtzz33rF5eb775Zhs7dqxNnz7dLrroIhs2bJh94xvfqMr69+9v++67r5mZPf300/b0009X59x+++2Tqe22/MCsWbPsgQceaHMK3Mxs2bJlZvb3/0z42c9+ZieccIKNGTPGXve619mpp55qxx9/fLXv/Pnzkw9yf2+byvfaa6+4kVrIJp+m43HkyJE2cOBAmz9/fvL3jvivUvScm/xNW37opZdesrVr11Z+8NZbb7UvfvGLdvvtt9v69euT/deuXWsDBgyo7kHvcfDgwTZo0KDkbx191tC1qPv73wp22WWXxJ40aZJtt912m2U9g+XLl9uaNWvssssus8suu6zNfTb13fnz59vkyZObfvvb8rkllIxjs/R9YtWqVXbBBRfYT37yk6Yxtul9YtmyZbZhw4Y237faep9oNBpNz2QT/j8pXgnw0dAGAwYMsFGjRtkDDzwQ7vfAAw/YmDFjml5CN1eGlPayDviX7i9/+cv2hS98wd73vvfZhRdeaIMHD7btttvOzjvvvJYG47VXl47U8WMf+5hdfvnldt5559mhhx5qAwYMsG7dutlpp532suq46Zgrr7yyzaBVMr6AMnr0aJswYYLddNNNNn78eGs0GnbooYfasGHD7Nxzz7X58+fbzTffbIcddlg1c/eNb3zDLrjgguoc48aNS37U2/IDL730kr32ta+1z3zmM23WY9dddzUzs+HDh9t9991n1113nV1zzTV2zTXX2OWXX27vec977Iorrqh9v926dWsz3sr/p0Kdc3eEjviGUl6uH5ozZ44dd9xxtttuu9k3v/lN22mnnax79+72hz/8wf793//9Zfuhjjxr6Fq83N//9vp9Z4ypzrzWpr7+rne9y84444w294nimlpBnfeJU0891W677Tb79Kc/bfvtt5/17dvXXnrpJTv++ONf9jju1q2bXXPNNW1ev2/fvsXn3Jrh7akdTjzxRPvv//5vu+WWW5Lp/03cfPPNNm/ePDv77LNf1vnHjRtnL730ks2dOzf5gp09e/bLrnNbXH311Xbsscfa97///eTva9asqYKitjRXX321nXHGGfZv//Zv1d+effbZprzS48aNa7N99G+bgrmGDx9ur3nNa1pfYdgqGDZsmPXu3buSHHkeffRR22677ZL/uTryyCPtpptusgkTJth+++1n/fr1s3333dcGDBhg1157rd17773JR8J73vOexDd05D8LJk2aZE8//XSH+mX37t3tpJNOspNOOsleeukl+8hHPmKXXnqpfeELX7DJkyfbuHHj2r03Mwtznw8aNKhNGZDOBpSs+LzJp82aNaua7TD7e1DlmjVrunQu9t/97nf23HPP2W9/+9vkfzlVerDpHmbPnp3MJK1cubJphqTkWUPX4uX8/g8aNKjNtRB0TJnlx9WsWbOS/jV79mx76aWXqgQem2a19Hql12qrbNiwYdavXz/buHFjtu+OGzfOHnzwQWs0Gsm52vJLm4PVq1fbn/70J7vggguSJAeb1AebGD58uPXs2bPD7xONRsMmTJjAh76RcrVdPv3pT1uvXr3s7LPPbkrVtWrVKvvQhz5kvXv3rtKZlbJJ6/yd73wn+fvFF1/88ircDttvv33T/9z9/Oc/t4ULF7b0OnVoq44XX3xx0/+aTJs2zW6//Xa77777qr+tWrXKfvSjHzXt179/f/vyl79sL7zwQtP1li9f3rrKQ5dl++23t9e97nX2m9/8JpkBWLp0qf2///f/7IgjjkhmCY888kibN2+e/fSnP63kStttt50ddthh9s1vftNeeOGFRIM/ceJEe81rXlP9O/zww7N1OvXUU+3222+36667rqlszZo1lcZefc52221X/e/epnSGr3/96+1vf/ub3X777dV+zzzzjF122WU2fvx422OPPdqtx6RJk+zRRx9NxsL9999vt956a7Lfpsxlbb0MKa9//evNzJqyAn3zm980MyvKDLe52fQ/iCqNvPzyy5P9jjvuONthhx2aUrH+53/+Z9M5O/qsoevxcn7/J02aZGvXrk1mKBYvXtzmInB9+vQJx9R//dd/Jfam94JNevv+/fvb0KFDm+Ji9H1i07XM2h7DbdVj++23t7e85S32i1/8wh588MGmY7zPeP3rX2+LFi2q0qubWZWqdkvQ1jg2a/ZJ22+/vb3mNa+xX//617Zo0aLq77Nnz7Zrrrkm2ffNb36zbb/99nbBBRc0nbfRaLSZynVbhpmGdthll13siiuusHe+8522995721lnnWUTJkywefPm2fe//31bsWKF/fjHP25KldZRpk6dam95y1vsW9/6lq1cubJKuTpz5kwzK/sfvogTTzzRvvSlL9l73/teO+yww2zGjBn2ox/9qEstSHPiiSfalVdeaQMGDLA99tjDbr/9drvhhhuaYi4+85nP2FVXXWWvfe1r7WMf+1iVcnXnnXe2VatWVW3Wv39/u+SSS+zd7363HXDAAXbaaafZsGHD7IknnrDf//73dvjhh7f5Iw9bJz/4wQ+qxAKec8891y666CK7/vrr7YgjjrCPfOQjtsMOO9ill15qzz33XJJj3cyqD4LHHnvMvvzlL1d/P+qoo+yaa66xHj162Kte9apadf30pz9tv/3tb+3EE0+s0os+88wzNmPGDLv66qtt3rx5NnToUHv/+99vq1atsle/+tU2duxYmz9/vl188cW23377Vf+L/9nPftZ+/OMf2wknnGAf//jHbfDgwXbFFVfY3Llz7Re/+EUlo2qL973vffbNb37Tpk2bZmeddZYtW7bMvvvd79qee+6ZBHb26tXL9thjD/vpT39qu+66qw0ePNj22muvNmMl9t13XzvjjDPssssuszVr1tjRRx9tf/vb3+yKK66wU045xY499thabdeZvO51r6tmds4++2x7+umn7b//+79t+PDhtnjx4mq/ESNG2Lnnnmv/9m//ZieffLIdf/zxdv/999s111xjQ4cOTfx2R581dD1ezu//aaedZv/4j/9ob3rTm+zjH/94leZ71113bUo6MnXqVLvhhhvsm9/8ZiWN9PFJc+fOrfrX7bffbldddZW94x3vqOKpzP6e3virX/2qvf/977cDDzzQbrrppur9Qa9lZvb5z3/eTjvtNNtxxx3tpJNOsj59+rRbj69+9at244032sEHH2wf+MAHbI899rBVq1bZvffeazfccIOtWrXKzMw+8IEP2H/+53/ae97zHrvnnnts1KhRduWVV1b/2bC56d+/vx111FH2ta99zV544QUbM2aM/fGPf7S5c+c27Xv++efbH//4Rzv88MPtwx/+sG3cuNH+8z//0/baa6/kPyYnTZpkF110kX3uc5+zefPm2SmnnGL9+vWzuXPn2q9+9Sv74Ac/aJ/61Kc2411uYTZrrqatkAceeKBx+umnN0aNGtXYcccdGyNHjmycfvrpjRkzZjTtuyld2vLly9st8zzzzDONc845pzF48OBG3759G6ecckrjsccea5hZ46tf/Wq1X3tpyd7whjc0XUdTKT777LONT37yk41Ro0Y1evXq1Tj88MMbt99+e9N+dVOu7rnnnk37tldHk3SJq1evbrz3ve9tDB06tNG3b9/GtGnTGo8++mhj3LhxTengpk+f3jjyyCMbPXr0aIwdO7bxla98pfEf//EfDTNrLFmypKmu06ZNawwYMKDRs2fPxqRJkxpnnnlm4+677w7vEbYONo2L9v49+eSTjUaj0bj33nsb06ZNa/Tt27fRu3fvxrHHHpuk8/MMHz68YWaNpUuXVn+75ZZbGmbWOPLIIztct/b6fqPx97Son/vc5xqTJ09udO/evTF06NDGYYcd1vjGN75RpQu9+uqrG6973esaw4cPb3Tv3r2x8847N84+++zG4sWLk3PNmTOn8da3vrUxcODARs+ePRsHHXRQ43//93+Tfdob21dddVVj4sSJje7duzf222+/xnXXXddm2sjbbrutMXXq1Eb37t2TdI5t+bQXXnihccEFFzQmTJjQ2HHHHRs77bRT43Of+1zj2Wef7VD7tJcKVlEfsskv/fznP0/2ay8tb1u++re//W1jn332afTs2bMxfvz4xr/+6782fvCDHzT53hdffLHxhS98oTFy5MhGr169Gq9+9asbjzzySGPIkCGND33oQ8l1OvKsoetS8vvfaDQaf/zjHxt77bVXo3v37o0pU6Y0rrrqqjbHyaOPPto46qijGr169UpS9W7a9+GHH2689a1vbfTr168xaNCgxkc/+tHGhg0bknOsX7++cdZZZzUGDBjQ6NevX+PUU09tLFu2rM0UyRdeeGFjzJgxje222y7pz+3Vo9FoNJYuXdo455xzGjvttFN178cdd1zjsssuS849f/78xsknn9zo3bt3Y+jQoY1zzz23ce2119ZKudqR94ZG4/9829e//vXqbwsWLGi86U1vagwcOLAxYMCAxtve9rbGokWL2myXP/3pT43999+/0b1798akSZMa3/ve9xqf/OQnGz179my6/i9+8YvGEUcc0ejTp0+jT58+jd12261xzjnnNB577LHwHrc1ujUaNaLOoOXcd999tv/++9tVV13VlEoU2ua8886zSy+91J5++mmWpAeAzc6aNWts0KBBdtFFF9nnP//5LV0d2Eo5//zz7YILLrDly5czC7WFOOWUU+yhhx5qioOAv0NMwxZkw4YNTX/71re+Zdttt50dddRRW6BGXR9ts5UrV9qVV15pRxxxBB8MANDptOe3zcyOOeaYzVsZAHjZ6FieNWuW/eEPf2AcBxDTsAX52te+Zvfcc48de+yxtsMOO1SpFT/4wQ825SOGv3PooYfaMcccY7vvvrstXbrUvv/979u6devsC1/4wpauGgC8AvjpT39qP/zhD+31r3+99e3b12655Rb78Y9/bK973es6FAwPAF2DiRMn2plnnmkTJ060+fPn2yWXXGLdu3dvN00y8NGwRTnssMPs+uuvtwsvvNCefvpp23nnne38889nejvg9a9/vV199dV22WWXWbdu3eyAAw6w73//+8zMAMBmYZ999rEddtjBvva1r9m6deuq4OiL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uo9x0DgoXT9h6dKlie3XO1GfksPXQ8dntIaTWerLcs+klURxcHXWXsgdWxJLEcWd5NZ0yMFMAwAAAAAAhPDRAAAAAAAAIciT2kGn91atWlVtf/GLX0zKVI6k+KlBnULNTat5GYBKAubOnZvYc+bMSez58+dX2z6lmllzOjOdJvVTlJquTac6VV4xYcKEalunWFWOtMceeyR2NOWosjCVYvh6vfOd70zKfve73yX2LbfcYrDto/IAlQdG40un/wcPHpzYXpKk8qNIjmSWpmDVfp3D31NOYqRj10twdPzkUrB636VSApU06Dj3586llVYf6M+l51UZlEo4vE/Q82qdNQ3lsmXLqm2935LU2JsztWJXp1TOUQf9rY3qEaUXzknTVG7n/Yj2G/UpkyZNSmwveYxSLbdVZ18vHcu5ceN/p/V+V65cmdiaYr4kvXCU1jknD9V78Oh4zMnCovJcSt3O6rO5PllybGfWmZkGAAAAAAAI4aMBAAAAAABC+GgAAAAAAIAQYhraQeMFvvOd71TbqpdXIi2wolo01S16DfK9996blN16662J7VOfmaUaQNU6a0yDpjd76qmnqm3VTWsaVa2zP1bjLObNm5fYXtttZrbPPvtU24ceemhSphrkqF31/r7yla8k9pFHHtnusbDtkItp8OMvF9OgaVV32WWXNrfNmvv1iBEjErskjkHr7MeXTwuqZWbN48DbOq5VBx2lP9axpz5A29LHT2gshdZRNeLeN2mZxjBEaXFViz18+PDE1nStPs5LNeDaNjm9uaduysOuzuaMW4jw143Sopo1P78opkF//6LYA42D2muvvRJb/YbvV9pf1Q9EaY71frS/qp/wvkD9gsb66LG+faJ0yWbxe0gupiGKR9OynKbft0dpf41Sn5b09TqxTjkfEpXXiZ0wY6YBAAAAAAAy8NEAAAAAAAAhfDQAAAAAAEBIl49p0Ny8Xm+nOrZBgwYl9urVqxPb619VH6+av9e85jWJffbZZ1fbPs7ArFmnpzo+X0/VGqrmesGCBYnt9YR33313UqZts99++yV2tKS76iUjHbFqGDW3tN6DX9Ni8eLFSZm2lcaOePuee+5JyjQOYd99901sr8nWdSd23nnnxNbn+6tf/ara1n6Ui//wz1vbXHWa25p+uauTi2nwz0c1tNoPdD2SiRMntrlt1hzDoOPL91XtE7n1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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "low_res_bicubic = nn.functional.interpolate(sampling_image, (64, 64), mode=\"bicubic\")\n", + "fig, axs = plt.subplots(num_samples, 3, figsize=(8, 8))\n", + "axs[0, 0].set_title(\"Original image\")\n", + "axs[0, 1].set_title(\"Low-resolution Image\")\n", + "axs[0, 2].set_title(\"Outputted image\")\n", + "for i in range(0, num_samples):\n", + " axs[i, 0].imshow(images[i, 0].cpu(), vmin=0, vmax=1, cmap=\"gray\")\n", + " axs[i, 0].axis(\"off\")\n", + " axs[i, 1].imshow(low_res_bicubic[i, 0].cpu(), vmin=0, vmax=1, cmap=\"gray\")\n", + " axs[i, 1].axis(\"off\")\n", + " axs[i, 2].imshow(decoded[i, 0].cpu().detach().numpy(), vmin=0, vmax=1, cmap=\"gray\")\n", + " axs[i, 2].axis(\"off\")\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "7fa52acc", + "metadata": {}, + "source": [ + "### Clean-up data directory" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "3a6f6d5a", + "metadata": {}, + "outputs": [], + "source": [ + "if directory is None:\n", + " shutil.rmtree(root_dir)" + ] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "formats": "ipynb,py:percent" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tutorials/generative/2d_super_resolution/2d_stable_diffusion_v2_super_resolution-lightning.py b/tutorials/generative/2d_super_resolution/2d_stable_diffusion_v2_super_resolution-lightning.py new file mode 100644 index 00000000..34c8c8f0 --- /dev/null +++ b/tutorials/generative/2d_super_resolution/2d_stable_diffusion_v2_super_resolution-lightning.py @@ -0,0 +1,540 @@ +# --- +# jupyter: +# jupytext: +# cell_metadata_filter: -all +# formats: ipynb,py:percent +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.14.5 +# kernelspec: +# display_name: Python 3 (ipykernel) +# language: python +# name: python3 +# --- + +# %% +# Copyright (c) MONAI Consortium +# 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. + +# %% [markdown] +# # Super-resolution using Stable Diffusion v2 Upscalers +# +# Tutorial to illustrate the super-resolution task on medical images using Latent Diffusion Models (LDMs) [1]. For that, we will use an autoencoder to obtain a latent representation of the high-resolution images. Then, we train a diffusion model to infer this latent representation when conditioned on a low-resolution image. +# +# To improve the performance of our models, we will use a method called "noise conditioning augmentation" (introduced in [2] and used in Stable Diffusion v2.0 and Imagen Video [3]). During the training, we add noise to the low-resolution images using a random signal-to-noise ratio, and we condition the diffusion models on the amount of noise added. At sampling time, we use a fixed signal-to-noise ratio, representing a small amount of augmentation that aids in removing artefacts in the samples. +# +# +# [1] - Rombach et al. "High-Resolution Image Synthesis with Latent Diffusion Models" https://arxiv.org/abs/2112.10752 +# +# [2] - Ho et al. "Cascaded diffusion models for high fidelity image generation" https://arxiv.org/abs/2106.15282 +# +# [3] - Ho et al. "High Definition Video Generation with Diffusion Models" https://arxiv.org/abs/2210.02303 + +# %% [markdown] +# ## Set up environment using Colab +# + +# %% +# !python -c "import monai" || pip install -q "monai-weekly[tqdm]" +# !python -c "import pytorch_lightning" || pip install pytorch-lightning +# !python -c "import matplotlib" || pip install -q matplotlib +# %matplotlib inline + +# %% [markdown] +# ## Set up imports + +# %% +import os +import shutil +import tempfile +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import torch +import torch.nn.functional as F +from monai import transforms +from monai.apps import MedNISTDataset +from monai.config import print_config +from monai.data import CacheDataset, ThreadDataLoader +from monai.utils import first, set_determinism +from torch.cuda.amp import GradScaler, autocast +from torch import nn +from tqdm.notebook import tqdm + +from generative.losses import PatchAdversarialLoss, PerceptualLoss +from generative.networks.nets import AutoencoderKL, DiffusionModelUNet, PatchDiscriminator +from generative.networks.schedulers import DDPMScheduler + +import pytorch_lightning as pl +from pytorch_lightning.callbacks.model_checkpoint import ModelCheckpoint + +print_config() + +# %% +# for reproducibility purposes set a seed +set_determinism(42) + +# %% [markdown] +# ## Setup a data directory and download dataset +# Specify a MONAI_DATA_DIRECTORY variable, where the data will be downloaded. If not specified a temporary directory will be used. + +# %% +directory = os.environ.get("MONAI_DATA_DIRECTORY") +root_dir = tempfile.mkdtemp() if directory is None else directory +print(root_dir) + +# %% +train_data = MedNISTDataset(root_dir=root_dir, section="training", download=True, seed=0) +train_datalist = [{"image": item["image"]} for item in train_data.data if item["class_name"] == "HeadCT"] +val_data = MedNISTDataset(root_dir=root_dir, section="validation", download=True, seed=0) +val_datalist = [{"image": item["image"]} for item in val_data.data if item["class_name"] == "HeadCT"] + + +# %% [markdown] +# ## Setup utils functions + + +# %% +def get_train_transforms(): + image_size = 64 + train_transforms = transforms.Compose( + [ + transforms.LoadImaged(keys=["image"]), + transforms.EnsureChannelFirstd(keys=["image"]), + transforms.ScaleIntensityRanged(keys=["image"], a_min=0.0, a_max=255.0, b_min=0.0, b_max=1.0, clip=True), + transforms.RandAffined( + keys=["image"], + rotate_range=[(-np.pi / 36, np.pi / 36), (-np.pi / 36, np.pi / 36)], + translate_range=[(-1, 1), (-1, 1)], + scale_range=[(-0.05, 0.05), (-0.05, 0.05)], + spatial_size=[image_size, image_size], + padding_mode="zeros", + prob=0.5, + ), + transforms.CopyItemsd(keys=["image"], times=1, names=["low_res_image"]), + transforms.Resized(keys=["low_res_image"], spatial_size=(16, 16)), + ] + ) + return train_transforms + + +def get_val_transforms(): + val_transforms = transforms.Compose( + [ + transforms.LoadImaged(keys=["image"]), + transforms.EnsureChannelFirstd(keys=["image"]), + transforms.ScaleIntensityRanged(keys=["image"], a_min=0.0, a_max=255.0, b_min=0.0, b_max=1.0, clip=True), + transforms.CopyItemsd(keys=["image"], times=1, names=["low_res_image"]), + transforms.Resized(keys=["low_res_image"], spatial_size=(16, 16)), + ] + ) + return val_transforms + + +def get_datasets(): + train_transforms = get_train_transforms() + val_transforms = get_val_transforms() + train_ds = CacheDataset(data=train_datalist[:320], transform=train_transforms) + val_ds = CacheDataset(data=val_datalist[:32], transform=val_transforms) + return train_ds, val_ds + + +# %% [markdown] +# ## Define the LightningModule for AutoEncoder (transforms, network, loaders, etc) +# The LightningModule contains a refactoring of your training code. The following module is a reformating of the code in 2d_stable_diffusion_v2_super_resolution. +# + + +# %% +class AutoEncoder(pl.LightningModule): + def __init__(self): + super().__init__() + self.data_dir = root_dir + self.autoencoderkl = AutoencoderKL( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_channels=(256, 512, 512), + latent_channels=3, + num_res_blocks=2, + norm_num_groups=32, + attention_levels=(False, False, True), + ) + self.discriminator = PatchDiscriminator(spatial_dims=2, in_channels=1, num_layers_d=3, num_channels=64) + self.perceptual_loss = PerceptualLoss(spatial_dims=2, network_type="alex") + self.perceptual_weight = 0.002 + self.autoencoder_warm_up_n_epochs = 10 + self.automatic_optimization = False + self.adv_loss = PatchAdversarialLoss(criterion="least_squares") + self.adv_weight = 0.005 + self.kl_weight = 1e-6 + + def forward(self, z): + return self.autoencoderkl(z) + + def prepare_data(self): + self.train_ds, self.val_ds = get_datasets() + + def train_dataloader(self): + return ThreadDataLoader(self.train_ds, batch_size=16, shuffle=True, num_workers=4, persistent_workers=True) + + def val_dataloader(self): + return ThreadDataLoader(self.val_ds, batch_size=16, shuffle=False, num_workers=4) + + def _compute_loss_generator(self, images, reconstruction, z_mu, z_sigma): + recons_loss = F.l1_loss(reconstruction.float(), images.float()) + p_loss = self.perceptual_loss(reconstruction.float(), images.float()) + kl_loss = 0.5 * torch.sum(z_mu.pow(2) + z_sigma.pow(2) - torch.log(z_sigma.pow(2)) - 1, dim=[1, 2, 3]) + kl_loss = torch.sum(kl_loss) / kl_loss.shape[0] + loss_g = recons_loss + (self.kl_weight * kl_loss) + (self.perceptual_weight * p_loss) + return loss_g, recons_loss + + def _compute_loss_discriminator(self, images, reconstruction): + logits_fake = self.discriminator(reconstruction.contiguous().detach())[-1] + loss_d_fake = self.adv_loss(logits_fake, target_is_real=False, for_discriminator=True) + logits_real = self.discriminator(images.contiguous().detach())[-1] + loss_d_real = self.adv_loss(logits_real, target_is_real=True, for_discriminator=True) + discriminator_loss = (loss_d_fake + loss_d_real) * 0.5 + loss_d = self.adv_weight * discriminator_loss + return loss_d, discriminator_loss + + def training_step(self, batch, batch_idx): + optimizer_g, optimizer_d = self.optimizers() + images = batch["image"] + reconstruction, z_mu, z_sigma = self.forward(images) + loss_g, recons_loss = self._compute_loss_generator(images, reconstruction, z_mu, z_sigma) + self.log("recons_loss", recons_loss, batch_size=16, prog_bar=True) + + if self.current_epoch > self.autoencoder_warm_up_n_epochs: + logits_fake = self.discriminator(reconstruction.contiguous().float())[-1] + generator_loss = self.adv_loss(logits_fake, target_is_real=True, for_discriminator=False) + loss_g += self.adv_weight * generator_loss + self.log("gen_loss", generator_loss, batch_size=16, prog_bar=True) + + self.log("loss_g", loss_g, batch_size=16, prog_bar=True) + self.manual_backward(loss_g) + optimizer_g.step() + optimizer_g.zero_grad() + self.untoggle_optimizer(optimizer_g) + + if self.current_epoch > self.autoencoder_warm_up_n_epochs: + loss_d, discriminator_loss = self._compute_loss_discriminator(images, reconstruction) + self.log("disc_loss", loss_d, batch_size=16, prog_bar=True) + self.log("train_loss_d", loss_d, batch_size=16, prog_bar=True) + self.manual_backward(loss_d) + optimizer_d.step() + optimizer_d.zero_grad() + self.untoggle_optimizer(optimizer_d) + + def validation_step(self, batch, batch_idx): + images = batch["image"] + reconstruction, z_mu, z_sigma = self.autoencoderkl(images) + recons_loss = F.l1_loss(images.float(), reconstruction.float()) + self.log("val_loss_d", recons_loss, batch_size=1, prog_bar=True) + self.images = images + self.reconstruction = reconstruction + + def on_validation_epoch_end(self): + # ploting reconstruction + plt.figure(figsize=(2, 2)) + plt.imshow( + torch.cat([self.images[0, 0].cpu(), self.reconstruction[0, 0].cpu()], dim=1), vmin=0, vmax=1, cmap="gray" + ) + plt.tight_layout() + plt.axis("off") + plt.show() + + def configure_optimizers(self): + optimizer_g = torch.optim.Adam(self.autoencoderkl.parameters(), lr=5e-5) + optimizer_d = torch.optim.Adam(self.discriminator.parameters(), lr=1e-4) + return [optimizer_g, optimizer_d], [] + + +# %% [markdown] +# ## Train Autoencoder + +# %% +n_epochs = 75 +val_interval = 10 + + +# initialise the LightningModule +ae_net = AutoEncoder() + +# set up checkpoints + +checkpoint_callback = ModelCheckpoint(dirpath=root_dir, filename="best_metric_model") + + +# initialise Lightning's trainer. +trainer = pl.Trainer( + devices=1, + max_epochs=n_epochs, + check_val_every_n_epoch=val_interval, + num_sanity_val_steps=0, + callbacks=checkpoint_callback, + default_root_dir=root_dir, +) + +# train +trainer.fit(ae_net) + + +# %% [markdown] +# ## Rescaling factor +# +# As mentioned in Rombach et al. [1] Section 4.3.2 and D.1, the signal-to-noise ratio (induced by the scale of the latent space) became crucial in image-to-image translation models (such as the ones used for super-resolution). For this reason, we will compute the component-wise standard deviation to be used as scaling factor. + + +# %% +def get_scale_factor(): + ae_net.eval() + device = torch.device("cuda:0") + ae_net.to(device) + + train_loader = ae_net.train_dataloader() + check_data = first(train_loader) + z = ae_net.autoencoderkl.encode_stage_2_inputs(check_data["image"].to(ae_net.device)) + print(f"Scaling factor set to {1/torch.std(z)}") + scale_factor = 1 / torch.std(z) + return scale_factor + + +scale_factor = get_scale_factor() + + +# %% [markdown] +# ## Define the LightningModule for DiffusionModelUnet (transforms, network, loaders, etc) +# The LightningModule contains a refactoring of your training code. The following module is a reformating of the code in 2d_stable_diffusion_v2_super_resolution. + + +# %% +class DiffusionUNET(pl.LightningModule): + def __init__(self): + super().__init__() + self.data_dir = root_dir + self.unet = DiffusionModelUNet( + spatial_dims=2, + in_channels=4, + out_channels=3, + num_res_blocks=2, + num_channels=(256, 256, 512, 1024), + attention_levels=(False, False, True, True), + num_head_channels=(0, 0, 64, 64), + ) + self.max_noise_level = 350 + self.scheduler = DDPMScheduler( + num_train_timesteps=1000, beta_schedule="linear", beta_start=0.0015, beta_end=0.0195 + ) + self.z = ae_net.autoencoderkl.eval() + + def forward(self, x, timesteps, low_res_timesteps): + return self.unet(x=x, timesteps=timesteps, class_labels=low_res_timesteps) + + def prepare_data(self): + self.train_ds, self.val_ds = get_datasets() + + def train_dataloader(self): + return ThreadDataLoader(self.train_ds, batch_size=16, shuffle=True, num_workers=4, persistent_workers=True) + + def val_dataloader(self): + return ThreadDataLoader(self.val_ds, batch_size=16, shuffle=False, num_workers=4) + + def _calculate_loss(self, batch, batch_idx, plt_image=False): + images = batch["image"] + low_res_image = batch["low_res_image"] + with autocast(enabled=True): + with torch.no_grad(): + latent = self.z.encode_stage_2_inputs(images) * scale_factor + + # Noise augmentation + noise = torch.randn_like(latent) + low_res_noise = torch.randn_like(low_res_image) + timesteps = torch.randint( + 0, self.scheduler.num_train_timesteps, (latent.shape[0],), device=latent.device + ).long() + low_res_timesteps = torch.randint( + 0, self.max_noise_level, (low_res_image.shape[0],), device=latent.device + ).long() + + noisy_latent = self.scheduler.add_noise(original_samples=latent, noise=noise, timesteps=timesteps) + noisy_low_res_image = self.scheduler.add_noise( + original_samples=low_res_image, noise=low_res_noise, timesteps=low_res_timesteps + ) + + latent_model_input = torch.cat([noisy_latent, noisy_low_res_image], dim=1) + + noise_pred = self.forward(latent_model_input, timesteps, low_res_timesteps) + loss = F.mse_loss(noise_pred.float(), noise.float()) + + if plt_image: + # Sampling image during training + sampling_image = low_res_image[0].unsqueeze(0) + latents = torch.randn((1, 3, 16, 16)).to(sampling_image.device) + low_res_noise = torch.randn((1, 1, 16, 16)).to(sampling_image.device) + noise_level = 20 + noise_level = torch.Tensor((noise_level,)).long().to(sampling_image.device) + + noisy_low_res_image = self.scheduler.add_noise( + original_samples=sampling_image, noise=low_res_noise, timesteps=noise_level + ) + self.scheduler.set_timesteps(num_inference_steps=1000) + for t in tqdm(self.scheduler.timesteps, ncols=110): + with autocast(enabled=True): + with torch.no_grad(): + latent_model_input = torch.cat([latents, noisy_low_res_image], dim=1) + noise_pred = self.forward( + latent_model_input, torch.Tensor((t,)).to(sampling_image.device), noise_level + ) + latents, _ = self.scheduler.step(noise_pred, t, latents) + with torch.no_grad(): + decoded = self.z.decode_stage_2_outputs(latents / scale_factor) + low_res_bicubic = nn.functional.interpolate(sampling_image, (64, 64), mode="bicubic") + # plot images + + self.images = images + self.low_res_bicubic = low_res_bicubic + self.decoded = decoded + + return loss + + def _plot_image(self, images, low_res_bicubic, decoded): + plt.figure(figsize=(2, 2)) + plt.style.use("default") + plt.imshow( + torch.cat([images[0, 0].cpu(), low_res_bicubic[0, 0].cpu(), decoded[0, 0].cpu()], dim=1), + vmin=0, + vmax=1, + cmap="gray", + ) + plt.tight_layout() + plt.axis("off") + plt.show() + + def training_step(self, batch, batch_idx): + loss = self._calculate_loss(batch, batch_idx) + self.log("train_loss", loss, batch_size=16, prog_bar=True) + return loss + + def validation_step(self, batch, batch_idx): + loss = self._calculate_loss(batch, batch_idx, plt_image=True) + self.log("val_loss", loss, batch_size=16, prog_bar=True) + return loss + + def on_validation_epoch_end(self): + self._plot_image(self.images, self.low_res_bicubic, self.decoded) + + def configure_optimizers(self): + optimizer = torch.optim.Adam(self.unet.parameters(), lr=5e-5) + return optimizer + + +# %% [markdown] +# ## Train Diffusion Model +# +# In order to train the diffusion model to perform super-resolution, we will need to concatenate the latent representation of the high-resolution with the low-resolution image. For this, we create a Diffusion model with `in_channels=4`. Since only the outputted latent representation is interesting, we set `out_channels=3`. +# +# As mentioned, we will use the conditioned augmentation (introduced in [2] section 3 and used on Stable Diffusion Upscalers and Imagen Video [3] Section 2.5) as it has been shown critical for cascaded diffusion models, as well for super-resolution tasks. For this, we apply Gaussian noise augmentation to the low-resolution images. We will use a scheduler low_res_scheduler to add this noise, with the t step defining the signal-to-noise ratio and use the t value to condition the diffusion model (inputted using class_labels argument). + +# %% +n_epochs = 200 +val_interval = 20 + + +# initialise the LightningModule +d_net = DiffusionUNET() + +# set up checkpoints + +checkpoint_callback = ModelCheckpoint(dirpath=root_dir, filename="best_metric_model_dunet") + + +# initialise Lightning's trainer. +trainer = pl.Trainer( + devices=1, + max_epochs=n_epochs, + check_val_every_n_epoch=val_interval, + num_sanity_val_steps=0, + callbacks=checkpoint_callback, + default_root_dir=root_dir, +) + +# train +trainer.fit(d_net) + +# %% [markdown] +# ### Plotting sampling example + +# %% +num_samples = 3 + + +def get_images_to_plot(): + d_net.eval() + device = torch.device("cuda:0") + d_net.to(device) + + val_loader = d_net.val_dataloader() + check_data = first(val_loader) + images = check_data["image"].to(d_net.device) + + sampling_image = check_data["low_res_image"][:num_samples].to(d_net.device) + latents = torch.randn((num_samples, 3, 16, 16)).to(d_net.device) + low_res_noise = torch.randn((num_samples, 1, 16, 16)).to(d_net.device) + noise_level = 10 + noise_level = torch.Tensor((noise_level,)).long().to(d_net.device) + scheduler = d_net.scheduler + noisy_low_res_image = scheduler.add_noise( + original_samples=sampling_image, noise=low_res_noise, timesteps=torch.Tensor((noise_level,)).long() + ) + + scheduler.set_timesteps(num_inference_steps=1000) + for t in tqdm(scheduler.timesteps, ncols=110): + with autocast(enabled=True): + with torch.no_grad(): + latent_model_input = torch.cat([latents, noisy_low_res_image], dim=1) + noise_pred = d_net.forward( + x=latent_model_input, timesteps=torch.Tensor((t,)).to(d_net.device), low_res_timesteps=noise_level + ) + # 2. compute previous image: x_t -> x_t-1 + latents, _ = scheduler.step(noise_pred, t, latents) + + with torch.no_grad(): + decoded = ae_net.autoencoderkl.decode_stage_2_outputs(latents / scale_factor) + return sampling_image, images, decoded + + +sampling_image, images, decoded = get_images_to_plot() + +# %% +low_res_bicubic = nn.functional.interpolate(sampling_image, (64, 64), mode="bicubic") +fig, axs = plt.subplots(num_samples, 3, figsize=(8, 8)) +axs[0, 0].set_title("Original image") +axs[0, 1].set_title("Low-resolution Image") +axs[0, 2].set_title("Outputted image") +for i in range(0, num_samples): + axs[i, 0].imshow(images[i, 0].cpu(), vmin=0, vmax=1, cmap="gray") + axs[i, 0].axis("off") + axs[i, 1].imshow(low_res_bicubic[i, 0].cpu(), vmin=0, vmax=1, cmap="gray") + axs[i, 1].axis("off") + axs[i, 2].imshow(decoded[i, 0].cpu().detach().numpy(), vmin=0, vmax=1, cmap="gray") + axs[i, 2].axis("off") +plt.tight_layout() + +# %% [markdown] +# ### Clean-up data directory + +# %% +if directory is None: + shutil.rmtree(root_dir)