├── data └── s ├── plotimages ├── dum └── download.png ├── README.md ├── Train.py └── onlyCNN.py /data/s: -------------------------------------------------------------------------------- 1 | f 2 | -------------------------------------------------------------------------------- /plotimages/dum: -------------------------------------------------------------------------------- 1 | f 2 | -------------------------------------------------------------------------------- /plotimages/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumitrj/denoiseCIFAR10-AE/HEAD/plotimages/download.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Denoise CIFAR10 dataset using autoencoders 2 | 3 | ## Goal: 4 | To make an autoencoder which takes input of images and returns denoised images. 5 | 6 | ## Approach: 7 | The images in CIFAR-10 dataset are of size 32*32*3. 8 | Since the image size is small, fully connected encoders can be used. 9 | Convolutional autoencoders can also be used to reduce image size further and check feature extraction. 10 | 11 | ### Fully connected autoencoder: 12 | 13 | 4 layers of fully connected nature with 3072 units in each layer is used. 1 Input layer, 2 hidden layers, 1 output layer. 14 | 15 | ### Noise source: 16 | 17 | Random numbers of normal distribution are used to introduce noise. 18 | Noise, as a function of noise level l (%) is given as: 19 | 20 | f = ( (max(image) - (image) )*l/100 )*randn(image.shape) + image 21 | 22 | 23 | To check noise reduction, following loss function is used: 24 | 25 | loss = log(sum( abs(X-Y)**torch.abs(X-Y) )) *100/3072 26 | 27 | Following is a plot of loss function against noise level l: 28 | 29 | ![Plot of Loss vs noise level for a single image](https://github.com/sumitrj/dcf10/blob/master/plotimages/download.png?raw=true) 30 | 31 | -------------------------------------------------------------------------------- /Train.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | from sklearn.utils import shuffle 4 | import time 5 | 6 | import os 7 | import cv2 8 | from PIL import Image 9 | import pydicom 10 | import matplotlib.pyplot as plt 11 | from scipy.ndimage import gaussian_filter 12 | 13 | import torch 14 | import torch.nn as nn 15 | import torch.nn.functional as F 16 | from torch.autograd import Variable 17 | import torch.optim as optim 18 | import torchvision 19 | 20 | from torch.utils.data.dataset import Dataset 21 | import torchvision.transforms as transforms 22 | 23 | classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') 24 | transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) 25 | 26 | 27 | trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) 28 | trainloader = torch.utils.data.DataLoader(trainset, batch_size=1, shuffle=True, num_workers=2) 29 | 30 | class AE(nn.Module): 31 | 32 | def __init__(self): 33 | 34 | super(AE, self).__init__() 35 | 36 | self.dropout = nn.Dropout(p=0.3, inplace=False) 37 | self.l1 = nn.Linear(32*32*3,32*32*3,True) 38 | self.l2 = nn.Linear(32*32*3,32*32*3,True) 39 | self.l3 = nn.Linear(32*32*3,32*32*3,True) 40 | self.out = nn.Linear(32*32*3,32*32*3,True) 41 | 42 | def forward(self, image): 43 | 44 | im = image.reshape(3072) 45 | 46 | im = self.l1(im) 47 | im = self.dropout(im) 48 | 49 | im = self.l2(im) 50 | im = self.dropout(im) 51 | 52 | im = self.l3(im) 53 | im = self.dropout(im) 54 | 55 | im = self.out(im) 56 | 57 | return im 58 | 59 | class Loss(nn.Module): 60 | 61 | def __init__(self): 62 | super(Loss, self).__init__() 63 | 64 | def forward(self, output, target): 65 | 66 | output = output.reshape(3,32,32) 67 | X = output 68 | Y = target 69 | gauss_loss = torch.log(torch.sum( torch.abs(X-Y)**torch.abs(X-Y) )) 70 | return 100*gauss_loss/3072 71 | 72 | def addNoise(image, l): 73 | 74 | f = (torch.max(image) - torch.min(image) )*l/100 75 | Noise = f*torch.randn(image.shape) 76 | image = image+Noise 77 | return image 78 | 79 | def train(Model,epochs): 80 | 81 | optimizer = optim.SGD(Model.parameters(), lr=0.01, momentum=0.9) 82 | Loss_fn = Loss() 83 | Losses = [] 84 | 85 | for epoch in range(epochs): 86 | 87 | for u, (image,id) in enumerate(trainloader): 88 | 89 | im = image[0] 90 | imN = addNoise(im,10) 91 | im, imN = im.cuda(), imN.cuda() 92 | imN = Model(imN) 93 | loss = Loss_fn(imN,im) 94 | 95 | loss.backward() 96 | optimizer.step() 97 | Losses.append(loss) 98 | 99 | print('Epoch: ', epoch, 'Loss: ', loss) 100 | 101 | return Losses 102 | 103 | Net = AE() 104 | if(int(input('Load Trained? '))): 105 | Net.load_state_dict(torch.load(input('Enter BaseModel Name: '))) 106 | Net1 = Net.cuda() 107 | epochs = int(input('Enter Epochs: ')) 108 | model_title = input('Enter Model title: ') 109 | 110 | start_time = time.time() 111 | Loss_trends = np.array(train(Net1,epochs)) 112 | end_time = time.time() 113 | L = pd.DataFrame() 114 | L['Losses'] = Loss_trends 115 | L.to_csv(model_title + 'Losses.csv') 116 | torch.save(Net1.state_dict(), model_title + '.pth.tar') 117 | print('........') 118 | print('Training Time: ', end_time - start_time, ' seconds') 119 | print('Saved at: ', model_title + '.pth.tar') 120 | -------------------------------------------------------------------------------- /onlyCNN.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | from sklearn.utils import shuffle 4 | import time 5 | 6 | import os 7 | import cv2 8 | from PIL import Image 9 | import pydicom 10 | import matplotlib.pyplot as plt 11 | from scipy.ndimage import gaussian_filter 12 | 13 | import torch 14 | import torch.nn as nn 15 | import torch.nn.functional as F 16 | from torch.autograd import Variable 17 | import torch.optim as optim 18 | import torchvision 19 | 20 | from torch.utils.data.dataset import Dataset 21 | import torchvision.transforms as transforms 22 | 23 | classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') 24 | transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) 25 | 26 | 27 | trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) 28 | trainloader = torch.utils.data.DataLoader(trainset, batch_size=1, shuffle=True, num_workers=2) 29 | 30 | class AE1(nn.Module): 31 | 32 | def __init__(self): 33 | 34 | super(AE, self).__init__() 35 | 36 | self.dropout = nn.Dropout(p=0.3, inplace=False) 37 | self.l1 = nn.Linear(32*32*3,32*32*3,True) 38 | self.l2 = nn.Linear(32*32*3,32*32*3,True) 39 | self.l3 = nn.Linear(32*32*3,32*32*3,True) 40 | self.out = nn.Linear(32*32*3,32*32*3,True) 41 | 42 | def forward(self, image): 43 | 44 | im = image.reshape(3072) 45 | 46 | im = self.l1(im) 47 | im = self.dropout(im) 48 | 49 | im = self.l2(im) 50 | im = self.dropout(im) 51 | 52 | im = self.l3(im) 53 | im = self.dropout(im) 54 | 55 | im = self.out(im) 56 | 57 | return im 58 | 59 | class AE(nn.Module): 60 | 61 | def __init__(self): 62 | 63 | super(AE,self).__init__() 64 | 65 | self.conv1 = nn.Conv2d(3, 6, 3) 66 | self.conv2 = nn.Conv2d(6,3,3) 67 | self.convt1 = nn.ConvTranspose2d(3,6,3) 68 | self.convt2 = nn.ConvTranspose2d(6,3,3) 69 | 70 | def forward(self,x): 71 | 72 | x = self.conv1(x) 73 | x = self.conv2(x) 74 | x = self.convt1(x) 75 | x = self.convt2(x) 76 | 77 | return x 78 | 79 | class Loss(nn.Module): 80 | 81 | def __init__(self): 82 | super(Loss, self).__init__() 83 | 84 | def forward(self, output, target): 85 | 86 | output = output.reshape(3,32,32) 87 | X = output 88 | Y = target 89 | gauss_loss = torch.log(torch.sum( torch.abs(X-Y)**torch.abs(X-Y) )) 90 | return 100*gauss_loss/3072 91 | 92 | def addNoise(image, l): 93 | 94 | f = (torch.max(image) - torch.min(image) )*l/100 95 | Noise = f*torch.randn(image.shape) 96 | image = image+Noise 97 | return image 98 | 99 | def train(Model,epochs): 100 | 101 | optimizer = optim.SGD(Model.parameters(), lr=0.01, momentum=0.9) 102 | Loss_fn = nn.MSELoss() 103 | Losses = [] 104 | 105 | for epoch in range(epochs): 106 | 107 | for u, (image,id) in enumerate(trainloader): 108 | 109 | im = image[0] 110 | im = im.view(1,3,32,32) 111 | imN = addNoise(im,10) 112 | im, imN = im.cuda(), imN.cuda() 113 | imN = Model(imN) 114 | loss = Loss_fn(imN,im) 115 | 116 | loss.backward() 117 | optimizer.step() 118 | Losses.append(loss) 119 | 120 | print('Epoch: ', epoch, 'Loss: ', loss) 121 | 122 | return Losses 123 | 124 | Net = AE() 125 | if(int(input('Load Trained? '))): 126 | Net.load_state_dict(torch.load(input('Enter BaseModel Name: '))) 127 | Net1 = Net.cuda() 128 | epochs = int(input('Enter Epochs: ')) 129 | model_title = input('Enter Model title: ') 130 | 131 | start_time = time.time() 132 | Loss_trends = np.array(train(Net1,epochs)) 133 | end_time = time.time() 134 | L = pd.DataFrame() 135 | L['Losses'] = Loss_trends 136 | L.to_csv(model_title + 'Losses.csv') 137 | torch.save(Net1.state_dict(), model_title + '.pth.tar') 138 | print('........') 139 | print('Training Time: ', end_time - start_time, ' seconds') 140 | print('Saved at: ', model_title + '.pth.tar') 141 | 142 | --------------------------------------------------------------------------------