Update app.py
Browse files
app.py
CHANGED
@@ -1,106 +1,97 @@
|
|
1 |
-
import
|
2 |
-
from streamlit_webrtc import webrtc_streamer, VideoTransformerBase
|
3 |
import cv2
|
4 |
import av
|
5 |
-
import
|
6 |
-
import
|
7 |
from datetime import datetime
|
8 |
|
9 |
-
#
|
10 |
KNOWN_FACES_DIR = "known_faces"
|
11 |
os.makedirs(KNOWN_FACES_DIR, exist_ok=True)
|
12 |
|
13 |
-
#
|
14 |
-
|
|
|
15 |
|
16 |
-
#
|
17 |
st.title("Face Detection and Registration App")
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
# Initialize log list
|
27 |
-
activity_log = []
|
28 |
-
|
29 |
-
# Define Video Processor
|
30 |
-
class VideoProcessor(VideoTransformerBase):
|
31 |
-
def __init__(self):
|
32 |
self.face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
|
33 |
-
self.
|
34 |
self.face_name = None
|
35 |
|
36 |
-
def
|
37 |
-
self.
|
38 |
self.face_name = name
|
39 |
|
40 |
-
def
|
41 |
-
self.
|
42 |
self.face_name = None
|
43 |
|
44 |
def recv(self, frame):
|
45 |
img = frame.to_ndarray(format="bgr24")
|
46 |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
47 |
-
|
48 |
-
# Detect faces
|
49 |
faces = self.face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(50, 50))
|
50 |
|
51 |
-
# Draw rectangles and save face images if in registering mode
|
52 |
for (x, y, w, h) in faces:
|
|
|
53 |
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
|
54 |
-
if self.registering_face:
|
55 |
-
face_img = img[y:y + h, x:x + w]
|
56 |
-
face_path = os.path.join(KNOWN_FACES_DIR, f"{self.face_name}_{datetime.now().strftime('%Y%m%d%H%M%S')}.jpg")
|
57 |
-
cv2.imwrite(face_path, face_img)
|
58 |
-
self.registering_face = False
|
59 |
-
st.session_state.activity_log.append(f"Face registered: {self.face_name} at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
60 |
|
61 |
-
|
|
|
|
|
|
|
|
|
|
|
62 |
|
|
|
|
|
|
|
|
|
|
|
63 |
|
64 |
-
|
65 |
-
st.sidebar.title("Options")
|
66 |
-
app_mode = st.sidebar.radio("Choose the mode:", ["Real-time Face Detection", "Register a New Face", "View Registered Faces", "Recent Activity"])
|
67 |
|
68 |
-
# Global activity log state
|
69 |
-
if "activity_log" not in st.session_state:
|
70 |
-
st.session_state.activity_log = []
|
71 |
|
72 |
-
#
|
73 |
-
if
|
74 |
st.header("Real-time Face Detection")
|
75 |
-
webrtc_streamer(key="face_detection", video_processor_factory=
|
|
|
|
|
|
|
|
|
76 |
|
77 |
-
elif app_mode == "Register a New Face":
|
78 |
-
st.header("Register a New Face")
|
79 |
-
name = st.text_input("Enter the name for the new face:")
|
80 |
if st.button("Start Registration"):
|
81 |
-
if
|
82 |
-
st.
|
|
|
|
|
|
|
83 |
else:
|
84 |
-
|
85 |
-
if processor.video_processor:
|
86 |
-
processor.video_processor.set_registering_mode(name)
|
87 |
-
st.success(f"Registering face for '{name}'. Please look into the camera.")
|
88 |
|
89 |
-
elif
|
90 |
st.header("Registered Faces")
|
91 |
faces = os.listdir(KNOWN_FACES_DIR)
|
|
|
92 |
if faces:
|
93 |
-
st.write(f"
|
94 |
-
for
|
95 |
-
st.write(
|
96 |
else:
|
97 |
-
st.write("No faces
|
98 |
|
99 |
-
elif
|
100 |
st.header("Recent Activity Log")
|
101 |
if st.session_state.activity_log:
|
102 |
for log in reversed(st.session_state.activity_log):
|
103 |
st.write(log)
|
104 |
else:
|
105 |
-
st.write("No activity
|
106 |
-
|
|
|
1 |
+
import os
|
|
|
2 |
import cv2
|
3 |
import av
|
4 |
+
import streamlit as st
|
5 |
+
from streamlit_webrtc import webrtc_streamer, VideoTransformerBase
|
6 |
from datetime import datetime
|
7 |
|
8 |
+
# Constants
|
9 |
KNOWN_FACES_DIR = "known_faces"
|
10 |
os.makedirs(KNOWN_FACES_DIR, exist_ok=True)
|
11 |
|
12 |
+
# Global State
|
13 |
+
if "activity_log" not in st.session_state:
|
14 |
+
st.session_state.activity_log = []
|
15 |
|
16 |
+
# Streamlit App Title
|
17 |
st.title("Face Detection and Registration App")
|
18 |
+
|
19 |
+
st.sidebar.header("Navigation")
|
20 |
+
page = st.sidebar.radio("Choose an option:", ["Real-time Face Detection", "Register New Face", "View Registered Faces", "Recent Activity"])
|
21 |
+
|
22 |
+
# Video Processor Class
|
23 |
+
class FaceDetectionProcessor(VideoTransformerBase):
|
24 |
+
def _init_(self):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
self.face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
|
26 |
+
self.register_mode = False
|
27 |
self.face_name = None
|
28 |
|
29 |
+
def set_register_mode(self, name):
|
30 |
+
self.register_mode = True
|
31 |
self.face_name = name
|
32 |
|
33 |
+
def stop_register_mode(self):
|
34 |
+
self.register_mode = False
|
35 |
self.face_name = None
|
36 |
|
37 |
def recv(self, frame):
|
38 |
img = frame.to_ndarray(format="bgr24")
|
39 |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
|
|
|
40 |
faces = self.face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(50, 50))
|
41 |
|
|
|
42 |
for (x, y, w, h) in faces:
|
43 |
+
# Draw rectangle
|
44 |
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
|
46 |
+
if self.register_mode and self.face_name:
|
47 |
+
# Save the cropped face image
|
48 |
+
face_img = img[y:y+h, x:x+w]
|
49 |
+
face_filename = f"{self.face_name}{datetime.now().strftime('%Y%m%d%H%M%S')}.jpg"
|
50 |
+
face_path = os.path.join(KNOWN_FACES_DIR, face_filename)
|
51 |
+
cv2.imwrite(face_path, face_img)
|
52 |
|
53 |
+
st.session_state.activity_log.append(
|
54 |
+
f"Registered face: {self.face_name} at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
55 |
+
)
|
56 |
+
self.stop_register_mode() # Stop registering after saving
|
57 |
+
st.success(f"Face registered successfully as {self.face_name}!")
|
58 |
|
59 |
+
return av.VideoFrame.from_ndarray(img, format="bgr24")
|
|
|
|
|
60 |
|
|
|
|
|
|
|
61 |
|
62 |
+
# Pages
|
63 |
+
if page == "Real-time Face Detection":
|
64 |
st.header("Real-time Face Detection")
|
65 |
+
webrtc_streamer(key="face_detection", video_processor_factory=FaceDetectionProcessor)
|
66 |
+
|
67 |
+
elif page == "Register New Face":
|
68 |
+
st.header("Register New Face")
|
69 |
+
name = st.text_input("Enter a name for the face:")
|
70 |
|
|
|
|
|
|
|
71 |
if st.button("Start Registration"):
|
72 |
+
if name.strip():
|
73 |
+
st.info(f"Looking for face to register as '{name}'...")
|
74 |
+
processor = webrtc_streamer(key="register_face", video_processor_factory=FaceDetectionProcessor)
|
75 |
+
if processor and processor.video_processor:
|
76 |
+
processor.video_processor.set_register_mode(name)
|
77 |
else:
|
78 |
+
st.error("Please enter a valid name!")
|
|
|
|
|
|
|
79 |
|
80 |
+
elif page == "View Registered Faces":
|
81 |
st.header("Registered Faces")
|
82 |
faces = os.listdir(KNOWN_FACES_DIR)
|
83 |
+
|
84 |
if faces:
|
85 |
+
st.write(f"*Total Registered Faces: {len(faces)}*")
|
86 |
+
for face_file in faces:
|
87 |
+
st.write(face_file)
|
88 |
else:
|
89 |
+
st.write("No registered faces found.")
|
90 |
|
91 |
+
elif page == "Recent Activity":
|
92 |
st.header("Recent Activity Log")
|
93 |
if st.session_state.activity_log:
|
94 |
for log in reversed(st.session_state.activity_log):
|
95 |
st.write(log)
|
96 |
else:
|
97 |
+
st.write("No recent activity to display.")
|
|