| 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): |
| """ |
| image: PIL Image in grayscale ('L') or RGB |
| amount: fraction of pixels to corrupt |
| """ |
| 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() |