Improved school attendance system using Facial Recognition

Improved school attendance system using Facial Recognition

INTRODUCTION

When it comes to image analysis, Facial recognition is one of the most successful application. It is capable of identifying or verifying a person’s face with digital masking from image to video, this advancement in technology happened over the years and now we can implement these systems into smart attendance taking. Usually, attendance is done manually. It can be signed or called one after another but this method has proven to be highly flawed with less than 60% accuracy. In this digital age, there must be a change from this absence to be able to accelerate and provide time efficiency.

Prerequisites

  1. A PC (with functional cam)
  2. Python and VMware installed
  3. Folder containing students jpeg

Installations

Firstly we need to download and install CMAKE and VNWARE On our computer in other for us to be able to install dlib, after that we run the following commands in out command line.

pip install face-recognition

pip install dlib

pip install opencv-python

importing modules 🛠️

After our packages have been installed, we now need to call our modules that would help out perform the task.

import face_recognition
import cv2
import numpy as np
import os
import pandas as pd

Now that our packages have been installed we need to go into creating functions to perform specific tasks like getting out training images, encoding images, creating file for attendance, live stream to take attendance.

#function to take the attendance in a csv file
def attendance(name):
    with open('attendance.csv', 'r+') as f:
        MyDataList = f.readline()
        nameList = []
        for line in MyDataList:
            entry = line.split(',')
            nameList.append(entry[0])
        if name not in nameList:
            time_now = datetime.now()
            tSTr = time_now.strftime('%H:%M:%S')
            dSTr = time_now.strftime('%d/%m/%Y')
            is_there = "Present"
            f.writelines(f'{name},{is_there},{tSTr},{dSTr}')

The above code creates a file called “attendance.csv” and it takes continuous attendance of every recognized face.

#code starts here calling the openCV video function
video_capture = cv2.VideoCapture(0)

#training model to get encoding for faces

known_face_encodings = []
known_face_names = []

path = 'sample_images'
path_list = []
for a in os.listdir(path)[1:]:
    myList = os.path.join(path, a)
    path_list.append(myList)
    #studentName.append
    known_face_names.append(a.split(".", 1)[0])

for i in path_list:
    training_img = face_recognition.load_image_file(i)
    training_img_encoding = face_recognition.face_encodings(training_img)[0]

    known_face_encodings.append(training_img_encoding)



#initializing variables to take face location
face_locations = []
face_encodings = []
face_names = []
process_this_frame = True

#opening system camera
ret, frame = video_capture.read()

Encoding is the process where the computer takes specific facial features and convert them into codes (array), to help better identify that person.

while True:
    # Grab a single frame of video
    ret, frame = video_capture.read()

    # Resize frame of video to 1/4 size for faster face recognition processing
    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

    # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
    rgb_small_frame = small_frame[:, :, ::-1]

    # Only process every other frame of video to save time
    if process_this_frame:
        # Find all the faces and face encodings in the current frame of video
        face_locations = face_recognition.face_locations(rgb_small_frame)
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)

        face_names = []
        for face_encoding in face_encodings:
            # See if the face is a match for the known face(s)
            matches = face_recognition.compare_faces(known_face_encodings, face_encoding, )
            name = "Unknown"

            # # If a match was found in known_face_encodings, just use the first one.
            # if True in matches:
            #     first_match_index = matches.index(True)
            #     name = known_face_names[first_match_index]

            # Or instead, use the known face with the smallest distance to the new face
            face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
            best_match_index = np.argmin(face_distances)
            if matches[best_match_index]:
                name = known_face_names[best_match_index]

            face_names.append(name)

    process_this_frame = not process_this_frame


    # Display the results
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        # Scale back up face locations since the frame we detected in was scaled to 1/4 size
        top *= 4
        right *= 4
        bottom *= 4
        left *= 4

        # Draw a box around the face
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # Draw a label with a name below the face
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_COMPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
        attendance(name)
        #if name in known_face_names:
            #attendance.append('pressent')
        #else:
            #attendance.append('absent')

        #df = pd.DataFrame({'Student_name': known_face_names, 'attendance': attendance})

    # Display the resulting image
    cv2.imshow('Video', frame)

    # Hit 'q' on the keyboard to quit!
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Release handle to the webcam

video_capture.release()
cv2.destroyAllWindows()

Now when you run the code it takes down the name of every identified person alone with the date and time the person was identified.

Conclusion

We’ve covered the entire concept of facial recognition and defined required functions for the program. A down side of this program is the amount of processing power it takes and causes the system to lag.

Code Repo

Let's connect 🖇️

feel free to reach me on: LinkedIn

Twitter

Github