File size: 3,601 Bytes
6c5f0dc
 
5fec869
 
 
 
 
1be28be
6c5f0dc
5fec869
6c5f0dc
5fec869
 
 
 
 
99bd3cf
 
 
 
 
 
6c5f0dc
5fec869
 
 
 
 
 
 
 
6c5f0dc
5fec869
 
6c5f0dc
5fec869
426a079
6c5f0dc
cce60dd
 
363428d
cce60dd
 
 
 
5fec869
6c5f0dc
5fec869
 
6c5f0dc
5fec869
 
6c5f0dc
5fec869
 
 
 
6c5f0dc
5fec869
 
 
 
 
 
 
 
 
 
 
 
c9b8627
5fec869
 
 
 
 
 
 
c9b8627
 
5fec869
 
9a846d7
c9b8627
 
5fec869
c9b8627
 
28145d9
5fec869
 
 
 
cce60dd
 
5fec869
28145d9
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
import streamlit as st
from PIL import Image
import face_recognition
import cv2
import numpy as np
import os
from datetime import datetime
import CSV

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")
if not os.path.isdir('Attendance'):
        os.makedirs('Attendance')
if f'Attendance-{current_datetime}.csv' not in os.listdir('Attendance'):
        with open(f'Attendance/Attendance-{current_datetime}.csv', 'w') as f:
            f.write('Name,Time')

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(names):
    current_datetime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print('Date',current_datetime)
    with open(f'Attendance/Attendance-{current_datetime}.csv', 'a') as f:
        f.write('Name,Time\n')  # Write header if file is newly created
        for name in names:
            f.write(f'{name},{current_datetime}\n')
   

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)
    encodesCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)

    # List to store recognized names for all faces in the image
    recognized_names = []

    # Checking if faces are detected
    if len(encodesCurFrame) > 0:
        for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame):
            # Assuming that encodeListknown is defined and populated in your code
            matches = face_recognition.compare_faces(encodeListknown, encodeFace)
            faceDis = face_recognition.face_distance(encodeListknown, encodeFace)
            
            # Initialize name as Unknown
            name = "Unknown"
        
            # Check if there's a match with known faces
            if True in matches:
                matchIndex = np.argmin(faceDis)
                name = classnames[matchIndex].upper()
                
            # Append recognized name to the list
            recognized_names.append(name)
        
            # Draw rectangle around the face
            y1, x2, y2, x1 = faceLoc
            y1, x2, y2, x1 = (y1 * 4), (x2 * 4), (y2 * 4) ,(x1 * 4)
            image = image.copy()
            cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(image, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
            
        # 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}")
        if len(recognized_names) > 0:
            add_attendance(recognized_names)
    else:
        st.warning("No faces detected in the image. Face recognition failed.")