Spaces:
Runtime error
Runtime error
import streamlit as st | |
from PIL import Image | |
import time | |
from utils.levels import complete_level, render_page, initialize_level | |
from utils.login import get_login, initialize_login | |
from utils.database import get_database | |
import os | |
import time | |
import face_recognition | |
import json | |
import numpy as np | |
from collections import defaultdict | |
import pickle as pkl | |
initialize_login() | |
initialize_level() | |
LEVEL = 3 | |
PKL_PATH = 'dataset/database.pkl' | |
def step3_page(): | |
st.header("Training the Model") | |
st.subheader("Face encoding and training") | |
st.markdown( | |
""" | |
### What is Face Encoding? | |
In face recognition, face encodings are numerical representations of facial features that are used to uniquely identify individuals. | |
These encodings are obtained by extracting relevant facial information from an input image or video frame. | |
Face encodings are typically computed using deep learning models, such as Convolutional Neural Networks (CNNs), | |
that are trained on large datasets of labeled faces. During the training process, these models learn to recognize patterns and extract discriminative features from facial images. | |
""" | |
) | |
st.image( | |
"https://miro.medium.com/v2/resize:fit:720/format:webp/1*V_wNVR0QvLQ7JZyUwMTv8w.jpeg", | |
use_column_width=True, | |
) | |
st.markdown( | |
""" | |
Once the face encodings are obtained, they can be stored in a database or used for face recognition tasks. | |
During face recognition, the encodings of input faces are compared to the stored encodings to determine if a match exists. | |
Various similarity metrics, such as Euclidean distance or cosine similarity, can be utilized to measure the similarity between | |
face encodings and determine potential matches. | |
""" | |
) | |
st.info( | |
"Now it's your turn to train your model to create face encodings to each of the faces in the known-face database that you have created in the previous step!" | |
) | |
img_dir = os.path.join(".sessions", get_login()["username"], "known_faces") | |
images = os.listdir(img_dir) | |
if len(images) > 0: | |
st.info("First, let's see your saved faces in your known-face database.") | |
cols = st.columns(len(images)) | |
for i, img in enumerate(images): | |
face_name = img.split("_")[0] | |
cols[i].image(os.path.join(img_dir, img), use_column_width=True) | |
cols[i].write(face_name) | |
st.info("Now it's your turn to train the model and generate face encodings! Click on the button below to train the model with your data to generate face encodings!") | |
if st.button("Train Model"): | |
# my_bar = st.progress(0, text="Training....") | |
if len(images) > 0: | |
database = get_database(PKL_PATH) | |
# for i in range(100): | |
# time.sleep(0.1) | |
# my_bar.progress(i, text="Training....") | |
# my_bar.progress(100, text="Successfully Trained!") | |
# st.success("Model trained successfully!") | |
# st.info("Now, lets generate face encodings for each face in known-face database using the model you just trained!") | |
my_bar = st.progress(0, text="Generating face encodings...") | |
for i, img in enumerate(images): | |
face_image = face_recognition.load_image_file(os.path.join(img_dir, img)) | |
my_face_encoding = face_recognition.face_encodings(face_image)[0] | |
face_name = img.split("_")[0] | |
face_id = img.split(".")[0] | |
# check if id already exists | |
existing_id = [database[i]["face_id"] for i in database.keys()] | |
if face_id in existing_id: | |
st.error(f"Encoding already created for : {face_id}") | |
else: | |
database[i] = {'face_id': face_id, | |
'name': face_name, | |
'encoding': my_face_encoding} | |
with open(PKL_PATH, 'wb') as f: | |
pkl.dump(database, f) | |
time.sleep(1) | |
my_bar.progress(int((i + 1) / len(images) * 100), text="Generating face encodings...") | |
my_bar.progress(100, text="Successfully encoded all the known faces!") | |
st.success("Face encoding completed successfully!") | |
else: | |
my_bar.empty() | |
st.error("You have not taken any images yet! Do the previous steps first!") | |
if st.button("Complete"): | |
complete_level(LEVEL) | |
render_page(step3_page, LEVEL) | |