srinuksv's picture
Update app.py
ecaec72 verified
import os
import cv2
import numpy as np
from keras_facenet import FaceNet
import gradio as gr
# Initialize FaceNet model
embedder = FaceNet()
def img_to_encoding(image, embedder):
try:
if image is None:
print("Debug: Image is None")
return None
if not isinstance(image, np.ndarray):
print(f"Debug: Image is not a numpy array, type(image)={type(image)}")
return None
print(f"Debug: Image shape = {image.shape}, dtype = {image.dtype}")
# Convert BGR to RGB and resize to 160x160
img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (160, 160))
# Get the embedding
embedding = embedder.embeddings([img])[0]
return embedding
except Exception as e:
print(f"Error in img_to_encoding: {e}")
return None
database = {}
def register_user(image, username):
try:
if not os.path.exists('images'):
os.makedirs('images')
if image is None or image.size == 0:
print("Debug: Invalid image input")
return "Error: Uploaded image is empty or invalid."
print(f"Debug: Image received for registration, username={username}")
# Save the image to disk
img_path = f'images/{username}.jpg'
success = cv2.imwrite(img_path, cv2.cvtColor(image, cv2.COLOR_RGB2BGR))
if not success:
print("Debug: Failed to save image to disk")
return "Error: Failed to save the image."
encoding = img_to_encoding(image, embedder)
if encoding is None:
return "Error: Failed to process the image."
database[username] = encoding
return f"User '{username}' registered successfully!"
except Exception as e:
print(f"Error during registration: {e}")
return f"Error during registration: {e}"
def verify_user(image):
try:
if image is None or image.size == 0:
print("Debug: Invalid image input for verification")
return "Error: Uploaded image is empty or invalid."
print("Debug: Image received for verification")
encoding = img_to_encoding(image, embedder)
if encoding is None:
return "Error: Failed to process the image."
min_dist = 1000
identity = None
for (name, db_enc) in database.items():
dist = np.linalg.norm(encoding - db_enc)
if dist < min_dist:
min_dist = dist
identity = name
if min_dist > 5:
return "Identity not recognized."
else:
return f"It's {identity}, the distance is {min_dist}."
except Exception as e:
print(f"Error during verification: {e}")
return f"Error during verification: {e}"
# Gradio Interface for Registration
register_interface = gr.Interface(
fn=register_user,
inputs=[gr.Image(type="numpy", label="Take a Photo or Upload"), gr.Textbox(label="Username")],
outputs="text",
title="Register User",
description="Take a photo or upload an image and enter a username to register."
)
# Gradio Interface for Verification
verify_interface = gr.Interface(
fn=verify_user,
inputs=gr.Image(type="numpy", label="Take a Photo or Upload"),
outputs="text",
title="Verify User",
description="Take a photo or upload an image to verify the user's identity."
)
# Combine the interfaces into a single application
app = gr.Blocks()
with app:
gr.Markdown("# Face Identification System")
with gr.Tab("Register"):
register_interface.render()
with gr.Tab("Verify"):
verify_interface.render()
# Run the Gradio application
if __name__ == "__main__":
app.launch()