Deepface / model /face_model.py
rithanashri's picture
Upload 16 files
63e2f2d verified
Raw
History Blame Contribute Delete
1.74 kB
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)
}