Spaces:
Runtime error
Runtime error
File size: 1,739 Bytes
63e2f2d | 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 | import os
import base64
import numpy as np
import cv2
from deepface import DeepFace
from sklearn.metrics.pairwise import cosine_similarity
# Ensure TensorFlow uses CPU
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
def base64_to_cv2_image(data_uri: str):
"""
Converts a base64 image string (data URI) to OpenCV image format.
"""
if "," in data_uri:
_, encoded = data_uri.split(",", 1)
else:
encoded = data_uri
decoded = base64.b64decode(encoded)
np_arr = np.frombuffer(decoded, np.uint8)
img = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
return img
def generate_facenet512_embedding(base64_image: str):
"""
Accepts a base64 image string and returns a 512-dimensional FaceNet embedding using CPU.
"""
img = base64_to_cv2_image(base64_image)
result = DeepFace.represent(
img_path=img,
model_name='Facenet512',
detector_backend='opencv', # CPU-friendly face detector
enforce_detection=True
)[0]
return result['embedding']
def compare_image_with_embedding(base64_image: str, stored_embedding: list, threshold: float = 0.4):
"""
Compares a live base64 image with a stored FaceNet512 embedding.
Returns match status and similarity details.
"""
img_embedding = np.array(generate_facenet512_embedding(base64_image)).reshape(1, -1)
stored_embedding = np.array(stored_embedding).reshape(1, -1)
similarity = cosine_similarity(img_embedding, stored_embedding)[0][0]
distance = 1 - similarity
is_match = distance < threshold
return {
"match": is_match,
"similarity": float(similarity),
"distance": float(distance)
}
|