Ankit93's picture
Update app.py
af55fe0 verified
Raw
History Blame Contribute Delete
6.28 kB
import warnings
warnings.filterwarnings("ignore")
import av, os, sys, cv2
import streamlit as st
from pydub.playback import play
import time, string, random, shutil
from PIL import Image
import streamlit as st
from pydub import AudioSegment
from streamlit_webrtc import VideoProcessorBase, webrtc_streamer, WebRtcMode, RTCConfiguration
from src.faceRecognize.face import Faces
from src.faceRecognize.facerecognition import *
sys.path.append(os.path.abspath('src/faceRecognize'))
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'
def generate_unique_filename():
chars = string.ascii_letters + string.digits
random_string = ''.join(random.choices(chars, k=8))
return random_string + '.jpg'
def load_alert_sound():
song = AudioSegment.from_file('src/faceRecognize/audio/alert.wav', format="wav")
return song
def create_new_folder():
initial_folder_path = "src/faceRecognize/facerec/data"
new_folder_name = st.text_input("Enter New User:")
if new_folder_name and st.button("Create User"):
new_folder_path = os.path.join(initial_folder_path, new_folder_name)
os.makedirs(new_folder_path, exist_ok=True)
st.success(f"User '{new_folder_name}' created successfully.")
return new_folder_path
def delete_folder():
base_dir = os.path.join(os.getcwd(),"src/faceRecognize/facerec/data")
folder_options = [f.path for f in os.scandir(base_dir) if f.is_dir()]
folder_dict = {}
for folder in folder_options:
key = folder.split("/")[-1]
folder_dict[key] = folder
selected_folder = st.selectbox("Select User to Delete", list(folder_dict.keys()))
if selected_folder and st.button("Delete User"):
try:
shutil.rmtree(folder_dict[selected_folder])
st.success("User deleted successfully.")
except Exception as e:
st.error(f"Failed to delete user: {str(e)}")
def start_training():
st.write("Training in progress...")
time.sleep(5)
import src.faceRecognize.facerec.train_v2
st.success("Training completed successfully.")
def video_frame_callback(frame: av.VideoFrame) -> av.VideoFrame:
image = frame.to_ndarray(format="bgr24")
face_encoder = model_selector("Facenet")
encodings_path = './src/faceRecognize/facerec/encodings/encodings.pkl'
encoding_dict = load_pickle(self.encodings_path)
# Run inference
blob = cv2.dnn.blobFromImage(
cv2.resize(image, (300, 300)), 0.007843, (300, 300), 127.5
)
net.setInput(blob)
output = net.forward()
h, w = image.shape[:2]
# Convert the output array into a structured form.
output = output.squeeze() # (1, 1, N, 7) -> (N, 7)
output = output[output[:, 2] >= score_threshold]
detections = [
detect(output, face_detector, face_encoder, encoding_dict)
for detection in output
]
# Render bounding boxes and captions
for detection in detections:
# image, pred = detect(frame_resized, face_detector, self.face_encoder, self.encoding_dict)
caption = f"{detection.label}: {round(detection.score * 100, 2)}%"
color = COLORS[detection.class_id]
xmin, ymin, xmax, ymax = detection.box.astype("int")
cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color, 2)
cv2.putText(
image,
caption,
(xmin, ymin - 15 if ymin - 15 > 15 else ymin + 15),
cv2.FONT_HERSHEY_SIMPLEX,
0.5,
color,
2,
)
result_queue.put(detections)
return av.VideoFrame.from_ndarray(image, format="bgr24")
class FaceRecognitionProcessor(VideoProcessorBase):
def __init__(self):
self.alert_sound = load_alert_sound()
self.face_encoder = model_selector("Facenet")
self.encodings_path = './src/faceRecognize/facerec/encodings/encodings.pkl'
self.encoding_dict = load_pickle(self.encodings_path)
self.COUNT = 0
def recv(self, frame):
img = frame.to_ndarray(format="bgr24")
frame_resized = cv2.resize(img, (640, 300))
frame4 = Faces(frame_resized)
try:
frame2, pred = detect(frame_resized, face_detector, self.face_encoder, self.encoding_dict)
if pred == 'unknown':
if self.COUNT < 10:
self.COUNT += 1
else:
play(self.alert_sound)
else:
self.COUNT = 0
top_row = cv2.hconcat([frame2, frame2])
bottom_row = cv2.hconcat([frame4, frame4])
grid = cv2.vconcat([top_row, bottom_row])
except Exception as e:
top_row = cv2.hconcat([img, img])
bottom_row = cv2.hconcat([frame4, frame4])
grid = cv2.vconcat([top_row, bottom_row])
return av.VideoFrame.from_ndarray(grid, format="bgr24")
def main():
st.title("Face Recognition App")
option = st.sidebar.selectbox("Choose an option",
("Add User", "Delete User", "Start Training","Run Code"))
if option == "Add User":
create_new_folder()
elif option == "Delete User":
delete_folder()
elif option == "Start Training":
start_training()
elif option == "Run Code":
RTC_CONFIGURATION = RTCConfiguration({
"iceServers": [
{"urls": ["stun:stun.l.google.com:19302"]},
{"urls": ["stun:stun1.l.google.com:19302"]},
{"urls": ["stun:stun2.l.google.com:19302"]},
{"urls": ["stun:stun3.l.google.com:19302"]},
{"urls": ["stun:stun4.l.google.com:19302"]}
]})
webrtc_ctx = webrtc_streamer(
key="face-detection",
mode=WebRtcMode.SENDRECV,
rtc_configuration=RTC_CONFIGURATION,
#video_frame_callback=FaceRecognitionProcessor().recv,
video_frame_callback = video_frame_callback,
media_stream_constraints={"video": True, "audio": False},async_processing=True
)
if webrtc_ctx.state.playing:
st.write("WebRTC is playing.")
else:
st.write("WebRTC is not playing.")
if __name__ == '__main__':
main()
# streamlit run app.py