Jamshaid89's picture
Changed the thickness and text pos
80e72b0
raw
history blame
5.44 kB
import gradio as gr
import numpy as np
from deepface import DeepFace
from pymongo.mongo_client import MongoClient
import cv2
credentials = "jamshaid:jamshaid19gh"
uri = f"mongodb+srv://{credentials}@cluster0.uimyui3.mongodb.net/?retryWrites=true&w=majority"
client = MongoClient(uri)
db = client["Face_identification"]
identities_collection = db["face_identities"]
model_name="Facenet"
debug=False
def save_identity(image , name):
try:
embeddings = DeepFace.represent(image , model_name=model_name , detector_backend = "retinaface")
embeddings = embeddings[0]
identity = {"embeddings":embeddings["embedding"] , "name" : name }
result = identities_collection.insert_one(identity)
return f"{name} stored in database successfully.It is recommended to add 2 or 3 high quality images for one person"
except Exception as error:
return str(error)
def findCosineDistance(source_representation, test_representation):
a = np.matmul(np.transpose(source_representation), test_representation)
b = np.sum(np.multiply(source_representation, source_representation))
c = np.sum(np.multiply(test_representation, test_representation))
return 1 - (a / (np.sqrt(b) * np.sqrt(c)))
def findThreshold(model_name, distance_metric):
base_threshold = {"cosine": 0.40, "euclidean": 0.55, "euclidean_l2": 0.75}
thresholds = {
"VGG-Face": {"cosine": 0.40, "euclidean": 0.60, "euclidean_l2": 0.86},
"Facenet": {"cosine": 0.40, "euclidean": 10, "euclidean_l2": 0.80},
"Facenet512": {"cosine": 0.30, "euclidean": 23.56, "euclidean_l2": 1.04},
"ArcFace": {"cosine": 0.68, "euclidean": 4.15, "euclidean_l2": 1.13},
"Dlib": {"cosine": 0.07, "euclidean": 0.6, "euclidean_l2": 0.4},
"SFace": {"cosine": 0.593, "euclidean": 10.734, "euclidean_l2": 1.055},
"OpenFace": {"cosine": 0.10, "euclidean": 0.55, "euclidean_l2": 0.55},
"DeepFace": {"cosine": 0.23, "euclidean": 64, "euclidean_l2": 0.64},
"DeepID": {"cosine": 0.015, "euclidean": 45, "euclidean_l2": 0.17},
}
threshold = thresholds.get(model_name, base_threshold).get(distance_metric, 0.4)
return threshold
threshold = findThreshold(model_name , "cosine")
def predict_image(image):
original_image = np.copy(image)
if debug:
print("1")
# getting face embeddings from database
results = identities_collection.find()
faces = [dict(result) for result in results]
if debug:
print("2")
# generate face embeddings for all detected faces in image
target_embedding_array = DeepFace.represent(
img_path=image,
model_name=model_name,
detector_backend = "retinaface"
)
identities = []
# for each face compare its embeddings with all face embeddings in database
for target_embedding_obj in target_embedding_array:
target_embedding = target_embedding_obj["embedding"]
if debug:
print("4")
# compare the face embedding with all other faces
name = "Unknown"
for face in faces:
distance = findCosineDistance(face["embeddings"], target_embedding)
if distance <= threshold:
name = face["name"]
break
if debug:
print("5")
identities.append({"name":name , "facial_area":target_embedding_obj["facial_area"]})
output_img = np.copy(original_image)
for identity in identities:
# Draw the rectangle on the image
x = identity["facial_area"]["x"]
y = identity["facial_area"]["y"]
w = identity["facial_area"]["w"]
h = identity["facial_area"]["h"]
cv2.rectangle(output_img, (x,y), (x+w,y+h), (0, 0, 255), 1)
# Define the text position
text_position = (x, y+h+5)
# Add the text to the image
cv2.putText(output_img ,identity["name"], text_position, cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255,0 ), 1)
return output_img
# image_input = gr.inputs.Image(shape=(160,160))
# Create the Gradio interface
# gr.Interface(fn=predict_image, inputs=image_input, outputs=label_output).launch()
# Create Gradio interfaces for input and output
image_input = gr.inputs.Image(shape=(160, 160))
label_input = gr.inputs.Textbox(label="Enter Name")
label_output = gr.outputs.Textbox()
# Create the Gradio interface
interface1 = gr.Interface(
fn=save_identity,
inputs=[image_input, label_input],
outputs=label_output,
title="Face Identification",
description="Upload an image, enter the person name and store the person in database",
)
# Create Gradio interfaces for image input and output
image_input2 = gr.inputs.Image(shape=(160,160))
output_image = gr.outputs.Image(type="numpy")
# output_image = gr.outputs.Textbox()
# Create the Gradio interface for image input and output
interface2 = gr.Interface(
fn=predict_image,
inputs=image_input2,
outputs=output_image,
title="Face Identification",
description="Upload an image and get the identity of person",
)
# Create the Gradio interface with two tabs
# interface = gr.Interface(title="Face identification App")
# interface.add_view(interface1, "Save", "Add new person")
# interface.add_view(interface2, "Predict", "Get identity of person")
gr.TabbedInterface(
[interface2 , interface1],
tab_names=["Predict Persons","Add new Person"]
).queue().launch()
# Launch the Gradio interface
# interface.launch()