face / app.py
Fortx69's picture
Create app.py
f239a3f verified
import os
import pandas as pd
from datetime import datetime
from deepface import DeepFace
import gradio as gr
from PIL import Image
# Ensure necessary directories exist
os.makedirs("registered_faces", exist_ok=True)
os.makedirs("attendance", exist_ok=True)
# Adjust the similarity threshold
SIMILARITY_THRESHOLD = 0.4 # Lower means stricter; increase for more flexibility
# 1. Register a face
def register_face(image, name):
if not name.strip():
return "Please provide a valid name."
file_path = f"registered_faces/{name}.jpg"
image.save(file_path)
return f"Face registered for {name}!"
# 2. Recognize a face and mark attendance
def recognize_face(image):
if not os.listdir("registered_faces"):
return "No registered faces found. Please register a face first."
recognized_name = "Unknown"
debug_logs = [] # Store debug information
# Save the uploaded image temporarily
temp_image_path = "temp_recognition.jpg"
image.save(temp_image_path)
for registered_file in os.listdir("registered_faces"):
registered_path = f"registered_faces/{registered_file}"
try:
# Perform face verification
result = DeepFace.verify(
img1_path=registered_path,
img2_path=temp_image_path,
enforce_detection=True, # Ensure face detection
model_name="Facenet", # Use a different model for testing
distance_metric="cosine" # Use cosine distance for better comparison
)
similarity = result["distance"]
debug_logs.append(f"Compared with {registered_file}: Verified={result['verified']}, Distance={similarity}")
# If a match is found
if similarity < SIMILARITY_THRESHOLD:
recognized_name = os.path.splitext(registered_file)[0]
break
except Exception as e:
debug_logs.append(f"Error comparing with {registered_file}: {str(e)}")
continue
# Remove temporary file after processing
if os.path.exists(temp_image_path):
os.remove(temp_image_path)
# Log attendance if recognized
if recognized_name != "Unknown":
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
attendance_file = "attendance/attendance.csv"
if not os.path.exists(attendance_file):
df = pd.DataFrame(columns=["Name", "Time"])
else:
df = pd.read_csv(attendance_file)
df = pd.concat([df, pd.DataFrame({"Name": [recognized_name], "Time": [now]})], ignore_index=True)
df.to_csv(attendance_file, index=False)
# Debug output
return f"Recognized: {recognized_name}\nDebug Logs:\n" + "\n".join(debug_logs)
# 3. Download attendance records
def download_attendance():
attendance_file = "attendance/attendance.csv"
if os.path.exists(attendance_file):
return attendance_file
else:
return "No attendance records found."
# 4. Delete all registered faces
def delete_registered_faces():
folder = "registered_faces"
if os.listdir(folder):
for file in os.listdir(folder):
os.remove(os.path.join(folder, file))
return "All registered faces have been deleted."
return "No registered faces to delete."
# Gradio interfaces
register_interface = gr.Interface(
fn=register_face,
inputs=[gr.Image(type="pil"), gr.Text(label="Name")],
outputs="text",
title="Register Face"
)
recognize_interface = gr.Interface(
fn=recognize_face,
inputs=gr.Image(type="pil"), # Corrected to use "pil"
outputs="text",
title="Recognize Face"
)
download_interface = gr.Interface(
fn=download_attendance,
inputs=None,
outputs="file",
title="Download Attendance"
)
delete_interface = gr.Interface(
fn=delete_registered_faces,
inputs=None,
outputs="text",
title="Delete Registered Faces"
)
# Tabbed Gradio App
app = gr.TabbedInterface(
[register_interface, recognize_interface, download_interface, delete_interface],
["Register", "Recognize", "Download Attendance", "Delete Faces"]
)
# Launch Gradio app
app.launch()