Spaces:
Sleeping
Sleeping
| """ | |
| 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() | |