Appendix D
Appendix D
import threading
import cv2
import csv
import numpy as np
import os
import string
import random
import sys
import subprocess
import winsound
import subprocess
import pandas as pd
class RecognitionWindow(Screen):
pass
class DatasetWindow(Screen):
pass
class WindowManager(ScreenManager):
58
pass
kv = Builder.load_file("gui.kv")
class MainApp(App):
running = False
Dir = os.path.dirname(os.path.realpath(__file__))
msg_thread = None
att_thread = None
data_thread = None
train_thread = None
msg_clear = True
msg_timer = 0
def message_cleaner(self):
while True:
if not self.msg_clear:
sleep(0.25)
self.msg_timer -= 0.25
kv.get_screen('main').ids.info.text = ""
kv.get_screen('second').ids.info.text = ""
self.msg_clear = True
self.msg_thread = threading.Thread(
target=self.message_cleaner, daemon=True)
self.msg_thread.start()
if screen == "both":
kv.get_screen('main').ids.info.text = message
kv.get_screen('second').ids.info.text = message
59
self.msg_timer = 5
self.msg_clear = False
kv.get_screen('main').ids.info.text = message
self.msg_timer = 5
self.msg_clear = False
kv.get_screen('second').ids.info.text = message
self.msg_timer = 5
self.msg_clear = False
return
def build(self):
return kv
def break_loop(self):
self.running = False
def startRecognition(self):
return
self.att_thread = threading.Thread(
target=self.Recognition, daemon=True)
self.att_thread.start()
def startTrain(self):
return
self.train_thread.start()
60
def startDataset(self):
return
self.data_thread.start()
def UserList(self):
if not (os.path.exists(users_file)):
return
try:
if sys.platform == "win32":
os.startfile(users_file)
else:
subprocess.call([opener, users_file])
except Exception as e:
print(e)
def UnrecognizedList(self):
subprocess.Popen(f'explorer "{folder_path}"')
def Recognition(self):
self.running = True
if not (os.path.isdir(dataset_path)):
61
os.mkdir(dataset_path)
if not (os.path.isdir(unknown_path)):
os.mkdir(unknown_path)
if not (os.path.isdir(records_path)):
os.mkdir(records_path)
print("Initializing...")
try:
# user_id = int(kv.get_screen('main').ids.user_id.text)
now = datetime.now()
date = now.strftime("%d/%m/%Y")
recog = cv2.face.LBPHFaceRecognizer_create()
try:
except:
self.show_message(
"Training file not found. Please Train the model first.", "main")
return
face = cv2.CascadeClassifier(
self.Dir + '/haarcascade_frontalface_default.xml')
font = cv2.FONT_HERSHEY_DUPLEX
rec = 0
id = 0
face_numbers = 5
camera = cv2.VideoCapture(0)
camera.set(3, 1920)
camera.set(4, 1080)
minWidth = 0.001*camera.get(3)
62
minHeight = 0.001*camera.get(4)
blink = 0
is_eye = False
unknownCount = 0
while self.running:
is_unknown = False
faces = face.detectMultiScale(
gray,
scaleFactor=1.3,
minNeighbors=face_numbers,
minSize=(int(minWidth), int(minHeight)),
eyes = eye.detectMultiScale(
if len(eyes) >= 2:
is_eye = True
if (len(faces) == 0):
blink = 0
if len(eyes) < 2:
blink += 1
63
if match < 35:
rec = 1
unknownCount=0
try:
try:
df = pd.read_csv(os.path.join(
except FileNotFoundError:
self.show_message(
return
except:
name = "Unknown"
else:
rec = 0
(0, 0, 255), 2)
name = "Unknown"
#is_unknown = True
unknownCount+=1
64
cv2.putText(image, str(name), (x+5, y-5),
Clock.schedule_once(partial(self.display_frame, image))
winsound.PlaySound("alarm.wav", winsound.SND_FILENAME)
letters = string.ascii_letters
#reset
unknownCount = 0
blink = 0
k = cv2.waitKey(1)
if k == 27:
break
camera.release()
cv2.destroyAllWindows()
return
except Exception as e:
print(e)
return
65
texture.blit_buffer(frame.tobytes(order=None), colorfmt='bgr', bufferfmt='ubyte')
texture.flip_vertical()
kv.get_screen('main').ids.vid.texture = texture
def dataset(self):
if not (os.path.isdir(dataset_path)):
os.mkdir(dataset_path)
if not (os.path.isdir(list_path)):
os.mkdir(list_path)
if not (os.path.isdir(attendance_path)):
os.mkdir(attendance_path)
try:
name = kv.get_screen('second').ids.user_name.text
face_id = kv.get_screen('second').ids.user_id.text
snap_amount = int(kv.get_screen('second').ids.snap.text)
camera = cv2.VideoCapture(0)
camera.set(3, 1920)
camera.set(4, 1080)
else:
count = 0
while(True):
rtrn, image=camera.read()
for(x,y,w,h) in faces:
66
cv2.rectangle(image, (x,y),(x+w,y+h),(255,0,0),2)
count+=1
if wait == 27:
break
break
camera.release()
cv2.destroyAllWindows()
try:
exist = False
try:
df = pd.read_csv(os.path.join(list_path, 'users.csv'))
except FileNotFoundError:
for i in range(len(df['id'])):
if df['id'].iloc[i] == int(face_id):
exist = True
if not exist:
df.loc[len(df.index)] = [int(face_id),name]
try:
except FileNotFoundError:
for i in range(len(df1['id'])):
if df1['id'].iloc[i] == int(face_id):
exist = True
if not exist:
67
arr = [int(face_id),name]
arr = np.concatenate((arr,[0]*(len(df1.columns)-2)))
df1.loc[len(df1.index)] = arr
except Exception as e:
print(e)
self.show_message(str(e), "second")
return
return
except:
return
faceSamples = []
ids = []
if len(imagesPath)<=0:
PIL_img=Image.open(imagePath).convert('L')
id=int(os.path.split(imagePath)[-1].split("_")[1])
faces = face.detectMultiScale(img_numpy)
faceSamples.append(img_numpy[y:y+h,x:x+w])
ids.append(id)
return faceSamples,ids
def train(self):
68
if not (os.path.isdir(dataset_path)):
sleep(10)
kv.get_screen('main').ids.info.text = ""
kv.get_screen('second').ids.info.text = ""
if not (os.path.isdir(trainer_path)):
os.mkdir(trainer_path)
sleep(10)
kv.get_screen('main').ids.info.text = ""
kv.get_screen('second').ids.info.text = ""
try:
recog = cv2.face.LBPHFaceRecognizer_create()
faces,ids=self.getImage_Labels(dataset_path,face)
return
recog.train(faces, np.array(ids))
recog.write(os.path.join(trainer_path, 'trainer.yml'))
except:
return
if(__name__ == "__main__"):
MainApp().run()
69