import traceback import numpy as np import torch import gradio as gr import timm import torch.nn.functional as F MODEL_NAME = "hf_hub:gaunernst/vit_tiny_patch8_112.arcface_ms1mv3" model = timm.create_model( MODEL_NAME, pretrained=True ) model.eval() def image_to_tensor(image): image = image.convert("RGB") image = image.resize((112, 112)) img = np.array(image).astype(np.float32) / 255.0 img = (img - 0.5) / 0.5 img = np.transpose(img, (2, 0, 1)) tensor = torch.tensor(img).unsqueeze(0) return tensor def get_embeddings(image): if image is None: raise ValueError("Please upload an image.") tensor = image_to_tensor(image) with torch.no_grad(): embedding = model(tensor) embedding = F.normalize(embedding, p=2, dim=1) return embedding def compare_faces(image1, image2): try: face1 = get_embeddings(image1) face2 = get_embeddings(image2) similarity = F.cosine_similarity(face1, face2).item() similarity = round(similarity, 4) if similarity >= 0.6: result = "THIS IS THE SAME PERSON" else: result = "FACE DOES NOT MATCH" return result, similarity except Exception: return traceback.format_exc(), 0 demo = gr.Interface( fn=compare_faces, inputs=[ gr.Image(type="pil", label="Upload your first face"), gr.Image(type="pil", label="Upload your second face") ], outputs=[ gr.Textbox(label="Result"), gr.Number(label="Similarity") ], title="Face Recognition App", description="Upload two clear cropped face images and compare them." ) demo.launch()