Spaces:
Sleeping
Sleeping
| """ | |
| Configuration file for Safety Monitor Application | |
| Customize safety requirements, detection parameters, and system settings. | |
| """ | |
| import os | |
| from typing import Dict, List | |
| class SafetyConfig: | |
| """Configuration class for safety monitoring system.""" | |
| # Detection Model Settings | |
| MODEL_CONFIDENCE_THRESHOLD = 0.5 | |
| MODEL_PATH = None # Set to path for custom model, None for default YOLOv8 | |
| DEVICE = 'auto' # 'auto', 'cpu', or 'cuda' | |
| # Required Safety Equipment | |
| # Customize this list based on your workplace requirements | |
| REQUIRED_SAFETY_EQUIPMENT = [ | |
| 'hard_hat', # Hard hats/helmets | |
| 'safety_vest', # High-visibility safety vests | |
| # 'safety_glasses', # Uncomment if safety glasses are required | |
| # 'gloves', # Uncomment if gloves are required | |
| # 'boots' # Uncomment if safety boots are required | |
| ] | |
| # Safety Equipment Detection Classes | |
| # Maps equipment types to possible class names in detection model | |
| SAFETY_EQUIPMENT_CLASSES = { | |
| 'hard_hat': [ | |
| 'hard hat', 'helmet', 'safety helmet', 'construction helmet', | |
| 'hardhat', 'hard_hat', 'safety_helmet' | |
| ], | |
| 'safety_vest': [ | |
| 'safety vest', 'high vis vest', 'reflective vest', 'hi-vis vest', | |
| 'safety_vest', 'high_vis_vest', 'reflective_vest', 'vest' | |
| ], | |
| 'safety_glasses': [ | |
| 'safety glasses', 'goggles', 'eye protection', 'safety goggles', | |
| 'safety_glasses', 'protective_glasses', 'eyewear' | |
| ], | |
| 'gloves': [ | |
| 'gloves', 'safety gloves', 'work gloves', 'protective gloves', | |
| 'safety_gloves', 'work_gloves' | |
| ], | |
| 'boots': [ | |
| 'safety boots', 'work boots', 'steel toe boots', 'protective boots', | |
| 'safety_boots', 'work_boots', 'steel_toe_boots' | |
| ] | |
| } | |
| # Detection Parameters | |
| PROXIMITY_THRESHOLD = 0.3 # How close equipment must be to person (relative to person height) | |
| PERSON_MIN_CONFIDENCE = 0.4 # Minimum confidence for person detection | |
| EQUIPMENT_MIN_CONFIDENCE = 0.3 # Minimum confidence for equipment detection | |
| # Camera Settings | |
| DEFAULT_CAMERA_SOURCE = 0 # Default camera (0 for built-in webcam) | |
| CAMERA_RESOLUTION_WIDTH = 640 | |
| CAMERA_RESOLUTION_HEIGHT = 480 | |
| CAMERA_FPS = 30 | |
| CAMERA_BUFFER_SIZE = 10 | |
| # Image Capture Settings | |
| VIOLATION_CAPTURE_ENABLED = True | |
| VIOLATION_IMAGES_DIR = "violation_captures" | |
| VIOLATION_IMAGE_QUALITY = 95 # JPEG quality (1-100) | |
| MAX_VIOLATION_IMAGES = 1000 # Maximum number of violation images to keep | |
| # Web Interface Settings | |
| WEB_HOST = '0.0.0.0' | |
| WEB_PORT = 5000 | |
| WEB_DEBUG = False | |
| SECRET_KEY = 'safety_monitor_secret_key_change_in_production' | |
| # Alert Settings | |
| VIOLATION_ALERT_ENABLED = True | |
| VIOLATION_ALERT_COOLDOWN = 5.0 # Seconds between alerts for same person | |
| VIOLATION_SOUND_ENABLED = False # Enable sound alerts (requires audio libraries) | |
| # Logging Settings | |
| LOG_LEVEL = 'INFO' # DEBUG, INFO, WARNING, ERROR, CRITICAL | |
| LOG_TO_FILE = True | |
| LOG_FILE = 'safety_monitor.log' | |
| LOG_MAX_SIZE = 10 * 1024 * 1024 # 10MB | |
| LOG_BACKUP_COUNT = 5 | |
| # Performance Settings | |
| MAX_PROCESSING_FPS = 30 # Limit processing FPS to reduce CPU usage | |
| FRAME_SKIP_THRESHOLD = 5 # Skip frames if processing falls behind | |
| MULTI_THREADING_ENABLED = True | |
| # Notification Settings (for future extensions) | |
| EMAIL_NOTIFICATIONS = False | |
| EMAIL_SMTP_SERVER = '' | |
| EMAIL_PORT = 587 | |
| EMAIL_USERNAME = '' | |
| EMAIL_PASSWORD = '' | |
| EMAIL_RECIPIENTS = [] | |
| WEBHOOK_NOTIFICATIONS = False | |
| WEBHOOK_URL = '' | |
| # Zone-based Detection (for future extensions) | |
| DETECTION_ZONES = [] # List of polygons defining detection areas | |
| ZONE_BASED_REQUIREMENTS = {} # Different requirements per zone | |
| # Reporting Settings | |
| GENERATE_DAILY_REPORTS = False | |
| REPORT_OUTPUT_DIR = "reports" | |
| REPORT_FORMAT = "pdf" # "pdf", "html", "csv" | |
| def load_from_file(cls, config_file: str = 'safety_config.json'): | |
| """Load configuration from JSON file.""" | |
| import json | |
| if not os.path.exists(config_file): | |
| return cls() | |
| try: | |
| with open(config_file, 'r') as f: | |
| config_data = json.load(f) | |
| # Update class attributes with loaded values | |
| for key, value in config_data.items(): | |
| if hasattr(cls, key.upper()): | |
| setattr(cls, key.upper(), value) | |
| except Exception as e: | |
| print(f"Warning: Could not load config file {config_file}: {e}") | |
| return cls() | |
| def save_to_file(cls, config_file: str = 'safety_config.json'): | |
| """Save current configuration to JSON file.""" | |
| import json | |
| config_data = {} | |
| for attr_name in dir(cls): | |
| if attr_name.isupper() and not attr_name.startswith('_'): | |
| config_data[attr_name.lower()] = getattr(cls, attr_name) | |
| try: | |
| with open(config_file, 'w') as f: | |
| json.dump(config_data, f, indent=2) | |
| print(f"Configuration saved to {config_file}") | |
| except Exception as e: | |
| print(f"Error saving config file {config_file}: {e}") | |
| def get_equipment_requirements_text(cls) -> str: | |
| """Get human-readable text of equipment requirements.""" | |
| if not cls.REQUIRED_SAFETY_EQUIPMENT: | |
| return "No specific safety equipment required" | |
| equipment_names = { | |
| 'hard_hat': 'Hard Hat/Helmet', | |
| 'safety_vest': 'Safety Vest', | |
| 'safety_glasses': 'Safety Glasses', | |
| 'gloves': 'Safety Gloves', | |
| 'boots': 'Safety Boots' | |
| } | |
| required_items = [equipment_names.get(item, item) for item in cls.REQUIRED_SAFETY_EQUIPMENT] | |
| if len(required_items) == 1: | |
| return f"Required: {required_items[0]}" | |
| elif len(required_items) == 2: | |
| return f"Required: {required_items[0]} and {required_items[1]}" | |
| else: | |
| return f"Required: {', '.join(required_items[:-1])}, and {required_items[-1]}" | |
| def validate_config(cls) -> List[str]: | |
| """Validate configuration and return list of warnings/errors.""" | |
| warnings = [] | |
| # Validate confidence thresholds | |
| if not (0.1 <= cls.MODEL_CONFIDENCE_THRESHOLD <= 1.0): | |
| warnings.append("MODEL_CONFIDENCE_THRESHOLD should be between 0.1 and 1.0") | |
| if not (0.1 <= cls.PERSON_MIN_CONFIDENCE <= 1.0): | |
| warnings.append("PERSON_MIN_CONFIDENCE should be between 0.1 and 1.0") | |
| if not (0.1 <= cls.EQUIPMENT_MIN_CONFIDENCE <= 1.0): | |
| warnings.append("EQUIPMENT_MIN_CONFIDENCE should be between 0.1 and 1.0") | |
| # Validate proximity threshold | |
| if not (0.1 <= cls.PROXIMITY_THRESHOLD <= 2.0): | |
| warnings.append("PROXIMITY_THRESHOLD should be between 0.1 and 2.0") | |
| # Validate camera settings | |
| if cls.CAMERA_RESOLUTION_WIDTH < 320 or cls.CAMERA_RESOLUTION_HEIGHT < 240: | |
| warnings.append("Camera resolution too low, may affect detection accuracy") | |
| if cls.CAMERA_FPS > 60: | |
| warnings.append("High FPS may impact performance") | |
| # Validate required equipment | |
| valid_equipment = set(cls.SAFETY_EQUIPMENT_CLASSES.keys()) | |
| for item in cls.REQUIRED_SAFETY_EQUIPMENT: | |
| if item not in valid_equipment: | |
| warnings.append(f"Unknown safety equipment type: {item}") | |
| # Check directories | |
| if cls.VIOLATION_CAPTURE_ENABLED: | |
| os.makedirs(cls.VIOLATION_IMAGES_DIR, exist_ok=True) | |
| if cls.GENERATE_DAILY_REPORTS: | |
| os.makedirs(cls.REPORT_OUTPUT_DIR, exist_ok=True) | |
| return warnings | |
| # Create a default configuration instance | |
| config = SafetyConfig() | |
| # Validate configuration on import | |
| validation_warnings = config.validate_config() | |
| if validation_warnings: | |
| print("Configuration Warnings:") | |
| for warning in validation_warnings: | |
| print(f" - {warning}") | |
| # Load custom configuration if available | |
| if os.path.exists('safety_config.json'): | |
| config = SafetyConfig.load_from_file('safety_config.json') | |
| print("Loaded configuration from safety_config.json") | |
| else: | |
| print("Using default configuration. Create 'safety_config.json' to customize settings.") |