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)
    }