AhmedAdamu commited on
Commit
09f4075
Β·
verified Β·
1 Parent(s): 1433d8a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +23 -22
app.py CHANGED
@@ -34,14 +34,15 @@ KNOWN_NAMES_PATH = "known_names.npy"
34
  index = None
35
  known_names = []
36
 
37
- if os.path.exists(KNOWN_EMBS_PATH):
38
  embeddings = np.load(KNOWN_EMBS_PATH)
39
  known_names = np.load(KNOWN_NAMES_PATH, allow_pickle=True).tolist()
40
- dim = embeddings.shape[1]
41
- index = faiss.IndexHNSWFlat(dim, 32)
42
  index.hnsw.efSearch = 16
43
  index.add(embeddings.astype('float32'))
44
- print(f"Loaded {len(known_names)} known people")
 
 
45
 
46
  # Tracker for persistent IDs
47
  tracker = DeepSort(max_age=30, n_init=3, max_cosine_distance=0.4, nn_budget=None, embedder_gpu=True)
@@ -127,40 +128,40 @@ def process_frame(frame: np.ndarray, blur_type: str = "gaussian", intensity: flo
127
  # ==================== 3. ENROLLMENT FUNCTION ====================
128
  def enroll_person(name: str, face_image: np.ndarray):
129
  global index, known_names
 
130
  if face_image is None:
131
- return "Please upload a clear face photo"
132
 
 
133
  faces = recognizer.get(face_image, max_num=1)
134
  if not faces:
135
- return "No face detected! Try a clearer photo."
136
 
137
- emb = faces[0].normed_embedding
138
 
139
- # Load existing data (or create new)
140
- if not os.path.exists(KNOWN_EMBS_PATH):
 
 
 
141
  all_embs = np.empty((0, 512))
142
  all_names = []
143
- else:
144
- all_embs = np.load(KNOWN_EMBS_PATH)
145
- all_names = np.load(KNOWN_NAMES_PATH, allow_pickle=True).tolist()
146
 
147
- # Append new person
148
- all_embs = np.vstack([all_embs, emb])
149
  all_names.append(name)
150
 
151
- # Save to disk
152
  np.save(KNOWN_EMBS_PATH, all_embs)
153
  np.save(KNOWN_NAMES_PATH, np.array(all_names))
154
 
155
- # ←←← THIS IS THE CRUCIAL PART ←←←
156
- # Rebuild FAISS index immediately
157
- index = faiss.IndexHNSWFlat(512, 32)
158
  index.hnsw.efSearch = 16
159
- index.add(all_embs.astype('float32'))
160
- known_names = all_names
161
- # ←←← END ←←←
162
 
163
- return f"Successfully enrolled: **{name}** β†’ now instantly recognized!"
164
 
165
  # ==================== 4. GRADIO UI ====================
166
  with gr.Blocks(title="SecureFace ID – Privacy-First Recognition") as demo:
 
34
  index = None
35
  known_names = []
36
 
37
+ if os.path.exists(KNOWN_EMBS_PATH) and os.path.getsize(KNOWN_EMBS_PATH) > 0:
38
  embeddings = np.load(KNOWN_EMBS_PATH)
39
  known_names = np.load(KNOWN_NAMES_PATH, allow_pickle=True).tolist()
40
+ index = faiss.IndexHNSWFlat(512, 32)
 
41
  index.hnsw.efSearch = 16
42
  index.add(embeddings.astype('float32'))
43
+ else:
44
+ index = faiss.IndexHNSWFlat(512, 32) # empty but valid index
45
+ known_names = []
46
 
47
  # Tracker for persistent IDs
48
  tracker = DeepSort(max_age=30, n_init=3, max_cosine_distance=0.4, nn_budget=None, embedder_gpu=True)
 
128
  # ==================== 3. ENROLLMENT FUNCTION ====================
129
  def enroll_person(name: str, face_image: np.ndarray):
130
  global index, known_names
131
+
132
  if face_image is None:
133
+ return "Please upload a photo"
134
 
135
+ # Get face embedding
136
  faces = recognizer.get(face_image, max_num=1)
137
  if not faces:
138
+ return "No face detected – try a clearer frontal photo with good lighting"
139
 
140
+ new_emb = faces[0].normed_embedding.reshape(1, 512) # shape (1,512)
141
 
142
+ # === Load existing data (safely) ===
143
+ if os.path.exists(KNOWN_EMBS_PATH):
144
+ all_embs = np.load(KNOWN_EMBS_PATH) # shape (N,512)
145
+ all_names = np.load(KNOWN_NAMES_PATH, allow_pickle=True).tolist()
146
+ else:
147
  all_embs = np.empty((0, 512))
148
  all_names = []
 
 
 
149
 
150
+ # === Append new person ===
151
+ all_embs = np.vstack([all_embs, new_emb])
152
  all_names.append(name)
153
 
154
+ # === Save to disk ===
155
  np.save(KNOWN_EMBS_PATH, all_embs)
156
  np.save(KNOWN_NAMES_PATH, np.array(all_names))
157
 
158
+ # === Rebuild FAISS index safely ===
159
+ index = faiss = faiss.IndexHNSWFlat(512, 32)
 
160
  index.hnsw.efSearch = 16
161
+ index.add(all_embs.astype('float32')) # ← this line used to crash if all_embs was empty
162
+ known_names = all_names # refresh the global list too
 
163
 
164
+ return f"Successfully enrolled **{name}** – now instantly recognized!"
165
 
166
  # ==================== 4. GRADIO UI ====================
167
  with gr.Blocks(title="SecureFace ID – Privacy-First Recognition") as demo: