""" Startup script for Face Verification System """ import os import sys import logging from pathlib import Path # Setup logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) def check_dependencies(): """Check if all required dependencies are installed""" required_packages = [ 'fastapi', 'uvicorn', 'cv2', 'numpy', 'pydantic' ] missing_packages = [] for package in required_packages: try: if package == 'cv2': import cv2 else: __import__(package) logger.info(f"✓ {package} installed") except ImportError: missing_packages.append(package) logger.error(f"✗ {package} not installed") if missing_packages: logger.error(f"Missing packages: {', '.join(missing_packages)}") logger.info("Install with: pip install -r requirements.txt") return False return True def check_optional_dependencies(): """Check optional face recognition libraries""" optional_packages = { 'deepface': 'DeepFace', 'face_recognition': 'face_recognition', 'insightface': 'InsightFace' } available = [] for package, name in optional_packages.items(): try: __import__(package) available.append(name) logger.info(f"✓ {name} available") except ImportError: logger.warning(f"⚠ {name} not available (will use fallback)") if not available: logger.warning("No advanced face recognition library found. Using custom fallback.") logger.info("For better accuracy, install: pip install deepface face-recognition") else: logger.info(f"Using: {', '.join(available)}") def create_directories(): """Create necessary directories""" directories = ['uploads', 'temp', 'models'] for directory in directories: Path(directory).mkdir(exist_ok=True) logger.info(f"✓ Directory created/verified: {directory}") def download_models(): """Download face detection models if not present""" try: import urllib.request models_dir = Path('models') models_dir.mkdir(exist_ok=True) # DNN face detection model files prototxt_url = "https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt" model_url = "https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20170830/res10_300x300_ssd_iter_140000.caffemodel" prototxt_path = models_dir / "deploy.prototxt" model_path = models_dir / "res10_300x300_ssd_iter_140000.caffemodel" # Download prototxt if not prototxt_path.exists(): logger.info("Downloading face detection prototxt...") urllib.request.urlretrieve(prototxt_url, prototxt_path) logger.info("✓ Prototxt downloaded") else: logger.info("✓ Prototxt already exists") # Download model (this is large, ~10MB) if not model_path.exists(): logger.info("Downloading face detection model (this may take a while)...") urllib.request.urlretrieve(model_url, model_path) logger.info("✓ Model downloaded") else: logger.info("✓ Model already exists") return True except Exception as e: logger.warning(f"Could not download models: {e}") logger.info("Will use Haar Cascade fallback (built-in to OpenCV)") return False def main(): """Main startup function""" logger.info("=" * 60) logger.info("🚀 Face Verification System - Startup") logger.info("=" * 60) # Check dependencies logger.info("\n1. Checking dependencies...") if not check_dependencies(): logger.error("❌ Dependency check failed") sys.exit(1) # Check optional dependencies logger.info("\n2. Checking optional dependencies...") check_optional_dependencies() # Create directories logger.info("\n3. Creating directories...") create_directories() # Download models logger.info("\n4. Checking face detection models...") download_models() # Set environment variables port = int(os.getenv('PORT', 7860)) host = os.getenv('HOST', '0.0.0.0') logger.info("\n" + "=" * 60) logger.info("✓ Startup checks complete!") logger.info(f"Starting server on {host}:{port}") logger.info("=" * 60 + "\n") # Start the application import uvicorn from app import app uvicorn.run( app, host=host, port=port, log_level="info", access_log=True ) if __name__ == "__main__": main()