├── .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 | ![](https://github.com/sovit-123/image-deblurring-using-deep-learning/blob/master/outputs/loss.png?raw=true) 39 | 40 | * **Blurred Image** 41 | 42 | ![](https://github.com/sovit-123/image-deblurring-using-deep-learning/blob/master/outputs/saved_images/blur0.jpg?raw=true) 43 | 44 | **Final Deblurred Image** 45 | 46 | ![](https://github.com/sovit-123/image-deblurring-using-deep-learning/blob/master/outputs/saved_images/val_deblurred39.jpg?raw=true) 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 --------------------------------------------------------------------------------