File size: 4,641 Bytes
9befc9d
 
 
 
 
 
 
 
d81f3c7
9befc9d
 
 
 
 
 
 
 
 
d81f3c7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9befc9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c9b325d
 
 
d5985cd
 
 
d81f3c7
 
 
c9b325d
d81f3c7
 
 
 
 
 
c9b325d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d81f3c7
 
c9b325d
 
 
 
 
 
 
 
 
d81f3c7
 
 
 
 
 
c9b325d
 
 
 
 
d81f3c7
 
 
 
 
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
117
118
119
120
121
122
123
124
125
126
from PIL import Image
import numpy as np
import cv2
import requests
import face_recognition
import os
from datetime import datetime
import streamlit as st
import sqlite3

# Set page title and description
st.set_page_config(
    page_title="Attendance System Using Face Recognition",
    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 & Location.")

# Create or connect to the SQLite database
conn = sqlite3.connect("attendance_database.db")
cursor = conn.cursor()

# Check if the 'faces' table exists, create it if not
cursor.execute('''
    CREATE TABLE IF NOT EXISTS faces (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        aadhaar TEXT,
        encoding BLOB
    )
''')
conn.commit()

# Load images for face recognition
Images = []
classnames = []
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])

def findEncodings(Images):
    encodeList = []
    for img in Images:
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        encode = face_recognition.face_encodings(img)[0]
        encodeList.append(encode)
    return encodeList

encodeListknown = findEncodings(Images)

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

# Take picture using the camera and input Aadhaar card details
img_file_buffer = st.file_uploader("Upload an image", type=["jpg", "jpeg"])
aadhaar_number = st.text_input("Enter Aadhaar Number:")

# Face recognition code...
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")

                    # Store face encoding and Aadhaar number in the database
                    face_encoding_bytes = pickle.dumps(encodeFace)
                    cursor.execute("INSERT INTO faces (aadhaar, encoding) VALUES (?, ?)", (aadhaar_number, face_encoding_bytes))
                    conn.commit()

        # 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")

        if name == "Unknown":
            st.info("Face not detected. Please try again.")
    else:
        st.error("Invalid Aadhaar card number. Please enter a valid 4-digit Aadhaar number.")

# Close the database connection
conn.close()