Spaces:
Running
on
Zero
Running
on
Zero
import numpy as np | |
from PIL import Image | |
import gradio as gr | |
from deepface import DeepFace | |
from datasets import load_dataset | |
# Cargar el dataset de Hugging Face | |
dataset = load_dataset("Segizu/dataset_faces") | |
if "train" in dataset: | |
dataset = dataset["train"] | |
# Cargar embeddings de todas las imágenes del dataset | |
def build_database(): | |
database = [] | |
for i, item in enumerate(dataset): | |
try: | |
img = item["image"] | |
# Convertir a RGB y np.array | |
img_rgb = img.convert("RGB") | |
img_np = np.array(img_rgb) | |
# Obtener representación (embedding) | |
representation = DeepFace.represent(img_path=img_np, model_name="Facenet", enforce_detection=False)[0]["embedding"] | |
database.append((f"image_{i}", img_rgb, representation)) | |
except Exception as e: | |
print(f"❌ No se pudo procesar imagen {i}: {e}") | |
return database | |
# Inicializamos base de datos de embeddings | |
database = build_database() | |
# Comparar imagen cargada con la base | |
def find_similar_faces(uploaded_image): | |
try: | |
img_np = np.array(uploaded_image.convert("RGB")) | |
query_representation = DeepFace.represent(img_path=img_np, model_name="Facenet", enforce_detection=False)[0]["embedding"] | |
except: | |
return [], "⚠ No se detectó un rostro válido en la imagen." | |
similarities = [] | |
for name, db_img, rep in database: | |
distance = np.linalg.norm(np.array(query_representation) - np.array(rep)) | |
similarity = 1 / (1 + distance) # Normalizado | |
similarities.append((similarity, name, db_img)) | |
similarities.sort(reverse=True) | |
top_matches = similarities[:5] | |
gallery_items = [] | |
text_summary = "" | |
for sim, name, img in top_matches: | |
caption = f"{name} - Similitud: {sim:.2f}" | |
gallery_items.append((img, caption)) | |
text_summary += caption + "\n" | |
return gallery_items, text_summary | |
# Interfaz Gradio | |
demo = gr.Interface( | |
fn=find_similar_faces, | |
inputs=gr.Image(label="📤 Sube una imagen", type="pil"), | |
outputs=[ | |
gr.Gallery(label="📸 Rostros más similares"), | |
gr.Textbox(label="🧠 Similitud", lines=6) | |
], | |
title="🔍 Buscador de Rostros con DeepFace", | |
description="Sube una imagen y se comparará contra los rostros del dataset alojado en Hugging Face (`Segizu/dataset_faces`)." | |
) | |
demo.launch() | |