sehaj13's picture
Update app.py
8054d7b verified
# Transformers
from transformers import pipeline
# For Face Recognition
import insightface
from insightface.app import FaceAnalysis
# Torch and Image Processing
import torch
import torch.nn.functional as F
from torchvision import transforms, datasets
# For Display and Web Interface
import streamlit as st
# Generic Libraries
import os
import cv2
import numpy as np
from PIL import Image
from glob import glob
import requests
# Set the device (GPU or CPU)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# Global Variables
MODEL_TRANSFORMER = 'google/vit-base-patch16-224'
BATCH_SIZE = 8
IMAGE_SHAPE = 640
# Paths
data_path = 'studentsofAIML25'
webcam_path = 'captured_image.jpg'
# Title
st.title("AIML2025 Attendance System")
# Read images from employee directory
image_paths = glob(os.path.join(data_path, '*.jpg'))
# Initialize Face Recognition App
app = FaceAnalysis(name="buffalo_l")
app.prepare(ctx_id=-1, det_size=(IMAGE_SHAPE, IMAGE_SHAPE)) # CPU: -1, GPU: 0
# Initialize HuggingFace ViT Classification Pipeline
vit_pipe = pipeline("image-classification", model=MODEL_TRANSFORMER)
# Face Matching Function
def prod_function(app, prod_path, webcam_path):
webcam_img = Image.open(webcam_path)
np_webcam = np.array(webcam_img)
cv2_webcam = cv2.cvtColor(np_webcam, cv2.COLOR_RGB2BGR)
webcam_emb = app.get(cv2_webcam, max_num=1)
if not webcam_emb:
return torch.tensor([]), None, None
webcam_emb_tensor = torch.from_numpy(np.array(webcam_emb[0].embedding))
similarity_score = []
for path in prod_path:
img = cv2.imread(path)
face_embedding = app.get(img, max_num=1)
if not face_embedding:
similarity_score.append(torch.tensor(-1.0))
continue
face_tensor = torch.from_numpy(np.array(face_embedding[0].embedding))
similarity_score.append(F.cosine_similarity(face_tensor, webcam_emb_tensor, dim=0))
return torch.stack(similarity_score), cv2_webcam, webcam_emb[0].bbox.astype(int)
# Streamlit Tabs
about_tab, app_tab = st.tabs(["About the app", "Face Recognition"])
# About Tab
with about_tab:
st.markdown(
"""
## 👁️‍🗨️ AI-Powered Face Recognition Attendance System
**Effortless, Secure, and Accurate Attendance with Vision Transformer Technology**
This is a facial recognition-based attendance system enhanced with image classification using a Vision Transformer (ViT).
Just capture your image to mark your attendance automatically!
""")
classnames = [os.path.splitext(os.path.basename(path))[0].upper() for path in image_paths]
st.sidebar.header("📋 Trained Students")
for name in classnames:
st.sidebar.write("👤", name)
# Application Tab
with app_tab:
enable = st.checkbox("Enable Camera")
picture = st.camera_input("Take a Picture", disabled=not enable)
if picture is not None:
with st.spinner("Processing..."):
# Save captured image
image = Image.open(picture)
image.save(webcam_path)
# --- Face Recognition ---
prediction, cv2_webcam, face_bbox = prod_function(app, image_paths, webcam_path)
if prediction is None or len(prediction) == 0:
st.warning("No face detected in the image.")
else:
match_idx = torch.argmax(prediction)
if prediction[match_idx] >= 0.6:
name = image_paths[match_idx].split('/')[-1].split('.')[0].upper()
# Draw bounding box and name
x1, y1, x2, y2 = face_bbox
cv2.rectangle(cv2_webcam, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.rectangle(cv2_webcam, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)
cv2.putText(cv2_webcam, name, (x1 + 6, y2 - 6),
cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
# Show result
st.image(cv2.cvtColor(cv2_webcam, cv2.COLOR_BGR2RGB),
caption=f"✅ Matched: {name}", use_container_width=True)
st.success(f"Welcome, {name}!")
# The use_column_width parameter has been deprecated and will be removed in a future release. Please utilize the use_container_width parameter instead.
# --- Send Attendance ---
url = "https://skattendancesystem25.glitch.me/adds"
data = {'rno': 15, 'sname': name, 'sclass': 7}
try:
response = requests.post(url, data=data)
if response.status_code == 200:
st.success("Attendance marked successfully.")
else:
st.warning("Failed to update attendance.")
except Exception as e:
st.error(f"Request failed: {e}")
else:
st.error("❌ Match not found. Try again.")