File size: 4,651 Bytes
9befc9d
 
 
 
 
 
 
ecf75ce
9befc9d
 
 
c69ec6c
9befc9d
 
 
 
 
67b481a
d81f3c7
9befc9d
 
 
ecf75ce
9befc9d
ecf75ce
9befc9d
 
 
 
 
 
 
 
ecf75ce
 
9befc9d
c9b325d
 
 
3bb64c3
 
d5985cd
ecf75ce
 
 
 
 
 
 
 
 
 
 
 
d81f3c7
41cef17
d81f3c7
c9b325d
d81f3c7
 
 
 
 
c9b325d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d81f3c7
 
c9b325d
 
 
 
 
 
 
 
 
ecf75ce
 
 
 
 
 
 
 
 
 
 
d81f3c7
c9b325d
 
 
d81f3c7
3bb64c3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from PIL import Image
import numpy as np
import cv2
import requests
import face_recognition
import os
import streamlit as st
import csv

# Set page title and description
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.")

# Load images for face recognition
Images = []
classnames = []
aadhar_numbers = []  # New list to store Aadhaar 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])
        # Assume Aadhaar number is part of the image filename (e.g., "123456_john.jpg")
        aadhar_numbers.append(cls.split('_')[0])

# Function to validate Aadhaar card number
def validate_aadhaar(aadhaar):
    # Implement your Aadhaar card validation logic here
    # For simplicity, let's assume any 6-digit number is a valid Aadhaar card
    return len(aadhaar) == 6 and aadhaar.isdigit()

# Function to read names and Aadhaar numbers from a CSV file
def read_csv(file_path):
    data = []
    with open(file_path, mode='r') as file:
        reader = csv.reader(file)
        for row in reader:
            data.append(row)
    return data

# Load names and Aadhaar numbers from CSV file
csv_data = read_csv('csv.csv')  # Replace 'your_csv_file.csv' with the actual file path

# Take picture using the camera and input Aadhaar card details
img_file_buffer = st.camera_input("Take a picture")
aadhaar_number = st.text_input("Enter Aadhaar Number:")

if img_file_buffer is not None:
    # Validate Aadhaar card number
    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"  # Default name for unknown faces

        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()

                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)

                if name != "Unknown":
                    # Update Aadhaar data
                    url = "https://attendanceviaface.000webhostapp.com"
                    url1 = "/update.php"
                    data1 = {'name': name, 'aadhaar': aadhaar_number}
                    response = requests.post(url + url1, data=data1)

                    if response.status_code == 200:
                        st.success("Data updated on: " + url)
                    else:
                        st.warning("Data not updated")

        # Display the name corresponding to the entered Aadhaar number
        if name == "Unknown":
            # Match Aadhaar number with the list
            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: {csv_data[aadhar_index][0]}")
            else:
                st.warning("Face not detected, and Aadhaar number not found in the database.")
        else:
            st.warning("Aadhaar number is valid, but face recognition failed.")

        # Apply styling with CSS
        st.markdown('<style>img { animation: pulse 2s infinite; }</style>', unsafe_allow_html=True)
        st.image(image, use_column_width=True, output_format="PNG")

    else:
        st.error("Invalid Aadhaar card number. Please enter a valid 6-digit Aadhaar number.")