File size: 3,310 Bytes
6c5f0dc
 
5fec869
 
 
 
b7a271e
5fec869
b50b4bf
1382c28
b7a271e
 
 
 
 
 
 
5fec869
6c5f0dc
5fec869
 
 
 
 
99bd3cf
6c5f0dc
5fec869
 
 
 
 
 
 
 
6c5f0dc
5fec869
 
6c5f0dc
5fec869
426a079
6c5f0dc
b7a271e
 
 
 
6c5f0dc
5fec869
 
6c5f0dc
5fec869
 
6c5f0dc
5fec869
 
d6d1fc2
 
5fec869
 
 
d6d1fc2
 
 
 
9556539
d6d1fc2
 
 
 
 
 
 
 
9556539
d6d1fc2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9556539
d6d1fc2
 
28145d9
d6d1fc2
 
 
 
5fec869
1382c28
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
import streamlit as st
from PIL import Image
import face_recognition
import cv2
import numpy as np
import os
import sqlite3
from datetime import datetime

# Establish connection to SQLite database
conn = sqlite3.connect('attendance.db')
c = conn.cursor()

# Create a table for storing attendance if it doesn't exist
c.execute('''CREATE TABLE IF NOT EXISTS attendance 
             (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, time TEXT)''')

st.title("AIMLJan24 - Face Recognition")

# Load images for face recognition
Images = []   
classnames = []  
directory = "photos"
myList = os.listdir(directory)
current_datetime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

st.write("Photographs found in folder : ")
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)
        st.write(os.path.splitext(cls)[0])
        classnames.append(os.path.splitext(cls)[0])

# Load images for face recognition
encodeListknown = [face_recognition.face_encodings(img)[0] for img in Images]

# camera to take photo of user in question
file_name = st.camera_input("Upload image")

def add_attendance(name):
    username = name
    c.execute("INSERT INTO attendance (name, time) VALUES (?, ?)", (username, current_datetime))
    conn.commit()

if file_name is not None:
    col1, col2 = st.columns(2)

    test_image = Image.open(file_name)
    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)
    
    # List to store recognized names for all faces in the image
    recognized_names = []

    # Iterate over each face location
    for faceLoc in facesCurFrame:
        # Extract the coordinates of the face location
        top, right, bottom, left = faceLoc
        
        # Crop the face region from the image
        face_img = imgS[top:bottom, left:right]

        # Encode the face
        face_encoding = face_recognition.face_encodings(face_img)[0]

        # Compare the face encoding with known face encodings
        matches = face_recognition.compare_faces(encodeListknown, face_encoding)
        
        # Initialize name as Unknown
        name = "Unknown"
        
        # Check if there's a match with known faces
        if True in matches:
            matchIndex = matches.index(True)
            name = classnames[matchIndex].upper()
        
        # Append recognized name to the list
        recognized_names.append(name)
        
        # Draw rectangle around the face
        cv2.rectangle(image, (left*4, top*4), (right*4, bottom*4), (0, 255, 0), 2)
        cv2.putText(image, name, (left*4 + 6, bottom*4 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
        
        # Store attendance in SQLite database
        add_attendance(name)
            
    # Display the image with recognized faces
    st.image(image, use_column_width=True, output_format="PNG")

    # Display recognized names
    st.write("Recognized Names:")
    for i, name in enumerate(recognized_names):
        st.write(f"Face {i+1}: {name}")
    else:
        st.warning("No faces detected in the image. Face recognition failed.")