Spaces:
Runtime error
Runtime error
Shafeek Saleem
commited on
Commit
·
16eecd4
1
Parent(s):
682e7c7
bug fixed images - path
Browse files- .idea/ascii_demo.iml +3 -1
- pages/3_Training the Model.py +9 -15
- pages/4_Trying It Out.py +35 -47
- utils/database.py +11 -0
- utils/inference.py +27 -9
.idea/ascii_demo.iml
CHANGED
@@ -1,7 +1,9 @@
|
|
1 |
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
<module type="PYTHON_MODULE" version="4">
|
3 |
<component name="NewModuleRootManager">
|
4 |
-
<content url="file://$MODULE_DIR$"
|
|
|
|
|
5 |
<orderEntry type="inheritedJdk" />
|
6 |
<orderEntry type="sourceFolder" forTests="false" />
|
7 |
</component>
|
|
|
1 |
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
<module type="PYTHON_MODULE" version="4">
|
3 |
<component name="NewModuleRootManager">
|
4 |
+
<content url="file://$MODULE_DIR$">
|
5 |
+
<sourceFolder url="file://$MODULE_DIR$/pages" isTestSource="false" />
|
6 |
+
</content>
|
7 |
<orderEntry type="inheritedJdk" />
|
8 |
<orderEntry type="sourceFolder" forTests="false" />
|
9 |
</component>
|
pages/3_Training the Model.py
CHANGED
@@ -3,6 +3,7 @@ from PIL import Image
|
|
3 |
from utils.levels import complete_level, render_page, initialize_level
|
4 |
from utils.login import get_login, initialize_login
|
5 |
from utils.inference import query
|
|
|
6 |
import os
|
7 |
import time
|
8 |
import face_recognition
|
@@ -18,15 +19,6 @@ LEVEL = 3
|
|
18 |
|
19 |
PKL_PATH = 'dataset/database.pkl'
|
20 |
|
21 |
-
def get_database():
|
22 |
-
database = {}
|
23 |
-
|
24 |
-
if os.path.getsize(PKL_PATH) > 0:
|
25 |
-
with open(PKL_PATH, "rb") as f:
|
26 |
-
unpickler = pickle.Unpickler(f)
|
27 |
-
database = unpickler.load()
|
28 |
-
return database
|
29 |
-
|
30 |
def step3_page():
|
31 |
st.header("Training the Model")
|
32 |
st.subheader("Face encoding")
|
@@ -71,7 +63,7 @@ def step3_page():
|
|
71 |
if st.button("Train Model"):
|
72 |
my_bar = st.progress(0, text="Training....")
|
73 |
if len(images) > 0:
|
74 |
-
database = get_database()
|
75 |
for i in range(100):
|
76 |
my_bar.progress(i, text="Training....")
|
77 |
my_bar.progress(100, text="Successfully Trained!")
|
@@ -85,23 +77,25 @@ def step3_page():
|
|
85 |
face_id = img.split(".")[0]
|
86 |
|
87 |
# check if id already exists
|
88 |
-
existing_id = [i for i in database.keys()]
|
89 |
if face_id in existing_id:
|
90 |
st.error(f"Encoding already created for : {face_id}")
|
91 |
else:
|
92 |
-
database[
|
93 |
-
|
|
|
94 |
with open(PKL_PATH, 'wb') as f:
|
95 |
pkl.dump(database, f)
|
96 |
|
97 |
my_bar.progress(int((i + 1) / len(images) * 100), text="Generating face encodings...")
|
98 |
my_bar.progress(100, text="Successfully encoded all the known faces!")
|
99 |
st.success("Face encoding completed successfully!")
|
100 |
-
|
101 |
-
complete_level(LEVEL)
|
102 |
else:
|
103 |
my_bar.empty()
|
104 |
st.error("You have not taken any images yet! Do the previous steps first!")
|
|
|
|
|
105 |
|
106 |
|
107 |
render_page(step3_page, LEVEL)
|
|
|
3 |
from utils.levels import complete_level, render_page, initialize_level
|
4 |
from utils.login import get_login, initialize_login
|
5 |
from utils.inference import query
|
6 |
+
from utils.database import get_database
|
7 |
import os
|
8 |
import time
|
9 |
import face_recognition
|
|
|
19 |
|
20 |
PKL_PATH = 'dataset/database.pkl'
|
21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
def step3_page():
|
23 |
st.header("Training the Model")
|
24 |
st.subheader("Face encoding")
|
|
|
63 |
if st.button("Train Model"):
|
64 |
my_bar = st.progress(0, text="Training....")
|
65 |
if len(images) > 0:
|
66 |
+
database = get_database(PKL_PATH)
|
67 |
for i in range(100):
|
68 |
my_bar.progress(i, text="Training....")
|
69 |
my_bar.progress(100, text="Successfully Trained!")
|
|
|
77 |
face_id = img.split(".")[0]
|
78 |
|
79 |
# check if id already exists
|
80 |
+
existing_id = [database[i]["face_id"] for i in database.keys()]
|
81 |
if face_id in existing_id:
|
82 |
st.error(f"Encoding already created for : {face_id}")
|
83 |
else:
|
84 |
+
database[i] = {'face_id': face_id,
|
85 |
+
'name': face_name,
|
86 |
+
'encoding': my_face_encoding}
|
87 |
with open(PKL_PATH, 'wb') as f:
|
88 |
pkl.dump(database, f)
|
89 |
|
90 |
my_bar.progress(int((i + 1) / len(images) * 100), text="Generating face encodings...")
|
91 |
my_bar.progress(100, text="Successfully encoded all the known faces!")
|
92 |
st.success("Face encoding completed successfully!")
|
93 |
+
|
|
|
94 |
else:
|
95 |
my_bar.empty()
|
96 |
st.error("You have not taken any images yet! Do the previous steps first!")
|
97 |
+
if st.button("Complete"):
|
98 |
+
complete_level(LEVEL)
|
99 |
|
100 |
|
101 |
render_page(step3_page, LEVEL)
|
pages/4_Trying It Out.py
CHANGED
@@ -1,7 +1,8 @@
|
|
1 |
import streamlit as st
|
2 |
from utils.levels import complete_level, render_page, initialize_level
|
3 |
from utils.login import get_login, initialize_login
|
4 |
-
from utils.inference import
|
|
|
5 |
import os
|
6 |
import time
|
7 |
import face_recognition
|
@@ -28,56 +29,43 @@ def step4_page():
|
|
28 |
st.info(
|
29 |
"Now that we know how our face recognition application works, let's try it out!"
|
30 |
)
|
31 |
-
|
32 |
-
|
33 |
-
known_face_encodings = []
|
34 |
-
known_face_names = []
|
35 |
-
if len(face_encodings) > 0:
|
36 |
-
for i, face_encoding in enumerate(face_encodings):
|
37 |
-
known_face_encoding = np.load(os.path.join(face_encodings_dir, face_encoding))
|
38 |
-
face_name = face_encoding.split(".")[0]
|
39 |
-
known_face_encodings.append(known_face_encoding)
|
40 |
-
known_face_names.append(face_name)
|
41 |
-
|
42 |
-
st.info("Select an image to analyze!")
|
43 |
input_type = st.radio("Select the Input Type", ["Image", "Camera"])
|
|
|
|
|
|
|
|
|
44 |
|
45 |
-
if input_type == "
|
46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
else:
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
st.image(image)
|
55 |
-
# Loop through each face in this image
|
56 |
-
cols = st.columns(len(face_encodings))
|
57 |
-
i = 0
|
58 |
-
# st.info("Select the tolerance level you want for your model! (How much distance between faces to consider it a match. "
|
59 |
-
# "Lower is more strict. 0.6 is typical best performance.)")
|
60 |
-
# tolerance = st.slider('Select tolerance level', 0.0, 1.0, 0.3, 0.1)
|
61 |
-
# if tolerance:
|
62 |
-
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
|
63 |
-
# See if the face is a match for the known face(s)
|
64 |
-
# matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
|
65 |
-
|
66 |
-
name = "Unknown"
|
67 |
-
# If a match was found in known_face_encodings, just use the first one.
|
68 |
-
face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
|
69 |
-
|
70 |
-
# Calculate the row sums
|
71 |
-
row_sums = np.sum(face_distances, axis=1)
|
72 |
-
best_match_index = np.argmin(row_sums)
|
73 |
-
if best_match_index is not None:
|
74 |
-
name = known_face_names[best_match_index]
|
75 |
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
|
|
|
|
|
|
|
|
|
|
81 |
|
82 |
st.info("Click on the button below to complete this level!")
|
83 |
if st.button("Complete Level"):
|
|
|
1 |
import streamlit as st
|
2 |
from utils.levels import complete_level, render_page, initialize_level
|
3 |
from utils.login import get_login, initialize_login
|
4 |
+
from utils.inference import recognize
|
5 |
+
from utils.database import get_database
|
6 |
import os
|
7 |
import time
|
8 |
import face_recognition
|
|
|
29 |
st.info(
|
30 |
"Now that we know how our face recognition application works, let's try it out!"
|
31 |
)
|
32 |
+
# Select input type
|
33 |
+
st.info("Select your input type to analyze!")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
input_type = st.radio("Select the Input Type", ["Image", "Camera"])
|
35 |
+
# Put slide to adjust tolerance
|
36 |
+
tolerance = st.slider("Tolerance", 0.0, 1.0, 0.5, 0.01)
|
37 |
+
st.info(
|
38 |
+
"Tolerance is the threshold for face recognition. The lower the tolerance, the more strict the face recognition. The higher the tolerance, the more loose the face recognition.")
|
39 |
|
40 |
+
if input_type == "Image":
|
41 |
+
st.title("Face Recognition App")
|
42 |
+
uploaded_images = st.file_uploader("Upload", type=['jpg', 'png', 'jpeg'], accept_multiple_files=True)
|
43 |
+
if len(uploaded_images) != 0:
|
44 |
+
# Read uploaded image with face_recognition
|
45 |
+
for image in uploaded_images:
|
46 |
+
image = face_recognition.load_image_file(image)
|
47 |
+
image, name, face_id = recognize(image, tolerance)
|
48 |
+
st.image(image)
|
49 |
+
else:
|
50 |
+
st.info("Please upload an image")
|
51 |
else:
|
52 |
+
st.title("Face Recognition App")
|
53 |
+
# Camera Settings
|
54 |
+
cam = cv2.VideoCapture(0)
|
55 |
+
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
|
56 |
+
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
|
57 |
+
FRAME_WINDOW = st.image([])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
|
59 |
+
while True:
|
60 |
+
ret, frame = cam.read()
|
61 |
+
if not ret:
|
62 |
+
st.error("Failed to capture frame from camera")
|
63 |
+
st.info("Please turn off the other app that is using the camera and restart app")
|
64 |
+
st.stop()
|
65 |
+
image, name, face_id = recognize(frame, tolerance)
|
66 |
+
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
67 |
+
# Display name and ID of the person
|
68 |
+
FRAME_WINDOW.image(image)
|
69 |
|
70 |
st.info("Click on the button below to complete this level!")
|
71 |
if st.button("Complete Level"):
|
utils/database.py
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import pickle as pkl
|
3 |
+
|
4 |
+
def get_database(PKL_PATH):
|
5 |
+
database = {}
|
6 |
+
|
7 |
+
if os.path.getsize(PKL_PATH) > 0:
|
8 |
+
with open(PKL_PATH, "rb") as f:
|
9 |
+
unpickler = pickle.Unpickler(f)
|
10 |
+
database = unpickler.load()
|
11 |
+
return database
|
utils/inference.py
CHANGED
@@ -1,10 +1,28 @@
|
|
1 |
-
import
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from utils.database import get_database
|
2 |
+
import os
|
3 |
+
import face_recognition
|
4 |
+
import cv2
|
5 |
+
import numpy as np
|
6 |
+
from PIL import Image
|
7 |
|
8 |
+
def recognize(image,tolerance):
|
9 |
+
database = get_databse()
|
10 |
+
known_encoding = [database[id]['encoding'] for id in database.keys()]
|
11 |
+
name = 'Unknown'
|
12 |
+
face_id = 'Unknown'
|
13 |
+
face_locations = face_recognition.face_locations(image)
|
14 |
+
face_encodings = face_recognition.face_encodings(image,face_locations)
|
15 |
+
for (top,right,bottom,left), face_encoding in zip(face_locations,face_encodings):
|
16 |
+
matches = face_recognition.compare_faces(known_encoding,face_encoding,tolerance=tolerance)
|
17 |
+
distance = face_recognition.face_distance(known_encoding,face_encoding)
|
18 |
+
name = 'Unknown'
|
19 |
+
face_id = 'Unknown'
|
20 |
+
if True in matches:
|
21 |
+
match_index = matches.index(True)
|
22 |
+
name = database[match_index]['name']
|
23 |
+
face_id = database[match_index]['face_id'].split("_")[1]
|
24 |
+
distance = round(distance[match_index],2)
|
25 |
+
cv2.putText(image,str(distance),(left,top-30),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,255,0),2)
|
26 |
+
cv2.rectangle(image,(left,top),(right,bottom),(0,255,0),2)
|
27 |
+
cv2.putText(image,name,(left,top-10),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,255,0),2)
|
28 |
+
return image, name, face_id
|