Spaces:
Running
Running
| """ | |
| Analyze 'sample video.mp4' through the SimShieldAI suspicious behavior pipeline. | |
| Prints detailed per-frame diagnostics for violence and running detection. | |
| """ | |
| import os | |
| import sys | |
| import time | |
| import cv2 | |
| import numpy as np | |
| sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | |
| from suspicious_behavior.pipeline.frame_analyzer import FrameAnalyzer | |
| from suspicious_behavior.pipeline.video_processor import VideoProcessor | |
| def main(): | |
| video_path = r"C:\Users\Admin\Downloads\sample video.mp4" | |
| print("=" * 70) | |
| print("SimShieldAI — Suspicious Behavior Detection Analysis") | |
| print(f"Video: {video_path}") | |
| print("=" * 70) | |
| # Get video metadata | |
| processor = VideoProcessor(target_fps=10.0) | |
| metadata = processor.get_metadata(video_path) | |
| print(f"Resolution: {metadata['width']}x{metadata['height']}") | |
| print(f"Duration: {metadata['duration']:.1f}s | Frames: {metadata['frame_count']} @ {metadata['fps']:.1f} FPS") | |
| print(f"Processing at 10 FPS (every {int(metadata['fps']/10)} frames)") | |
| print("=" * 70) | |
| # Initialize analyzer | |
| print("\n[Init] Loading models (YOLOv8n + VideoMAE + MediaPipe)...") | |
| analyzer = FrameAnalyzer(camera_id="test_cam", violence_stride=4) | |
| # Reset state | |
| analyzer.frame_idx = 0 | |
| analyzer.violence_buffer.clear() | |
| analyzer.alert_manager.reset_cooldowns() | |
| # Process video | |
| frames_processed = 0 | |
| violence_scores = [] | |
| running_detections = [] | |
| all_alerts = [] | |
| output_frames = [] | |
| start_time = time.time() | |
| print("\n--- Per-Frame Analysis ---\n") | |
| for f_idx, frame, timestamp in processor.extract_frames_generator(video_path): | |
| annotated, frame_alerts, frame_meta = analyzer.analyze(frame, fps=10.0, output_base64=False) | |
| frames_processed += 1 | |
| output_frames.append(annotated) | |
| # Collect metrics | |
| v_meta = frame_meta["violence_metrics"] | |
| if v_meta["confidence"] > 0: | |
| violence_scores.append({ | |
| "frame": f_idx, | |
| "time": timestamp, | |
| "label": v_meta["label"], | |
| "conf": v_meta["confidence"] | |
| }) | |
| for track in frame_meta["tracks"]: | |
| running_detections.append({ | |
| "frame": f_idx, | |
| "time": timestamp, | |
| "track_id": track["track_id"], | |
| "behavior": track["behavior"], | |
| "conf": track["behavior_confidence"] | |
| }) | |
| for alert in frame_alerts: | |
| all_alerts.append({"time": timestamp, "alert": alert}) | |
| # Print frame details | |
| tracks_info = ", ".join([ | |
| f"ID{t['track_id']}:{t['behavior']}({t['behavior_confidence']*100:.0f}%)" | |
| for t in frame_meta["tracks"] | |
| ]) or "no people" | |
| violence_info = "" | |
| if v_meta['confidence'] > 0: | |
| emoji = "🔴" if v_meta['detected'] else "🟢" | |
| violence_info = f" | {emoji} Violence: {v_meta['label']}({v_meta['confidence']*100:.1f}%)" | |
| alert_info = "" | |
| if frame_meta['threats_detected']: | |
| alert_info = f" | ⚠️ THREATS: {frame_meta['threats_detected']}" | |
| print(f" [{f_idx:04d}] {timestamp:5.1f}s | {frame_meta['active_tracks_count']} people | " | |
| f"[{tracks_info}]{violence_info}{alert_info}") | |
| elapsed = time.time() - start_time | |
| # Save annotated output | |
| output_path = r"C:\Users\Admin\Downloads\sample_video_annotated.mp4" | |
| processor.write_frames_to_video( | |
| output_frames, output_path, fps=10.0, | |
| frame_size=(metadata['width'], metadata['height']) | |
| ) | |
| # Print summary | |
| print("\n" + "=" * 70) | |
| print("ANALYSIS SUMMARY") | |
| print("=" * 70) | |
| print(f"Frames processed: {frames_processed}") | |
| print(f"Processing time: {elapsed:.1f}s ({frames_processed/elapsed:.1f} FPS)") | |
| print(f"\n--- Violence Detection (VideoMAE) ---") | |
| if violence_scores: | |
| confs = [s["conf"] for s in violence_scores] | |
| violence_detected = [s for s in violence_scores if s["label"] != "normal"] | |
| normal_scores = [s for s in violence_scores if s["label"] == "normal"] | |
| print(f"Total inference runs: {len(violence_scores)}") | |
| if violence_detected: | |
| print(f"🔴 VIOLENCE DETECTED in {len(violence_detected)} frames:") | |
| for v in violence_detected: | |
| print(f" Frame {v['frame']:04d} ({v['time']:.1f}s): {v['label']} at {v['conf']*100:.1f}%") | |
| else: | |
| print(f"🟢 No violence detected. All {len(normal_scores)} checks returned 'normal'") | |
| if normal_scores: | |
| normal_confs = [s["conf"] for s in normal_scores] | |
| print(f" Normal confidence: min={min(normal_confs)*100:.1f}%, max={max(normal_confs)*100:.1f}%, avg={np.mean(normal_confs)*100:.1f}%") | |
| else: | |
| print("⚠️ VideoMAE never ran (need 16 frames + people in scene)") | |
| print(f"\n--- Running Detection (MediaPipe) ---") | |
| if running_detections: | |
| running_found = [r for r in running_detections if r["behavior"] == "running"] | |
| walking = [r for r in running_detections if r["behavior"] == "walking/standing"] | |
| unknown = [r for r in running_detections if r["behavior"] == "unknown"] | |
| print(f"Total person-frame analyses: {len(running_detections)}") | |
| if running_found: | |
| print(f"🟠 RUNNING DETECTED in {len(running_found)} person-frames:") | |
| for r in running_found[:10]: | |
| print(f" Frame {r['frame']:04d} ({r['time']:.1f}s): ID{r['track_id']} running at {r['conf']*100:.1f}%") | |
| else: | |
| print(f"🟢 No running detected. {len(walking)} walking/standing, {len(unknown)} unknown") | |
| else: | |
| print("⚠️ No people detected in any frame") | |
| print(f"\n--- Alerts ---") | |
| if all_alerts: | |
| print(f"🚨 {len(all_alerts)} ALERTS TRIGGERED:") | |
| for a in all_alerts: | |
| alert = a["alert"] | |
| print(f" [{a['time']:.1f}s] [{alert.severity}] {alert.threat_type} " | |
| f"(confidence: {alert.confidence*100:.1f}%)") | |
| else: | |
| print("No alerts triggered") | |
| print(f"\n--- Output ---") | |
| print(f"Annotated video saved to: {os.path.abspath(output_path)}") | |
| print("=" * 70) | |
| if __name__ == "__main__": | |
| main() | |