beykun18's picture
Update app.py
e8eeca3
raw
history blame contribute delete
No virus
3.41 kB
from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer
import datasets
import gradio as gr
import numpy as np
import torchvision.transforms as transforms
import mediapipe as mp
import cv2
#model = SentenceTransformer('clip-ViT-B-16')
model = SentenceTransformer('clip-ViT-B-32')
dataset = datasets.load_dataset('brendenc/celeb-identities')
def predict(im1, im2):
# Convert the PIL Image to a numpy array
im1 = np.array(im1)
im2 = np.array(im2)
face1 = im1.copy()
face2 = im2.copy()
img1_h, img1_w, _ = im1.shape
img2_h, img2_w, _ = im2.shape
# Locate face using mediapipe
mp_face_mesh = mp.solutions.face_mesh
with mp_face_mesh.FaceMesh(max_num_faces=1, refine_landmarks=True, min_detection_confidence=0.5, min_tracking_confidence=0.5) as face_mesh:
results1 = face_mesh.process(im1)
results2 = face_mesh.process(im2)
if results1.multi_face_landmarks:
for face_landmarks in results1.multi_face_landmarks:
# get location of face detected
top_x = int(face_landmarks.landmark[234].x * img1_w)
top_y = int(face_landmarks.landmark[10].y * img1_h)
bottom_x = int(face_landmarks.landmark[454].x * img1_w)
bottom_y = int(face_landmarks.landmark[152].y * img1_h)
face1 = im1[top_y:bottom_y, top_x:bottom_x]
cv2.rectangle(im1, (top_x, top_y), (bottom_x, bottom_y), (0, 255, 0), 2)
if results2.multi_face_landmarks:
for face_landmarks in results2.multi_face_landmarks:
# get location of face detected
top_x2 = int(face_landmarks.landmark[234].x * img2_w)
top_y2 = int(face_landmarks.landmark[10].y * img2_h)
bottom_x2 = int(face_landmarks.landmark[454].x * img2_w)
bottom_y2 = int(face_landmarks.landmark[152].y * img2_h)
face2 = im2[top_y2:bottom_y2, top_x2:bottom_x2]
cv2.rectangle(im2, (top_x2, top_y2), (bottom_x2, bottom_y2), (0, 255, 0), 2)
# Convert the tensor back to a PIL Image
face1 = transforms.ToPILImage()(face1)
im1 = transforms.ToPILImage()(im1)
face2 = transforms.ToPILImage()(face2)
im2 = transforms.ToPILImage()(im2)
embeddings = model.encode([face1, face2])
sim = cosine_similarity(embeddings)
sim = sim[0, 1]
if sim > 0.82:
return im1, im2, sim, "SAME PERSON, AUTHORIZE PAYMENT"
else:
return im1, im2, sim, "DIFFERENT PEOPLE, DON'T AUTHORIZE PAYMENT"
interface = gr.Interface(fn=predict,
inputs= [gr.Image(value = dataset['train']['image'][10], type="pil", source="webcam"),
gr.Image(value = dataset['train']['image'][17], type="pil", source="webcam")],
outputs= [gr.Image(),
gr.Image(),
gr.Number(label="Similarity"),
gr.Textbox(label="Message")],
title = 'Face ID',
description = 'This app uses face biometrics and a similarity to function as a Face ID application.The similarity score ranges from -1 to 1.'
)
interface.launch(debug=True)
#interface.launch(share=True)