|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from keras.datasets import mnist |
|
from tensorflow.keras.layers import Conv2D, MaxPooling2D, UpSampling2D |
|
from tensorflow.keras.models import Sequential |
|
import numpy as np |
|
import random, cv2 |
|
from matplotlib import pyplot as plt |
|
|
|
|
|
def sp_noise(image,prob): |
|
''' |
|
Add salt and pepper noise to image |
|
prob: Probability of the noise |
|
''' |
|
output = np.zeros(image.shape,np.uint8) |
|
thres = 1 - prob |
|
for i in range(image.shape[0]): |
|
for j in range(image.shape[1]): |
|
rdn = random.random() |
|
if rdn < prob: |
|
output[i][j] = 0 |
|
elif rdn > thres: |
|
output[i][j] = 255 |
|
else: |
|
output[i][j] = image[i][j] |
|
return output |
|
|
|
(x_train, _), (x_test, _) = mnist.load_data() |
|
|
|
|
|
|
|
|
|
x_train = x_train.astype('float32') / 255.0 |
|
x_test = x_test.astype('float32') / 255.0 |
|
|
|
|
|
x_train = x_train.reshape((len(x_train), 28, 28, 1)) |
|
x_test = x_test.reshape((len(x_test), 28, 28, 1)) |
|
|
|
|
|
|
|
|
|
|
|
noise_factor = 0.5 |
|
x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape) |
|
x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape) |
|
|
|
|
|
x_train_noisy = np.clip(x_train_noisy, 0., 1.) |
|
x_test_noisy = np.clip(x_test_noisy, 0., 1.) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SIZE = 28 |
|
DIMENSIONS = 1 |
|
model = Sequential() |
|
|
|
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(SIZE, SIZE, DIMENSIONS))) |
|
model.add(MaxPooling2D((2, 2), padding='same')) |
|
model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) |
|
model.add(MaxPooling2D((2, 2), padding='same')) |
|
model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) |
|
model.add(MaxPooling2D((2, 2), padding='same')) |
|
model.add(Conv2D(256, (3, 3), activation='relu', padding='same')) |
|
model.add(MaxPooling2D((2, 2), padding='same')) |
|
model.add(Conv2D(512, (3, 3), activation='relu', padding='same')) |
|
|
|
|
|
model.add(MaxPooling2D((2, 2), padding='same')) |
|
|
|
|
|
model.add(Conv2D(512, (3, 3), activation='relu', padding='same')) |
|
model.add(UpSampling2D((2, 2))) |
|
model.add(Conv2D(256, (3, 3), activation='relu', padding='same')) |
|
model.add(UpSampling2D((2, 2))) |
|
model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) |
|
model.add(UpSampling2D((2, 2))) |
|
model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) |
|
model.add(UpSampling2D((2, 2))) |
|
model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) |
|
model.add(UpSampling2D((2, 2))) |
|
|
|
|
|
model.add(Conv2D(DIMENSIONS, (5, 5), activation='relu')) |
|
|
|
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy']) |
|
|
|
model.summary() |
|
model.fit(x=x_train_noisy, y=x_train, epochs=3, batch_size=256, shuffle=True, validation_data=(x_test_noisy, x_test)) |
|
|
|
|
|
model.evaluate(x_test_noisy, x_test) |
|
|
|
|
|
|
|
model.save('denoising_autoencoder.model') |
|
|
|
no_noise_img = model.predict(x_test_noisy) |
|
|
|
plt.figure(figsize=(40, 4)) |
|
for i in range(10): |
|
|
|
ax = plt.subplot(3, 20, i + 1) |
|
plt.imshow(x_test_noisy[i].reshape(28, 28), cmap="binary") |
|
|
|
|
|
ax = plt.subplot(3, 20, 40 + i + 1) |
|
plt.imshow(no_noise_img[i].reshape(28, 28), cmap="binary") |
|
|
|
plt.waitforbuttonpress() |
|
|