J
File size: 1,853 Bytes
85fa7d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Embedding Engine - Generación de vectores faciales
"""

from deepface import DeepFace
import numpy as np
from loguru import logger


class EmbeddingEngine:
    """
    Genera embeddings faciales usando modelos de deep learning.
    """
    
    SUPPORTED_MODELS = [
        "VGG-Face", "Facenet", "Facenet512", "OpenFace",
        "DeepFace", "DeepID", "ArcFace", "Dlib", "SFace"
    ]
    
    def __init__(self, model="ArcFace"):
        """
        Inicializa el motor de embeddings.
        
        Args:
            model: Modelo a usar (default: ArcFace - el más preciso)
        """
        if model not in self.SUPPORTED_MODELS:
            logger.warning(f"Modelo {model} no soportado, usando ArcFace")
            model = "ArcFace"
        
        self.model_name = model
        logger.info(f"Embedding Engine inicializado con modelo: {model}")
    
    def generate_embedding(self, face_image):
        """
        Genera un vector de embedding para un rostro.
        
        Args:
            face_image: Imagen del rostro (numpy array RGB, 160x160)
            
        Returns:
            Vector numpy de embeddings o None si falla
        """
        try:
            # DeepFace espera un array numpy
            embedding_obj = DeepFace.represent(
                img_path=face_image,
                model_name=self.model_name,
                enforce_detection=False,
                detector_backend='skip'  # Ya hicimos detección con MTCNN
            )
            
            # Extraer el vector
            embedding = np.array(embedding_obj[0]["embedding"])
            
            logger.debug(f"Embedding generado: {len(embedding)} dimensiones")
            
            return embedding
        
        except Exception as e:
            logger.error(f"Error generando embedding: {e}")
            return None