reab5555 commited on
Commit
7e53804
·
verified ·
1 Parent(s): a30b6a4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -18
app.py CHANGED
@@ -315,10 +315,10 @@ def plot_anomaly_scores(df, anomaly_scores, top_indices, title):
315
  plt.tight_layout()
316
  return fig
317
 
318
- def plot_emotion(df, emotion, num_anomalies):
319
  fig, ax = plt.subplots(figsize=(16, 8))
320
  values = df[emotion].values
321
- bars = ax.bar(range(len(df)), values, width=0.8, color='lightgreen')
322
  top_indices = np.argsort(values)[-num_anomalies:][::-1]
323
  for i in top_indices:
324
  bars[i].set_color('red')
@@ -331,17 +331,14 @@ def plot_emotion(df, emotion, num_anomalies):
331
  plt.tight_layout()
332
  return fig
333
 
334
- def plot_components(df):
335
- fig, ax = plt.subplots(figsize=(16, 8))
336
- component_columns = [col for col in df.columns if col.startswith('Comp')]
337
- for col in component_columns:
338
- ax.plot(df['Time (Minutes)'], df[col], label=col)
339
- ax.set_xlabel('Time (Minutes)')
340
- ax.set_ylabel('Component Value')
341
- ax.set_title('UMAP Components Over Time')
342
- ax.legend()
343
- plt.tight_layout()
344
- return fig
345
 
346
  def process_video(video_path, num_anomalies, num_components, desired_fps, batch_size, progress=gr.Progress()):
347
  with tempfile.TemporaryDirectory() as temp_dir:
@@ -390,11 +387,17 @@ def process_video(video_path, num_anomalies, num_components, desired_fps, batch_
390
  try:
391
  anomaly_plot_all = plot_anomaly_scores(df, anomaly_scores_all, top_indices_all, "All Features")
392
  anomaly_plot_comp = plot_anomaly_scores(df, anomaly_scores_comp, top_indices_comp, "Components Only")
393
- components_plot = plot_components(df)
394
- emotion_plots = [plot_emotion(df, emotion, num_anomalies) for emotion in ['fear', 'sad', 'angry']]
 
 
 
395
  except Exception as e:
396
  return f"Error generating plots: {str(e)}", None, None, None, None, None, None
397
 
 
 
 
398
  progress(1.0, "Preparing results")
399
  results = f"Top {num_anomalies} anomalies (All Features):\n"
400
  results += "\n".join([f"{score:.4f} at {timecode}" for score, timecode in
@@ -408,8 +411,8 @@ def process_video(video_path, num_anomalies, num_components, desired_fps, batch_
408
  results += f"\n\nTop {num_anomalies} {emotion.capitalize()} Scores:\n"
409
  results += "\n".join([f"{df[emotion].iloc[i]:.4f} at {df['Timecode'].iloc[i]}" for i in top_indices])
410
 
411
- return results, anomaly_plot_all, anomaly_plot_comp, components_plot, *emotion_plots
412
-
413
  # Gradio interface
414
  iface = gr.Interface(
415
  fn=process_video,
@@ -422,9 +425,9 @@ iface = gr.Interface(
422
  ],
423
  outputs=[
424
  gr.Textbox(label="Anomaly Detection Results"),
 
425
  gr.Plot(label="Anomaly Scores (All Features)"),
426
  gr.Plot(label="Anomaly Scores (Components Only)"),
427
- gr.Plot(label="UMAP Components"),
428
  gr.Plot(label="Fear Scores"),
429
  gr.Plot(label="Sad Scores"),
430
  gr.Plot(label="Angry Scores")
 
315
  plt.tight_layout()
316
  return fig
317
 
318
+ def plot_emotion(df, emotion, num_anomalies, color):
319
  fig, ax = plt.subplots(figsize=(16, 8))
320
  values = df[emotion].values
321
+ bars = ax.bar(range(len(df)), values, width=0.8, color=color)
322
  top_indices = np.argsort(values)[-num_anomalies:][::-1]
323
  for i in top_indices:
324
  bars[i].set_color('red')
 
331
  plt.tight_layout()
332
  return fig
333
 
334
+ def get_random_face_sample(organized_faces_folder, largest_cluster):
335
+ person_folder = os.path.join(organized_faces_folder, f"person_{largest_cluster}")
336
+ face_files = [f for f in os.listdir(person_folder) if f.endswith('.jpg')]
337
+ if face_files:
338
+ random_face = np.random.choice(face_files)
339
+ face_path = os.path.join(person_folder, random_face)
340
+ return face_path
341
+ return None
 
 
 
342
 
343
  def process_video(video_path, num_anomalies, num_components, desired_fps, batch_size, progress=gr.Progress()):
344
  with tempfile.TemporaryDirectory() as temp_dir:
 
387
  try:
388
  anomaly_plot_all = plot_anomaly_scores(df, anomaly_scores_all, top_indices_all, "All Features")
389
  anomaly_plot_comp = plot_anomaly_scores(df, anomaly_scores_comp, top_indices_comp, "Components Only")
390
+ emotion_plots = [
391
+ plot_emotion(df, 'fear', num_anomalies, 'lightblue'),
392
+ plot_emotion(df, 'sad', num_anomalies, 'lightgreen'),
393
+ plot_emotion(df, 'angry', num_anomalies, 'salmon')
394
+ ]
395
  except Exception as e:
396
  return f"Error generating plots: {str(e)}", None, None, None, None, None, None
397
 
398
+ # Get a random face sample
399
+ face_sample = get_random_face_sample(organized_faces_folder, largest_cluster)
400
+
401
  progress(1.0, "Preparing results")
402
  results = f"Top {num_anomalies} anomalies (All Features):\n"
403
  results += "\n".join([f"{score:.4f} at {timecode}" for score, timecode in
 
411
  results += f"\n\nTop {num_anomalies} {emotion.capitalize()} Scores:\n"
412
  results += "\n".join([f"{df[emotion].iloc[i]:.4f} at {df['Timecode'].iloc[i]}" for i in top_indices])
413
 
414
+ return results, face_sample, anomaly_plot_all, anomaly_plot_comp, *emotion_plots
415
+
416
  # Gradio interface
417
  iface = gr.Interface(
418
  fn=process_video,
 
425
  ],
426
  outputs=[
427
  gr.Textbox(label="Anomaly Detection Results"),
428
+ gr.Image(label="Random Face Sample of Most Frequent Person"),
429
  gr.Plot(label="Anomaly Scores (All Features)"),
430
  gr.Plot(label="Anomaly Scores (Components Only)"),
 
431
  gr.Plot(label="Fear Scores"),
432
  gr.Plot(label="Sad Scores"),
433
  gr.Plot(label="Angry Scores")