Skip to content

Instantly share code, notes, and snippets.

@kuroipearls
Created August 4, 2020 06:57
Show Gist options
  • Save kuroipearls/6ebeec7797d1f73e14352fd429080622 to your computer and use it in GitHub Desktop.
Save kuroipearls/6ebeec7797d1f73e14352fd429080622 to your computer and use it in GitHub Desktop.
Dense in Dense Network with Attention Module (DiDNT) for Blind Image Denoising (Inference only)
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Dense in Dense Network with Attention Module (DiDNT) for Blind Image Denoising"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is my last research during my Master degree. My motivation to do this research is because I'm interested in a paper from NVIDIA researchers, called High-Quality Self-Supervised Deep Image Denoising (https://arxiv.org/pdf/1901.10277.pdf). Thus, this research tries to improve the results from that paper. \n",
"\n",
"This research is about blind image denoising, where clean image representations are <b>not</b> required to train the denoising network. \n",
"\n",
"Since my paper is not published yet, therefore, I can only show the quantitative results, using standard image quality assessments (PSNR - Peak-Signal-to-Noise Ratio). All the PSNR results are obtained from the inference process (from our models) which definitely runs in this notebook. \n",
"\n",
"All of the results in the comparison table are from the same NVIDIA paper (stated above), except our proposed DiDNT results. There are three types of artifical noise in this experiment: Additive White Gaussian Noise (AWGN), Poisson Noise, and Impulse Noise.\n",
"\n",
"My proposed DiDNT has <b>better results</b> compared with the previous (NVIDIA) paper, especially when it comes to Gaussian and Impulse noise. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I'm using python 3.7"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python 3.7.3\n"
]
}
],
"source": [
"!python --version"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The whole architecture is built using Tensorflow 1.14.0. Trained using one NVIDIA Quadro RTX8000, which would take around 4-6 days. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"absl-py==0.7.1\n",
"appdirs==1.4.3\n",
"astor==0.8.0\n",
"attrs==19.1.0\n",
"autograd==1.2\n",
"backcall==0.1.0\n",
"beautifulsoup4==4.7.1\n",
"bleach==3.1.0\n",
"blessings==1.7\n",
"bokeh==1.2.0\n",
"bs4==0.0.1\n",
"cachetools==3.1.1\n",
"certifi==2019.6.16\n",
"cffi==1.12.3\n",
"chardet==3.0.4\n",
"cloudpickle==1.2.1\n",
"cycler==0.10.0\n",
"Cython==0.29.7\n",
"decorator==4.4.0\n",
"defusedxml==0.6.0\n",
"distlib==0.3.0\n",
"entrypoints==0.3\n",
"filelock==3.0.12\n",
"future==0.17.1\n",
"gast==0.2.2\n",
"google-api-python-client==1.7.9\n",
"google-auth==1.6.3\n",
"google-auth-httplib2==0.0.3\n",
"google-auth-oauthlib==0.4.1\n",
"google-pasta==0.1.7\n",
"gpustat==0.5.0\n",
"grpcio==1.22.0\n",
"h5py==2.9.0\n",
"horovod==0.16.4\n",
"httplib2==0.13.0\n",
"idna==2.8\n",
"imageio==2.8.0\n",
"importlib-metadata==1.6.0\n",
"ipykernel==5.1.1\n",
"ipython==7.6.0\n",
"ipython-genutils==0.2.0\n",
"jedi==0.14.0\n",
"Jinja2==2.10.1\n",
"json5==0.8.4\n",
"jsonschema==3.0.1\n",
"jupyter-client==5.2.4\n",
"jupyter-core==4.5.0\n",
"jupyterlab==2.1.2\n",
"jupyterlab-server==1.1.1\n",
"Keras==2.2.4\n",
"Keras-Applications==1.0.8\n",
"Keras-Preprocessing==1.1.0\n",
"kiwisolver==1.1.0\n",
"llvmlite==0.29.0\n",
"Markdown==3.1.1\n",
"MarkupSafe==1.1.1\n",
"matplotlib==3.1.1\n",
"mistune==0.8.4\n",
"mlxtend==0.16.0\n",
"mock==3.0.5\n",
"nbconvert==5.5.0\n",
"nbformat==4.4.0\n",
"notebook==5.7.8\n",
"numba==0.44.1\n",
"numexpr==2.6.9\n",
"numpy==1.16.2\n",
"nvidia-ml-py3==7.352.0\n",
"oauth2client==4.1.3\n",
"oauthlib==3.0.1\n",
"opt-einsum==3.2.1\n",
"packaging==19.0\n",
"pandas==0.24.2\n",
"pandocfilters==1.4.2\n",
"parso==0.5.0\n",
"pexpect==4.7.0\n",
"pickleshare==0.7.5\n",
"Pillow==6.1.0\n",
"prometheus-client==0.7.1\n",
"prompt-toolkit==2.0.9\n",
"protobuf==3.8.0\n",
"psutil==5.6.3\n",
"ptyprocess==0.6.0\n",
"pyasn1==0.4.5\n",
"pyasn1-modules==0.2.5\n",
"pycparser==2.19\n",
"pydot-ng==2.0.0\n",
"Pygments==2.4.2\n",
"pygsheets==2.0.1\n",
"pyodbc==4.0.26\n",
"pyparsing==2.4.0\n",
"pyrsistent==0.15.2\n",
"python-dateutil==2.8.0\n",
"pytz==2019.1\n",
"PyYAML==5.1.1\n",
"pyzmq==18.0.2\n",
"requests==2.22.0\n",
"requests-oauthlib==1.2.0\n",
"rsa==4.0\n",
"scikit-learn==0.20.3\n",
"scipy==1.4.1\n",
"seaborn==0.9.0\n",
"Send2Trash==1.5.0\n",
"six==1.12.0\n",
"soupsieve==1.9.2\n",
"SQLAlchemy==1.3.5\n",
"tables==3.5.2\n",
"tensorboard==1.14.0\n",
"tensorflow==1.14.0\n",
"tensorflow-estimator==1.14.0\n",
"tensorflow-gpu==1.14.0\n",
"termcolor==1.1.0\n",
"terminado==0.8.2\n",
"testpath==0.4.2\n",
"torch==1.5.0\n",
"torchvision==0.6.0\n",
"tornado==6.0.3\n",
"tqdm==4.32.2\n",
"traitlets==4.3.2\n",
"uritemplate==3.0.0\n",
"urllib3==1.25.3\n",
"virtualenv==20.0.20\n",
"watermark==1.8.1\n",
"wcwidth==0.1.7\n",
"webencodings==0.5.1\n",
"Werkzeug==0.15.4\n",
"wrapt==1.11.2\n",
"yacs==0.1.6\n",
"zipp==3.1.0\n"
]
}
],
"source": [
"!pip freeze"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I will only demonstrate the inference process only, using the previously trained model. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Denoising on Additive White Gaussian Noise"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Additive White Gaussian Noise for σ = 25"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00080-eval-ilsvrc-kodak-3c-gauss25-iter3m-blindspot-known-res128-EVAL_gauss25-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/kodak/*.png'.\n",
"Loaded 24 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 10 times.\n",
"Evaluating network 'list_trained/network-1940000-gauss25-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 240 images.\n",
" 0: time= 1.70, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 30.7433, valid_psnr_pme= 32.5198\n",
"Evaluation done, exiting.\n",
"RESULT 32.5198\n",
"dnnlib: Finished selfsupervised_denoising.train() in 5m 51s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=kodak --eval=list_trained/network-1940000-gauss25-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00081-eval-ilsvrc-bsd300-3c-gauss25-iter3m-blindspot-known-res128-EVAL_gauss25-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/BSR/BSDS500/data/images/test/*.jpg'.\n",
"Loaded 200 images.\n",
"Validation image padded size = [512, 512].\n",
"Repeating the validation set 3 times.\n",
"Evaluating network 'list_trained/network-1940000-gauss25-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 600 images.\n",
" 0: time= 2.24, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 29.2610, valid_psnr_pme= 31.4460\n",
"Evaluation done, exiting.\n",
"RESULT 31.4460\n",
"dnnlib: Finished selfsupervised_denoising.train() in 6m 21s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=bsd300 --eval=list_trained/network-1940000-gauss25-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00082-eval-ilsvrc-set14-3c-gauss25-iter3m-blindspot-known-res128-EVAL_gauss25-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/Set14/*.png'.\n",
"Loaded 14 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 20 times.\n",
"Evaluating network 'list_trained/network-1940000-gauss25-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 280 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 29.7157, valid_psnr_pme= 31.3533\n",
"Evaluation done, exiting.\n",
"RESULT 31.3533\n",
"dnnlib: Finished selfsupervised_denoising.train() in 5m 31s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=set14 --eval=list_trained/network-1940000-gauss25-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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WLECgFq1agGQnZ1NZmbmVfMYemni2bx5c0JCQgAIDAwkICDAvq5cjUoTy5I4deoUq1evLpOWpIuWJHXr1o1Dhw7RvHlzRo0axVdffQVYAfzTn/7EkiVLSEhIYOTIkTz55JP51v3DH/5Anz59ePnll5k/f/45Zf/1r39l5cqVbNmyhWXLlhVbl/T0dNq1a8eOHTvo0qULEydOBOD+++/ntddeIyEhgSlTpjBq1Ch7neTkZNavX8/UqVO5/fbb+c9//gPAd999R6NGjbjuuuvybWPy5Mls3ryZrVu38sYbbwBWd+Mtt9xCXFwca9asYfz48aSnp/P6669TrVo1vv/+eyZOnEhCQkKJYurn50dERAS7du3i+++/Z/HixXzzzTckJibi5+fH/PnzOXbsGC+88AKff/45mzZtol27dkydOtUu45prrmHbtm2MGTOGcePGFbvN1NRUNmzYwCuvvEKfPn146KGH2LFjB9u2bbObkSdNmsTGjRvZunUrX331FVu3biUjI4MHHniATz/9lISEhHwnkMLiUpw2bdrYiWxRZSQmJrJ48WK2bdvG4sWLOXToED/99BMTJkxg9erVJCYmEh8fz9KlS/OVv2LFCgIDA9myZQvbt2+nR48e59QhPT2dqKgotmzZQufOnXn77bcB+POf/8yf//xntm3bRlBQULH7crXIycnB5XIREBBAbGwsHTp0sOdlZWUxd+5cr3F2u9088sgj9k1IQSNGjMDlcvH8889fVY9NFxXPohw+fJiGDRvaPwcFBXH48GH75+7duxMQEEDNmjW58847fV7vS9WFxjOvuLg4MjMzadq0qT3tySefxOl08tBDD3H27FlfVvmSVZpYZmRk0K5dO6Kios45LwMsXbqUmJgYO6H3pYuWJNWoUYOEhATeeust6tevz4ABA5g9eza7d+9m+/btxMbG4nK5eOGFFwq9kyzMTTfdxPDhw3n77bdL1H9eoUIFBgwYAMDdd9/N119/TVpaGuvXr+euu+6yW2Lytmjddddd+Pn5ATBgwAC7VWHRokV2WXk5nU6GDBnCvHnzqFjR+hueq1atYvLkybhcLqKjo8nIyODgwYOsXbuWu+++217P6XSWeN9zLwhffPEFCQkJtG/fHpfLxRdffMG+ffv49ttv2blzJzfddBMul4s5c+Zw4MABe/1BgwbZ/27YsKHY7d12220YY3A4HFx33XU4HA4qVKhAWFgYSUlJALz//vu0adOG1q1bs2PHDnbu3MmuXbto0qQJjRs3zrfdouJS0n0vroyYmBiuueYa/P39adWqFQcOHCA+Pp7o6Gjq169PxYoVGTJkCGvXrs1XvsPh4LPPPmPChAmsW7eOa6655pw6VK5c2W4Ra9u2rR2DDRs2cNdddwEwePDgYvflauHn50diYiLJycnExcWxfft2e96oUaPo3LkznTp1Ome9GTNm0KtXL68J5/z589m2bRvr1q1j3bp1zJ07t0z34VJSVDxLY+XKlRw5coSzZ8+yevVqn5R5OShtPI8cOcI999zDrFmzqFDButy++OKL7Nq1i/j4eE6cOMFLL71UFlW/5JQmlgcOHGDjxo0sWLCAcePGsXfv3nzzFy5cmO8a4ktF/sXtsubn50d0dDTR0dE4HA7mzJlD27ZtCQsLK9EFOteTTz7J8uXLAauV4I033uC7775j+fLltG3bloSEBCpWrIjb/b8/sJmRkVFoecYY3G43tWvXLnRQXfXq1e3/d+zYkR9//JGUlBSWLl3KU089dc7yy5cvZ+3atfz3v/9l0qRJbNu2DRHhww8/pEWLFiXe16Lk5OSwbds2QkND+eWXXxg2bBgvvvhivmX++9//Ehsby8KFC72WkbcpvSTN6rndpRUqVLD/n/tzdnY2+/fvZ8qUKcTHx1OnTh2GDx9eZOyBC47L5s2bCQ0NLbKM7777Ll89/fz8yM7OLlH5zZs3Z9OmTXzyySc89dRTxMTE8Mwzz+RbplKlSnbczqfsq13t2rXp2rUrK1asIDw8nIkTJ5KSksKbb77pdfkNGzawbt06ZsyYQVpaGpmZmdSoUYPJkyfToEEDAGrWrMngwYOJi4tj6NCh5bk7F13BeBanQYMG9vADsFrKo6Oj8y3j7+/P7bffzkcffURsbKyPa3xpO994gtUFdOuttzJp0iSioqLs6TfccANgnTtHjBhRaGvolepCYpn7nW7SpAnR0dFs3rzZbpk7duwYcXFxdm+Or120lqTdu3fzww8/2D8nJibSqFEjWrRoQUpKip0kZWVlsWPHjiLLmjRpEomJiXZCs3fvXjp06MBf//pX6tevz6FDhwgODiYxMRG3282hQ4eIi4uz13e73fZTcwsWLODmm2+mVq1aNG7cmA8++ACwLrq5Y30KMsbQr18/Hn74YUJDQ7n22mvzzc/dZteuXXnppZc4efIkaWlpdO/enddee81uAdm8eTMAnTt3ZsGCBQBs376drVu3FhvPrKws/vKXv9CwYUOcTicxMTEsWbLEfrLnxIkTHDhwgKioKL755ht7vFF6ejp79uyxy8ltEVu8eDEdO3YsdrvFOXXqFNWrV+eaa67h6NGjfPrppwC0aNGCffv22S0teZ/+KCwuRUlKSuLRRx/lT3/60wWVERkZyVdffcWxY8fIyclh4cKFdOnSJd8yP/30E9WqVePuu+9m/PjxbNq0qWRBAKKiovjwww8Bq7VRQUpKij2W78yZM3z22We0bNmSd955h5UrV7Jw4UL77rug+fPnc/DgQZKSkpgyZQpDhw5l8uTJZGdn20/JZGVl8fHHH5f4RHy5KyyeJdG9e3dWrVpFamoqqamprFq1iu7du5OWlma3oGdnZ7N8+fISl3m5K008MzMz6devH0OHDj2nezI3niLC0qVLr4rjszSxTE1Ntbskjx07xjfffEOrVq3s+UuWLKF37974+/v7vuJcxCQpLS2NYcOG2YOZd+7cyXPPPUflypVZsmQJEyZMICIiApfLxfr168+r7PHjx9sDcG+88UYiIiK46aabaNy4Ma1atWLs2LG0adPGXr569erExcURHh7O6tWr7daB+fPnM3PmTPuxxaIGEA8YMIB58+Z57WrLycnh7rvvxuFw0Lp1a8aOHUvt2rV5+umnycrKwul0EhYWxtNPPw1YA53T0tIIDQ3lmWeeoW3btoVud8iQITidTsLDw0lPT7fr2KpVK1544QW6deuG0+kkNjaWI0eOUL9+fWbPns2gQYNwOp107NjRHscD1gHpdDp59dVXeeWVV84r7t5ERETQunVrWrZsyeDBg7npppsAqFq1KjNmzLAHxtesWdPuviosLgXt3bvX/hMA/fv3Z+zYsYwYMeK8ysh1ww03MHnyZLp27UpERARt27bl9ttvz7fMtm3b7IHwEydO9NpiWJh//vOfTJ06FafTyY8//ui1q+5qc+TIEbp27YrT6aR9+/bExsbSu3dvHnzwQY4ePUrHjh1xuVz89a9/BWDjxo384Q9/KLLMs2fP0r17d/vPijRo0ID77ruvPHbnoissntOmTSMoKIjk5GScTqcdw7zxrFu3Lk8//TTt27enffv2PPPMM9StW5f09HT69OljxzMg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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"data = [[32.46, 31.08, 31.26, 31.60],\n",
" [32.45, 31.07, 31.23, 31.58],\n",
" [32.45, 31.03, 31.25, 31.57],\n",
" [32.52, 31.45, 31.35, 31.77]]\n",
"\n",
"columns = ('Kodak', 'BSD300', 'Set14', 'Average')\n",
"rows = ('N2C', 'N2N', 'Self-supervised Deep Image Denoising', 'Proposed DiDNT')\n",
"\n",
"# Add a table at the bottom of the axes\n",
"the_table = plt.table(cellText=data,\n",
" rowLabels=rows,\n",
" colLabels=columns,\n",
" loc='center')\n",
"\n",
"ax = plt.gca()\n",
"ax.get_xaxis().set_visible(False)\n",
"ax.get_yaxis().set_visible(False)\n",
"plt.box(on=None)\n",
"the_table.scale(1, 1.5)\n",
"\n",
"plt.title('PSNR Results for Additive White Gaussian Noise (σ = 25)')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Additive White Gaussian Noise for σ ∈ [5,50]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00039-eval-ilsvrc-kodak-3c-gauss5_50-iter2m-blindspot-known-res128-EVAL_gauss5_50-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/kodak/*.png'.\n",
"Loaded 24 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 10 times.\n",
"Evaluating network 'list_trained/network-final-gauss5_50-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 240 images.\n",
" 0: time= 5.78, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 30.6047, valid_psnr_pme= 32.5811\n",
"Evaluation done, exiting.\n",
"RESULT 32.5811\n",
"dnnlib: Finished selfsupervised_denoising.train() in 5m 43s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=kodak --eval=list_trained/network-final-gauss5_50-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00040-eval-ilsvrc-bsd300-3c-gauss5_50-iter2m-blindspot-known-res128-EVAL_gauss5_50-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/BSR/BSDS500/data/images/test/*.jpg'.\n",
"Loaded 200 images.\n",
"Validation image padded size = [512, 512].\n",
"Repeating the validation set 3 times.\n",
"Evaluating network 'list_trained/network-final-gauss5_50-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 600 images.\n",
" 0: time= 8.98, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 29.2220, valid_psnr_pme= 31.8438\n",
"Evaluation done, exiting.\n",
"RESULT 31.8438\n",
"dnnlib: Finished selfsupervised_denoising.train() in 7m 59s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=bsd300 --eval=list_trained/network-final-gauss5_50-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00041-eval-ilsvrc-set14-3c-gauss5_50-iter2m-blindspot-known-res128-EVAL_gauss5_50-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/Set14/*.png'.\n",
"Loaded 14 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 20 times.\n",
"Evaluating network 'list_trained/network-final-gauss5_50-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 280 images.\n",
" 0: time= 2.83, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 29.5511, valid_psnr_pme= 31.4066\n",
"Evaluation done, exiting.\n",
"RESULT 31.4066\n",
"dnnlib: Finished selfsupervised_denoising.train() in 5m 48s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=set14 --eval=list_trained/network-final-gauss5_50-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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/vgjsbGxdO7cmd/97ndUqlSJe+65x15+xYoVjBo1CpfLRb9+/Thz5gypqamlGwwP6S+lK6VKpEKFCnz88cfExMTwj3/8g2efffaS6xT2hT137lySk5OJj4+nUqVKBAYG2gOta9WqxU033cT69evtroNrUWRkJCkpKSQnJ1O/fn2qVKlCz5496dmzJzfccAOLFy8mJibmovXOnj1LYmIiQUFB+aY3bNgQh8PBunXruPXWW/MlDUlJSTRq1AiAG264we5iPH78+DXXheXn50d0dDTR0dGEhobyr3/9i5CQEDZu3HjFZcbFxdkJR0pKCl988QUVK1bkzjvv9Fa1y8wvv/zCypUr2bFjB8YYsrOzMcbw+uuvEx0dzZdffsnChQvt/RcR3n77bbp3756vnNWrV1O9evV8f69YsYKNGzdSrVo1oqOj7c94UXJycti0aRP+/v7e39FScm2m3Eopn6hWrRpLly5l7ty5dkvVLbfcYo+9mDt3Lp06dQLg1ltvzTc91+nTp6lfvz6VKlVi1apV+e4UrFy5Mv/5z3/46KOPmDdvXmntVqnbvXs32dnZ/P73v2fLli323WY5OTls376dJk2aXLROamoqjz76KHfeeSd16tQhKSmJ8+fPA3Dq1CnWr19Py5YtadCgATVr1mTTpk2ICB999BF33HEHAP369WPWrFkAzJo1y55+LdizZ4/dWgKQkJBAcHAwycnJdkKVmZnJrl27AKhRowZnz569ZLkHDx4kMTGRxMRE7r77bqZOnXpNJFMAixYt4r777uPQoUMkJiZy5MgRbr75ZtatW8fAgQOZMWMG69ato0ePHgB0796df//732RmZgKwd+9e0tLSLir39OnT1KlTh2rVqrF79242bdoEQIcOHVizZg2nTp0iKyuLTz/91F6nW7duvP322/bfCQkJvtx13/B2H6K+9KWv0ntRBnf5iVhjdwIDA+Wzzz6TxMRE6dKli4SGhsrtt98uhw4dEhGRAwcOSEREhDgcDnnuuefs9ZOTk+3pI0aMkFatWsnBgwfz3eV36tQpad++vXz22Weltn8iUipjqMLCwsTpdMp///tfERFZtmyZtG3bVkJCQiQkJETuv/9+OX/+vIhY43kcDoeEhIRIcHCwPPvss/a8r776SkJDQ8XpdEpoaKhMmzbN3tbmzZslJCREmjZtKo899pjk5OSIiEhK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48aNvPHGG/Tr148nnniCXbt2sWPHDhISEuz9jIuLY/v27axZs4bt27eTnp7OQw89xLJly4iPj7dPNsXF5VLatm1rJ73FlZGQkMDChQvZsWMHCxcu5MiRIxw7doyxY8eycuVKEhIS2Lx5M4sXL85X/vLly2nYsCHbtm1j586d9OjR46I6pKWlERERwbZt24iKiuL9998H4G9/+xt/+9vf2LFjB40bN77kvlwvsrOzcblc1K9fn65du9KxY0d7XmZmJrNnzy40zjk5OTz11FP2BUthFixYwMCBA6+r3+4pLp5Xom7dumRlZdkXDIsWLeLIkSPeqOpVwRvxjI2NJSMjg2bNmvmghlePK43l3r17qV27NnfddRdt2rRhzJgxduNAruLOFaWpzBKqgIAA4uPjee+996hXrx4DBw5k5syZ7Nmzh507d9K1a1dcLhevvPLKZWedt956KyNGjOD999+/KPCFqVChAgMHDgRg6NChrF+/ntTUVL799lvuueceu4Unb0vZPffcg5+fHwADBw60WytyT+IFOZ1OhgwZwpw5c6hY0fo91a+++oqJEyficrmIjo4mPT2dw4cPs3btWoYOHWqv53Q6S7zv4v6dkm+++Yb4+Hg6dOiAy+Xim2++4cCBA2zatInvv/+eW2+9FZfLxaxZszh06JC9/uDBg+1/N27ceMnt9e3bF2MMoaGh3HDDDYSGhlKhQgVCQkLsfu6PP/6Ytm3b0qZNG3bt2sX333/P7t27adq0KTfffHO+7RYXl5Lu+6XKiImJoVatWvj7+9O6dWsOHTrE5s2biY6Opl69elSsWJEhQ4awdu3afOWHhoby9ddfM3bsWNatW0etWrUuqkPlypXtlrZ27drZMdi4cSP33HMPAPfee+8l9+V64efnR0JCAklJScTGxrJz50573qOPPkpUVFShLUxTp06lV69exSanCxYsyHdcXQ+Ki+eVMMawYMECnnjiCcLDw6lRo4Z93rseeBrP48ePc9999zFjxgwqVLi+7wG70lhmZWWxbt06Jk+ezObNmzlw4MBF42WLO1eUpmJ/Kd3X/Pz8iI6OJjo6mtDQUGbNmkW7du0ICQkp0Zd5rueee46lS5cCVuvDu+++y3fffcfSpUtp164d8fHxVKxYkZyc334YNT09vcjyjDHk5ORQu3Ztu5WloOrVq9v/j4yMZN++fSQnJ7N4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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"data = [[32.57, 31.29, 31.27, 31.71],\n",
" [32.57, 31.29, 31.26, 31.70],\n",
" [32.47, 31.19, 31.21, 31.62],\n",
" [32.58, 31.84, 31.41, 31.94]]\n",
"\n",
"columns = ('Kodak', 'BSD300', 'Set14', 'Average')\n",
"rows = ('N2C', 'N2N', 'Self-supervised Deep Image Denoising', 'Proposed DiDNT')\n",
"\n",
"# Add a table at the bottom of the axes\n",
"the_table = plt.table(cellText=data,\n",
" rowLabels=rows,\n",
" colLabels=columns,\n",
" loc='center')\n",
"\n",
"ax = plt.gca()\n",
"ax.get_xaxis().set_visible(False)\n",
"ax.get_yaxis().set_visible(False)\n",
"plt.box(on=None)\n",
"the_table.scale(1, 1.5)\n",
"\n",
"plt.title('PSNR Results for Additive White Gaussian Noise (σ ∈ [5,50])')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It can be seen that for both scenarios of Gaussian noise (fixed number of σ and random number of σ), the proposed DiDNT method yields the <b>best</b> results. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Denoising on Poisson Noise"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Poisson Noise for λ = 30"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00083-eval-ilsvrc-kodak-3c-poisson30-iter2m-blindspot-known-res128-EVAL_poisson30-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/kodak/*.png'.\n",
"Loaded 24 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 10 times.\n",
"Evaluating network 'list_trained/network-1960000-poisson30-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 240 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 30.1386, valid_psnr_pme= 31.6923\n",
"Evaluation done, exiting.\n",
"RESULT 31.6923\n",
"dnnlib: Finished selfsupervised_denoising.train() in 5m 50s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=kodak --eval=list_trained/network-1960000-poisson30-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00084-eval-ilsvrc-bsd300-3c-poisson30-iter2m-blindspot-known-res128-EVAL_poisson30-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/BSR/BSDS500/data/images/test/*.jpg'.\n",
"Loaded 200 images.\n",
"Validation image padded size = [512, 512].\n",
"Repeating the validation set 3 times.\n",
"Evaluating network 'list_trained/network-1960000-poisson30-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 600 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 28.7412, valid_psnr_pme= 30.6716\n",
"Evaluation done, exiting.\n",
"RESULT 30.6716\n",
"dnnlib: Finished selfsupervised_denoising.train() in 7m 26s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=bsd300 --eval=list_trained/network-1960000-poisson30-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00085-eval-ilsvrc-set14-3c-poisson30-iter2m-blindspot-known-res128-EVAL_poisson30-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/Set14/*.png'.\n",
"Loaded 14 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 20 times.\n",
"Evaluating network 'list_trained/network-1960000-poisson30-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 280 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 29.0126, valid_psnr_pme= 30.3948\n",
"Evaluation done, exiting.\n",
"RESULT 30.3948\n",
"dnnlib: Finished selfsupervised_denoising.train() in 5m 48s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=set14 --eval=list_trained/network-1960000-poisson30-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkUAAAD3CAYAAAAT4yCWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeVxU9f748ddHUFHJtNS+5oaKCwzDDJCAlSKRW2pmqbhdl+xmXb1+bVF/LbftZmbZZmbLzZuWW2VlltY10xQLF1RyKUsTVNSbuGCCIAy8f3/McL4iiySby/v5eMxD55zz+ZzP583MnPd8zufMMSKCUkoppdSVrlpVN0AppZRS6mKgSZFSSimlFJoUKaWUUkoBmhQppZRSSgGaFCmllFJKAZoUKaWUUkoBmhQppVSVMsbMMcY8W0513W+M+d0Yk26MubY86rzAdjxqjHm3qvZfniqqL8aYQGNMgjHGeJ7PMcakGmP6lfe+yoMxZqMxxlbV7ahomhQppaqMMSbZGJPpOYj/7jkw+HrW2YwxK4wxx40xacaYzcaY2zzruhhjxBgz65z61hljRnr+P9IYk+up+w9jzI/GmN4ltKWLMSbPs/0pY8wvxphRFdj94tqQcoFlqwMvA91ExFdEjpVDe4r9+5RERJ4TkXvKuv/y4GmzGGPCz1rmb4wp1Y/0VWBf/glMF8+PBYrISOD/AdMqYF8AGGNWexKv/PdD33PWDzHG7DPGZBhjlhhjrjlr9XTgmYpq28VCkyKlVFXrIyK+QChwA/C4Z/kXwDfA/wCNgPHAH2eVywD+YozxK6HueE/d9YBZwCJjTL0Stj/k2b4u8ADwL2NMuz/do6pxHeAD7PyzBY1bcceD4v4+l5LjQLmMxpUHY0xjIBpYcs6q94EGxpjQCtr1/wKNRaQucC8wz9MWPKNAbwN/wf1aOo37PZNvKRBtjPmfCmrbRUGTIqXURUFEDgJfAUHGmAZAS+BfIpLteXwvIuvOKpIGzAGeLEXdecAHQB2gTSm2FxFZjvtgGpy/3BjT3hjzjWf06hdjzMCz1t1mjPnJM8p00BjzsGf5SGPM2e3GM3Lhf86yOp7+X+8ZmUk3xlxvjAn3nGb5wzNa8/K57TXGtAV+yY+LMWaVZ/mNxphNxpiTnn9vPKvMd8aYKcaY73EfAFudJybW38dT/npjzFJPLPYYY/56Vt1PGWPmef7vY4yZZ4w55hnx22SMue6s2Oz1xCzJGDPUs7yaMeZxz6jFEWPM+8aYqz3r/DzxG2GM2W+MOWqMeayktgNzgWBjTFRRK8upL1cbY2YbYw57/v7PGmO8imlPV2CLiGSds7wakAfEnqc/F0REtomIK/8pUB1o5nk+FPhCRNaKSDrwD+BOY8xVnrJZwGage0W07WKhSZFS6qJgjGkG3AZsBY4Be3B/k70j/8BThCnAXecbzfEcnEYBOcC+UrSlmjHmdqCBpx35Scs3wALcI1eDgFnGmEBPsdnAGBG5CnfisOp8+zmbiGQAPfGMVnkeh4DXgNc83+5bAx8VUfZXIH++Rz0RucVz6mMZMAO4FveptWWm4Fyjv+AeMbiK88TlnL8PwCIgBbge6A88Z4y5pYiiI4CrcR98rwXuAzI98ZwB9PTE7EYg0VNmpOcRjTtZ8wVmnlPvzUA7IAZ4whgTUELzTwPP4X69FKVMffGsmwO4AH8gBOgGFHfazc7/JbFniwVqAgOLWGcxxnzpScqKenxZirJZwAbgOyDBs8oG/Ji/nYj8BmQDbc8q/jPgKKn+S50mRUqpqrbEGJMGrAPWAM955llEA8nAS8BhY8xaY0yBUR4R+S/wFsXPdYj01J2Fe07EMBE5UkJbrvdsnwl8BjwoIvlJQG8gWUTeExGXZ/knwADP+hwg0BhTV0ROiMiWPxOEEuQA/saYBiKSLiLrS1muF7BbRD7wtHchsAvoc9Y2c0Rkp2d9TjH1FPr7eBKkm4DJIpIlIonAu8DwYtp/LeAvIrkisllE8k+D5uEeGawlIodFJP/U31DgZRHZ6xm1eAQYZIzxPqvep0UkU0R+xH0wP9/B+m2guTGm59kLy6MvnqT9NmCCiGR4XmOv4E6ci1IPOFXE8r/hnld0lTEmoriOiEhvEalXzKPYeXP5ZXEnwbcBKzyjqOBOPE+es/lJz7b5TnnaftnSpEgpVdXu8HyYtxCRv4lIJoCIpIjIOBFpDbTAPYfo/SLKTwO6G2OKOiiuF5F6QH3ccyI6nacthzzb18U9inH2aEELIOLsb+W4D975cyzuwn2g2WeMWWOM6ViazpfCaNzf1nd5TteUeNA7y/UUHv3ZBzQ56/mBUtRT1N/neuC4iJx9YD+37nwfAP/BPZ/rkDHmBWNMdc/IWCzu0ZbDxphlxpj2xbR9H+CNe65Lvv+e9f/TuA/qxRKRM7gnN//znFVl7gvu10Z1Tz/yXxtv4x5RLMoJCiYbGGNCcI98vYc72a6QU2gAIpIjIl8B3TwjogDpuF/3Z6tLweTtKtynrS9bmhQppS56InIAeAPPfJZz1h0DXqXwwe7sbdKB+3FPzA4pxf7OAJMBuzHmDs/iA8Cac76V+4rI/Z4ym0SkL+4D4RL+7zRXBlA7v25T8kTVQldEichuERnsqXcasNhz6ul8DuE+WJ+tOXCwpP2V0iHgmvz5JsXU7d6B+wD8tIgE4j5F1hvPKIyI/EdEugKNcY9i/auYtjfHfWrq9wtsb773cI903FnOfTkAnAEanPXaqCsixV3Cvo2Cp6UAxgLvichp3KfzBhjjvlz/XMaYr8z/zTs79/HV+YJwFm/cp2TBPUHf+mJhjGmF+1Ter2dtH8BZp9guR5oUKaUuOsaY+saYp4370ulqxj3x+m6guFNHL+M+SBU7r0REjuM+LfJEadogItm4T93lb/8l0NYY8xdjTHXPo4MxJsAYU8MYM9QYc7XnNNQfuE8NgfsgYjPGOI0xPsBTJez2d+Da/EnFAMaYYcaYhp7THPnf0vOKLF3Qck97hxhjvI0xsUCgpx9l4klSfwCmeiYfB+Me0Zp37rbGmGhjjN0zr+sP3Keg8owx1xlj+noSvDO4Ryry+7UQeMAY09K4fwLgOeDDsyYJX2i7Xbgn5k8uz76IyGFgBfCSMaau5zXb2hQzsRv33LRQz+sB474iMhZ34g/u05ReuE/rFdWPnmfNOzv30bOoMsZ9kUBPY0wtz2t3GNDZsy+A+UAfY0wnz9/kGeDT/BE0T1vDPG2/bGlSpJS6GGUDfsBK3AefHbgPnCOL2tgzR+UF4Jqi1p/lVeA2z4GvNP6Nex5KH8/BoRvueSKHcJ++mYb72zS4Jy0nG2P+wH1KaKinbb/iPsCsBHbjnptTJBHZhTsh2Os5DXM90APYaYxJxz3pelD+KcaSeEbQegMP4Z64PgnoLSJHS9n38xmM+290CPf8qydFZGUR2/0PsBj33/Fn3AfhD3Affx70lD8OROEezQN33D8A1gJJuOeE/b2c2r0QOFzOfQH3iFEN4Cfcp8cW4x4BK0REfsc9ET//d4JGAHGeyc35V0t+RPFzki6EwZ2QHwFScV+eH5s/980zn+s+3MnREdynyv52Vvk+wHfinvx/2TIiFzp6qpRSSqkLYdxXLc4FwuUSOBAbYzYAo0VkR1W3pSJpUqSUUkophZ4+U0oppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCNClSSimllAI0KVJKKaWUAjQpUkoppZQCwLuqG6CUunC1atX6b1ZW1nVV3Y7LhY+PT15WVpZ+WSwHGsvypfEsXz4+Pr9nZmb+z7nLjYhURXuUUuXAGCP6Hi4/xhg0nuVDY1m+NJ7lyxNPc+5yzTqVUkoppdCkSCmllFIK0KRIKaWUUgrQpEgpVUq+vr7W/5cvX07btm3Zt2/fBZUvSnJyMkFBQRfcvoudl5cXTqcTh8NBaGgoP/zwAwB5eXmMHz+eoKAg7HY7HTp0ICkpCQA/Pz/sdjt2u53AwEAef/xxsrKyANi3bx+hoaE4nU5sNhtvvfWWta/Nmzdjt9vx9/dn/Pjx1lyU48eP07VrV9q0aUPXrl05ceJEJUehYk2ZMgWbzUZwcDBOp5MNGzYUu+2cOXM4dOiQ9XzmzJn4+/tjjOHo0aOFtt+0aRPe3t4sXry4QtpelZYsWYIxhl27dlV1U6qeiOhDH/q4RB/ut3DlqFOnjoiIrFy5Ulq3bi179uy5oPLFSUpKEpvNdsHtKw8VGc+z+//1119L586dRURkwYIFctddd0lubq6IiBw4cECOHz8uIiItWrSQ1NRUERE5deqUDB48WIYPHy4iImfOnJGsrCxrXYsWLeTgwYMiItKhQweJj4+XvLw86dGjhyxfvlxERCZOnChTp04VEZGpU6fKpEmTKqy/lfnaFBH54YcfJDIy0opJamqqFY+iREVFyaZNm6znW7ZskaSkpAIxz+dyuSQ6Olp69uwpH3/8ccV04DwqMp4DBw6Um2++WZ544oky15WTk1MOLap4nngW+kzVkSKlVKmtXbuWv/71r3z55Ze0bt0acI/w3HLLLQQHBxMTE8P+/fsBSEpKomPHjtjtdh5//HGrjvT0dGJiYggNDcVut/P5558X2s/evXsJCQlh06ZNldOxSvbHH39Qv359AA4fPkzjxo2pVs39cdy0aVNr3dl8fX156623WLJkCcePH6dGjRrUrFkTgDNnzpCXl2fV98cffxAZGYkxhuHDh7NkyRIAPv/8c0aMGAHAiBEjrOWXg8OHD9OgQQMrJg0aNOD6669n8+bNREVFERYWRvfu3Tl8+DCLFy8mISGBoUOH4nQ6yczMJCQkBD8/vyLrfv3117nrrrto1KhRJfaocqSnp7Nu3Tpmz57NokWLABg0aBDLli2zthk5ciSLFy8mNzeXiRMn0qFDB4KDg3n77bcB+O677+jUqRO33347gYGBANxxxx2EhYVhs9l45513rLpmz55N27ZtCQ8P569//Svjxo0DIDU1lbvuuosOHTrQoUMHvv/++8oKQUFFZUr60Ic+Lo0Hlfht3NvbW+rXry8//vhjgeW9e/eWOXPmiIjI7NmzpW/fviIi0qdPH5k7d66IiMycOdMaKcnJyZGTJ0+KiPvbfOvWrSUvL88aKdq1a5c4nU5JTEysrK5ZKjKe1apVE4fDIe3atZO6detKQkKCiLhHhlq0aCEOh0MefPBB2bJli1WmqFELh8Mh69evFxGR/fv3i91ul1q1asnMmTNFRGTTpk0SExNjbb927Vrp1auXiIhcffXV1vK8vLwCz8tbZb42RdyjZQ6HQ9q0aSP333+/fPfdd5KdnS0dO3aUI0eOiIjIokWLZNSoUSJSeKQo37kxT0lJkc6dO0tubq6MGDHishspmjdvntx9990iItKxY0dJSEiQTz/9tMCIZNOmTeX06dPy9ttvyz//+U8REcnKypKwsDDZu3evrF69WmrXri179+616j127JiIiJw+fVpsNpscPXpUDh48KC1atJBjx45Jdna23HzzzTJ27FgRERk8eLDExcWJiMi+ffukffv2FdLffOhIkVKqLKpXr86NN97I7NmzCyyPj49nyJAhAPzlL39h3bp1AHz//fcMHjzYWp5PRHj00UcJDg7m1ltv5eDBg/z++++A+9ti3759mT9/Pg6HozK6VWlq1apFYmIiu3bt4uuvv2b48OGICE2bNuWXX35h6tSpVKtWjZiYGL799tti63F/nrs1a9aMbdu2sWfPHubOnWvFsTSMMRhT6GdaLlm+vr5s3ryZd955h4YNGxIbG8vbb7/Njh076Nq1K06nk2effZaUlJQ/Ve+ECROYNm2aNZJ3uVm4cCGDBg0C3CNECxcupGfPnqxevZozZ87w1Vdf0blzZ2rVqsWKFSt4//33cTqdREREcOzYMXbv3g1AeHg4LVu2tOqdMWMGDoeDyMhIDhw4wO7du9m4cSNRUVFcc801VK9enQEDBljbr1y5knHjxuF0Orn99tv5448/SE9Pr9xgoL9orZQqpWrVqvHRRx8RExPDc889x6OPPnreMkUddOfPn09qaiqbN2+mevXq+Pn5WZOHr776apo3b866deusYfjLUceOHTl69Cipqak0atSImjVr0rNnT3r27Ml1113HkiVLiImJKVTu1KlTJCcn07Zt2wLLr7/+eoKCgoiLi+Omm24qcOBPSUmhSZMmAFx33XXW6brDhw9fdqeDvLy86NKlC126dMFut/PGG29gs9mIj4+/4DoTEhKspOHo0aMsX74cb29v7rjjjvJqdpU5fvw4q1atYvv27RhjyM3NxRjDiy++SJcuXfjPf/7Dhx9+aPVfRHj99dfp3r17gXq+++476tSpU+D5ypUriY+Pp3bt2nTp0sV6jxcnLy+P9evX4+PjU/4d/RMuz9RXKVUhateuzbJly5g/f741YnTjjTdacxHmz59Pp06dALjpppsKLM938uRJGjVqRPXq1Vm9enWBK9hq1KjBZ599xvvvv8+CBQsqq1uVbteuXeTm5nLttdeyZcsW6yqovLw8tm3bRosWLQqVSU9P529/+xt33HEH9evXJyUlhczMTABOnDjBunXraNeuHY0bN6Zu3bqsX78eEeH999+nb9++ANx+++3MnTsXgLlz51rLLwe//PKLNWoBkJiYSEBAAKmpqVZSlJOTw86dOwG46qqrOHXq1HnrTUpKIjk5meTkZPr378+sWbMui4QIYPHixfzlL39h3759JCcnc+DAAVq2bElcXByxsbG89957xMXF0aNHDwC6d+/Om2++SU5ODgC//vorGRkZheo9efIk9evXp3bt2uzatYv169cD0KFDB9asWcOJEydwuVx88sknVplu3brx+uuvW88TExMrsuvFK+qcmj70oY9L40EVXH0m4p7L4ufnJ59//rkkJydLdHS02O12ueWWW2Tfvn0iIrJ3716JjIyUoKAgeeyxx6zyqamp1vKRI0dK+/btJSkpqcDVZydOnJAbbrhBPv/880rrn4hUypwih8MhwcHB8uWXX4qIyFdffSWhoaFis9nEZrPJqFGjJDMzU0Tc81uCgoLEZrNJQECAPProo9a6FStWiN1ul+DgYLHb7fL2229b+9q0aZPYbDZp1aqVjB07VvLy8kRE5OjRo3LLLbeIv7+/xMTEWPM+KkJlvjZFRBISEqRjx44SEBAgdrtd+vXrJ6mpqbJ161bp1KmTBAcHS2BgoLzzzjsiIrJ48WJp27atOBwOOX36tLz22mvSpEkT8fLyksaNG8vo0aML7eNym1PUpUsX+eqrrwose+211+S+++6T7OxsqV+/vowcOdJal5ubK4888oj1muzSpYukpaXJ6tWrrXlrIu75Rj169JD27dtL3759JSoqSlavXi0iIm+//bb4+/tLeHi4DB8+XB599FERcX8uDBw4UOx2uwQEBMiYMWPKvb9no5g5RXrvM6UuYXrvs/Kl95cqPxrL8nW5xDM9PR1fX19cLhf9+vXj7rvvpl+/fpXeDr33mVJKKaWq1FNPPYXT6SQoKIiWLVtedKcidaRIqUuYjhSVr8vl2/jFQGNZvjSe5UtHipRSSimlSqBJkVJKKaUU5/mdolq1av03KyvruspqjFLqz/Hx8bmsfoCvqmk8y4/GsnxpPMuXj49PXlHLS5xTpPMVlLq46TyD8qXxLD8ay/Kl8SxfOqdIKaWUUqoEmhQppZRSSqFJkVJKKaUUUMVJkTGGhx56yHo+ffp0nnrqKQBe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S0uTzMxMad68uezfv18OHjxofYPLycmR6Oho+eyzz6y4pKamyuLFi+Wee+6x9peWllbo7wDI0qVLRURk4sSJ8s9//lNE3K+3BQsWiIjIm2++KXXq1CkU2wtRke/RyuByucThcEidOnVk0qRJBdaVNFL02WefSa9evaRfv37idDrl4Ycftt6PI0aMkLZt24rdbpcJEyZY77vSuNzimZqaKq1bt7bW79+/v9D75lwff/yx9Rkm4n59BwUFicPhkGeeeUby8vJK1ZZLPZYi5R/P48ePS5MmTSQpKUlycnLkzjvvlN69e5eqLRpPt1atWsn27dsLLOvWrZvUq1dPBg8ebH0OnA8X20iRr68vmzdv5p133qFhw4bExsYyZ84cfvnlF3bs2EHXrl1xOp08++yzpKSk/Km6b7rpJkaOHMm//vWvUp1frFatGrGxsQAMGzaMdevWkZ6ezg8//MCAAQOskZazR6wGDBiAl5cXALGxsdaowaJFi6y6zhYcHMzQoUOZN28e3t7u38xcsWIFzz//PE6nky5dupCVlcX+/ftZu3Ytw4YNs8oFBweXuu/i+R2Lb7/9ls2bN9OhQwecTifffvste/fuZf369fz000/cdNNNOJ1O5s6dy759+6zygwcPtv6Nj48/7/769OmDMQa73c51112H3W6nWrVq2Gw2a47HRx99RGhoKCEhIezcuZOffvqJXbt20apVK1q2bFlgvyXFpbR9P18dMTExXH311fj4+BAYGMi+ffvYtGkTXbp0oWHDhnh7ezN06FDWrl1boH673c4333zD5MmTiYuL4+qrry7Uhho1algjXmFhYVYM4uPjGTBgAABDhgw5b1+uFF5eXiQmJpKSksLGjRvZsWNHqcq5XC7i4uKYPn06mzZtYu/evdacsqlTp7Jr1y42bdrE8ePHmTZtWgX24OJybjzzR7dLa+fOnUyePJm3337bWjZ//ny2b99OXFwccXFxfPDBB+Xd7ItWecezfv36vPnmm8TGxtKpUyf8/Pys48iVoKzx3LBhA7Vr1yYoKKjA8v/85z8cPnyYM2fOFJi/dSFK/EXriubl5UWXLl3o0qULdruduXPnEhYWhs1mK9UBOd9jjz3GsmXLAEhMTOStt95iw4YNLFu2jLCwMDZv3oy3tzd5ef/3A5ZZWVnF1meMIS8vj3r16hU7SbNOnTrW/zt27Mie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3LiRzp07W6fSriT58YyPjyctLc2abJ6SkkKTJk0Kbd+0aVM6d+5MgwYNqF27NrfddpsVT4Aff/wRl8tFWFhYpfXhYvJn43m2gIAAfH19rYR/9OjRbN68mbVr11K/fn19fZYint7e3rzyyiskJiby+eefk5aWViBu9957L23atCmXiwAuitNnJQkPD2fNmjUcPXqU3NxcFi5caI0C5eXlsXjxYgAWLFjAzTffzNVXX039+vWJi4sD4IMPPiAqKoq8vDwOHDhAdHQ006ZN4+TJk6Snp9O9e3def/11a9Rm69atAHTu3JkFCxYAsGPHjgJXhRUnJyeHRx55hGbNmp13ZCk5OZmHH36Yv//974XWjRw5kpUrV1pzpJS6HKWmplpXamZmZvLNN9/Qvn37UpXt0KEDaWlp1ntk1apVBAYGAnDkyBEAzpw5w7Rp07jvvvsqoPUXn6LiQinqtAAABA1JREFUGRAQQHR0tPU5OXfuXPr27VuobPfu3dm+fTunT5/G5XKxZs0aK54ACxcuvOJGicoSz6SkJOtAv2/fPnbt2mXNk8t/fe7fv59PP/2UIUOGVEJvql5Z4nn69GkyMjIA+Oabb/D29rZen48//jgnT578/+3dr4vUeRzH8dfihQn2Q0wiDF/nh7OG1aBFjBtEEIwGwWAT1GYwGcVsEBSsYhX/A4OYTMsKJg1aRNRwrwvHLejpotx4sufjkYaZ+X75zJsZeM4wH77L28n3pX9f9yfsPvvb57u02vbevXudzWadTqe9cuXKJ8dfvHix0+m0x48f76tXr9q2T5486ZEjRzqfz3vy5Mm+fv26Hz9+7NGjR7fOc/369bbtu3fvev78+c5ms04mk66vr2/df+bMmQ7D0FOnTvXw4cNf3X02Ho87n887Ho974cKFvnnz5h+vcXNzs6PRqKurqx2GoWtra719+/bW8z7fWXbz5s0msfuMbf3oz+iP9PTp066urnY+n3c6nfbatWtt/3rv7927t7t27eqePXt67ty5tu3jx4+3brftw4cPO5/PO5vNevbs2X748KFte+nSpQ7D0PF43Bs3bnzXmv6P89zY2Oja2lr379/f06dP9/37923bBw8e9OrVq1vH3717t5PJpNPptJcvX/7k3Pv27euzZ8++az07eZbtv5vnnTt3OplMulgseujQod6/f3/rvMeOHeuBAwd68ODBPnr06JvX8yvPc3Nzs+PxuMMw9MSJE33+/Hnb9sWLF03SYRi6WCy6WCx669atb1pPvrL7bEdf+2z37t15+/btz14G/DSuh7Rc5rk8Zrlc5rlcrn0GALCNHR1FfiUCAJZlR0cRAMCyiCIAgCS/bffgaDR6ubKy8vt/tRjg+4xGoz9WVlZ8uVkS81wes1wu81yu0Wj08kv3b7v7DADgV6E6AQAiigAAkogiAIAkoggAIIkoAgBIIooAAJKIIgCAJKIIACCJKAIASCKKAACSiCIAgCSiCAAgiSgCAEgiigAAkogiAIAkoggAIIkoAgBIIooAAJKIIgCAJKIIACCJKAIASCKKAACSiCIAgCSiCAAgiSgCAEgiigAAkogiAIAkoggAIIkoAgBIIooAAJKIIgCAJKIIACCJKAIASCKKAACSiCIAgCSiCAAgiSgCAEgiigAAkogiAIAkoggAIIkoAgBIIooAAJKIIgCAJKIIACCJKAIASCKKAACSiCIAgCSiCAAgiSgCAEgiigAAkogiAIAkoggAIIkoAgBIIooAAJKIIgCAJKIIACCJKAIASCKKAACSiCIAgCSiCAAgiSgCAEgiigAAkogiAIAkoggAIIkoAgBIIooAAJKIIgCAJKIIACCJKAIASJL8CQOLvUG98+R7AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"data = [[31.81, 30.40, 30.45, 30.89],\n",
" [31.80, 30.39, 30.44, 30.88],\n",
" [31.65, 30.25, 30.29, 30.73],\n",
" [31.69, 30.67, 30.39, 30.92]]\n",
"\n",
"columns = ('Kodak', 'BSD300', 'Set14', 'Average')\n",
"rows = ('N2C', 'N2N', 'Self-supervised Deep Image Denoising', 'Proposed DiDNT')\n",
"\n",
"# Add a table at the bottom of the axes\n",
"the_table = plt.table(cellText=data,\n",
" rowLabels=rows,\n",
" colLabels=columns,\n",
" loc='center')\n",
"\n",
"ax = plt.gca()\n",
"ax.get_xaxis().set_visible(False)\n",
"ax.get_yaxis().set_visible(False)\n",
"plt.box(on=None)\n",
"the_table.scale(1, 1.5)\n",
"\n",
"plt.title('PSNR Results for Poisson Noise (λ = 30)')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Poisson Noise for λ ∈ [5,50]"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00045-eval-ilsvrc-kodak-3c-poisson5_50-iter4m-blindspot-known-res128-EVAL_poisson5_50-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/kodak/*.png'.\n",
"Loaded 24 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 10 times.\n",
"Evaluating network 'list_trained/network-0-poisson5_50-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 240 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 29.5716, valid_psnr_pme= 31.0104\n",
"Evaluation done, exiting.\n",
"RESULT 31.0104\n",
"dnnlib: Finished selfsupervised_denoising.train() in 6m 23s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=kodak --eval=list_trained/network-0-poisson5_50-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00046-eval-ilsvrc-bsd300-3c-poisson5_50-iter4m-blindspot-known-res128-EVAL_poisson5_50-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/BSR/BSDS500/data/images/test/*.jpg'.\n",
"Loaded 200 images.\n",
"Validation image padded size = [512, 512].\n",
"Repeating the validation set 3 times.\n",
"Evaluating network 'list_trained/network-0-poisson5_50-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 600 images.\n",
" 0: time= 0.82, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 28.1459, valid_psnr_pme= 29.8763\n",
"Evaluation done, exiting.\n",
"RESULT 29.8763\n",
"dnnlib: Finished selfsupervised_denoising.train() in 7m 19s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=bsd300 --eval=list_trained/network-0-poisson5_50-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00047-eval-ilsvrc-set14-3c-poisson5_50-iter4m-blindspot-known-res128-EVAL_poisson5_50-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/Set14/*.png'.\n",
"Loaded 14 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 20 times.\n",
"Evaluating network 'list_trained/network-0-poisson5_50-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 280 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 28.4098, valid_psnr_pme= 29.6617\n",
"Evaluation done, exiting.\n",
"RESULT 29.6617\n",
"dnnlib: Finished selfsupervised_denoising.train() in 5m 47s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=set14 --eval=list_trained/network-0-poisson5_50-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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OVbJtl/MEFz/o0O4xl9NEJEVZSz3P8ACXP/HH3Cd8D/AdV550l3+BK6T4yPuMrPdy6wBUnCNCfs/D9V7PnDYw20BV49RPeB7XJfHFuDqAStFRI7gGojfxz1pBLBWRPa65xfh6mksc0yS+9LjjbiOk42XOKbo/+HqFTsFvAE8KO7b7N3jrc7iuosMXIPatxljsnAl3Z/iStCKDcb1tQ0ngdeA/iKSUd6GjTFdgUxx3ZpfqxjXuEellFJKXSrjumsxHoiQajrBGmPexZUAHnGP1bvY8vcCNhG55Et17kTtLVzfpRUkIvuMMQuBWe6xTLWKJkVKKaWUUujlM6WUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopQJMipZRSSilAkyKllFJKKUCTIqWUUkopAOrWdAWUUr9egwYNfs7Jybm2putxpfD29i7KycnRD4seoLH0LI2nZ3l7ex/Jzs7+nwunGxGpifoopTzAGCN6DHuOMQaNp2doLD1L4+lZ7niaC6dr1qmUUkophSZFSimllFKAJkVKKaWUUoAmRUqpSvLx8bF+X7ZsGZ06dWL//v2/qnxZUlNTCQ4O/tX1u9x5eXnhdDoJCQkhLCyMb7/9FoCioiIee+wxgoODsdvtdO3alZSUFAD8/Pyw2+3Y7XaCgoIYP348OTk5AOzfv5+wsDCcTic2m4133nnH2lZSUhJ2u52OHTvy2GOPWWNRTpw4QY8ePfD396dHjx6cPHmymqNQtV5++WVsNhsOhwOn08l3331X7rJz587l0KFD1t/Tp0+nY8eOGGM4duxYqeUTExOpW7cuCxYsqJK616RFixZhjGHXrl01XZWaJyL60pe+aunLdQhXj0aNGomIyIoVK6RDhw6yZ8+eX1W+PCkpKWKz2X51/TyhKuN5fvu//PJL6d69u4iIfPTRR9KvXz8pLCwUEZGDBw/KiRMnRETE19dXMjIyRETk7NmzMmTIEBk+fLiIiOTm5kpOTo41z9fXV9LT00VEpGvXrrJ+/XopKiqSnj17yrJly0RE5KmnnpJXX31VREReffVVGTt2bJW1tzr3TRGRb7/9Vrp162bFJCMjw4pHWaKjoyUxMdH6e/PmzZKSklIi5sUKCgokNjZWevXqJZ988knVNOAiqjKeAwcOlJtuukleeOGFS15Xfn6+B2pU9dzxLPWeqj1FSqlKW7NmDQ8++CD//ve/6dChA+Dq4bnllltwOBzExcVx4MABAFJSUoiKisJutzN+/HhrHZmZmcTFxREWFobdbmfx4sWltrNv3z5CQ0NJTEysnoZVszNnztCsWTMADh8+TKtWrahTx/V23LZtW2ve+Xx8fHjnnXdYtGgRJ06coF69etSvXx+A3NxcioqKrPWdOXOGbt26YYxh+PDhLFq0CIDFixczYsQIAEaMGGFNvxIcPnyY5s2bWzFp3rw5rVu3JikpiejoaMLDw7nttts4fPgwCxYsYNOmTQwbNgyn00l2djahoaH4+fmVue5p06bRr18/WrZsWY0tqh6ZmZmsW7eOWbNm8fHHHwMwePBgli5dai0zcuRIFixYQGFhIU899RRdu3bF4XAwc+ZMAFavXs3NN9/MXXfdRVBQEAB333034eHh2Gw2/vGPf1jrmjVrFp06dSIiIoIHH3yQMWPGAJCRkUG/fv3o2rUrXbt25ZtvvqmuEJRUVqakL33pq3a8qMZP43Xr1pVmzZrJ1q1bS0y/8847Ze7cuSIiMmvWLOnTp4+IiPTu3Vvi4+NFRGT69OlWT0l+fr6cPn1aRFyf5jt06CBFRUVWT9GuXbvE6XRKcnJydTXNUpXxrFOnjoSEhEjnzp2lSZMmsmnTJhFx9Qz5+vpKSEiIPPnkk7J582arTFm9FiEhIbJhwwYRETlw4IDY7XZp0KCBTJ8+XUREEhMTJS4uzlp+zZo1cscdd4iIyNVXX21NLyoqKvG3p1Xnvini6i0LCQkRf39/eeSRR2T16tWSl5cnUVFRcvToURER+fjjj+W+++4TkdI9RcUujHlaWpp0795dCgsLZcSIEVdcT9G8efPk/vvvFxGRqKgo2bRpk3z66acleiTbtm0r586dk5kzZ8pf/vIXERHJycmR8PBw2bdvn6xatUoaNmwo+/bts9Z7/PhxERE5d+6c2Gw2OXbsmKSnp4uvr68cP35c8vLy5KabbpJHH31URESGDBkia9euFRGR/fv3S0BAQJW0txjaU6SUuhRXXXUVN9xwA7NmzSoxff369QwdOhSA3//+96xbtw6Ab775hiFDhljTi4kIzz77LA6Hg//93/8lPT2dI0eOAK5Pi3369OHDDz8kJCSkOppVbRo0aEBycjK7du3iyy+/ZPjw4YgIbdu25ccff+TVV1+lTp06xMXFsXLlynLX43o/d2nXrh3btm1jz549xMfHW3GsDGMMxpT6mpZay8fHh6SkJP7xj3/QokULBg0axMyZM9mxYwc9evTA6XQyceJE0tLSftF6H3/8cV5//XWrJ+9KM3/+fAYPHgy4eojmz59Pr169WLVqFbm5uXzxxRd0796dBg0asHz5ct5//32cTieRkZEcP36cn376CYCIiAjat29vrXfq1KmEhITQrVs3Dh48yE8//cTGjRuJjo7mmmuu4aqrrmLAgAHW8itWrGDMmDE4nU7uuusuzpw5Q2ZmZvUGA/1Ga6VUJdWpU4d//etfxMXF8corr/Dss89etExZJ90PP/yQjIwMkpKSuOqqq/Dz87MGD1999dVcd911rFu3zuqGvxJFRUVx7NgxMjIyaNmyJfXr16dXr1706tWLa6+9lkWLFhEXF1eq3NmzZ0lNTaVTp04lprdu3Zrg4GDWrl3LjTfeWOLEn5aWRps2bQC49tprrct1hw8fvuIuB3l5eRETE0NMTAx2u52///3v2Gw21q9f/6vXuWnTJitpOHbsGMuWLaNu3brcfffdnqp2jTlx4gQJCQls374dYwyFhYUYY3jjjTeIiYnhq6++4p///KfVfhFh2rRp3HbbbSXWs3r1aho1alTi7xUrVrB+/XoaNmxITEyMdYyXp6ioiA0bNuDt7e35hv4CV2bqq5SqEg0bNmTp0qV8+OGHVo/RDTfcYI1F+PDDD7n55psBuPHGG0tML3b69GlatmzJVVddxapVq0rcwVavXj0+++wz3n//fT766KPqala127VrF4WFhfzud79j8+bN1l1QRUVFbNu2DV9f31JlMjMz+cMf/sDdd99Ns2bNSEtLIzs7G4CTJ0+ybt06OnfuTKtWrWjSpAkbNmxARHj//ffp06cPAHfddRfx8fEAxMfHW9OvBD/++KPVawGQnJxMYGAgGRkZVlKUn5/Pzp07AWjcuDFnz5696HpTUlJITU0lNTWV/v37M2PGjCsiIQJYsGABv//979m/fz+pqakcPHiQ9u3bs3btWgYNGsScOXNYu3YtPXv2BOC2227j7bffJj8/H4Ddu3eTlZVVar2nT5+mWbNmNGzYkF27drFhwwYAunbtyn/+8x9OnjxJQUEBCxcutMrceuutTJs2zfo7OTm5KptevrKuqelLX/qqHS9q4O4zEddYFj8/P1m8eLGkpqZKbGys2O12ueWWW2T//v0iIrJv3z7p1q2bBAcHy3PPPWeVz8jIsKaPHDlSAgICJCUlpcTdZydPnpQuXbrI4sWLq619IlItY4pCQkLE4XDIv//9bxER+eKLLyQsLExsNpvYbDa57777JDs7W0Rc41uCg4PFZrNJYGCgPPvss9a85cuXi91uF4fDIXa7XWbOnGltKzExUWw2m1x//fXy6KOPSlFRkYiIHDt2TG655Rbp2LGjxMXFWeM+qkJ17psiIps2bZKoqCgJDAwUu90uffv2lYyMDNmyZYvcfPPN4nA4JCgoSP7xj3+IiMiCBQukU6dOEhISIufOnZMpU6ZImzZtxMvLS1q1aiWjRo0qtY0rbUxRTEyMfPHFFyWmTZkyRR5++GHJy8uTZs2ayciRI615hYWF8swzz1j7ZExMjJw6dUpWrVpljVsTcY036tmzpwQEBEifPn0kOjpaVq1aJSIiM2fOlI4dO0pERIQMHz5cnn32WRFxvS8MHDhQ7Ha7BAYGyujRoz3e3vNRzpgiffaZUrWYPvvMs/T5Up6jsfSsKyWemZmZ+Pj4UFBQQN++fbn//vvp27dvtddDn32mlFJKqRr14osv4nQ6CQ4Opn379pfdpUjtKVKqFtOeIs+6Uj6NXw40lp6l8fQs7SlSSimllKqAJkVKKaWUUlzke4oaNGjwc05OzrXVVRml1C/j7e19RX0BX03TeHqOxtKzNJ6e5e3tXVTW9ArHFOl4BaUubzrOwLM0np6jsfQsjadn6ZgipZRSSqkKaFKklFJKKYUmRUoppZRSQA0nRcYY/vjHP1p/v/nmm7z44osATJo0iaCgIBwOB3FxcSWej7R7925uv/12/P39CQsLY+DAgb/o6dBKqctDTk4OERERhISEYLPZmDBhAgDTp0+nY8eOGGM4duxYmWX3799PWFgYTqcTm83GO++8Y83r2bOntc6HH36YwsLCamlPTTp48CCxsbEEBQVhs9mYMmUKAFu3biUqKgq73U7v3r05c+ZMmeWnTJlCcHAwNpuNyZMnW9M/+eQTbDYbderUYdOmTdXSlstBVcUTYNq0aQQEBGCz2Rg7dmyVt+VyVt57QEpKCpGRkXTs2JFBgwaRl5dX7joOHDiAj48Pb7755qVXqKxnf0g1PVepfv364ufnJxkZGSIi8sYbb8iECRNERCQhIUGysrJERGTGjBkycOBAERHJzs6Wjh07ypIlS6z1rFq1SrZv316ldVXqclTVx2hVKyoqkrNnz4qISF5enkRERMj69etl8+bNkpKSIr6+vtb7w4Vyc3MlJydHRETOnj0rvr6+kp6eLiIip0+fttZ/zz33yPz58ytVn9ocz0OHDklSUpKIiJw5c0b8/f1l586d0qVLF1m9erWIiMyaNUvGjx9fquz27dvFZrNJVlaW5OfnS1xcnPz0008iIvL999/Lrl27JDo6WhITEytdn9ocS5Gqi2dCQoLExcVZ++6RI0cqVZ/aHs/ylPceMGDAAOu4HT16tMyYMaPcdfTr10/69+8vb7zxRqW3SznPPqvRnqK6devy0EMP8dZbb5WaFxsbS8OGDQHo1q0baWlpAHz00UdERUXRu3dva9mYmBiCg4Orp9JKKY8xxuDj4wO4nmCen5+PMYbQ0FD8/PwqLFuvXj3q168PQG5uLkVF/73DtkmTJgAUFBSQl5f3m7iVuVWrVoSFhQGuJ8AHBgaSnp7O7t276d69OwA9evQo8WTyYj/88AORkZE0bNiQunXrEh0dzaeffgpAYGAgnTt3rr6GXCaqKp5vv/02Tz/9tLXvtmzZsppadHkq7z0gISGB/v37AzBixAgWLVpUZvlFixbRvn17bDabR+pT42OKHn30UT788ENOnz5d7jKzZs2iV69eAOzYsYPw8PDqqp5SqooVFhbidDpp2bIlPXr0IDIystJlDx48iMPhoF27dowbN47WrVtb82677TZatmxJ48aNrTfX34rU1FS2bNlCZGQkNpuNxYsXA65LYQcPHiy1fHBwMGvXruX48eOcO3eOZcuWlbncb5Un47l7927Wrl1LZGQk0dHRJCYmVmtbLkcXvgd06NCBpk2bUreu66sU27ZtS3p6eqlymZmZvP7669YlN0+o8aSoSZMmDB8+nKlTp5Y5f968eWzatImnnnqqmmumlKoOXl5eJCcnk5aWxsaNG9mxY0ely7Zr145t27axZ88e4uPjS4wt/Oqrrzh8+DC5ubkkJCRURdUvS5mZmfTr14/JkyfTpEkTZs+ezYwZMwgPD+fs2bPUq1evVJnAwEDGjRvHrbfeSs+ePXE6nXh5edVA7S8/no5nQUEBJ06cYMOGDbzxxhsMHDjwN//9Qxe+B+zatatS5V588UWeeOIJq6fJE2o8KQJ4/PHHmTVrFllZWSWmr1ixgpdffpklS5ZYXY02m42kpKSaqKZSqgo1bdqU2NhYvvzyy19ctnXr1tan8/N5e3vTp08f65P9lS4/P59+/foxbNgw7rnnHgACAgJYvnw5SUlJDBkyhA4dOpRZdtSoUSQlJbFmzRqaNWtGp06dqrPql6WqiGfbtm255557MMYQERFBnTp1yr2Z4Lem+D1g/fr1nDp1ioKCAgDS0tJo06ZNqeW/++47xo4di5+fH5MnT+aVV15h+vTpl1SHyyIpuuaaaxg4cCCzZs2ypm3ZsoXRo0ezZMmSEtdchw4dyrfffsvSpUutaWvWrPlFny6VUpeHjIwMTp06BUB2djZff/01AQEBlSqblpZGdnY2ACdPnmTdunV07tyZzMxMDh8+DLg+lS9durTS66zNRIRRo0YRGBjIk08+aU0/evQoAEVFRUycOJGHH364zPLFyx04cIBPP/2UoUOHVn2lL2NVFc+7776bVatWAa5LaXl5eTRv3rwqm3JZK+s9IDAwkNjYWBYsWABAfHw8ffr0KVV27dq1pKamkpqayuOPP86zzz7LmDFjLq1CZY2+lmq6+6xRo0bW7z///LM0aNDAuvssLi5OWrZsKSEhIRISEiK9e/e2lv3hhx/ktttuk44dO0pgYKAMGjRIfv755yqtq1KXo6o+Rqva1q1bxel0it1uF5vNJi+99JKIiEyZMkXatGkjXl5e0qpVKxk1apSIiCQmJlq/L1++XOx2uzgcDrHb7TJz5kwRcb2XdOnSxVrnmDFjJD8/v1L1qc3xXLt2rQBit9ut982lS5fK5MmTxd/fX/z9/WXcuHFSVFQkIiLp6enSq1cvq/xNN90kgYGB4nA4ZMWKFdb0Tz/9VNq0aSP16tWTli1byq233ilFkY0AACAASURBVFqp+tTmWIpUXTxzc3Nl2LBhYrPZJDQ0VFauXFmp+tT2eJanvPeAvXv3SteuXaVDhw7Sv39/6269xYsXy/PPP19qPRMmTPDI3Wf67DOlajF9HpJnaTw9R2PpWRpPz9JnnymllFJKVUCTIqWUUkopNClSSimllAI0KVJKKaWUAqBuRTO9vb2LjDGaOCl1mfL29v5NPMKiumg8PUdj6VkaT8/y9vYuKmu63n2mVC2md6R4lsbTczSWnqXx9Cy9+0wppZRSqgKaFCmllFJKoUmRUkoppRRQw0mRMYY//vGP1t9vvvkmL774IgCTJk0iKCgIh8NBXFwc+/fvByA1NRVjDNOmTbPKjRkzhrlz51Zn1ZVSlygnJ4eIiAhCQkKw2WxMmDABgOnTp9OxY0eMMeU+KHP//v2EhYXhdDqx2Wy88847AJw7d4477riDgIAAbDYbTz/9dLW153J18OBBYmNjCQoKwmazMWXKFAC2bt1KVFQUdrud3r17c+bMmTLLT5kyheDgYGw2G5MnT67OqteoqozbtGnTrH107NixVd6Wy0F5x3tKSgqRkZF07NiRQYMGkZeXV6rsxo0bcTqdOJ1OQkJC+Oyzz6x5Ht8/y3r2h1TTs8/q168vfn5+kpGRISIib7zxhvXss4SEBMnKyhIRkRkzZsjAgQNFRCQlJUVatmwpHTp0kNzcXBERefTRR2XOnDlVWlelLkdVfYxWpaKiIjl79qyIiOTl5UlERISsX79eNm/eLCkpKeLr62u9N1woNzfXehbS2bNnxdfXV9LT0yUrK0sSEhKsZW666SZZtmxZpetUm+NZnkOHDklSUpKIiJw5c0b8/f1l586d0qVLF1m9erWIiMyaNUvGjx9fquz27dvFZrNJVlaW5OfnS1xcnPz000+V2m5tj2VVxS0hIUHi4uKs/ffIkSOVqk9tj2d5x/uAAQNk/vz5IiIyevRomTFjRqmyxXEUcf1fWrRoIfn5+Z7YP0vlPTXaU1S3bl0eeugh3nrrrVLzYmNjadiwIQDdunUjLS3NmteiRQvi4uKIj4+vtroqpTzLGIOPjw8A+fn55OfnY4whNDQUPz+/CsvWq1eP+vXrA5Cbm0tRkevu2oYNGxIbG2stExYWVuK947eoVatWhIWFAdC4cWMCAwNJT09n9+7ddO/eHYAePXqwcOHCUmV/+OEHIiMjadiwIXXr1iU6OppPP/20WutfU6oqbm+//TZPP/20tf+2bNmymlpUs8o73hMSEujfvz8AI0aMYNGiRaXKFscRXD1OxV9NUBX7Z42PKXr00Uf58MMPOX36dLnLzJo1i169epWYNm7cON58800KCwuruopKqSpSWFiI0+mkZcuW9OjRg8jIyEqXPXjwIA6Hg3bt2jFu3Dhat25dYv6pU6f4/PPPiYuL83S1a63U1FS2bNlCZGQkNpuNxYsXA/DJJ59w8ODBUssHBwezdu1ajh8/zrlz51i2bFmZy13pPBm33bt3s3btWiIjI4mOjiYxMbFa21KTLjzeO3ToQNOmTa2Ep23btqSnp5dZ9rvvvsNms2G323nnnXeoW7duleyfNZ4UNWnShOHDhzN16tQy58+bN49Nmzbx1FNPlZh+/fXXExkZyUcffVQd1VRKVQEvLy+Sk5NJS0tj48aN7Nixo9Jl27Vrx7Zt29izZw/x8fEcOXLEmldQUMCQIUN47LHHuP7666ui6rVOZmYm/fr1Y/LkyTRp0oTZs2czY8YMwsPDOXv2LPXq1StVJjAwkHHjxnHrrbfSs2dPnE4nXl5eNVD7muPpuBUUFHDixAk2bNjAG2+8wcCBA38z3z904fG+a9euSpeNjIxk586dJCYm8uqrr5KTk1Ml+2eNJ0UAjz/+OLNmzSIrK6vE9BUrVvDyyy+zZMkSq6vxfM8++yyvv/76b2aHUupK1bRpU2JjY/nyyy9/cdnWrVtbnxiLPfTQQ/j7+/P44497spq1Vn5+Pv369WPYsGHcc889AAQEBLB8+XKSkpIYMmQIHTp0KLPsqFGjSEpKYs2aNTRr1oxOnTpVZ9VrVFXErW3bttxzzz0YY4iIiKBOnTrl3lBwpSo+3tevX8+pU6coKCgAIC0tjTZt2lRYNjAwEB8fH+sDlKf3z8siKbrmmmsYOHAgs2bNsqZt2bKF0aNHs2TJknKvuQYEBBAUFMTnn39eXVVVSnlIRkYGp06dAiA7O5uvv/6agICASpVNS0sjOzsbgJMnT7Ju3To6d+4MwPjx4zl9+vRv6k6piogIo0aNIjAwkCeffNKafvToUQCKioqYOHEiDz/8cJnli5c7cOAAn376KUOHDq36Sl8Gqipud999N6tWrQJcl9Ly8vJo3rx5VTblslDW8R4YGEhsbCwLFiwAID4+nj59+pQqm5KSYiVO+/fvZ9euXda4Q4/vn2WNvpZquvusUaNG1u8///yzNGjQwLr7LC4uTlq2bCkhISESEhIivXv3FhHX3Wc2m80ql5ycLMYYvftM/SZV9TFalbZu3SpOp1PsdrvYbDZ56aWXRERkypQp0qZNG/Hy8pJWrVrJqFGjREQkMTHR+n358uVit9vF4XCI3W6XmTNniojIwYMHBZCAgADrvePdd9+tdJ1qczzLs3btWgHEbrdbMVm6dKlMnjxZ/P39xd/fX8aNGydFRUUiIpKeni69evWyyt90000SGBgoDodDVqxYUent1vZYVlXccnNzZdiwYWKz2SQ0NFRWrlxZqfrU9niWd7zv3btXunbtKh06dJD+/ftbd+UtXrxYnn/+eRERef/99yUoKEhCQkIkNDRUPvvsM2u9l7h/lsp79NlnStVi+jwkz9J4eo7G0rM0np6lzz5TSimllKqAJkVKKaWUUmhSpJRSSikFaFKklFJKKQVA3Ypment7FxljNHFS6jLl7e1tfeW9unQaT8/RWHqWxtOzvL29i8qarnefKVWL6R0pnqXx9ByNpWdpPD1L7z5TSimllKqAJkVKKaWUUmhSpJRSSikF1HBS9PLLL2Oz2XA4HDidTr777rsKlx85cqT1jJS1a9dis9lwOp3WM5AuN++88w7vv//+Ja8nJiaGTZs2lTm9c+fOOBwOAgICGDNmjPVsmaoyd+5cxowZU6XbqIzU1FQaNGhAaGgogYGBREREMHfu3CrZ1u23315hXB944AG+//77Ktn2lSwnJ4eIiAhCQkKw2WxMmDABgOnTp9OxY0eMMRU+KLNnz540bdqUO++8s8R0EeG5556jU6dOBAYGMnXq1Cptx+Xi4MGDxMbGEhQUhM1mY8qUKQBs3bqVqKgo7HY7vXv35syZM6XK/vjjjzidTuvVpEkT69lxL774Im3atLHmLVu2rFrbVVMuJZ4Ab731FjabjeDgYIYMGUJOTg4Aw4YNo3PnzgQHB3P//feTn59fbW2qSeUd7ykpKURGRtKxY0cGDRpEXl5eqbJff/014eHh2O12wsPDSUhIKLXMXXfdRXBw8KVXtKxnf0g1PPvs22+/lW7dulnPOcnIyJD09PQKy4wYMUI++eQTEREZPXq0fPDBB1VWv8rKz8+v8m1ER0dLYmJihdNzc3PlySeflO7du1dpXebMmSOPPvpolW6jMi58Bt7evXslJCREZs+eXYO1qn5VeYxWtaKiIjl79qyIiOTl5UlERISsX79eNm/eLCkpKeLr6ysZGRnlll+xYoUsWbJE7rjjjhLTZ8+eLb///e+lsLBQRESOHDlS6TrV5ngeOnRIkpKSRETkzJkz4u/vLzt37pQuXbrI6tWrRURk1qxZMn78+ArXU1BQINdee62kpqaKiMiECRPkjTfe+MX1qc2xFLm0eKalpYmfn5+cO3dOREQGDBhgPZ9z6dKlUlRUJEVFRTJ48GCZMWNGpepT2+NZ3vE+YMAAmT9/voi4zutlxWPz5s1WfrB9+3Zp3bp1ifkLFy6UIUOGlDgnXAzlPPusxnqKDh8+TPPmzalfvz4AzZs3p3Xr1gAkJSURHR1NeHg4t912G4cPHy5R9r333uNf//oXzz//PMOGDSu17k8++YTg4GBCQkLo3r07ULqH484772T16tUA+Pj48MQTT2Cz2YiLiyMjIwOAvXv30rNnT8LDw7n55pvZtWsX4Oqxevjhh4mMjGTs2LH4+fmV6Enw9/fnyJEjvPjii7z55psATJ06laCgIBwOB4MHDwYgKyuL+++/n4iICEJDQ1m8eDHgeoLw4MGDCQwMpG/fvpXqCatXrx5//etfOXDgAFu3bgVg3rx5RERE4HQ6GT16NIWFhQAsX76cqKgowsLCGDBgAJmZmQD4+fkxduxY7HY7ERER7Nmzp8Jtjhw5kkceeYRu3bpx/fXXs3r1au6//34CAwMZOXKktdwjjzxCly5dSnw6AFi2bBkBAQGEh4fz2GOPWZ/4y4tLRa6//nomTZpk9QqUt465c+dyzz330LNnT/z9/Rk7dqy1jvnz52O32wkODmbcuHHWdD8/P44dO0ZWVhZ33HEHISEhBAcH889//hMo2ZPn4+PDc889R0hICN26dePIkSOAa1/q1q0bdrud8ePH4+Pjc9E2XemMMVYc8vPzyc/PxxhDaGio9QTsisTFxdG4ceNS099++21eeOEF6tRxvb21bNnSo/W+XLVq1YqwsDAAGjduTGBgIOnp6ezevdt6H+zRowcLFy6scD0rV66kQ4cO+Pr6VnmdL2eXGs+CggKys7MpKCjg3Llz1vnt9ttvxxiDMYaIiAjS0tKqp0E1rLzjPSEhgf79+wMwYsQIFi1aVKpsaGioFT+bzUZ2dja5ubkAZGZmMmnSJMaPH++ZipaVKUk19BSdPXtWQkJCxN/fXx555BEr887Ly5OoqCg5evSoiIh8/PHHct9994lIyZ6i83+/UHBwsKSlpYmIyMmTJ0WkdA/HHXfcIatWrRIRV8Y4b948ERF56aWXrOVuueUW2b17t4iIbNiwQWJjY61t33HHHVJQUCAiIo899pjVQ7FhwwaJi4sTkZKfsFq1amX1ihXX6ZlnnrF6u06ePCn+/v6SmZkpf/vb36w2b926Vby8vC7aU1SsT58+8vHHH8v3338vd955p+Tl5YmIyCOPPCLx8fGSkZEhN998s2RmZoqIyGuvvWY9rdjX11cmTpwoIiLx8fGlPoFfGMcRI0bIoEGDpKioSBYtWiSNGzeWbdu2SWFhoYSFhcmWLVtEROT48eMi4voEGh0dLVu3bpXs7Gxp27at7Nu3T0REBg8ebG2vvLic78KeouJlvb29K1zHnDlzpH379nLq1CnJzs6W6667Tg4cOCDp6enSrl07OXr0qOTn50tsbKz1JObiHosFCxbIAw88YG3v1KlTpf4PgCxZskRERJ566in5y1/+IiKu/e2jjz4SEZG3335bGjVqVCq2v0ZVHqPVoaCgQEJCQqRRo0YyduzYEvMu1lMkIrJq1apS++k111wjEydOlPDwcOnZs6d1DFdGbY9nsZSUFGnXrp2cPn1aoqKirH35b3/7m/j4+FRY9r777pNp06ZZf0+YMEF8fX3FbrfLfffdJydOnKhUHa6UWIr8unhOnjxZGjVqJM2bN5ehQ4eWmp+XlyehoaGyZs2aStXhSojnhcd7RkaGdOjQwZp/4MCBi/b2fPLJJ9Y5VkTk8ccfl08//bTMc0JFuNx6inx8fEhKSuIf//gHLVq0YNCgQcydO5cff/yRHTt20KNHD5xOJxMnTvzFmfSNN97IyJEjeffdd63ekYrUqVOHQYMGAXDvvfeybt06MjMz+fbbbxkwYIDV03J+j9WAAQPw8vICYNCgQVavwccff2yt63wOh4Nhw4Yxb9486tZ1fWfm8uXLee2113A6ncTExJCTk8OBAwdYs2YN9957r1XO4XBUuu3i/h6LlStXkpSURNeuXXE6naxcuZJ9+/axYcMGvv/+e2688UacTifx8fHs37/fKj9kyBDr5/r16y+6vd69e2OMwW63c+2112K326lTpw42m43U1FQA/vWvfxEWFkZoaCg7d+7k+++/Z9euXVx//fW0b9++xHYriktl236xdcTFxXH11Vfj7e1NUFAQ+/fvJzExkZiYGFq0aEHdunUZNmwYa9asKbF+u93O119/zbhx41i7di1XX311qTrUq1fP6vEKDw+3YrB+/XoGDBgAwNChQy/alt8KLy8vkpOTSUtLY+PGjezYseOS15mbm4u3tzebNm3iwQcf5P777/dATWuPzMxM+vXrx+TJk2nSpAmzZ89mxowZhIeHc/bsWerVq1du2by8PJYsWWLtq+Dq6d27dy/Jycm0atWKP/7xj9XRjMvGr4nnyZMnWbx4MSkpKRw6dIisrCzmzZtXYpk//OEPdO/enZtvvrm6mlLjLjzei6++VNbOnTsZN24cM2fOBCA5OZm9e/fSt29fj9Wxwm+0rmpeXl7ExMQQExOD3W4nPj6e8PBwbDZbpU7IxZ577jmWLl0KuIL0zjvv8N1337F06VLCw8NJSkqibt26FBX99wssiwe9lcUYQ1FREU2bNiU5ObnMZRo1amT9HhUVxZ49e8jIyGDRokVlduMtXbqUNWvW8Pnnn/Pyyy+zfft2RISFCxfSuXPnSre1IoWFhWzfvp3AwECOHj3KiBEjePXVV0ss8/nnn9OjRw/mz59f5jrO/8bUynx7avHlzzp16li/F/9dUFBASkoKb775JomJiTRr1oyRI0dWGHvgV8dly5YtBAYGVriO7777rkQ9vby8KCgoqNT6O3XqxObNm1m2bBnjx48nLi6OF154ocQyV111lRW3X7Lu37qmTZsSGxvLl19+ecmDJdu2bcs999wDQN++fbnvvvs8UcVaIT8/n379+jFs2DArBgEBASxfvhyA3bt3W++VZfniiy8ICwvj2muvtaad//uDDz5YamD7lezXxnPFihW0b9+eFi1aAHDPPffw7bffWh92X3rpJTIyMqyT+29N8fG+fv16Tp06RUFBAXXr1iUtLY02bdqUWSYtLY2+ffvy/vvv06FDB8D1YXPTpk34+flRUFDA0aNHiYmJsYbG/Bo11lP0448/8tNPP1l/Jycn4+vrS+fOncnIyLCSovz8fHbu3Fnhul5++WWSk5OtBGbv3r1ERkby5z//mRYtWnDw4EH8/PxITk6mqKiIgwcPsnHjRqt8UVGRdVfbRx99xE033USTJk1o3749n3zyCeA6yRaP1bmQMYa+ffvy5JNPEhgYyO9+97sS84u3GRsby+uvv87p06fJzMzktttuY9q0aVYPx5YtWwDo3r07H330EQA7duxg27ZtF41nfn4+zzzzDO3atcPhcBAXF8eCBQs4evQoACdOnGD//v1069aNb775xhovlJWVxe7du631FPd4/fOf/yQqKuqi272YM2fO0KhRI66++mqOHDnCF198AUDnzp3Zt2+f1ZNSvF2g3LhUJDU1lT/96U/83//9369aR0REBP/5z384duwYhYWFzJ8/n+jo6BLLHDp0iIYNG3Lvvffy1FNPsXnz5soFAejWrZs19uDjjz+udLkrWUZGhjUWLzs7m6+//pqAgIBLXu/dd9/NqlWrAPjPf/5Dp06dLnmdtYGIMGrUKAIDA3nyySet6cXvAUVFRUycOJGHH3643HXMnz+/RK8tUKKH/LPPPvPMHT61wKXE87rrrmPDhg2cO3cOEWHlypXWB7b33nuPr776ivnz51vj3n4LyjreAwMDiY2Ntc6/8fHx9OnTp1TZU6dOcccdd/Daa69x4403WtMfeeQRDh06RGpqKuvWraNTp06XlBBBDSZFmZmZjBgxwhp8/P333/Piiy9Sr149FixYwLhx4wgJCcHpdPLtt9/+onU/9dRT1oDZG264gZCQEG688Ubat29PUFAQjz32mDWADly9Phs3biQ4OJiEhATr0/+HH37IrFmzrFsIKxrwO2jQIObNm1fmpbPCwkLuvfde7HY7oaGhPPbYYzRt2pTnn3+e/Px8HA4HNpuN559/HnD9ozMzMwkMDOSFF14gPDy83O0OGzYMh8NBcHAwWVlZVh2DgoKYOHEit956Kw6Hgx49enD48GFatGjB3LlzGTJkCA6Hg6io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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"data = [[31.33, 29.91, 29.96, 30.40],\n",
" [31.32, 29.90, 29.96, 30.39],\n",
" [31.16, 29.75, 29.82, 30.24],\n",
" [31.01, 29.88, 29.66, 30.20]]\n",
"\n",
"columns = ('Kodak', 'BSD300', 'Set14', 'Average')\n",
"rows = ('N2C', 'N2N', 'Self-supervised Deep Image Denoising', 'Proposed DiDNT')\n",
"\n",
"# Add a table at the bottom of the axes\n",
"the_table = plt.table(cellText=data,\n",
" rowLabels=rows,\n",
" colLabels=columns,\n",
" loc='center')\n",
"\n",
"ax = plt.gca()\n",
"ax.get_xaxis().set_visible(False)\n",
"ax.get_yaxis().set_visible(False)\n",
"plt.box(on=None)\n",
"the_table.scale(1, 1.5)\n",
"\n",
"plt.title('PSNR Results for Poisson Noise (λ ∈ [5,50])')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It can be seen that for scenario of Poisson noise using fixed number of λ, the proposed method yield the best results. As for random number of λ, while my results are not the best, but they are still competitive (compared with other results)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Denoising on Impulse Noise"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00086-eval-ilsvrc-kodak-3c-impulse50-iter4m-blindspot-known-res128-EVAL_impulse50-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/kodak/*.png'.\n",
"Loaded 24 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 10 times.\n",
"Evaluating network 'list_trained/network-2320000-impulse50-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 240 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 31.2646, valid_psnr_pme= 33.6970\n",
"Evaluation done, exiting.\n",
"RESULT 33.6970\n",
"dnnlib: Finished selfsupervised_denoising.train() in 5m 53s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=kodak --eval=list_trained/network-2320000-impulse50-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00087-eval-ilsvrc-bsd300-3c-impulse50-iter4m-blindspot-known-res128-EVAL_impulse50-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/BSR/BSDS500/data/images/test/*.jpg'.\n",
"Loaded 200 images.\n",
"Validation image padded size = [512, 512].\n",
"Repeating the validation set 3 times.\n",
"Evaluating network 'list_trained/network-2320000-impulse50-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 600 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 29.4790, valid_psnr_pme= 31.9694\n",
"Evaluation done, exiting.\n",
"RESULT 31.9694\n",
"dnnlib: Finished selfsupervised_denoising.train() in 6m 25s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=bsd300 --eval=list_trained/network-2320000-impulse50-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00088-eval-ilsvrc-set14-3c-impulse50-iter4m-blindspot-known-res128-EVAL_impulse50-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/Set14/*.png'.\n",
"Loaded 14 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 20 times.\n",
"Evaluating network 'list_trained/network-2320000-impulse50-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 280 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 29.5466, valid_psnr_pme= 31.7654\n",
"Evaluation done, exiting.\n",
"RESULT 31.7654\n",
"dnnlib: Finished selfsupervised_denoising.train() in 5m 27s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=set14 --eval=list_trained/network-2320000-impulse50-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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4xlgI74RnB+Bzf5lZ6qMb5L3YXz7QQjwmH/dK/gShmXGmJP4EvnWhTTlDfLOW/o70NEYswnfvtYZGGKMeaAo/foT+uH7CYxj+PrS25+s4k/wc48a/T98SexxfLG/R0S+ybV+AL5k8JJifHMblVJKqQtjjJkFJInIWVdvqf/xjzZtAeKklH/AsTj4DzDeEJHimkNXbuQ3M14ppZRSJcR/yininBuWU+L7RetLLiECPX2mlFJKKQXo6TOllFJKKUBHipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUATYqUUkoppQBNipRSSimlAE2KlFJKKaUACCzrBiilzl+VKlV+z8jIuKqs23GpCAoK8mZkZOjBYjHQWBYvjWfxCgoKOpSenn71mcuNiJRFe5RSxcAYI/oeLj7GGDSexUNjWbw0nsXLH09z5nLNOpVSSiml0KRIKaWUUgrQpEgppZRSCtCkSClVRMHBwdb/lyxZQtOmTdmzZ895lc9PYmIikZGR592+8i4gIAC3243L5aJ58+Z8//33AHi9XkaNGkVkZCQOh4NWrVqRkJAAQFhYGA6HA4fD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WrQoreYppUpYdnY2brebkJAQOnXqROvWrQEYMmQIV199NTt37uSBBx7It+wPP/yA3W7H4XAwffp0K0nKkZiYyJYtW6w6/6oKivGfsX79ejIzM2nUqFEJtLB8Ot+4eb1eHn74YSZPnlzgNsePH+ezzz4jLi6uuJpb7p1vPF0uF0uXLuXUqVMcPnyYlStXsm/fPgDefvttunfvTv369Xnvvfcu+JRkmSdF1atXZ+DAgbz66qv5rn///ffZuHEjY8aMKeWWKaVKQ0BAAPHx8SQlJbF+/Xp++uknAGbOnMmBAwew2WwFzmVp3bo127dvZ8OGDUyaNImMjAxrXWpqKrfffjsvv/yyNfL0V1VQjIvq4MGD3H333cycOZMKFcr8a6PUnG/cpk6dan1R5ycrK4v+/fszatQoGjZsWJxNLtfON56dO3eme/futG3blv79+9OmTRsCAgIAeOmll1iyZAlJSUkMGTKEhx566ILaWC727tGjRzNjxgzS0tLyLP/qq6+YOHEiixYtonLlygDY7XY2bdpUFs1USpWgGjVq0LFjR2tYHHwfov369ePjjz8utKzNZiM4ONj6kPV4PNx+++0MGDCA2267rUTbfTHJL8bncuLECXr06MHEiROJiYkpwdaVX382bmvXrmXKlCmEhYXxyCOP8O677+YZwbj33ntp0qQJo0ePLqkml2vnsx+OGzeO+Ph4li9fjojQtGlTkpOT2bp1qzXi1LdvX77//vsLalu5SIpq1apFnz59mDFjhrVsy5Yt3HfffSxatIiQkBBr+Z133sn333/P4sWLrWWrVq3600c+Sqmyl5yczPHjxwFIT09n+fLlNGvWzLqCRERYtGgR4eHhZ5VNSEggKysLgD179rBz507CwsIQEYYNG4bNZrvgo8ZLQX4xzi+e+cnMzKRXr14MHDiQ3r17l2Qzy50LiducOXPYu3cviYmJTJ48mYEDB/Lss88CMH78eFJSUnj55ZdLrO3l0YXEMzs7myNHjgCwbds2tm3bRufOnalZsyYpKSn88ssvACxfvhybzXZhDc1v9rWU0tVn1apVs/7/+++/S5UqVayrz+Li4iQkJERcLpe4XC656aabrG3/+9//SpcuXaRx48Zis9mkb9++8vvvv5doW5Uqj0r6PVrStm7dKm63WxwOh9jtdnn66aclOztb2rZtK5GRkWK32+XOO++0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TK6++mpp166d9bl3Lhd7LEUK3z8LG5144YUXrPe+iMg//vEPeeGFF+TYsWNSv359efDBByUqKkp69+4tv//+e5HacrHH83xj+cknn0iPHj2kV69e4na75ZFHHjlrH7wkRoqCg4PZtGkTb775JrVr16Zv377MmjWLn3/+mZ9++olOnTrhdrt55pln8j1SLMx1113H4MGDeeutt6zRkcJUqFCBvn37AnDXXXexZs0aUlNT+f7777njjjuskZbcI1Z33HEHAQEBAPTt29caNZg/f75VV25Op5MBAwbw/vvvExjo+83MZcuW8eyzz+J2u4mNjSUjI4O9e/eyatUq7rrrLquc0+ksct/F/zsWX3/9NZs2baJVq1a43W6+/vprdu/ezbp169ixYwfXXXcdbreb2bNns2fPHqt8//79rX/Xrl17zte76aabMMbgcDi46qqrcDgcVKhQAbvdbp33/fDDD2nevDlRUVFs376dHTt2sHPnTho2bEiDBg3yvG5hcSlq389VR1xcHJdffjlBQUFERESwZ88eNmzYQGxsLLVr1yYwMJABAwawatWqPPU7HA6WL1/O2LFjWb16NZdffvlZbahUqZI14tWiRQsrBmvXruWOO+4A4M477zxnX/4qAgICiI+PJykpifXr1/PTTz9Z6+6//37at29Pu3btzirXuXNnunfvTtu2benfvz9t2rSx3o8vvfQSS5YsISkpiSFDhvDQQw+VWn/K2pnxzBndLqoffviBqlWrEhkZCfiO6qdNm8aWLVs4cOAATqeTSZMmlUTTy6XC9s/zkZWVRVJSEm3btmXz5s20adOGRx55pJhaW76dbyyzsrJYvXo1kydPZsOGDezevbvE5o/COX7RuqQFBAQQGxtLbGwsDoeD2bNn06JFC+x2e5G+kHOMGzeOxYsXAxAfH8/06dP54YcfWLx4MS1atGDTpk0EBgbi9f7vBywzMjIKrM8Yg9frpUaNGtZkwzNVq1bN+n+bNm347bffSE5OZuHChYwfP/6s7RcvXsyqVav47LPPmDhxIj/++CMiwscff0yzZs2K3NfCZGdn8+OPP2Kz2fjjjz8YNGjQWR9gn332GZ06dWLevHn51pH7F1OL8uupOac/K1SoYP0/53lWVhYJCQnWzlyzZk0GDx5caOyB847Lli1bsNlshdbxww8/5GlnQEAAWVlZRaq/adOm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7t0731+inzNnjvUecbvdVKhQocAbO19KCorZlClTaNy4McYYDh8+XGD5sWPHEhkZSWRkZJ57EbZr186KZd26dbn11ltLvC/lwYXEc+XKlXn2waCgIBYuXAhoPM+M54ABA2jWrBmRkZEMHToUj8dTYB0nTpygfv36jBw50lo2b948HA4HTqeTrl27FrqPF4mIFPjwrS451apVs/5/5513yr///e88671er2RnZ5doG4qqQ4cOsmHDhkKXnz59Wh566CFp3779WdslJCSI3W63nu/atUtcLpe88847IiIyc+ZMueaaa6RPnz7WNna7XRISEqznM2fOlBEjRhRXl9QloKTfo2XF6/XKyZMnRUQkMzNToqOjZe3atZKSkmJt8+CDD8qkSZMKrWfbtm3SsGHDIr/uxRzPgmK2efNmSUhIkNDQUElOTs637Oeffy433nijeDweSU1NlZYtW+aJdY7bbrtNZs+eXaT2XMyxFLmweOZ25MgRqVmzpqSlpZ21TuO5VhYvXixer1e8Xq/069dPpk6dWmAdo0aNkv79+1vfgx6PR2rXrm39HcaMGSMTJkwoUnv88Twr7yk3p8/atWvHb7/9RmJiIs2aNWPgwIFERkayb98+KxOMjIxk7NixVpng4GAefPBB7HY7cXFx1l104+PjiYmJwel00qtXL44dOwb4bh4XERGB0+m07gSdlpbG0KFDiY6OJioqyrofVXp6Ov369cNms9GrVy/S09PP2YdKlSrx/PPPs3fvXrZu3Wq1MT8NGzbkxRdf5NVXX7WW9ezZk+3bt/Pzzz+fRwSVunQYY6z3jsfjwePxYIyhevXqgO9gLj09/ZyXKM+bNy/PXd8vZQXFLCoqirCwsELL7tixg/bt2xMYGEi1atVwOp0sXbo0zzYnTpxgxYoVf5mRjQuJZ24LFiygW7duVK1aNc9yjacvnt27d8cYgzGG6OhokpKS8i2/adMmDh06ROfOna1lOYlMWloaIsKJEyeoW7fuBbWzXCRFWVlZfPHFFzgcDgB+/fVX7r//frZv307FihUZO3YsK1asID4+ng0bNljDkGlpabRs2ZLt27fToUMHnn76aQAGDhzIc889x7Zt23A4HNbyZ599li1btrBt2zamT58OwMSJE7nhhhtYv349K1euZMyYMaSlpTFt2jSqVq3Kf//7X55++mk2bdpUpL4EBATgcrnYuXPnObdt3rx5nu0qVKjAo48+yr/+9a+iB0+pS1R2djZut5uQkBA6depE69atARgyZAhXX301O3fu5IEHHii0jg8++ID+/fuXRnPLhYJidi4ul4ulS5dy6tQpDh8+zMqVK9m3b1+ebRYuXEhcXJyVmP4VnG88c5s/f36++6DGM288PR4P7733Hl27dj2rnNfr5eGHH2by5Ml5llesWJFp06bhcDioW7cuO3bsYNiwYRfUxjJNitLT03G73bRs2ZJrr73W6kxoaCgxMTEAbNiwgdjYWGrXrk1gYCADBgxg1apVgC+J6Nu3LwB33XUXa9asISUlhePHj9OhQwcABg0aZG3vdDoZMGAA77//PoGBvt+tXLZsGc8++yxut5vY2FgyMjLYu3cvq1at4q677rLKOZ3OIvdLivhbEvltd+edd7Ju3ToSEhKK/HpKXYoCAgKIj48n0kwOmgAABk5JREFUKSmJ9evX89NPPwEwc+ZMDhw4gM1myzP35Uw//PADVatWJTIysrSaXOYKitm5dO7cme7du9O2bVv69+9PmzZtCAgIyLPNvHnz/lIJJpx/PHMcPHiQH3/8kS5dupy1TuOZN573338/7du3p127dmeVmzp1Kt27d6d+/fp5lns8HqZNm8aWLVs4cOAATqeTSZMmXVAbyzQpqlKlCvHx8cTHx/Paa69RqVIlAKpVq3Ze9Z1rKH3x4sWMGDGCzZs3///27ifEynoP4PBnSmsW/bFNlwqxDMrZGBEKQRkDQdAIUQsJirKdbaZAF0ZUGC00okUFtRiIihREN9Impk0FBSIYFq4KRBcV2sKI/mBzzl3Ine7UmPfq3NLr8yzPnDPzO9/NfN7fed/ztmrVqn799deGw2G7d++eXcfhw4cbGxs7o79fJ0v4888//49+x/79+//wvEWLFrVx48a2bdt2xmuA/ydLlixpfHx8zsc5F198cQ8++GC7d+8+5etOdYR+IZhvZqfz9NNP99lnnzU9Pd1wOOymm26a/dmxY8fau3dvExMT/4vlnvPOZJ5VO3fu7P7772/x4sVzHjfPufPcsmVLR48e7eWXX573+Z9++mmvvfZa119/fZs2bertt99u8+bNsxdQ3HjjjY2MjLRu3bo++eSTs1rbOfHx2Z9ZvXp1H374YceOHWtmZqYdO3bM7gINBoN27dpV1fbt27vjjju68soru+qqq/r444+reuedd7rrrrsaDAYdOXKk8fHxtm3b1vHjx/vhhx+65557evXVV2d3bfbv31/VmjVr2r59e1VffPHFnKvCTuXEiRM99dRTLV269LQ7S4cOHWrTpk3zbv+vX7++Dz74YPYcKbjQHD16dPYqzp9++qnp6eluvvnmvvzyy+rkLuuePXtasWLFvK8fDAbt3LnzgjmfqOaf2anm83szMzN99913VR04cKADBw7MOXdj165drV27ttHR0YVf+DnqbOb5L6faDTLP3+Y5NTXV+++/344dO7roovmT5N133+3w4cMdOnSol156qUceeaStW7d23XXXdfDgwdn/ldPT02e1qVGnuffZueCaa65p69atjY+PNxwOm5iY6L777qtO7ijt3bu3F154oauvvnp2K/2tt95qw4YN/fjjjy1fvrw333yzmZmZHn744Y4fP95wOGxycrIlS5b0zDPP9OSTT7Zy5coGg0E33HBD7733Xo8//niPPfZYY2NjjY2Nddttt51yjQ899FCXXnppv/zyS3fffffsydq/99VXX3Xrrbf2888/d/nllzc5Odn69ev/8LxLLrmkycnJnnjiibMfIJyHvv766x599NFmZmYaDAatW7euiYmJ7rzzzr7//vuGw2G33HJLr7/+elV79uxp3759Pf/881V99NFHLV26tOXLl/+db+MvNd/M1q5d2yuvvNKLL77YN99808qVK7v33nubmppq3759vfHGG01NTXXixInZjy2uuOKKOacY1Mldt82bN/9db+1vcTbzrJMHvkeOHJk9iP935vnbPBctWtSyZcu6/fbbq3rggQd69tln/zDP+Vx77bU999xzrVmzpsWLF7ds2bI5X3VzJs7re59ddtll835PCVwo3A9pYZnnwjHLhWWeC8u9zwAA/sR5HUV2iQCAhXJeRxEAwEIRRQAAnebqs9HR0W9HRkb+8VctBvjvjI6ODkZGRhzcLBDzXDhmubDMc2GNjo5+O9/jf3r1GQDAhUJ1AgAkigAAKlEEAFCJIgCAShQBAFSiCACgEkUAAJUoAgCoRBEAQCWKAAAqUQQAUIkiAIBKFAEAVKIIAKASRQAAlSgCAKhEEQBAJYoAACpRBABQiSIAgEoUAQBUoggAoBJFAACVKAIAqEQRAEAligAAKlEEAFCJIgCAShQBAFSiCACgEkUAAJUoAgCoRBEAQCWKAAAqUQQAUIkiAIBKFAEAVKIIAKASRQAAlSgCAKhEEQBAJYoAACpRBABQiSIAgEoUAQBUoggAoBJFAACVKAIAqEQRAEAligAAKlEEAFCJIgCAShQBAFSiCACgEkUAAJUoAgCoRBEAQCWKAAAqUQQAUIkiAIBKFAEAVKIIAKASRQAAlSgCAKhEEQBAJYoAACpRBABQiSIAgEoUAQBU9U8Jgnxx074kYQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"data = [[33.32, 31.20, 31.42, 31.98],\n",
" [32.88, 30.85, 30.94, 31.56],\n",
" [32.98, 30.78, 31.06, 31.61],\n",
" [33.70, 31.97, 31.77, 32.48]]\n",
"\n",
"columns = ('Kodak', 'BSD300', 'Set14', 'Average')\n",
"rows = ('N2C', 'N2N', 'Self-supervised Deep Image Denoising', 'Proposed DiDNT')\n",
"\n",
"# Add a table at the bottom of the axes\n",
"the_table = plt.table(cellText=data,\n",
" rowLabels=rows,\n",
" colLabels=columns,\n",
" loc='center')\n",
"\n",
"ax = plt.gca()\n",
"ax.get_xaxis().set_visible(False)\n",
"ax.get_yaxis().set_visible(False)\n",
"plt.box(on=None)\n",
"the_table.scale(1, 1.5)\n",
"\n",
"plt.title('PSNR Results for Impulse Noise (α = 0.5)')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Impulse Noise for α ∈ [0,1]"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00090-eval-ilsvrc-kodak-3c-impulse0_100-iter4m-blindspot-known-res128-EVAL_impulse0_100-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/kodak/*.png'.\n",
"Loaded 24 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 10 times.\n",
"Evaluating network 'list_trained/network-2080000-impulse0_100-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 240 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 29.0182, valid_psnr_pme= 32.6320\n",
"Evaluation done, exiting.\n",
"RESULT 32.6320\n",
"dnnlib: Finished selfsupervised_denoising.train() in 5m 00s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=kodak --eval=list_trained/network-2080000-impulse0_100-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00091-eval-ilsvrc-bsd300-3c-impulse0_100-iter4m-blindspot-known-res128-EVAL_impulse0_100-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/BSR/BSDS500/data/images/test/*.jpg'.\n",
"Loaded 200 images.\n",
"Validation image padded size = [512, 512].\n",
"Repeating the validation set 3 times.\n",
"Evaluating network 'list_trained/network-2080000-impulse0_100-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 600 images.\n",
" 0: time= 0.00, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 27.6495, valid_psnr_pme= 31.5723\n",
"Evaluation done, exiting.\n",
"RESULT 31.5723\n",
"dnnlib: Finished selfsupervised_denoising.train() in 6m 05s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=bsd300 --eval=list_trained/network-2080000-impulse0_100-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating the run dir: results/_eval/00092-eval-ilsvrc-set14-3c-impulse0_100-iter4m-blindspot-known-res128-EVAL_impulse0_100-blindspot-sigma_known\n",
"Copying files to the run dir\n",
"dnnlib: Running selfsupervised_denoising.train() on localhost...\n",
"Not loading training data.\n",
"Loading validation dataset from 'datasets/Set14/*.png'.\n",
"Loaded 14 images.\n",
"Validation image padded size = [768, 768].\n",
"Repeating the validation set 20 times.\n",
"Evaluating network 'list_trained/network-2080000-impulse0_100-blindspot-sigma_known.pickle'.\n",
"Evaluating network with 280 images.\n",
" 0: time= 45.13, loss= 0.0000, train_psnr= 0.0000, train_psnr_pme= 0.0000, std_net= 0.0000, std_noise= 0.0000, valid_psnr_mu= 27.2628, valid_psnr_pme= 30.5220\n",
"Evaluation done, exiting.\n",
"RESULT 30.5220\n",
"dnnlib: Finished selfsupervised_denoising.train() in 6m 11s.\n"
]
}
],
"source": [
"!python selfsupervised_denoising.py --dataset-dir=datasets --validation-set=set14 --eval=list_trained/network-2080000-impulse0_100-blindspot-sigma_known.pickle"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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LDl79qyIuL7N+/n5SW5urtVTtGfPHnE6nRIXF1dRm2Ypz3hWqVJFHA6HtG7dWurUqSNbt24VEVfPkI+PjzgcDhk/frxs27bNKlNUr4XD4ZBNmzaJiMjhw4fFbrdLjRo1ZObMmSIismXLFomOjraWX7dunfTo0UNERG644QZrem5uboH3Za0i900RV2+Zw+GQli1byujRo2Xt2rWSmZkp7du3l5MnT4qIyOLFi+WBBx4QkcI9RXkujHliYqJ07NhRcnJyZPjw4ddcT9GCBQvkwQcfFBGR9u3by9atW+U///lPgR7Jpk2byrlz5+Ttt9+Wv//97yIikpGRIeHh4XLw4EFZs2aN1KxZUw4ePGjV+9tvv4mIyLlz58Rms8mpU6fk6NGj4uPjI7/99ptkZmbK7bffLmPGjBERkSFDhsj69etFROTQoUMSEBBQLtubB+0pUkpdjqpVq3Lrrbcyd+7cAtM3btzIvffeC8B9993Hhg0bAPjuu+8YMmSINT2PiPDUU08REhLCn//8Z44ePcqJEycA17fF3r1788EHH+BwOCpisypMjRo1iIuLY8+ePXz55Zfcf//9iAhNmzZl7969TJ06lSpVqhAdHc0333xTbD2u47lLs2bN+PHHH/nll1+IiYmx4lgaxhiMKfQzLVctb29vYmNjeeedd2jQoAGDBg3i7bffZufOnXTp0gWn08nkyZNJTEy8pHrHjRvHSy+9ZPXkXWsWLVrE4MGDAVcP0aJFi+jevTtr1qzh/PnzfPHFF3Ts2JEaNWqwatUq3n//fZxOJ+3ateO3335j//79AERERNC8eXOr3hkzZuBwOIiMjOTIkSPs37+fzZs306lTJ2688UaqVq3KgAEDrOW//vprxo4di9Pp5O677yY5OZnU1NSKDQb6i9ZKqVKqUqUKH330EdHR0fzjH//gqaeeumiZok66H3zwAUlJScTGxlK1alV8fX2twcM33HADt9xyCxs2bLC64a9F7du359SpUyQlJdGwYUOqV69O9+7d6d69OzfddBNLly4lOjq6ULmUlBQSEhJo1apVgemNGzcmODiY9evXc9tttxU48ScmJtKkSRMAbrrpJuty3fHjx6+5y0EeHh507tyZzp07Y7fbeeutt7DZbGzcuPEP17l161YraTh16hQrV67E09OTe+65p6yaXWl+//13Vq9ezU8//YQxhpycHIwxvPzyy3Tu3Jn//ve/fPjhh9b2iwhvvvkmd955Z4F61q5dS61atQq8//rrr9m4cSM1a9akc+fO1me8OLm5uWzatAkvL6+y39BLcG2mvkqpclGzZk1WrFjBBx98YPUY3XrrrdZYhA8++IAOHToAcNtttxWYnufs2bM0bNiQqlWrsmbNmgJ3sFWrVo1PP/2U999/n4ULF1bUZlW4PXv2kJOTw5/+9Ce2bdtm3QWVm5vLjz/+iI+PT6Eyqamp/N///R/33HMP9erVIzExkfT0dABOnz7Nhg0baN26NY0aNaJOnTps2rQJEeH999+nd+/eANx9993ExMQAEBMTY02/Fuzdu9fqtQCIi4sjMDCQpKQkKynKyspi165dANSuXZuUlJSL1hsfH09CQgIJCQn079+fWbNmXRMJEcCSJUu47777OHToEAkJCRw5coTmzZuzfv16Bg0axLx581i/fj3dunUD4M4772T27NlkZWUBsG/fPtLS0grVe/bsWerVq0fNmjXZs2cPmzZtAqBt27Z8++23nD59muzsbD755BOrTNeuXXnzzTet93FxceW56cUr6pqavvSlr6vjRSXcfSbiGsvi6+sry5Ytk4SEBImKihK73S533HGHHDp0SEREDh48KJGRkRIcHCxPP/20VT4pKcmaPmLECAkICJD4+PgCd5+dPn1a2rRpI8uWLauw7RORChlT5HA4JCQkRD7//HMREfniiy8kLCxMbDab2Gw2eeCBByQ9PV1EXONbgoODxWazSWBgoDz11FPWvFWrVondbpeQkBCx2+3y9ttvW+vasmWL2Gw2adGihYwZM0Zyc3NFROTUqVNyxx13iL+/v0RHR1vjPspDRe6bIiJbt26V9u3bS2BgoNjtdunTp48kJSXJ9u3bpUOHDhISEiJBQUHyzjvviIjIkiVLpFWrVuJwOOTcuXPyxhtvSJMmTcTDw0MaNWokI0eOLLSOa21MUefOneWLL74oMO2NN96Qhx9+WDIzM6VevXoyYsQIa15OTo48+eST1j7ZuXNnOXPmjKxZs8YatybiGm/UrVs3CQgIkN69e0unTp1kzZo1IiLy9ttvi7+/v0RERMj9998vTz31lIi4jgsDBw4Uu90ugYGBMmrUqDLf3vwoZkyRPvtMqauYPvusbOnzpcqOxrJsXSvxTE1Nxdvbm+zsbPr06cODDz5Inz59Krwd+uwzpZRSSlWq559/HqfTSXBwMM2bN7/iLkVqT5FSVzHtKSpb18q38SuBxrJsaTzLlvYUKaWUUkqVQJMipZRSSiku8jtFNWrU+DUjI+OmimqMUurSeHl5XVM/wFfZNJ5lR2NZtjSeZcvLyyu3qOkljinS8QpKXdl0nEHZ0niWHY1l2dJ4li0dU6SUUkopVQJNipRSSiml0KRIKaWUUgqo5KTIGMPf/vY36/0rr7zC888/D8Brr71GUFAQISEhREdHF3g+0r59+7jrrrto2bIlYWFhDBw48JKeDq2UqnwZGRlERETgcDiw2Ww899xzAMycORN/f3+MMZw6darY8ocPH6Zr164EBgYSFBREQkICAKtXryYsLIzg4GCGDx9OdnZ2RWxOpSsunvHx8bRr1w5/f38GDRpEZmZmobJfffUV4eHh2O12wsPDWb16NeB6AK3T6bRe9evXZ9y4cRW6XZXlyJEjREVFERQUhM1m44033gBgx44dtG/fHrvdTq9evUhOTi5Udu/evQXiVqdOHaZPnw7AoEGDrOm+vr44nc4K3a7Kcjn7Z0JCAjVq1LDi9vDDD1vzFi1ahN1uJyQkhG7dupV4zCiVop79IRX0XKXq1auLr6+vJCUliYjIyy+/LM8995yIiKxevVrS0tJERGTWrFkycOBAERFJT08Xf39/Wb58uVXPmjVr5KeffirXtip1JSrvz2h5ys3NlZSUFBERyczMlIiICNm4caNs27ZN4uPjxcfHxzo2FKVTp06yatUqERFJSUmRtLQ0ycnJkaZNm8revXtFROSZZ56Rd999t9RtuhbjOWDAAFm0aJGIiIwaNUpmzZpVqOy2bdvk6NGjIiLy008/SePGjYtcR1hYmHz77belas/VHEsRkWPHjklsbKyIiCQnJ0vLli1l165d0qZNG1m7dq2IiMydO1cmTZpUYj3Z2dly0003SUJCQqF548ePlxdeeKFU7bna43k5+2f+5yLml5WVJQ0aNLCOExMmTLByiIuhmGefVWpPkaenJ3/96195/fXXC82LioqiZs2aAERGRpKYmAjAwoULad++Pb169bKW7dy5M8HBwRXTaKVUmTDG4O3tDbieXp6VlYUxhtDQUHx9fUssu3v3brKzs+nSpQsA3t7e1KxZk99++41q1arRqlUrALp06VLgSdzXsuLiuXr1avr37w/A8OHD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PGnevLmcOXNG0tPT5ZZbbpHDhw/L0aNHpVmzZnLy5EnJysqSqKgo60nMeT0WS5YskYceesha35kzZwr9HQBZvny5iLi+tfz9738XEdf+tnDhQhERmT17ttSqVatQbP+I8vyMVoTs7GxxOBxSq1YteeKJJwrMK6mnSETk8OHDYrfbpUaNGjJz5kwRcf2tmzZtKo899piEhoZK//795ddffy11e672eJbkwlgnJSWJn5+fNf/w4cOFPlMiImPGjCnQK//ggw8We+zN71qKZXx8vDRr1kzOnj0r7du3t44Nr776qnh7exdZpl+/frJ161ZZs2ZNkcfSmJgY6devX6nbcC3E84/ug/l9/PHH1jk2733t2rXl5ptvlg4dOpSqF1PkCuwp8vb2JjY2lnfeeYcGDRowaNAg5s+fz969e9m5cyddunTB6XQyefJkEhMTL6nu2267jREjRvCvf/3L6h0pSZUqVRg0aBAAw4YNY8OGDaSmpvL9998zYMAAq6clf4/VgAED8PDwAGDQoEFWr8HixYutuvILCQlh6NChLFiwAE9P129mrlq1imnTpuF0OuncuTMZGRkcPnyYdevWMWzYMKtcSEhIqbdd3L9j8c033xAbG0vbtm1xOp188803HDx4kE2bNrF7925uu+02nE4nMTExHDp0yCo/ZMgQ69+NGzdedH29evXCGIPdbuemm27CbrdTpUoVbDYbCQkJAHz00UeEhYURGhrKrl272L17N3v27KFFixY0b968wHpLiktpt/1idURHR3PDDTfg5eVFUFAQhw4dYsuWLXTu3JkGDRrg6enJ0KFDWbduXYH67XY7X331FRMnTmT9+vXccMMNhdpQrVo1q8crPDzcisHGjRsZMGAAAPfee+9Ft+V64eHhQVxcHImJiWzevJmdO3eWumyzZs348ccf+eWXX4iJieHEiRNkZ2eTmJjIrbfeyrZt22jfvj2PP/54OW7B1ePCWOf1fKuSpaam0q9fP6ZPn06dOnV47733mDVrFuHh4aSkpFCtWrVCZT7//HMaNmxIeHh4sfUuWrSowHHvenC5++CuXbuYOHEib7/9NuDqcZo9ezbbt2/n2LFjhISEMHXq1MtqY4m/aF3ePDw86Ny5M507d8ZutxMTE0N4eDg2m61UJ+Q8Tz/9NCtWrAAgLi6OOXPm8MMPP7BixQrCw8OJjY3F09Oz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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"data = [[31.69, 30.27, 29.77, 30.58],\n",
" [31.53, 30.11, 29.51, 30.38],\n",
" [31.36, 30.00, 29.47, 30.28],\n",
" [32.63, 31.57, 30.52, 31.57]]\n",
"\n",
"columns = ('Kodak', 'BSD300', 'Set14', 'Average')\n",
"rows = ('N2C', 'N2N', 'Self-supervised Deep Image Denoising', 'Proposed DiDNT')\n",
"\n",
"# Add a table at the bottom of the axes\n",
"the_table = plt.table(cellText=data,\n",
" rowLabels=rows,\n",
" colLabels=columns,\n",
" loc='center')\n",
"\n",
"ax = plt.gca()\n",
"ax.get_xaxis().set_visible(False)\n",
"ax.get_yaxis().set_visible(False)\n",
"plt.box(on=None)\n",
"the_table.scale(1, 1.5)\n",
"\n",
"plt.title('PSNR Results for Impulse Noise (α ∈ [0,1])')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It can be seen that for both scenarios of Impulse noise (fixed number of α and random number of α), the proposed DiDNT method yields the <b>best</b> results. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment