deep-tempest/KAIR/show_imgs.ipynb

495 lines
2.1 MiB
Plaintext
Raw Normal View History

{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Libs and parameter setting"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"import numpy as np\n",
"import torch\n",
"import torch.utils.data as data\n",
"import utils.utils_image as util\n",
"import itertools\n",
"import os\n",
"\n",
"from main_train_drunet_visuals import drunet_pipeline\n",
"\n",
"\n",
"from matplotlib import pyplot as plt"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Visuals train (patches and stuff)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [],
"source": [
"n_channels = 1\n",
"n_channels_datasetload = 3\n",
"patch_size = 128\n",
"sigma = [0, 0]\n",
"sigma_min, sigma_max = sigma[0], sigma[1]\n",
"num_patches_per_image = 20\n",
"dataroot_H = 'trainsets/web_images_train'\n",
"dataroot_L = 'trainsets/simulations'\n",
"\n",
"# -------------------------------------\n",
"# get the path of H, return None if input is None\n",
"# -------------------------------------\n",
"paths_H = util.get_image_paths(dataroot_H)[:50] # Edit: overfittear con las primeras 50 imagenes\n",
"paths_L = util.get_image_paths(dataroot_L)[:50] # Edit: las primeras 9 imagenes pertenecen a test\n",
"\n",
"\n",
"listOfLists = [list(itertools.repeat(path, num_patches_per_image)) for path in paths_H]\n",
"paths_H = list(itertools.chain.from_iterable(listOfLists))\n",
"\n",
"listOfLists = [list(itertools.repeat(path, num_patches_per_image)) for path in paths_L]\n",
"paths_L = list(itertools.chain.from_iterable(listOfLists))"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [],
"source": [
"indexes = np.random.randint(low=0, high=len(paths_H), size=10).astype('int16')\n",
"patches = []"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [],
"source": [
"for index in indexes:\n",
" # -------------------------------------\n",
" # get H and L image\n",
" # -------------------------------------\n",
" H_path = paths_H[index]\n",
" L_path = paths_L[index]\n",
"\n",
" H_file, L_file = H_path.split('/')[-1], L_path.split('/')[-1]\n",
" H_name, L_name = H_file.split('.')[0], L_file.split('.')[0]\n",
"\n",
" assert H_name==L_name, 'Both high and low quality images MUST have same name'\n",
"\n",
" img_H = util.imread_uint(H_path, n_channels_datasetload) \n",
"\n",
" # L_path = H_path\n",
"\n",
" img_L = util.imread_uint(L_path, n_channels_datasetload)[:,:,:2] \n",
"\n",
" # Get module of complex image, stretch and to uint8\n",
" img_L = img_L.astype('float')\n",
" img_L = np.abs(img_L[:,:,0]+1j*img_L[:,:,1])\n",
" img_L = 255*(img_L - img_L.min())/(img_L.max() - img_L.min())\n",
" img_L = img_L.astype('uint8')\n",
"\n",
"\n",
" \"\"\"\n",
" # --------------------------------\n",
" # get L/H/M patch pairs\n",
" # --------------------------------\n",
" \"\"\"\n",
" H, W = img_H.shape[:2]\n",
"\n",
" # ---------------------------------\n",
" # randomly crop the patch\n",
" # ---------------------------------\n",
" rnd_h = random.randint(0, max(0, H - patch_size))\n",
" rnd_w = random.randint(0, max(0, W - patch_size))\n",
"\n",
" # # Comment because using one only channel to train as ground-truth\n",
" # patch_H = img_H[rnd_h:rnd_h + patch_size, rnd_w:rnd_w + patch_size, :]\n",
"\n",
" # Ground-truth as channels mean\n",
" patch_H = np.mean(img_H[rnd_h:rnd_h + patch_size, rnd_w:rnd_w + patch_size, :],axis=2)\n",
"\n",
" # Get the patch from the simulation\n",
" patch_L = img_L[rnd_h:rnd_h + patch_size, rnd_w:rnd_w + patch_size]\n",
"\n",
" # # Commented augmentation with rotating because of TMDS encoding\n",
"\n",
" # ---------------------------------\n",
" # augmentation - flip, rotate\n",
" # ---------------------------------\n",
" # mode = random.randint(0, 7)\n",
" # patch_L = util.augment_img(patch_H, mode=mode)\n",
"\n",
" # ---------------------------------\n",
" # HWC to CHW, numpy(uint) to tensor\n",
" # ---------------------------------\n",
" img_H = util.uint2tensor3(patch_H)\n",
" img_L = util.uint2tensor3(patch_L)\n",
"\n",
" # ---------------------------------\n",
" # get noise level\n",
" # ---------------------------------\n",
" # noise_level = torch.FloatTensor([np.random.randint(self.sigma_min, sigma_max)])/255.0\n",
" noise_level = torch.FloatTensor([np.random.uniform(sigma_min, sigma_max)])/255.0\n",
"\n",
" # ---------------------------------\n",
" # add noise\n",
" # ---------------------------------\n",
" noise = torch.randn(img_L.size()).mul_(noise_level).float()\n",
" img_L.add_(noise)\n",
"\n",
" patches.append(util.tensor2uint(img_H))\n",
" patches.append(util.tensor2uint(img_L))\n"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 500x2000 with 20 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Creamos la figura y los subplots\n",
"filas, columnas = len(patches)//2, 2\n",
"fig, axs = plt.subplots(filas, columnas, figsize=(5, 20))\n",
"\n",
"# Recorremos las imágenes y las mostramos en los subplots\n",
"for i, ax in enumerate(axs.flatten()):\n",
" if i < len(patches):\n",
" ax.imshow(patches[i], cmap='gray')\n",
" ax.set_title(f'Imagen {i//2}')\n",
" else:\n",
" ax.axis('off')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test images"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"23-04-16 16:09:38.196 : task: drunet\n",
" model: plain\n",
" gpu_ids: [0]\n",
" scale: 0\n",
" n_channels: 1\n",
" n_channels_datasetload: 3\n",
" sigma: [0, 50]\n",
" sigma_test: 50\n",
" path:[\n",
" root: denoising\n",
" pretrained_netG: denoising/drunet/models/15996_G.pth\n",
" task: denoising/drunet\n",
" log: denoising/drunet\n",
" options: denoising/drunet/options\n",
" models: denoising/drunet/models\n",
" images: denoising/drunet/images\n",
" pretrained_optimizerG: None\n",
" ]\n",
" datasets:[\n",
" train:[\n",
" name: train_dataset\n",
" dataset_type: ffdnet\n",
" dataroot_H: testsets/web_subset/ground_truth\n",
" num_patches_per_image: 20\n",
" dataroot_L: testsets/web_subset/simulations\n",
" H_size: 128\n",
" dataloader_shuffle: True\n",
" dataloader_num_workers: 8\n",
" dataloader_batch_size: 64\n",
" phase: train\n",
" scale: 0\n",
" n_channels: 1\n",
" ]\n",
" test:[\n",
" name: test_dataset\n",
" dataset_type: ffdnet\n",
" dataroot_H: testsets/web_subset/ground_truth\n",
" dataroot_L: testsets/web_subset/simulations\n",
" phase: test\n",
" scale: 0\n",
" n_channels: 1\n",
" ]\n",
" ]\n",
" netG:[\n",
" net_type: drunet\n",
" in_nc: 2\n",
" out_nc: 1\n",
" nc: [64, 128, 256, 512]\n",
" nb: 4\n",
" gc: 32\n",
" ng: 2\n",
" reduction: 16\n",
" act_mode: R\n",
" upsample_mode: convtranspose\n",
" downsample_mode: strideconv\n",
" bias: False\n",
" init_type: orthogonal\n",
" init_bn_type: uniform\n",
" init_gain: 0.2\n",
" scale: 0\n",
" ]\n",
" train:[\n",
" epochs: 1000\n",
" G_lossfn_type: l1\n",
" G_lossfn_weight: 1.0\n",
" G_tvloss_weight: 0.1\n",
" G_optimizer_type: adam\n",
" G_optimizer_lr: 0.0001\n",
" G_optimizer_clipgrad: None\n",
" G_scheduler_type: MultiStepLR\n",
" G_scheduler_milestones: [1600, 3200, 4800, 6400, 8000, 9600, 11200, 12800, 14400]\n",
" G_scheduler_gamma: 0.1\n",
" G_regularizer_orthstep: None\n",
" G_regularizer_clipstep: None\n",
" checkpoint_test: 1600\n",
" checkpoint_save: 3999\n",
" checkpoint_print: 16\n",
" F_feature_layer: 34\n",
" F_weights: 1.0\n",
" F_lossfn_type: l1\n",
" F_use_input_norm: True\n",
" F_use_range_norm: False\n",
" G_optimizer_betas: [0.9, 0.999]\n",
" G_scheduler_restart_weights: 1\n",
" G_optimizer_wd: 0\n",
" G_optimizer_reuse: False\n",
" G_param_strict: True\n",
" E_param_strict: True\n",
" E_decay: 0\n",
" ]\n",
" opt_path: options/visuals_drunet.json\n",
" is_train: True\n",
" merge_bn: False\n",
" merge_bn_startpoint: -1\n",
" find_unused_parameters: True\n",
" use_static_graph: False\n",
" dist: False\n",
" num_gpu: 1\n",
" rank: 0\n",
" world_size: 1\n",
"\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"export CUDA_VISIBLE_DEVICES=0\n",
"number of GPUs is: 1\n",
"LogHandlers setup!\n",
"Random seed: 4649\n",
"Dataset [DatasetFFDNet - test_dataset] is created.\n",
"Initialization method [orthogonal + uniform], gain is [0.20]\n",
"Training model [ModelPlain] is created.\n",
"Loading model for G [denoising/drunet/models/15996_G.pth] ...\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"23-04-16 16:09:39.705 : ---1--> 10534.png | PSNR = 11.07dB ; G_loss = 2.198e-01\n",
"23-04-16 16:09:39.995 : ---2--> 12460.png | PSNR = 19.93dB ; G_loss = 4.660e-02\n",
"23-04-16 16:09:40.284 : ---3--> 125.png | PSNR = 17.45dB ; G_loss = 1.179e-01\n",
"23-04-16 16:09:40.568 : ---4--> 4172.png | PSNR = 14.73dB ; G_loss = 1.027e-01\n",
"23-04-16 16:09:40.864 : ---5--> 5583.png | PSNR = 15.31dB ; G_loss = 1.405e-01\n",
"23-04-16 16:09:40.881 : Average PSNR : 15.70dB, Average loss : 1.255e-01\n",
"\n"
]
}
],
"source": [
"imgs = drunet_pipeline('options/visuals_drunet.json')\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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NA1PP/10/xVqyvdeOB8uWrQI++23H3w+HxoaGnDTTTcBAN555x3suuuu8Pl8GD9+PP70pz/pnm9pacHZZ5+NzTbbDH6/H3V1ddhzzz3x1ltv9XrXqlWrcNRRRyEQCKCqqgo/+9nPsHDhwpJzyX//+18ceuihiEQicLvd2GqrrfC3v/1Ndw9dCF5//XWcddZZqKmpQXV1NY444gg0NTVVVP558+ZhwoQJai7585//XPK+rq4uXH/99cottba2FjNmzEBLS4vuvmw2iwsvvBD19fXwer3Yfffd8d577/Wae5j3l156Caeccgpqa2vh9XqRzWbx9ddfY8aMGRg3bhy8Xi+GDh2KQw45BJ988kmvfC1atAj7778/vF4vampqcOaZZyKRSPS67+WXX8Zhhx2GYcOGwe12Y+zYsTjjjDPQ2tra697nn38eW265pXK/ve2220rWSaVzX7n6vP/++3H88cf3YjtVWtejRo3CwQcfjBdffBFbb701PB4PJk6ciAceeKDf93Mdv/XWW3HzzTdj1KhR8Hg82GOPPfDll18il8vhl7/8JRobGxEKhXD44Yf3ApeKxSJuueUWlc+6ujpMnz4dq1at0t2naRpuueUWNfdvvfXWeOGFF3rliX3CyCqu1HUyk8ngsssu060b55xzDqLRaK97TzzxRDz88MMl+4pRmpqacMwxxyAQCCAUCuHYY49Fc3NzyXsrGbflxKiLsD5ee+01pR8Eg0FMnz4dqVQKzc3NOOaYY1BVVYWGhgZcdNFFvfreNddcgx122AGRSATBYBBbb7017r//fmiapruv0nELAM3NzTjjjDMwbNgwOJ1O5aKez+fVPexft912G+644w6MHj0afr8fO+20E955551+6+Lpp5+Gpmkl1+fOzk68+OKLFdWpKaaUkh/zuv/UU09hwoQJCnQCALvdjhNOOAELFizAN9980+fzfdlTlerujz/+OHbYYQeEQiFlLzGNN954A9tttx2A7vFOe4tz43//+1/89Kc/VWvWqFGjcNxxx2H58uW6d5Rzjy+1znAtffLJJ7HVVlvB7XbjmmuuATAwG6eSdS6TyeDCCy/ElltuiVAohEgkgp122gn/+Mc/+qx3Uza8mIynfqRQKOD111/Htttui4aGhgE929XVhUMPPRRnnHEGfvnLXyKfzyOTyWDatGlYsmQJrrnmGkyZMgVvvfUW5syZgw8//BDPP//8oPN65JFH4thjj8Wpp56KTz75BJdddhkAKAVZ0zT85Cc/wdtvv42rrroK2223Hf7zn//ggAMOqCj9gw46CDfeeCMuv/xyzJ07F1tvvTUAYJNNNlH3rF69GieccAIuueQS3HjjjQNybagk/ebmZvzsZz/DhRdeiNmzZ+Opp57CZZddhsbGRkyfPr1s2gMp++eff46dd94ZI0aMwO233476+nr861//ws9//nO0trZi9uzZFZdJyuWXX45p06Zh3rx5WLZsGS666CIcd9xxsNvt2GKLLfDII4/ggw8+wOWXX45AIIC77rpLPbtkyRIcf/zxaqH56KOPcMMNN2DRokU6A+hXv/oV5syZg9NPPx1HHHEEVq5ciZkzZyKXy2H8+PHqvnQ6jalTp2LVqlW4/PLLMWXKFHz22We46qqr8Mknn+CVV17RLSbPP/88Fi5ciGuvvRZ+vx+
"text/plain": [
"<Figure size 1500x600 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1500x600 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABJ4AAAF/CAYAAAAIMwNqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOx9d5hkVZn+e6u7qitX5zihJ88QBpgRUFAGMJAlGFBEkKCoqD8VBDEhiCTz7rIm0roqugjqAgZcxF1Uwigw5GFmmJ7QOVau6gr390c/7+nvnr63qpo0hPs+Tz3ddevec8/5Tvze833fMUzTNOHChQsXLly4cOHChQsXLly4cOHCxYsMz57OgAsXLly4cOHChQsXLly4cOHChYvXJlziyYULFy5cuHDhwoULFy5cuHDhwsVLApd4cuHChQsXLly4cOHChQsXLly4cPGSwCWeXLhw4cKFCxcuXLhw4cKFCxcuXLwkcIknFy5cuHDhwoULFy5cuHDhwoULFy8JXOLJhQsXLly4cOHChQsXLly4cOHCxUsCl3hy4cKFCxcuXLhw4cKFCxcuXLhw8ZLAJZ5cuHDhwoULFy5cuHDhwoULFy5cvCRwiScXLly4cOHChQsXLly4cOHChQsXLwlc4smFCxcuXLhw4eJVgM9+9rPo6enBrl279nRWXLhw4cKFCxcuaoZLPM0Djz32GM455xwsW7YMgUAAgUAAK1aswHnnnYd//OMfezp7LwiGYeCrX/1q1fueeuopfPWrX0VfX99Lko9K6R9++OHYZ599XvR31lr2WtHb24sPfehDL1p6r2Y8++yzuPDCC7F+/Xo0NjaiubkZhx56KH71q1/t6ay5eIlw8803wzCMV/2Y+FLjQx/6EHp7e/d0Np43/vKXv8AwDPzlL3950dL86le/CsMwXrT0iMsvvxx77bUXyuXyi572y4lf//rXuPHGG/H73/8eCxcurOmZww8/HIcffvjzet8LaaOHHXYYPv3pTz+vZ4m+vj4YhoGbb775BaUj8WLP969m/POf/8T555+PfffdF5FIBB0dHXjb296GP//5z3s6ay5eZXDnfStuv/12vP/978fy5csRCATQ29uLD3zgA9iyZcuezprCwMAAvvrVr+LRRx/d01l5wXgh85yLlxcu8VQjfvjDH2L9+vV48MEH8f/+3//DnXfeibvuuguf/vSn8eSTT+LAAw/Etm3b9nQ2X3I89dRTuOyyy15S4umlTP/lwK9//Wt8+ctf3tPZeEXg7rvvxl133YV3vetduPXWW/Gzn/0MK1aswHve8x5cfvnlezp7Lly4eI1jYGAA1157LS6//HJ4PK/eJc9zzz2H8847D7fddhvWrl27p7NTFV/72tfw7//+79i8efOezooF999/P84999w9nY1XBG655RY89NBDOPvss/Hb3/4W119/PRoaGvDWt74VP/nJT/Z09ly4eNXimmuuQSaTwRe/+EX84Q9/wBVXXIFHHnkE69atw5NPPrmnswdgZm687LLLXhPEk4tXD+r3dAZeDfjb3/6Gj3/84zjuuOPwq1/9Cj6fT/125JFH4vzzz8ett96KQCBQMZ1MJoNgMPhSZ/cVhddjmQ844IA9nYVXDN73vvfh/PPPt1gxHHPMMRgbG8M111yDiy++GA0NDXswhy5cvL6QzWbh9/tfEsuiVyK+973vobGxEaeccsqezsoLwtKlSzEyMrKns1EzNmzYgFWrVuFb3/oWfvSjH+3p7Ci88Y1v3NNZeMXgoosuwje/+U3LtWOPPRbr1q3D5ZdfjjPOOGMP5cyFi1c37rjjDrS3t1uuHXnkkejt7cV3vvMdXH/99fNO87WoT2Wz2aq6s4vXFl69238vI6688krU1dXhhz/8oYV0knjPe96D7u5u9f1DH/oQwuEwHn/8cbzjHe9AJBLBW9/6VgDAxMQEPv7xj6Onpwc+nw9Lly7FF7/4ReTzefV8JRNz3VSc7glPPvkk3v/+9yMWi6GjowNnn3024vG45dlEIoEPf/jDaGlpQTgcxtFHH41nn322JjncfPPNeM973gMAOOKII2AYhiWPdIX7v//7PxxyyCEIBoM4++yzbfNMSLe0aukTGzduxFve8hYEg0EsXboUV199dU0uFPMp+5YtW3Daaaehvb0dDQ0NWLNmDa677roapDTX1Y4uKT//+c9x8cUXo6urC+FwGCeccAKGh4eRTCbxkY98BK2trWhtbcVZZ52FVCplSfO6667DYYcdhvb2doRCIey777649tprUSgULPeZpokrr7wSixcvht/vxxve8Ab86U9/sjVDTSQSuPDCC7FkyRL4fD709PTg05/+NNLptOU+wzDwiU98Av/5n/+JNWvWIBgMYr/99sOdd95ZVRatra22Cu5BBx2ETCaDiYmJqmm4ePWD4+EzzzyDo446CqFQCF1dXbj66qsBAA888ADe/OY3IxQKYeXKlfiP//gPy/Ojo6P4+Mc/jr322gvhcBjt7e048sgjcd9998151+7du/Hud78bkUgEjY2N+MAHPoCNGzfajiX/+Mc/8M53vhPNzc3w+/044IAD8F//9V+We+hCcO+99+JjH/sYWltb0dLSglNOOQUDAwM1lf/mm2/GqlWr1FjiZE0wPT2NK664AqtXr0ZDQwPa2tpw1llnYXR01HJfPp/HBRdcgM7OTgSDQRx22GH45z//OWfsYd7vvvtunH322Whra0MwGEQ+n8fWrVtx1llnYcWKFQgGg+jp6cEJJ5yAxx9/fE6+nnnmGRx99NEIBoNobW3FRz/6USSTyTn3/elPf8KJJ56IBQsWwO/3Y/ny5TjvvPMwNjY259677roL+++/PxoaGrBkyZI5CjBR69jnJM8bbrgBp5122hxrp1pl3dvbi+OPPx5/+MMfsG7dOgQCAaxevRo33nhj1fdzHv/GN76Ba665Br29vQgEAjj88MPx7LPPolAo4POf/zy6u7sRi8Vw8sknzyGXyuUyrr32WpXP9vZ2nHHGGdi9e7flPtM0ce2116qxf926dfj9738/J09sE7pVca2uk7lcDpdccoll3jj//PMxNTU1594PfvCD+PnPf27bVnQMDAzgve99LyKRCGKxGE499VQMDQ3Z3ltLv3WCvhahPP785z+r9UE0GsUZZ5yBdDqNoaEhvPe970VjYyO6urpw4YUXzml7l112GQ4++GA0NzcjGo1i3bp1uOGGG2CapuW+WvstAAwNDeG8887DggUL4PP5sGTJElx22WUoFovqHravb37zm/j2t7+NJUuWIBwO401vehMeeOCBqrLQFWMAqKurw/r1690YYi5eMF7P875d3+ru7saCBQtq6luV9Kla1+633norDj74YMRiMaUvMY2//OUvOPDAAwEAZ511ltK3ODb+4x//wPve9z41Z/X29uL9738/duzYYXmHk3u83TzDufT222/HAQccAL/fj8suuwzA/HScWua5XC6HCy64APvvvz9isRiam5vxpje9Cb/97W+ryt7FSwvX4qkKSqUS7r33XrzhDW9AV1fXvJ6dnp7GO9/5Tpx33nn4/Oc/j2KxiFwuhyOOOALbtm3DZZddhrVr1+K+++7DVVddhUcffRR33XXX887ru971Lpx66qk455xz8Pjjj+OSSy4BALVANk0TJ510Ev7+97/jK1/5Cg488ED87W9/wzHHHFNT+scddxyuvPJKfOELX8B1112HdevWAQCWLVum7hkcHMTpp5+Oiy66CFdeeeW8XBtqSX9oaAgf+MAHcMEFF+DSSy/Fr3/9a1xyySXo7u6uuDs3n7I/9dRTOOSQQ7Bo0SJ861vfQmdnJ/74xz/iU5/6FMbGxnDppZfWXCaJL3zhCzjiiCNw8803o6+vDxdeeCHe//73o76+Hvvttx9uueUWPPLII/jCF76ASCSCf/mXf1HPbtu2DaeddpqaaDZt2oSvf/3reOaZZywK0Be/+EVcddVV+MhHPoJTTjkFu3btwrnnnotCoYCVK1eq+zKZDDZs2IDdu3fjC1/4AtauXYsnn3wSX/nKV/D444/jf/7nfyyTyV133YWNGzfi8ssvRzg
"text/plain": [
"<Figure size 1500x600 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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uaeu+rDDuHHjAABer8t9vxPA+XDt2rU4/vjjEYlEMGHCBHz9618HACxfvhyHH344IpEIZs+ePcoY2rFjBz72sY9h7733RjQaVbL1xx57bNS9tmzZgrPOOguxWAxNTU143/vehxUrVtjOJU8//TROPfVUtLS0IBgMYv/998f//d//Wc6hC8HDDz+Mj370o2hra0NrayvOOOMMdHd311X+22+/HXPmzFFzyf/+7//anjc0NIQbbrgBc+fORSAQwLhx43DxxRdjx44dlvMKhQKuuOIKdHR0IBwO48gjj8S///3vUXMP8/73v/8dH/zgBzFu3DiEw2EUCgW8+uqruPjiizFr1iyEw2F0dXXhlFNOwapVq0bla+3atXj3u9+NcDiMtrY2fOQjH0EqlRp13gMPPIDTTjsNEydORDAYxMyZM3HZZZehr69v1Ln33nsvFixYgEAggGnTpuGb3/ymbZ3UO/c51efPfvYznH/++aPUTvXW9dSpU3HyySfj/vvvx8KFCxEKhTB37lzcdtttNe/P5/g3vvEN3HzzzZg6dSpCoRCWLl2Kl19+GcViEZ///OfR2dmJxsZGnH766aPIpUqlgltuuUXls729HRdccAG2bNliOc80Tdxyyy1q7l+4cCH++te/jsoT+4Tuzl6v62Q+n8fVV19teW58/OMfRyKRGHXuBz7wAfzmN7+x7Ss6uru7cc455yAWi6GxsRHnnnsuenp6bM+tZ9w6QV+LsD4eeughtT6Ix+O44IILkMlk0NPTg3POOQdNTU2YMGECrrzyylF977rrrsOiRYvQ0tKCeDyOhQsX4mc/+xlM07ScV++4BYCenh5cdtllmDhxIvx+P6ZNm4brrrvO4gLH/vXNb34T3/72tzFt2jREo1EceuihWL58eV31YYdx48bB4/GgoaFhl9Nw4eKd/tzX4fP50NTUVNe6t5o9Ve/a/c4778SiRYvQ2Nio7CWm8cgjj+Cggw4CAFx88cXK3uLc+PTTT+O9732vemZNnToV5513HjZu3Gi5h5N7vN1zhs/Su+++G/vvvz+CwSCuu+46AGOzcep5zuXzeVxxxRVYsGABGhsb0dLSgkMPPRR/+tOfata9i90L1+qrgXK5jIcffhgHHnggJkyYMKZrh4aGcOqpp+Kyyy7D5z//eZRKJeTzeRx11FFYt24drrvuOsybNw+PPfYYbrrpJqxcuRL33nvvLuf1zDPPxLnnnotLLrkEq1atwtVXXw0AaoFsmibe85734IknnsA111yDgw46CI8//jhOOOGEutI/6aSTcOONN+ILX/gCbr31VixcuBAALO6F27Ztw/vf/3587nOfw4033jgm14Z60u/p6cH73vc+XHHFFbj22mvxhz/8AVdffTU6OztxwQUXOKY9lrKvXr0aixcvxuTJk/Gtb30LHR0d+Nvf/oZPfepT6Ovrw7XXXlt3mSS+8IUv4KijjsLtt9+ODRs24Morr8R5550Hr9eL+fPn44477sCzzz6LL3zhC4jFYvje976nrl23bh3OP/989aB57rnn8LWvfQ1r1661GEBf/OIXcdNNN+HDH/4wzjjjDGzevBmXXnopisUiZs+erc7LZrNYsmQJtmzZgi984QuYN28eXnzxRVxzzTVYtWoV/vGPf1geJvfeey9WrFiBr371q4hGo7jlllt
"text/plain": [
"<Figure size 1500x600 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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12PKlClwOp2oqanBOeecg+7u7qLrBgYGcOmll6K+vh4ejweHHnoo3nrrrSFzD/P+7LPP4txzz0VNTQ08Hg8GBgbwwQcf4JxzzsHEiRPh8XjQ1NSEE088Ee+9996QfK1atQrHHnssPB4Pqqur8fWvfx3xeHzIdf/6179w8sknY9SoUXC5XJgwYQIuvPBCQ7edJ598Evvssw+cTidaWlrwi1/8wrBOyp37StXnn/70J5x55plD1E7l1vXYsWOxaNEi/POf/8ScOXPgdrsxZcoU3HnnnSM+n+v4z3/+c9x0000YO3Ys3G43DjvsMKxZswbZbBbf//730djYiGAwiFNOOQVdXV1FaRQKBdx8880qn7W1tTjrrLOwZcuWous0TcPNN9+s5v45c+bg6aefHpIn9gm9qrhc18lMJoMrr7yyaN345je/iUgkMuTar3zlK7jvvvsM+4oebW1t+PznPw+/349gMIgzzjgDHR0dhteWM25LQb8XYX08//zzan8QCARw1llnIZlMoqOjA5///OcRCoXQ0NCAyy67bEjfu/baazFv3jyEw2EEAgHMmTMHf/rTn4YQvOWOWwDo6OjAhRdeiFGjRsHhcKClpQXXXnstcrmcuob96xe/+AV+9atfoaWlBT6fDwceeCBee+21suoDAF5++WXcfvvt+OMf/4iKioqy7zNhYjh82td9APjZz36Gvr4+/PSnPy37HmB4e6rcvftf//pXzJs3D8FgUNlLTOPFF1/E/vvvDwA455xzlL3FufHNN9/EF77wBbVmjR07Fl/84hexcePGomeUco83Wme4lj7yyCPYd9994XK5cO211wLYMRunnHUuk8ng0ksvxT777INgMIhwOIwDDzwQf//733egFUzsCdj2dgY+6sjn83jhhRew3377oaGhYYfuHRwcxEknnYQLL7wQ3//+95HL5ZDJZLBw4UKsW7cO1157LWbNmoWXX34ZN954I9599108+eSTO53X0047DWeccQbOO+88vPfee7jyyisBQG2QNU3DZz/7Wbz66qu46qqrsP/+++OVV17BcccdV1b6J5xwAm644Qb84Ac/wC233II5c+YAQJG6p729HV/+8pdx+eWX44Ybbtgh14Zy0u/o6MCXvvQlXHrppbj66qvx6KOP4sorr0RjYyPOOuuskmnvSNlXrFiB+fPnY/To0fjlL3+J+vp6PPPMM/jOd76Dnp4eXH311WWXSeIHP/gBFi5ciLvvvhutra247LLL8MUvfhE2mw2zZ8/G/fffj3feeQc/+MEP4Pf78T//8z/q3nXr1uHMM89UC83SpUvx05/+FKtWrSoygH74wx/ixhtvxAUXXIBTTz0Vmzdvxvnnn49sNotJkyap61KpFBYsWIAtW7bgBz/4AWbNmoXly5fjqquuwnvvvadiPRBPPvkklixZguuuuw4+nw8333wzTjnlFKxevRrjxo0bttyapuH888/HokWLcNJJJ+3WeB0mPj7IZrM49dRT8fWvfx3/7//9P9x333248sorEYvF8PDDD+OKK67AqFGj8Lvf/Q5f/epXMWPGDMydOxfANrIeAK6++mrU19cjkUjg0UcfxWGHHYbnnntOkarJZBILFy5EX18fbrrpJkyYMAH//Oc/ccYZZwzJzwsvvIBjjz0W8+bNw6233opgMIgHHng
"text/plain": [
"<Figure size 1500x600 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for ind,img in enumerate(imgs):\n",
"\n",
" H = img['H_vis']\n",
"\n",
" L = util.tensor2uint(img['L']).astype('float')\n",
" L = np.abs(L[:,:,0] + 1j*L[:,:,1])\n",
" L = (L - L.min())/(L.max() - L.min())\n",
"\n",
" E = img['E_vis']\n",
"\n",
"\n",
" # Crea una figura y subfiguras utilizando Matplotlib\n",
" fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15, 6))\n",
"\n",
" # Muestra las imágenes en las subfiguras\n",
" ax[0].imshow(H,cmap='gray')\n",
" ax[0].axis(\"off\")\n",
" ax[0].set_title(f'Ground-truth de imagen {ind}')\n",
" ax[1].imshow(L,cmap='gray')\n",
" ax[1].axis(\"off\")\n",
" ax[1].set_title(f'Imagen degradada (en módulo) de imagen {ind}')\n",
" ax[2].imshow(E,cmap='gray')\n",
" ax[2].axis(\"off\")\n",
" ax[2].set_title(f'Imagen {ind} restaurada')\n",
"\n",
" # Muestra la figura\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def save_deeptempest_result(imgs_dict, save_path):\n",
"\n",
" file_name = imgs_dict['image_name']\n",
" save_img_path = os.path.join(save_path, file_name)\n",
"\n",
" H = imgs_dict['H_vis']\n",
" util.imsave(H, save_img_path+'_H.png')\n",
"\n",
" L = util.tensor2uint(imgs_dict['L']).astype('float')\n",
" L = np.abs(L[:,:,0] + 1j*L[:,:,1])\n",
" L = 255*(L - L.min())/(L.max() - L.min())\n",
" util.imsave(L, save_img_path+'_L.png')\n",
"\n",
" E = imgs_dict['E_vis']\n",
"\n",
" util.imsave(E, save_img_path+'_E.png')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"######################################################################\n",
"### Save results (given by a selected index) in the specified path ###\n",
"######################################################################\n",
"save_ind = 1 # COMPLETE INDEX NUMBER\n",
"\n",
"save_path = 'testsets/web_subset/visuals' # COMPLETE SAVING PATH\n",
"\n",
"save_deeptempest_result(imgs[save_ind], save_path)"
]
}
],
"metadata": {
"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.9.16"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}