|
from PIL import Image |
|
import numpy as np |
|
import cv2 |
|
import requests |
|
import face_recognition |
|
import os |
|
import streamlit as st |
|
|
|
|
|
st.set_page_config( |
|
page_title="Aadhaar Based Face Recognition Attendance System", |
|
page_icon="📷", |
|
layout="centered", |
|
initial_sidebar_state="collapsed" |
|
) |
|
st.title("Attendance System Using Face Recognition 📷") |
|
st.markdown("This app recognizes faces in an image, verifies Aadhaar card details, and updates attendance records with the current timestamp.") |
|
|
|
|
|
Images = [] |
|
classnames = [] |
|
aadhar_numbers = [] |
|
|
|
directory = "photos" |
|
myList = os.listdir(directory) |
|
|
|
for cls in myList: |
|
if os.path.splitext(cls)[1] in [".jpg", ".jpeg"]: |
|
img_path = os.path.join(directory, cls) |
|
curImg = cv2.imread(img_path) |
|
Images.append(curImg) |
|
classnames.append(os.path.splitext(cls)[0]) |
|
|
|
aadhar_numbers.append(cls.split('_')[0]) |
|
|
|
|
|
def validate_aadhaar(aadhaar): |
|
|
|
|
|
return len(aadhaar) == 6 and aadhaar.isdigit() |
|
|
|
|
|
def update_data(name, aadhaar_number): |
|
url = "https://attendanceviaface.000webhostapp.com" |
|
url1 = "/update.php" |
|
data = {'name': name, 'aadhaar': aadhaar_number} |
|
response = requests.post(url + url1, data=data) |
|
|
|
if response.status_code == 200: |
|
st.success("Data updated on: " + url) |
|
else: |
|
st.warning("Data not updated") |
|
|
|
|
|
def display_image_with_overlay(image, name): |
|
|
|
|
|
|
|
|
|
st.markdown('<style>img { animation: pulse 2s infinite; }</style>', unsafe_allow_html=True) |
|
st.image(image, use_column_width=True, output_format="PNG") |
|
|
|
|
|
aadhaar_number = st.text_input("Enter your Last 6-digits Aadhaar Number:") |
|
|
|
|
|
img_file_buffer = st.camera_input("Take a picture") |
|
|
|
|
|
encodeListknown = [face_recognition.face_encodings(img)[0] for img in Images] |
|
|
|
if img_file_buffer is not None: |
|
|
|
if validate_aadhaar(aadhaar_number): |
|
test_image = Image.open(img_file_buffer) |
|
image = np.asarray(test_image) |
|
|
|
imgS = cv2.resize(image, (0, 0), None, 0.25, 0.25) |
|
imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB) |
|
facesCurFrame = face_recognition.face_locations(imgS) |
|
encodesCurFrame = face_recognition.face_encodings(imgS, facesCurFrame) |
|
|
|
name = "Unknown" |
|
match_found = False |
|
|
|
|
|
if len(encodesCurFrame) > 0: |
|
for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame): |
|
|
|
matches = face_recognition.compare_faces(encodeListknown, encodeFace) |
|
faceDis = face_recognition.face_distance(encodeListknown, encodeFace) |
|
matchIndex = np.argmin(faceDis) |
|
|
|
if matches[matchIndex]: |
|
name = classnames[matchIndex].upper() |
|
|
|
|
|
if aadhaar_number not in aadhar_numbers: |
|
st.error("Face recognized, but Aadhaar number not found in the database.") |
|
else: |
|
|
|
update_data(name, aadhaar_number) |
|
match_found = True |
|
|
|
else: |
|
|
|
st.error("Face recognized, but Aadhaar number does not match.") |
|
|
|
y1, x2, y2, x1 = faceLoc |
|
y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4 |
|
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2) |
|
cv2.rectangle(image, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED) |
|
cv2.putText(image, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2) |
|
|
|
display_image_with_overlay(image, name) |
|
|
|
|
|
if not match_found: |
|
|
|
aadhar_index = aadhar_numbers.index(aadhaar_number) if aadhaar_number in aadhar_numbers else None |
|
if aadhar_index is not None: |
|
st.success(f"Match found: {classnames[aadhar_index]}") |
|
else: |
|
st.warning("Face not detected, and Aadhaar number not found in the database.") |
|
else: |
|
st.success(f"Face recognized: {name}") |
|
|
|
else: |
|
st.warning("No faces detected in the image. Face recognition failed.") |
|
|
|
else: |
|
st.error("Invalid Aadhaar card number. Please enter a valid 6-digit Aadhaar number.") |
|
|