fix: keyframe images, video clips, evidence images, live stream webcam+URL, remove demo mode
fd50325 verified | """ | |
| Configuration settings for the Video Event Detection and Preprocessing Pipeline. | |
| This file contains all configurable parameters that can be tweaked to control: | |
| - Keyframe extraction sensitivity | |
| - Event detection thresholds | |
| - Video quality settings | |
| - Output formats and paths | |
| """ | |
| import os | |
| from dataclasses import dataclass | |
| from typing import Dict, List, Optional, Tuple | |
| class VideoProcessingConfig: | |
| """Main configuration class for video processing pipeline""" | |
| # ===== KEYFRAME EXTRACTION PARAMETERS ===== | |
| # Control how many keyframes are extracted | |
| # Base quality threshold (0.1-0.3): Lower = more keyframes, Higher = fewer but better quality | |
| base_quality_threshold: float = 0.15 | |
| # Motion detection threshold (0.005-0.02): Lower = more motion-sensitive, Higher = only significant motion | |
| motion_threshold: float = 0.008 | |
| # Burst sampling rate (1-10): Higher = more frames during high activity periods | |
| burst_sampling_rate: int = 3 | |
| # Frame sampling interval in seconds (0.5-3.0): Lower = more frequent sampling | |
| frame_sampling_interval: float = 1.0 | |
| # ===== EVENT DETECTION PARAMETERS ===== | |
| # Control how events are detected and prioritized | |
| # Event importance threshold (0.2-0.5): Lower = more events detected | |
| event_importance_threshold: float = 0.25 | |
| # Burst activity weight (1.5-3.0): Higher = burst frames get higher priority | |
| burst_weight: float = 2.5 | |
| # Temporal clustering window in seconds (10-30): Frames within this window are clustered | |
| temporal_clustering_window: float = 15.0 | |
| # Scene change detection threshold (0.01-0.05): Lower = more scene changes detected | |
| scene_change_threshold: float = 0.02 | |
| # ===== VIDEO SEGMENTATION PARAMETERS ===== | |
| # Control how video is divided into segments | |
| # Segment duration in seconds (30-60): Length of each temporal segment | |
| segment_duration: float = 45.0 | |
| # Keyframes per segment (3-8): How many keyframes to extract per segment | |
| keyframes_per_segment: int = 5 | |
| # ===== HIGHLIGHT REEL PARAMETERS ===== | |
| # Control the final summary video creation | |
| # Maximum summary duration in seconds (15-60): Total length of highlight reel | |
| max_summary_duration: float = 25.0 | |
| # Frame display duration in seconds (0.5-3.0): How long each frame is shown | |
| frame_display_duration: float = 1.5 | |
| # Maximum frames in summary (10-30): Total number of frames in highlight reel | |
| max_summary_frames: int = 18 | |
| # Summary video FPS (0.4-1.0): Playback speed of summary | |
| summary_fps: float = 0.6 | |
| # ===== DEDUPLICATION PARAMETERS ===== | |
| # Control duplicate frame removal | |
| # Similarity threshold (0.80-0.95): Higher = stricter deduplication | |
| similarity_threshold: float = 0.85 | |
| # Minimum time gap between frames in seconds (1-5): Prevents frames too close in time | |
| min_frame_gap: float = 2.0 | |
| # ===== COMPRESSION PARAMETERS ===== | |
| # Control video compression settings | |
| # Output resolution (720p, 1080p, or original) | |
| output_resolution: str = "720p" | |
| # Compression quality (18-28): Lower = better quality, larger files | |
| compression_crf: int = 23 | |
| # Compression preset (ultrafast, fast, medium, slow): Affects encoding speed vs efficiency | |
| compression_preset: str = "fast" | |
| # ===== ADAPTIVE ENHANCEMENT PARAMETERS ===== | |
| # Control image enhancement | |
| # Enable adaptive histogram equalization | |
| enable_clahe: bool = True | |
| # CLAHE clip limit (1.0-4.0): Higher = more contrast enhancement | |
| clahe_clip_limit: float = 2.0 | |
| # Enable denoising | |
| enable_denoising: bool = True | |
| # Denoising strength (3-10): Higher = more denoising | |
| denoise_strength: int = 5 | |
| # ===== OUTPUT SETTINGS ===== | |
| # Control output files and formats | |
| # Base output directory | |
| output_base_dir: str = "video_processing_outputs" | |
| # Enable various output formats | |
| generate_json_reports: bool = True | |
| generate_html_gallery: bool = True | |
| generate_compressed_video: bool = True | |
| generate_segments: bool = True | |
| generate_highlight_reels: bool = False # Disabled for security focus - saves processing time | |
| # Video output format (mp4, avi, mov) | |
| video_output_format: str = "mp4" | |
| # ===== ADVANCED PARAMETERS ===== | |
| # Fine-tuning for specific use cases | |
| # Enable GPU acceleration if available | |
| use_gpu_acceleration: bool = True | |
| # Enable face detection for human-centric events | |
| enable_face_detection: bool = False | |
| # Enable object detection for context-aware processing | |
| enable_object_detection: bool = False | |
| # Enable facial recognition for suspicious person tracking (FULL implementation with FAISS + MongoDB) | |
| enable_facial_recognition: bool = True | |
| # Face recognition confidence threshold (0.5-0.95) | |
| face_recognition_confidence: float = 0.7 | |
| # Face detection model to use (MTCNN for detection, FaceNet for embeddings) | |
| face_detection_model: str = "mtcnn" | |
| # Face recognition model to use (InceptionResnetV1 with FAISS similarity search) | |
| face_recognition_model: str = "facenet_faiss" | |
| # Enable suspicious person database and tracking | |
| suspicious_person_tracking: bool = True | |
| # Face database settings | |
| face_database_enabled: bool = True | |
| # ===== OBJECT DETECTION PARAMETERS ===== | |
| # Configuration for fire, knife, gun detection | |
| # Models directory path (relative to backend directory when running from project root) | |
| models_dir: str = os.path.join(os.path.dirname(__file__), "models") | |
| # Object detection confidence threshold (0.1-0.9) | |
| object_detection_confidence: float = 0.5 | |
| # Temporal window for grouping object detections into events (seconds) | |
| object_event_temporal_window: float = 5.0 | |
| # Enable annotation of detected objects on keyframes | |
| enable_object_annotation: bool = True | |
| # Object detection specific thresholds | |
| fire_detection_confidence: float = 0.7 # Lower threshold for fire (safety critical) | |
| weapon_detection_confidence: float = 0.7 # Higher threshold for weapons (reduce false positives) | |
| # Enable specific object types | |
| enable_fire_detection: bool = True | |
| enable_weapon_detection: bool = True | |
| # Object event importance multiplier | |
| object_event_importance_multiplier: float = 2.0 | |
| # ===== BEHAVIOR ANALYSIS PARAMETERS ===== | |
| # Configuration for behavior/action recognition (fighting, accidents, climbing) | |
| # Enable behavior analysis | |
| enable_behavior_analysis: bool = False | |
| # Behavior analysis models directory | |
| behavior_models_dir: str = os.path.join(os.path.dirname(__file__), "behavior_analysis") | |
| # Behavior detection confidence thresholds per action type (0.3-0.8) | |
| fighting_detection_confidence: float = 0.5 | |
| accident_detection_confidence: float = 0.6 | |
| climbing_detection_confidence: float = 0.7 | |
| # Temporal window for grouping behavior detections into events (seconds) | |
| behavior_event_temporal_window: float = 5.0 | |
| # Behavior event importance multiplier | |
| behavior_event_importance_multiplier: float = 2.5 | |
| # Enable specific behavior types | |
| enable_fighting_detection: bool = True | |
| enable_accident_detection: bool = True | |
| enable_climbing_detection: bool = True | |
| # ===== VIDEO CAPTIONING PARAMETERS ===== | |
| # Configuration for video frame captioning with vision-language models | |
| # Enable video captioning | |
| enable_video_captioning: bool = False | |
| # Vision model for caption generation | |
| captioning_vision_model: str = "Salesforce/blip-image-captioning-base" | |
| # Embedding model for semantic search | |
| captioning_embedding_model: str = "sentence-transformers/all-MiniLM-L6-v2" | |
| # Device for captioning models (cpu or cuda) | |
| captioning_device: str = "cpu" | |
| # Batch size for captioning (increased for better throughput) | |
| captioning_batch_size: int = 8 | |
| # Database paths for caption storage | |
| captioning_db_path: str = None # Will use default if None | |
| captioning_vector_db_path: str = "./video_captioning_store" | |
| # Enable async processing for captioning | |
| captioning_async: bool = True | |
| # Parallel processing workers (1-8): More workers = faster but more memory | |
| num_workers: int = 4 | |
| def __post_init__(self): | |
| """Validate configuration parameters""" | |
| # Ensure output directory exists | |
| os.makedirs(self.output_base_dir, exist_ok=True) | |
| # Validate thresholds | |
| assert 0.1 <= self.base_quality_threshold <= 0.3, "Quality threshold must be between 0.1-0.3" | |
| assert 0.005 <= self.motion_threshold <= 0.02, "Motion threshold must be between 0.005-0.02" | |
| assert 0.8 <= self.similarity_threshold <= 0.95, "Similarity threshold must be between 0.8-0.95" | |
| # ===== PRESET CONFIGURATIONS ===== | |
| def get_high_recall_config() -> VideoProcessingConfig: | |
| """Configuration optimized for capturing more events (more keyframes)""" | |
| return VideoProcessingConfig( | |
| base_quality_threshold=0.12, # Lower quality threshold | |
| motion_threshold=0.005, # Very sensitive motion detection | |
| event_importance_threshold=0.20, # Lower event threshold | |
| max_summary_frames=25, # More frames in summary | |
| frame_sampling_interval=0.8, # More frequent sampling | |
| temporal_clustering_window=20.0, # Wider clustering window | |
| burst_weight=3.0, # Higher burst priority | |
| keyframes_per_segment=6 # More keyframes per segment | |
| ) | |
| def get_high_precision_config() -> VideoProcessingConfig: | |
| """Configuration optimized for quality over quantity (fewer but better keyframes)""" | |
| return VideoProcessingConfig( | |
| base_quality_threshold=0.20, # Higher quality threshold | |
| motion_threshold=0.015, # Less sensitive motion detection | |
| event_importance_threshold=0.35, # Higher event threshold | |
| max_summary_frames=12, # Fewer frames in summary | |
| frame_sampling_interval=1.5, # Less frequent sampling | |
| temporal_clustering_window=10.0, # Tighter clustering | |
| burst_weight=2.0, # Moderate burst priority | |
| keyframes_per_segment=4 # Fewer keyframes per segment | |
| ) | |
| def get_balanced_config() -> VideoProcessingConfig: | |
| """Balanced configuration for general use""" | |
| return VideoProcessingConfig() # Uses default values | |
| # Removed robbery detection config - using security_focused_config instead | |
| def get_security_focused_config() -> VideoProcessingConfig: | |
| """Configuration optimized specifically for security and threat detection""" | |
| return VideoProcessingConfig( | |
| base_quality_threshold=0.12, | |
| motion_threshold=0.005, # Very sensitive | |
| event_importance_threshold=0.20, | |
| burst_weight=3.0, # Highest priority for burst activity | |
| temporal_clustering_window=20.0, | |
| max_summary_frames=25, | |
| frame_display_duration=2.0, | |
| similarity_threshold=0.82, | |
| enable_clahe=True, | |
| clahe_clip_limit=3.0, | |
| # Enhanced object detection for security | |
| enable_object_detection=True, | |
| object_detection_confidence=0.4, # Lower threshold for better recall | |
| fire_detection_confidence=0.5, # Very sensitive for fire | |
| weapon_detection_confidence=0.7, # Higher threshold for weapons to reduce false positives | |
| object_event_temporal_window=8.0, # Longer window for complex events | |
| enable_object_annotation=True, | |
| object_event_importance_multiplier=3.0, # High importance for security events | |
| # Enhanced behavior analysis for security | |
| enable_behavior_analysis=True, | |
| fighting_detection_confidence=0.5, | |
| accident_detection_confidence=0.6, | |
| climbing_detection_confidence=0.7, | |
| behavior_event_temporal_window=8.0, # Longer window for complex events | |
| behavior_event_importance_multiplier=3.0, # High importance for security events | |
| # Video captioning for semantic search | |
| enable_video_captioning=True, | |
| captioning_device="cpu" # Change to "cuda" if GPU available | |
| ) | |
| # ===== PARAMETER ADJUSTMENT GUIDE ===== | |
| PARAMETER_GUIDE = { | |
| "More Keyframes": { | |
| "base_quality_threshold": "Decrease (0.10-0.12)", | |
| "motion_threshold": "Decrease (0.005-0.008)", | |
| "event_importance_threshold": "Decrease (0.20-0.25)", | |
| "max_summary_frames": "Increase (20-30)", | |
| "keyframes_per_segment": "Increase (6-8)", | |
| "frame_sampling_interval": "Decrease (0.5-1.0)" | |
| }, | |
| "Fewer Keyframes": { | |
| "base_quality_threshold": "Increase (0.18-0.25)", | |
| "motion_threshold": "Increase (0.012-0.020)", | |
| "event_importance_threshold": "Increase (0.30-0.40)", | |
| "max_summary_frames": "Decrease (8-15)", | |
| "keyframes_per_segment": "Decrease (3-4)", | |
| "frame_sampling_interval": "Increase (1.5-2.5)" | |
| }, | |
| "Better Quality": { | |
| "base_quality_threshold": "Increase (0.18-0.25)", | |
| "compression_crf": "Decrease (18-20)", | |
| "enable_clahe": "True", | |
| "enable_denoising": "True", | |
| "output_resolution": "'1080p'" | |
| }, | |
| "Faster Processing": { | |
| "compression_preset": "'ultrafast'", | |
| "num_workers": "Increase (6-8)", | |
| "enable_face_detection": "False", | |
| "enable_object_detection": "False", | |
| "keyframes_per_segment": "Decrease (3-4)" | |
| }, | |
| "More Sensitive Event Detection": { | |
| "motion_threshold": "Decrease (0.005-0.008)", | |
| "burst_weight": "Increase (2.5-3.0)", | |
| "event_importance_threshold": "Decrease (0.20-0.25)", | |
| "temporal_clustering_window": "Increase (15-25)" | |
| } | |
| } | |
| def print_parameter_guide(): | |
| """Print parameter adjustment guide""" | |
| print("🔧 VIDEO PROCESSING PARAMETER ADJUSTMENT GUIDE") | |
| print("=" * 60) | |
| for goal, params in PARAMETER_GUIDE.items(): | |
| print(f"\n🎯 {goal}:") | |
| for param, adjustment in params.items(): | |
| print(f" • {param}: {adjustment}") | |
| print(f"\n📝 Available Preset Configurations:") | |
| print(f" • get_high_recall_config() - More keyframes, sensitive detection") | |
| print(f" • get_high_precision_config() - Fewer but higher quality keyframes") | |
| print(f" • get_balanced_config() - General purpose settings") | |
| print(f" • get_security_focused_config() - Optimized for security/threat detection") | |
| if __name__ == "__main__": | |
| print_parameter_guide() |