therayz1's picture
Update app.py
3d25766 verified
import os
import cv2
import face_recognition
import numpy as np
from datetime import datetime
import gradio as gr
import pandas as pd
import plotly.express as px
import json
class FaceRecognitionSystem:
def __init__(self, images_folder='known_faces'):
self.images_folder = images_folder
self.known_face_encodings = []
self.known_face_names = []
self.attendance_file = 'attendance.json'
self.load_face_database()
def load_face_database(self):
self.known_face_encodings = []
self.known_face_names = []
os.makedirs(self.images_folder, exist_ok=True)
for filename in os.listdir(self.images_folder):
if filename.endswith((".jpg", ".png", ".jpeg")):
image_path = os.path.join(self.images_folder, filename)
try:
image = face_recognition.load_image_file(image_path)
face_locations = face_recognition.face_locations(image)
if face_locations:
face_encoding = face_recognition.face_encodings(image, face_locations)[0]
self.known_face_encodings.append(face_encoding)
self.known_face_names.append(filename.split('.')[0])
except Exception as e:
print(f"Hata: {filename} dosyası yüklenirken hata oluştu - {str(e)}")
def record_attendance(self, name):
current_time = datetime.now()
attendance_data = self.load_attendance_data()
current_date = current_time.strftime("%Y-%m-%d")
current_time_str = current_time.strftime("%H:%M:%S")
if current_date not in attendance_data:
attendance_data[current_date] = {}
if name not in attendance_data[current_date]:
attendance_data[current_date][name] = []
attendance_data[current_date][name].append(current_time_str)
self.save_attendance_data(attendance_data)
return True
def load_attendance_data(self):
if os.path.exists(self.attendance_file):
with open(self.attendance_file, 'r') as f:
return json.load(f)
return {}
def save_attendance_data(self, data):
with open(self.attendance_file, 'w') as f:
json.dump(data, f, indent=4)
def process_image(self, image):
if image is None:
return None, []
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
face_locations = face_recognition.face_locations(rgb_image)
face_encodings = face_recognition.face_encodings(rgb_image, face_locations)
detected_names = []
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
matches = face_recognition.compare_faces(self.known_face_encodings, face_encoding, tolerance=0.6)
name = "Bilinmeyen"
if True in matches:
first_match_index = matches.index(True)
name = self.known_face_names[first_match_index]
self.record_attendance(name)
detected_names.append(name)
cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)
cv2.rectangle(image, (left, bottom - 35), (right, bottom), (0, 255, 0), cv2.FILLED)
cv2.putText(image, name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_DUPLEX, 0.6, (255, 255, 255), 1)
return image, detected_names
def get_attendance_stats(self):
attendance_data = self.load_attendance_data()
stats = []
for date, entries in attendance_data.items():
for name, times in entries.items():
stats.append({
'date': date,
'name': name,
'total_entries': len(times),
'first_entry': min(times),
'last_entry': max(times)
})
return pd.DataFrame(stats)
def create_gradio_interface():
face_system = FaceRecognitionSystem()
def process_uploaded_image(image):
processed_image, detected_names = face_system.process_image(image)
return processed_image, ", ".join(detected_names) if detected_names else "Kimse tespit edilmedi."
def upload_face(image, name):
if image is None or name.strip() == "":
return "Lütfen hem resim hem de isim giriniz."
os.makedirs(face_system.images_folder, exist_ok=True)
file_path = os.path.join(face_system.images_folder, f"{name.strip()}.jpg")
cv2.imwrite(file_path, image)
face_system.load_face_database()
return f"{name} başarıyla kaydedildi!"
def get_attendance_report():
df = face_system.get_attendance_stats()
if df.empty:
return "Henüz katılım kaydı bulunmamaktadır."
fig = px.bar(df, x='name', y='total_entries',
title='Kişi Bazlı Toplam Katılım',
labels={'name': 'İsim', 'total_entries': 'Toplam Katılım'})
table_html = df.to_html(classes='table table-striped', index=False)
return f"""
<div style='margin-bottom: 20px;'>
{fig.to_html()}
</div>
<div>
{table_html}
</div>
"""
with gr.Blocks(theme=gr.themes.Soft()) as interface:
gr.Markdown("# 🎥 Yüz Tanıma ve Katılım Takip Sistemi--ERAY COŞKUN")
with gr.Tabs():
with gr.Tab("Yüz Tanıma"):
gr.Markdown("## 📷 Resim Yükle ve Tanı")
image_input = gr.Image(type="numpy", label="Resim Yükle")
output_image = gr.Image(label="İşlenmiş Resim")
output_text = gr.Textbox(label="Tespit Edilen Kişiler")
process_button = gr.Button("Resmi İşle")
process_button.click(
process_uploaded_image,
inputs=[image_input],
outputs=[output_image, output_text]
)
with gr.Tab("Yeni Kişi Kaydı"):
gr.Markdown("## 👤 Yeni Kişi Ekle")
with gr.Row():
new_image_input = gr.Image(type="numpy", label="Kişi Fotoğrafı")
name_input = gr.Textbox(label="Kişi Adı")
upload_button = gr.Button("Kaydet")
upload_result = gr.Textbox(label="Sonuç")
upload_button.click(
upload_face,
inputs=[new_image_input, name_input],
outputs=[upload_result]
)
with gr.Tab("Katılım Raporu"):
gr.Markdown("## 📊 Katılım İstatistikleri")
refresh_button = gr.Button("Raporu Yenile")
report_html = gr.HTML()
refresh_button.click(
get_attendance_report,
outputs=[report_html]
)
return interface
if __name__ == "__main__":
interface = create_gradio_interface()
interface.launch()