ParisNeo commited on
Commit
9578e95
·
1 Parent(s): 19ef1c2
Files changed (1) hide show
  1. app.py +45 -20
app.py CHANGED
@@ -52,6 +52,7 @@ class UI():
52
  self.face_name=None
53
  self.nb_images = 20
54
  self.nb_faces = 3
 
55
  # Important to set. If higher than this distance, the face is considered unknown
56
  self.threshold = 4e-1
57
  self.faces_db_preprocessed_path = Path(__file__).parent/"faces_db_preprocessed"
@@ -104,19 +105,19 @@ class UI():
104
  with gr.Blocks():
105
  with gr.Row():
106
  with gr.Column():
 
 
 
 
 
 
107
  self.gallery = gr.Gallery(
108
  label="Uploaded Images", show_label=True, height=300, elem_id="gallery"
109
  ).style(grid=[2], height="auto")
110
  self.btn_clear = gr.Button("Clear Gallery")
111
-
112
- self.add_file = gr.Files(label="Files",file_types=["image"])
113
- self.add_file.change(self.add_files, self.add_file, [self.gallery, self.faces])
114
- self.txtFace_name2 = gr.Textbox(label="face_name")
115
- self.btn_start = gr.Button("Build face embeddings")
116
- self.status = gr.Label(label="Status")
117
- self.txtFace_name2.change(self.set_face_name, inputs=self.txtFace_name2, outputs=self.status, show_progress=False)
118
- self.btn_start.click(self.record_from_files, inputs=self.gallery, outputs=self.status, show_progress=True)
119
  self.btn_clear.click(self.clear_galery,[],[self.gallery, self.add_file])
 
120
  with gr.TabItem('Known Faces List'):
121
  with gr.Blocks():
122
  with gr.Row():
@@ -148,6 +149,33 @@ class UI():
148
 
149
  demo.queue().launch()
150
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  def clear_galery(self):
152
  return self.gallery.update(value=[]), self.add_file.update(value=[])
153
 
@@ -250,7 +278,7 @@ class UI():
250
  print(f"Saved {name}")
251
 
252
  def record_from_webcam(self, image):
253
- if self.face_name is None:
254
  self.embeddings_cloud=[]
255
  self.is_recording=False
256
  return "Please input a face name"
@@ -293,8 +321,8 @@ class UI():
293
  else:
294
  return "Waiting"
295
 
296
- def record_from_files(self, images):
297
- if self.face_name is None:
298
  self.embeddings_cloud=[]
299
  self.is_recording=False
300
  return "Please input a face name"
@@ -329,16 +357,15 @@ class UI():
329
  embeddings_cloud_inv_cov = embeddings_cloud.std(axis=0)
330
  # Now we save it.
331
  # create a dialog box to ask for the subject name
332
- name = self.face_name
333
- with open(str(faces_path/f"{name}.pkl"),"wb") as f:
334
  pickle.dump({"mean":embeddings_cloud_mean, "inv_cov":embeddings_cloud_inv_cov},f)
335
- print(f"Saved {name} embeddings")
336
  self.i=0
337
  self.embeddings_cloud=[]
338
  self.is_recording=False
339
  self.upgrade_faces()
340
 
341
- return f"Saved {name} embeddings"
342
  else:
343
  return "Waiting"
344
 
@@ -351,6 +378,7 @@ class UI():
351
  fa.process(image)
352
 
353
  if fa.nb_faces>0:
 
354
  for i in range(fa.nb_faces):
355
  try:
356
  face = fa.faces[i]
@@ -373,13 +401,10 @@ class UI():
373
  nearest_distance = distance
374
  nearest = i
375
 
376
- if nearest_distance>self.threshold:
377
- face.draw_bounding_box(image, thickness=1,text=f"Unknown:{nearest_distance:.3e}")
378
- else:
379
- face.draw_bounding_box(image, thickness=1,text=f"{self.known_faces_names[nearest]}:{nearest_distance:.3e}")
380
  except Exception as ex:
381
  pass
382
-
383
  # Return the resulting frame
384
  return image
385
 
 
52
  self.face_name=None
53
  self.nb_images = 20
54
  self.nb_faces = 3
55
+
56
  # Important to set. If higher than this distance, the face is considered unknown
57
  self.threshold = 4e-1
58
  self.faces_db_preprocessed_path = Path(__file__).parent/"faces_db_preprocessed"
 
105
  with gr.Blocks():
106
  with gr.Row():
107
  with gr.Column():
108
+ self.add_file = gr.Files(label="Files",file_types=["image"])
109
+ with gr.Row():
110
+ self.txtFace_name2 = gr.Textbox(label="face_name")
111
+ self.btn_start = gr.Button("Build face embeddings")
112
+ self.status = gr.Label(label="Status")
113
+
114
  self.gallery = gr.Gallery(
115
  label="Uploaded Images", show_label=True, height=300, elem_id="gallery"
116
  ).style(grid=[2], height="auto")
117
  self.btn_clear = gr.Button("Clear Gallery")
118
+ self.btn_start.click(self.record_from_files, inputs=[self.gallery, self.txtFace_name2], outputs=self.status, show_progress=True)
 
 
 
 
 
 
 
119
  self.btn_clear.click(self.clear_galery,[],[self.gallery, self.add_file])
120
+ self.add_file.change(self.add_files, self.add_file, [self.gallery, self.faces])
121
  with gr.TabItem('Known Faces List'):
122
  with gr.Blocks():
123
  with gr.Row():
 
149
 
150
  demo.queue().launch()
151
 
152
+
153
+
154
+ def draw_name_on_bbox(self, image, bbox, name, font=cv2.FONT_HERSHEY_SIMPLEX,
155
+ font_scale=1, thickness=2, color=(0, 0, 255)):
156
+ # Upscale the image to avoid pixelization of the text
157
+ height, width = image.shape[:2]
158
+ scale = max(1, int(max(height, width) / 800))
159
+ new_height, new_width = int(height * scale), int(width * scale)
160
+ resized_image = cv2.resize(image, (new_width, new_height))
161
+
162
+ # Upscale the bounding box
163
+ bbox = [int(val * scale) for val in bbox]
164
+
165
+ # Draw the bounding box and the name
166
+ x1, y1, x2, y2 = bbox
167
+ cv2.rectangle(resized_image, (x1, y1), (x2, y2), color, thickness)
168
+ text_size, _ = cv2.getTextSize(name, font, font_scale, thickness)
169
+ text_x = x1 + (x2 - x1 - text_size[0]) // 2
170
+ text_y = y1 - text_size[1] - 5
171
+ cv2.putText(resized_image, name, (text_x, text_y), font, font_scale, color, thickness)
172
+
173
+ # Downscale the image back to its original size
174
+ final_image = cv2.resize(resized_image, (width, height))
175
+
176
+ return final_image
177
+
178
+
179
  def clear_galery(self):
180
  return self.gallery.update(value=[]), self.add_file.update(value=[])
181
 
 
278
  print(f"Saved {name}")
279
 
280
  def record_from_webcam(self, image):
281
+ if self.face_name is None or self.face_name=="":
282
  self.embeddings_cloud=[]
283
  self.is_recording=False
284
  return "Please input a face name"
 
321
  else:
322
  return "Waiting"
323
 
324
+ def record_from_files(self, images, face_name):
325
+ if face_name is None or face_name=="":
326
  self.embeddings_cloud=[]
327
  self.is_recording=False
328
  return "Please input a face name"
 
357
  embeddings_cloud_inv_cov = embeddings_cloud.std(axis=0)
358
  # Now we save it.
359
  # create a dialog box to ask for the subject name
360
+ with open(str(faces_path/f"{face_name}.pkl"),"wb") as f:
 
361
  pickle.dump({"mean":embeddings_cloud_mean, "inv_cov":embeddings_cloud_inv_cov},f)
362
+ print(f"Saved {face_name} embeddings")
363
  self.i=0
364
  self.embeddings_cloud=[]
365
  self.is_recording=False
366
  self.upgrade_faces()
367
 
368
+ return f"Saved {face_name} embeddings"
369
  else:
370
  return "Waiting"
371
 
 
378
  fa.process(image)
379
 
380
  if fa.nb_faces>0:
381
+ bboxes_and_names=[]
382
  for i in range(fa.nb_faces):
383
  try:
384
  face = fa.faces[i]
 
401
  nearest_distance = distance
402
  nearest = i
403
 
404
+ bboxes_and_names.append([face.bounding_box, f"Unknown:{nearest_distance:.2e}" if nearest_distance>self.threshold else f"{self.known_faces_names[nearest]}:{nearest_distance:.2e}"])
 
 
 
405
  except Exception as ex:
406
  pass
407
+ image = fa.draw_names_on_bboxes(image,bboxes_and_names,upscale=2)
408
  # Return the resulting frame
409
  return image
410