File size: 2,363 Bytes
bf687e5
7823cea
bf687e5
7823cea
 
13cd42f
bf687e5
13cd42f
 
bf687e5
7823cea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bf687e5
7823cea
 
 
 
 
 
 
bf687e5
7823cea
 
 
 
 
bf687e5
7823cea
 
 
 
 
bf687e5
7823cea
 
 
 
bf687e5
7823cea
 
 
bf687e5
7823cea
bf687e5
7823cea
 
bf687e5
f134081
7823cea
bf687e5
7823cea
 
bf687e5
8fed1b4
 
f134081
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import os
import numpy as np
from PIL import Image
import gradio as gr
from deepface import DeepFace
from datasets import load_dataset

# Cargamos el dataset sin aplicar formato especial
dataset = load_dataset("Segizu/dataset_faces")

# Cargar embeddings de todas las imágenes del dataset
def build_database():
    database = []
    for filename in os.listdir(IMAGE_DIRECTORY):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            path = os.path.join(IMAGE_DIRECTORY, filename)
            try:
                representation = DeepFace.represent(img_path=path, model_name="Facenet")[0]["embedding"]
                database.append((filename, path, representation))
            except:
                print(f"❌ No se pudo procesar: {filename}")
    return database

# Inicializamos base de datos
database = build_database()

# Comparar imagen cargada con las del dataset
def find_similar_faces(uploaded_image):
    try:
        uploaded_image = np.array(uploaded_image)
        query_representation = DeepFace.represent(img_path=uploaded_image, model_name="Facenet")[0]["embedding"]
    except:
        return [], "⚠ No se detectó un rostro válido en la imagen."

    similarities = []
    for name, path, rep in database:
        distance = np.linalg.norm(np.array(query_representation) - np.array(rep))
        similarity = 1 / (1 + distance)  # Normalizamos para que 1 = muy similar
        similarities.append((similarity, name, path))

    # Ordenar por similitud
    similarities.sort(reverse=True)
    top_matches = similarities[:5]

    # Formatear salida para gradio
    gallery_items = []
    text_summary = ""
    for sim, name, path in top_matches:
        img = Image.open(path)
        caption = f"{name} - Similitud: {sim:.2f}"
        gallery_items.append({"image": img, "caption": 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 te mostrará los rostros más similares desde el directorio `dataset_faces/`."
)

demo.launch()