├── .gitignore
├── .vscode
└── settings.json
├── README.md
├── outputs
├── loss.png
├── saved_images
│ ├── blur0.jpg
│ ├── sharp0.jpg
│ ├── val_deblurred0.jpg
│ ├── val_deblurred1.jpg
│ ├── val_deblurred10.jpg
│ ├── val_deblurred11.jpg
│ ├── val_deblurred12.jpg
│ ├── val_deblurred13.jpg
│ ├── val_deblurred14.jpg
│ ├── val_deblurred15.jpg
│ ├── val_deblurred16.jpg
│ ├── val_deblurred17.jpg
│ ├── val_deblurred18.jpg
│ ├── val_deblurred19.jpg
│ ├── val_deblurred2.jpg
│ ├── val_deblurred20.jpg
│ ├── val_deblurred21.jpg
│ ├── val_deblurred22.jpg
│ ├── val_deblurred23.jpg
│ ├── val_deblurred24.jpg
│ ├── val_deblurred25.jpg
│ ├── val_deblurred26.jpg
│ ├── val_deblurred27.jpg
│ ├── val_deblurred28.jpg
│ ├── val_deblurred29.jpg
│ ├── val_deblurred3.jpg
│ ├── val_deblurred30.jpg
│ ├── val_deblurred31.jpg
│ ├── val_deblurred32.jpg
│ ├── val_deblurred33.jpg
│ ├── val_deblurred34.jpg
│ ├── val_deblurred35.jpg
│ ├── val_deblurred36.jpg
│ ├── val_deblurred37.jpg
│ ├── val_deblurred38.jpg
│ ├── val_deblurred39.jpg
│ ├── val_deblurred4.jpg
│ ├── val_deblurred5.jpg
│ ├── val_deblurred6.jpg
│ ├── val_deblurred7.jpg
│ ├── val_deblurred8.jpg
│ └── val_deblurred9.jpg
└── test_deblurred_images
│ ├── deblurred_image_2.jpg
│ ├── image_1.jpg
│ ├── original_blurred_image.jpg
│ └── original_blurred_image_2.jpg
├── src
├── add_gaussian_blur.py
├── add_gaussian_blur_test_image.py
├── deblur_ae.py
├── explore_data.ipynb
├── models.py
└── test.py
└── test_data
├── gaussian_blurred
├── image_1.jpg
└── image_2.jpg
├── image_1.jpg
└── image_2.jpg
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 |
131 | # input data and models
132 | input/
133 | outputs/*.pth
134 | Approach.md
135 |
136 | # data files
137 | *.csv
138 | *.h5
139 | *.pkl
140 | *.pth
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "python.pythonPath": "D:\\Installed_Softwares\\Miniconda\\envs\\ml\\python.exe"
3 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # README
2 |
3 |
4 |
5 | * **First of all, you can find the dataset on Kaggle:**
6 |
7 | * **Dataset => https://www.kaggle.com/kwentar/blur-dataset.**
8 |
9 | * Get the dataset and extract it inside the `input` folder. Following is the directory structure for the project:
10 |
11 | ```
12 | ├───input
13 | │ ├───defocused_blurred
14 | │ ├───gaussian_blurred
15 | │ ├───motion_blurred
16 | │ └───sharp
17 | ├───outputs
18 | │ └───saved_images
19 | └───src
20 | ```
21 |
22 |
23 |
24 | ## Steps to Execute
25 |
26 | * I have not used the blurred images that are given in the original dataset for image deblurring. They are spatially variant due to motion blurring and defocus-blurring. I have added Gaussian blurring to the images using the `add_guassian_blur.py` script inside the `src` folder. Then I have used these images for deblurring.
27 | * **The following is the order of execution:**
28 | 1. `add_gaussian_blur.py`
29 | 2. `deblur_ae.py`
30 | * ***Note: Execute all the scripts while being within the `src` folder inside the terminal***.
31 |
32 |
33 |
34 | ## Some Results
35 |
36 | * **Loss Plot**
37 |
38 | 
39 |
40 | * **Blurred Image**
41 |
42 | 
43 |
44 | **Final Deblurred Image**
45 |
46 | 
47 |
48 |
49 |
50 | ## Future Work
51 |
52 | * To deblur the spatially variant images inside the `defocused_blurred` and `motion_blurred` folders.
53 | * Add more and better models to `models.py` script.
54 | * **Any useful contribution to the project is highly appreciated.**
55 |
56 |
57 |
58 | ## References
59 |
60 | * Paper: Image Deblurring with BlurredNoisy Image Pairs, **Lu Yuan, Jian Sun, Long Quan, Heung-Yeung Shum.**
61 | * [Image super-resolution as sparse representation of raw image patches](https://www.researchgate.net/publication/221364186_Image_super-resolution_as_sparse_representation_of_raw_image_patches), **Jianchao Yang†, John Wright‡, Yi Ma‡, Thomas Huang†**.
62 | * mage Deblurring and Super-Resolution Using Deep Convolutional Neural Networks](https://www.researchgate.net/publication/328985265_Image_Deblurring_and_Super-Resolution_Using_Deep_Convolutional_Neural_Networks), **Fatma Albluwi, Vladimir A. Krylov & Rozenn Dahyot**.
63 | * [GitHub Code](https://github.com/YapengTian/SRCNN-Keras).
64 |
--------------------------------------------------------------------------------
/outputs/loss.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/loss.png
--------------------------------------------------------------------------------
/outputs/saved_images/blur0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/blur0.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/sharp0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/sharp0.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred0.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred1.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred10.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred11.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred12.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred13.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred14.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred15.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred15.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred16.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred17.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred17.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred18.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred18.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred19.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred19.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred2.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred20.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred20.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred21.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred21.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred22.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred22.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred23.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred23.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred24.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred24.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred25.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred25.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred26.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred26.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred27.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred27.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred28.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred28.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred29.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred29.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred3.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred30.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred30.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred31.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred31.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred32.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred32.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred33.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred33.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred34.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred34.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred35.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred35.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred36.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred36.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred37.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred37.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred38.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred38.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred39.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred39.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred4.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred5.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred6.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred7.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred8.jpg
--------------------------------------------------------------------------------
/outputs/saved_images/val_deblurred9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/saved_images/val_deblurred9.jpg
--------------------------------------------------------------------------------
/outputs/test_deblurred_images/deblurred_image_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/test_deblurred_images/deblurred_image_2.jpg
--------------------------------------------------------------------------------
/outputs/test_deblurred_images/image_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/test_deblurred_images/image_1.jpg
--------------------------------------------------------------------------------
/outputs/test_deblurred_images/original_blurred_image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/test_deblurred_images/original_blurred_image.jpg
--------------------------------------------------------------------------------
/outputs/test_deblurred_images/original_blurred_image_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/outputs/test_deblurred_images/original_blurred_image_2.jpg
--------------------------------------------------------------------------------
/src/add_gaussian_blur.py:
--------------------------------------------------------------------------------
1 | import cv2
2 | import os
3 |
4 | from tqdm import tqdm
5 |
6 | src_dir = '../input/sharp'
7 | images = os.listdir(src_dir)
8 | dst_dir = '../input/gaussian_blurred'
9 |
10 | for i, img in tqdm(enumerate(images), total=len(images)):
11 | img = cv2.imread(f"{src_dir}/{images[i]}")
12 | # add gaussian blurring
13 | blur = cv2.GaussianBlur(img, (51, 51), 0)
14 | cv2.imwrite(f"{dst_dir}/{images[i]}", blur)
15 |
16 | print('DONE')
--------------------------------------------------------------------------------
/src/add_gaussian_blur_test_image.py:
--------------------------------------------------------------------------------
1 | """
2 | Script to add Gaussian blurring to a test data
3 | """
4 |
5 | import cv2
6 | import os
7 | import glob as glob
8 |
9 | from tqdm import tqdm
10 |
11 | src_dir = '../test_data'
12 | images = glob.glob(f"{src_dir}/*.jpg")
13 | dst_dir = '../test_data/gaussian_blurred'
14 |
15 | for i, img in tqdm(enumerate(images), total=len(images)):
16 | img = cv2.imread(f"{images[i]}")
17 | # add gaussian blurring
18 | blur = cv2.GaussianBlur(img, (15, 15), 0)
19 | cv2.imwrite(f"{dst_dir}/image_{i+1}.jpg", blur)
20 |
21 | print('DONE')
--------------------------------------------------------------------------------
/src/deblur_ae.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import os
3 | import matplotlib.pyplot as plt
4 | import glob
5 | import cv2
6 | import torch
7 | import torchvision
8 | import torch.nn as nn
9 | import torch.nn.functional as F
10 | import torch.optim as optim
11 | import time
12 | import albumentations
13 | import argparse
14 | import models
15 |
16 | from tqdm import tqdm
17 | from torch.utils.data import Dataset, DataLoader
18 | from torchvision.transforms import transforms
19 | from torchvision.utils import save_image
20 | from sklearn.model_selection import train_test_split
21 |
22 | # constructing the argument parser
23 | parser = argparse.ArgumentParser()
24 | parser.add_argument('-e', '--epochs', type=int, default=50,
25 | help='number of epochs to train the model for')
26 | args = vars(parser.parse_args())
27 |
28 | # helper functions
29 | image_dir = '../outputs/saved_images'
30 | os.makedirs(image_dir, exist_ok=True)
31 |
32 | def save_decoded_image(img, name):
33 | img = img.view(img.size(0), 3, 224, 224)
34 | save_image(img, name)
35 |
36 | device = 'cuda:0' if torch.cuda.is_available() else 'cpu'
37 |
38 | print(device)
39 |
40 | batch_size = 2
41 |
42 | gauss_blur = os.listdir('../input/gaussian_blurred/')
43 | gauss_blur.sort()
44 | sharp = os.listdir('../input/sharp')
45 | sharp.sort()
46 |
47 | x_blur = []
48 | for i in range(len(gauss_blur)):
49 | x_blur.append(gauss_blur[i])
50 |
51 | y_sharp = []
52 | for i in range(len(sharp)):
53 | y_sharp.append(sharp[i])
54 |
55 | print(x_blur[10])
56 | print(y_sharp[10])
57 |
58 | (x_train, x_val, y_train, y_val) = train_test_split(x_blur, y_sharp, test_size=0.25)
59 |
60 | print(len(x_train))
61 | print(len(x_val))
62 |
63 | # define transforms
64 | transform = transforms.Compose([
65 | transforms.ToPILImage(),
66 | transforms.Resize((224, 224)),
67 | transforms.ToTensor(),
68 | ])
69 |
70 | class DeblurDataset(Dataset):
71 | def __init__(self, blur_paths, sharp_paths=None, transforms=None):
72 | self.X = blur_paths
73 | self.y = sharp_paths
74 | self.transforms = transforms
75 |
76 | def __len__(self):
77 | return (len(self.X))
78 |
79 | def __getitem__(self, i):
80 | blur_image = cv2.imread(f"../input/gaussian_blurred/{self.X[i]}")
81 |
82 | if self.transforms:
83 | blur_image = self.transforms(blur_image)
84 |
85 | if self.y is not None:
86 | sharp_image = cv2.imread(f"../input/sharp/{self.y[i]}")
87 | sharp_image = self.transforms(sharp_image)
88 | return (blur_image, sharp_image)
89 | else:
90 | return blur_image
91 |
92 | train_data = DeblurDataset(x_train, y_train, transform)
93 | val_data = DeblurDataset(x_val, y_val, transform)
94 |
95 | trainloader = DataLoader(train_data, batch_size=batch_size, shuffle=True)
96 | valloader = DataLoader(val_data, batch_size=batch_size, shuffle=False)
97 |
98 | model = models.CNN().to(device)
99 | print(model)
100 |
101 | # the loss function
102 | criterion = nn.MSELoss()
103 | # the optimizer
104 | optimizer = optim.Adam(model.parameters(), lr=0.001)
105 | scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
106 | optimizer,
107 | mode='min',
108 | patience=5,
109 | factor=0.1,
110 | verbose=True
111 | )
112 |
113 | def fit(model, dataloader, epoch):
114 | model.train()
115 | running_loss = 0.0
116 | for i, data in tqdm(enumerate(dataloader), total=int(len(train_data)/dataloader.batch_size)):
117 | blur_image = data[0]
118 | sharp_image = data[1]
119 | blur_image = blur_image.to(device)
120 | sharp_image = sharp_image.to(device)
121 | optimizer.zero_grad()
122 | outputs = model(blur_image)
123 | loss = criterion(outputs, sharp_image)
124 | # backpropagation
125 | loss.backward()
126 | # update the parameters
127 | optimizer.step()
128 | running_loss += loss.item()
129 |
130 | train_loss = running_loss/len(dataloader.dataset)
131 | print(f"Train Loss: {train_loss:.5f}")
132 |
133 | return train_loss
134 |
135 | # the training function
136 | def validate(model, dataloader, epoch):
137 | model.eval()
138 | running_loss = 0.0
139 | with torch.no_grad():
140 | for i, data in tqdm(enumerate(dataloader), total=int(len(val_data)/dataloader.batch_size)):
141 | blur_image = data[0]
142 | sharp_image = data[1]
143 | blur_image = blur_image.to(device)
144 | sharp_image = sharp_image.to(device)
145 | outputs = model(blur_image)
146 | loss = criterion(outputs, sharp_image)
147 | running_loss += loss.item()
148 |
149 | if epoch == 0 and i == (len(val_data)/dataloader.batch_size)-1:
150 | save_decoded_image(sharp_image.cpu().data, name=f"../outputs/saved_images/sharp{epoch}.jpg")
151 | save_decoded_image(blur_image.cpu().data, name=f"../outputs/saved_images/blur{epoch}.jpg")
152 |
153 | val_loss = running_loss/len(dataloader.dataset)
154 | print(f"Val Loss: {val_loss:.5f}")
155 |
156 | save_decoded_image(outputs.cpu().data, name=f"../outputs/saved_images/val_deblurred{epoch}.jpg")
157 |
158 | return val_loss
159 |
160 | train_loss = []
161 | val_loss = []
162 | start = time.time()
163 | for epoch in range(args['epochs']):
164 | print(f"Epoch {epoch+1} of {args['epochs']}")
165 | train_epoch_loss = fit(model, trainloader, epoch)
166 | val_epoch_loss = validate(model, valloader, epoch)
167 | train_loss.append(train_epoch_loss)
168 | val_loss.append(val_epoch_loss)
169 | scheduler.step(val_epoch_loss)
170 | end = time.time()
171 |
172 | print(f"Took {((start-end)/60):.3f} minutes to train")
173 |
174 | # loss plots
175 | plt.figure(figsize=(10, 7))
176 | plt.plot(train_loss, color='orange', label='train loss')
177 | plt.plot(val_loss, color='red', label='validataion loss')
178 | plt.xlabel('Epochs')
179 | plt.ylabel('Loss')
180 | plt.legend()
181 | plt.savefig('../outputs/loss.png')
182 | plt.show()
183 |
184 | # save the model to disk
185 | print('Saving model...')
186 | torch.save(model.state_dict(), '../outputs/model.pth')
--------------------------------------------------------------------------------
/src/models.py:
--------------------------------------------------------------------------------
1 | import torch
2 | import torch.nn as nn
3 | import torch.nn.functional as F
4 |
5 | class CNN(nn.Module):
6 | def __init__(self):
7 | super(CNN, self).__init__()
8 |
9 | self.conv1 = nn.Conv2d(3, 128, kernel_size=5, padding=1)
10 | self.conv2 = nn.Conv2d(128, 64, kernel_size=3, padding=1)
11 | self.conv3 = nn.Conv2d(64, 3, kernel_size=1, padding=1)
12 |
13 | def forward(self, x):
14 | x = F.relu(self.conv1(x))
15 | x = F.relu(self.conv2(x))
16 | x = F.relu(self.conv3(x))
17 |
18 | return x
19 |
20 | class SimpleAE(nn.Module):
21 | def __init__(self):
22 | super(SimpleAE, self).__init__()
23 |
24 | self.encoder = nn.Sequential(
25 | nn.Conv2d(3, 32, kernel_size=5),
26 | nn.ReLU(True),
27 | nn.Conv2d(32, 64, kernel_size=5),
28 | nn.ReLU(True))
29 | self.decoder = nn.Sequential(
30 | nn.ConvTranspose2d(64, 32, kernel_size=5),
31 | nn.ReLU(True),
32 | nn.ConvTranspose2d(32, 3, kernel_size=5),
33 | nn.ReLU(True))
34 | def forward(self,x):
35 | x = self.encoder(x)
36 | x = self.decoder(x)
37 | return x
--------------------------------------------------------------------------------
/src/test.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import os
3 | import matplotlib.pyplot as plt
4 | import glob
5 | import cv2
6 | import models
7 | import torch
8 |
9 | from torchvision.transforms import transforms
10 | from torchvision.utils import save_image
11 |
12 | def save_decoded_image(img, name):
13 | img = img.view(img.size(0), 3, 224, 224)
14 | save_image(img, name)
15 |
16 | device = 'cpu'
17 |
18 | # load the trained model
19 | model = models.CNN().to(device).eval()
20 | model.load_state_dict(torch.load('../outputs/model.pth'))
21 |
22 | # define transforms
23 | transform = transforms.Compose([
24 | transforms.ToPILImage(),
25 | transforms.Resize((224, 224)),
26 | transforms.ToTensor(),
27 | ])
28 |
29 | name = 'image_1'
30 |
31 | image = cv2.imread(f"../test_data/gaussian_blurred/{name}.jpg")
32 | orig_image = image.copy()
33 | orig_image = cv2.resize(orig_image, (224, 224))
34 | cv2.imwrite(f"../outputs/test_deblurred_images/original_blurred_image_2.jpg", orig_image)
35 | image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
36 |
37 | image = transform(image).unsqueeze(0)
38 | print(image.shape)
39 |
40 | with torch.no_grad():
41 | outputs = model(image)
42 | save_decoded_image(outputs.cpu().data, name=f"../outputs/test_deblurred_images/deblurred_image_2.jpg")
43 |
44 |
--------------------------------------------------------------------------------
/test_data/gaussian_blurred/image_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/test_data/gaussian_blurred/image_1.jpg
--------------------------------------------------------------------------------
/test_data/gaussian_blurred/image_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/test_data/gaussian_blurred/image_2.jpg
--------------------------------------------------------------------------------
/test_data/image_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/test_data/image_1.jpg
--------------------------------------------------------------------------------
/test_data/image_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sovit-123/image-deblurring-using-deep-learning/00596bcb4ad95f3e81bfd8ee5e5178ddebeb4abb/test_data/image_2.jpg
--------------------------------------------------------------------------------