LovnishVerma commited on
Commit
57f2097
·
verified ·
1 Parent(s): 3b6bd75

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +54 -63
app.py CHANGED
@@ -1,106 +1,97 @@
1
- import streamlit as st
2
- from streamlit_webrtc import webrtc_streamer, VideoTransformerBase
3
  import cv2
4
  import av
5
- import numpy as np
6
- import os
7
  from datetime import datetime
8
 
9
- # Directory to store registered faces
10
  KNOWN_FACES_DIR = "known_faces"
11
  os.makedirs(KNOWN_FACES_DIR, exist_ok=True)
12
 
13
- # Page configuration
14
- st.set_page_config(page_title="Face Detection App", layout="wide")
 
15
 
16
- # Title and Description
17
  st.title("Face Detection and Registration App")
18
- st.write("""
19
- This app allows you to:
20
- 1. Detect faces in real-time using your webcam.
21
- 2. Register new faces with names.
22
- 3. View the list of registered faces.
23
- 4. Show recent activity logs.
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.registering_face = False
34
  self.face_name = None
35
 
36
- def set_registering_mode(self, name):
37
- self.registering_face = True
38
  self.face_name = name
39
 
40
- def stop_registering(self):
41
- self.registering_face = False
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
- return av.VideoFrame.from_ndarray(img, format="bgr24")
 
 
 
 
 
62
 
 
 
 
 
 
63
 
64
- # Sidebar for navigation
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
- # Handle the selected mode
73
- if app_mode == "Real-time Face Detection":
74
  st.header("Real-time Face Detection")
75
- webrtc_streamer(key="face_detection", video_processor_factory=VideoProcessor)
 
 
 
 
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 not name.strip():
82
- st.error("Name cannot be empty!")
 
 
 
83
  else:
84
- processor = webrtc_streamer(key="register_face", video_processor_factory=VideoProcessor)
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 app_mode == "View Registered Faces":
90
  st.header("Registered Faces")
91
  faces = os.listdir(KNOWN_FACES_DIR)
 
92
  if faces:
93
- st.write(f"**Total Faces Registered:** {len(faces)}")
94
- for face in faces:
95
- st.write(face)
96
  else:
97
- st.write("No faces have been registered yet.")
98
 
99
- elif app_mode == "Recent Activity":
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 logged yet.")
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.")