| import numpy as np |
| import gradio as gr |
| from tensorflow.keras.models import load_model |
| import tensorflow as tf |
|
|
| |
| autoencoder = load_model("models/autoencoder.h5", compile=False) |
| decoder = load_model("models/decoder.h5") |
|
|
| latent_dim = 128 |
|
|
|
|
| def add_gaussian_noise(image, noise_factor=0.2): |
| noisy_image = image + noise_factor * np.random.normal(size=image.shape) |
| noisy_image = np.clip(noisy_image, 0., 1.) |
| return noisy_image |
|
|
| def denoise_and_generate(image, num_images): |
| image = np.array(image) / 255.0 |
| image = tf.image.resize(image, (224, 224)) |
| noisy_image = add_gaussian_noise(np.expand_dims(image, axis=0)) |
| |
| denoised_image = autoencoder.predict(noisy_image).squeeze() |
| denoised_image = (denoised_image * 255).astype(np.uint8) |
|
|
| noisy_image_display = (noisy_image.squeeze() * 255).astype(np.uint8) |
| |
| |
| random_latent_vectors = np.random.normal(size=(num_images, latent_dim)) |
| generated_images = decoder.predict(random_latent_vectors) |
| |
| |
| outputs = [noisy_image_display, denoised_image] + [generated_images[i].squeeze() for i in range(num_images)] |
| |
| return outputs |
|
|
|
|
| |
| inputs = [ |
| gr.Image(label="Imagen de Entrada"), |
| gr.Slider(1, 2, step=1, label="Número de Imágenes Generadas") |
| ] |
|
|
| outputs = [ |
| gr.Image(label="Imagen con Ruido"), |
| gr.Image(label="Imagen Reconstruida (DAE)"), |
| ] + [ |
| gr.Image(label=f"Imagen Generada {i+1} (VAE)") for i in range(2) |
| ] |
|
|
| |
| interface = gr.Interface( |
| fn=denoise_and_generate, |
| inputs=inputs, |
| outputs=outputs, |
| title="Interfaz Interactiva para DAE y VAE", |
| description="Sube una imagen para agregar ruido, reconstruir con DAE y generar imágenes nuevas con VAE." |
| ) |
|
|
| |
| if __name__ == "__main__": |
| interface.launch(share=True) |
|
|