Spaces:
Build error
Build error
File size: 1,832 Bytes
f10370d |
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 |
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# The user is identified if cosine distance < 0.5.
# Cosine Similarity = 1 - Cosine Distance
SIMILARITY_THRESHOLD = 0.5
def recognize_face_by_embedding(current_embedding, known_embeddings, known_names):
"""
Identifies a known person by comparing the current face embedding against stored ones.
Args:
current_embedding (np.array): The 128-D embedding of the live face.
known_embeddings (list): List of stored embedding vectors (numpy arrays).
known_names (list): List of names corresponding to the embeddings.
Returns:
tuple: (Identified Name or "Unknown", Cosine Distance)
"""
if not known_embeddings or current_embedding is None:
return "Unknown", 1.0 # No users registered or failed embedding
# Reshape for comparison: (1, 128)
current_embedding = current_embedding.reshape(1, -1)
# Convert list of known embeddings to a NumPy array (N, 128)
known_embeddings_array = np.array(known_embeddings)
# Calculate Cosine Similarity (vector comparison)
similarities = cosine_similarity(current_embedding, known_embeddings_array)[0]
# Find the best match (highest similarity)
best_match_index = np.argmax(similarities)
best_similarity = similarities[best_match_index]
# Calculate distance for checking the threshold: Distance = 1 - Similarity
best_distance = 1.0 - best_similarity
# Check if the similarity surpasses the threshold (i.e., distance < 0.5)
if best_distance < SIMILARITY_THRESHOLD:
identified_name = known_names[best_match_index]
return identified_name, best_distance
else:
# System notes the person as unknown [cite: 44]
return "Unknown", best_distance |