import gradio as gr import numpy as np from tensorflow.keras.models import load_model from PIL import Image import tensorflow as tf #Cargar modelo def euclidean_distance(vects): x, y = vects sum_square = tf.reduce_sum(tf.square(x - y), axis=1, keepdims=True) return tf.sqrt(tf.maximum(sum_square, tf.keras.backend.epsilon())) model = load_model("mnist_siamese_model.keras", custom_objects={'euclidean_distance': euclidean_distance}) #Preprocesar imágenes def preprocess(img): img = img.convert("L").resize((28, 28)) img = np.array(img).astype("float32") / 255.0 img = np.expand_dims(img, axis=-1) # (28, 28, 1) return img #Función de predicción def predict(img1, img2): img1 = preprocess(img1) img2 = preprocess(img2) img1 = np.expand_dims(img1, axis=0) img2 = np.expand_dims(img2, axis=0) distance = model.predict([img1, img2])[0][0] threshold = 0.5 same = distance < threshold return f"¿Es el mismo dígito? {'Sí' if same else 'No'} (distancia: {distance:.4f})" #Interfaz Gradio interface = gr.Interface( fn=predict, inputs=[ gr.Image(type="pil", label="Imagen 1"), gr.Image(type="pil", label="Imagen 2") ], outputs="text", title="Modelo Siamese con MNIST", description="Sube dos imágenes de dígitos para verificar si representan el mismo número." ) interface.launch()