import gradio as gr import time from video_processing import process_video from PIL import Image import matplotlib import cv2 matplotlib.rcParams['figure.dpi'] = 500 matplotlib.rcParams['savefig.dpi'] = 500 def process_and_show_completion(video_input_path, anomaly_threshold_input, fps, progress=gr.Progress()): try: print("Starting video processing...") results = process_video(video_input_path, anomaly_threshold_input, fps, progress=progress) print("Video processing completed.") if isinstance(results[0], str) and results[0].startswith("Error"): print(f"Error occurred: {results[0]}") return [results[0]] + [None] * 19 exec_time, results_summary, df, mse_embeddings, mse_posture, \ mse_plot_embeddings, mse_histogram_embeddings, \ mse_plot_posture, mse_histogram_posture, \ mse_heatmap_embeddings, mse_heatmap_posture, \ face_samples_frequent, face_samples_other, \ anomaly_faces_embeddings, anomaly_frames_posture_images, \ aligned_faces_folder, frames_folder, annotated_video_path = results anomaly_faces_embeddings_pil = [Image.fromarray(face) for face in anomaly_faces_embeddings] anomaly_frames_posture_pil = [Image.fromarray(frame) for frame in anomaly_frames_posture_images] face_samples_frequent = [Image.open(path) for path in face_samples_frequent] face_samples_other = [Image.open(path) for path in face_samples_other] output = [ exec_time, results_summary, df, mse_embeddings, mse_posture, mse_plot_embeddings, mse_plot_posture, mse_histogram_embeddings, mse_histogram_posture, mse_heatmap_embeddings, mse_heatmap_posture, anomaly_faces_embeddings_pil, anomaly_frames_posture_pil, face_samples_frequent, face_samples_other, aligned_faces_folder, frames_folder, mse_embeddings, mse_posture, annotated_video_path ] return output except Exception as e: error_message = f"An error occurred: {str(e)}" print(error_message) import traceback traceback.print_exc() return [error_message] + [None] * 19 with gr.Blocks() as iface: gr.Markdown(""" # Multimodal Behavioral Anomalies Detection The purpose of this tool is to detect anomalies in facial expressions and body language over the timeline of a video. It extracts faces and postures from video frames, detects unique facial features and body postures, and analyzes them to identify anomalies using time series analysis, specifically utilizing a variational autoencoder (VAE) approach. """) with gr.Row(): video_input = gr.Video() anomaly_threshold = gr.Slider(minimum=1, maximum=5, step=0.1, value=3, label="Anomaly Detection Threshold") fps_slider = gr.Slider(minimum=5, maximum=20, step=1, value=10, label="Frames Per Second") process_btn = gr.Button("Detect Anomalies") progress_bar = gr.Progress() execution_time = gr.Number(label="Execution Time (seconds)") with gr.Group(visible=False) as results_group: results_text = gr.TextArea(label="Anomaly Detection Results", lines=4) with gr.Tab("Facial Features"): mse_features_plot = gr.Plot(label="MSE: Facial Features") mse_features_hist = gr.Plot(label="MSE Distribution: Facial Features") mse_features_heatmap = gr.Plot(label="MSE Heatmap: Facial Features") anomaly_frames_features = gr.Gallery(label="Anomaly Frames (Facial Features)", columns=6, rows=2, height="auto") with gr.Tab("Body Posture"): mse_posture_plot = gr.Plot(label="MSE: Body Posture") mse_posture_hist = gr.Plot(label="MSE Distribution: Body Posture") mse_posture_heatmap = gr.Plot(label="MSE Heatmap: Body Posture") anomaly_frames_posture = gr.Gallery(label="Anomaly Frames (Body Posture)", columns=6, rows=2, height="auto") with gr.Tab("Annotated Video"): annotated_video_output = gr.Video(label="Annotated Video") with gr.Tab("Face Samples"): face_samples_most_frequent = gr.Gallery(label="Most Frequent Person Samples (Target)", columns=6, rows=2, height="auto") face_samples_others = gr.Gallery(label="Other Persons Samples", columns=6, rows=1, height="auto") df_store = gr.State() mse_features_store = gr.State() mse_posture_store = gr.State() aligned_faces_folder_store = gr.State() frames_folder_store = gr.State() mse_heatmap_embeddings_store = gr.State() mse_heatmap_posture_store = gr.State() process_btn.click( process_and_show_completion, inputs=[video_input, anomaly_threshold, fps_slider], outputs=[ execution_time, results_text, df_store, mse_features_store, mse_posture_store, mse_features_plot, mse_posture_plot, mse_features_hist, mse_posture_hist, mse_features_heatmap, mse_posture_heatmap, anomaly_frames_features, anomaly_frames_posture, face_samples_most_frequent, face_samples_others, aligned_faces_folder_store, frames_folder_store, mse_heatmap_embeddings_store, mse_heatmap_posture_store, annotated_video_output ] ).then( lambda: gr.Group(visible=True), inputs=None, outputs=[results_group] ) if __name__ == "__main__": iface.launch()