| | import random |
| | import gradio as gr |
| | import numpy as np |
| | from PIL import Image |
| | from datasets import load_dataset |
| | from tensorflow.keras.models import load_model |
| |
|
| | |
| | model = load_model("unet_model.h5", compile=False) |
| |
|
| | |
| | dataset = load_dataset("AIOmarRehan/Cropped_Yale_Faces") |
| |
|
| | |
| | def preprocess_image(image, target_size=(192, 176)): |
| | image = image.resize((target_size[1], target_size[0])) |
| | image = np.array(image) / 255.0 |
| | if image.ndim == 2: |
| | image = np.expand_dims(image, axis=-1) |
| | return np.expand_dims(image, axis=0) |
| |
|
| | |
| | def add_salt_and_pepper_noise(image, amount=0.05): |
| | |
| | |
| |
|
| | img_array = np.array(image) |
| | |
| | num_salt = np.ceil(amount * img_array.size * 0.5) |
| | coords = [np.random.randint(0, i - 1, int(num_salt)) for i in img_array.shape] |
| | img_array[tuple(coords)] = 255 |
| | |
| | num_pepper = np.ceil(amount * img_array.size * 0.5) |
| | coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in img_array.shape] |
| | img_array[tuple(coords)] = 0 |
| | return Image.fromarray(img_array) |
| |
|
| | |
| | def predict(img=None, use_dataset=False, add_noise=False): |
| | if use_dataset: |
| | |
| | example = random.choice(dataset["train"]) |
| | img = example["image"] |
| |
|
| | if img is None: |
| | return None, None |
| |
|
| | img = img.convert("L") |
| |
|
| | noisy_img = img |
| | if add_noise: |
| | noisy_img = add_salt_and_pepper_noise(img) |
| |
|
| | input_data = preprocess_image(noisy_img) |
| |
|
| | pred = model.predict(input_data)[0] |
| |
|
| | if pred.ndim == 3 and pred.shape[-1] == 1: |
| | pred = np.squeeze(pred, axis=-1) |
| |
|
| | denoised_img = (pred * 255).astype(np.uint8) |
| | denoised_img = Image.fromarray(denoised_img) |
| |
|
| | return noisy_img, denoised_img |
| |
|
| | |
| | interface = gr.Interface( |
| | fn=predict, |
| | inputs=[ |
| | gr.Image(type="pil", label="Upload Image"), |
| | gr.Checkbox(label="Use Random Dataset Image"), |
| | gr.Checkbox(label="Add Salt-and-Pepper Noise") |
| | ], |
| | outputs=[ |
| | gr.Image(type="pil", label="Noisy Input Image"), |
| | gr.Image(type="pil", label="Denoised Output Image") |
| | ], |
| | title="U-Net Image Denoising with Salt-and-Pepper Noise", |
| | description="Upload an image or pick a random image from the Cropped Yale Faces dataset. " |
| | "Optionally add salt-and-pepper noise to the image before denoising." |
| | ) |
| |
|
| | |
| | interface.launch() |