| import os |
| import pandas as pd |
| from datetime import datetime |
| from deepface import DeepFace |
| import gradio as gr |
| from PIL import Image |
|
|
| |
| os.makedirs("registered_faces", exist_ok=True) |
| os.makedirs("attendance", exist_ok=True) |
|
|
| |
| SIMILARITY_THRESHOLD = 0.4 |
|
|
| |
| 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}!" |
|
|
| |
| 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 = [] |
|
|
| |
| 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: |
| |
| result = DeepFace.verify( |
| img1_path=registered_path, |
| img2_path=temp_image_path, |
| enforce_detection=True, |
| model_name="Facenet", |
| distance_metric="cosine" |
| ) |
| similarity = result["distance"] |
| debug_logs.append(f"Compared with {registered_file}: Verified={result['verified']}, Distance={similarity}") |
|
|
| |
| 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 |
|
|
| |
| if os.path.exists(temp_image_path): |
| os.remove(temp_image_path) |
|
|
| |
| 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) |
|
|
| |
| return f"Recognized: {recognized_name}\nDebug Logs:\n" + "\n".join(debug_logs) |
|
|
| |
| def download_attendance(): |
| attendance_file = "attendance/attendance.csv" |
| if os.path.exists(attendance_file): |
| return attendance_file |
| else: |
| return "No attendance records found." |
|
|
| |
| 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." |
|
|
| |
| 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"), |
| 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" |
| ) |
|
|
| |
| app = gr.TabbedInterface( |
| [register_interface, recognize_interface, download_interface, delete_interface], |
| ["Register", "Recognize", "Download Attendance", "Delete Faces"] |
| ) |
|
|
| |
| app.launch() |
|
|