Spaces:
Running
Running
| import numpy as np | |
| from deepface import DeepFace | |
| _MODEL = "VGG-Face" | |
| def _cosine_sim(a, b): | |
| a, b = np.array(a, dtype=float), np.array(b, dtype=float) | |
| return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))) | |
| def _to_pct(sim): | |
| return round(max(0.0, min(1.0, (sim + 1) / 2)) * 100, 1) | |
| def analyze(father_path, mother_path, child_path): | |
| child_info = DeepFace.analyze( | |
| child_path, actions=["age"], enforce_detection=False, silent=True | |
| ) | |
| age = int(child_info[0]["age"]) | |
| child_emb = DeepFace.represent( | |
| child_path, model_name=_MODEL, enforce_detection=False | |
| )[0]["embedding"] | |
| father_emb = DeepFace.represent( | |
| father_path, model_name=_MODEL, enforce_detection=False | |
| )[0]["embedding"] | |
| mother_emb = DeepFace.represent( | |
| mother_path, model_name=_MODEL, enforce_detection=False | |
| )[0]["embedding"] | |
| return { | |
| "age": age, | |
| "father_score": _to_pct(_cosine_sim(child_emb, father_emb)), | |
| "mother_score": _to_pct(_cosine_sim(child_emb, mother_emb)), | |
| } | |