""" Startup script for running both FastAPI and Gradio interfaces. """ import os import sys import threading import uvicorn import logging from datetime import datetime from app.gradio_app import launch_gradio # Configure logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) logger = logging.getLogger(__name__) def run_fastapi(): """Run FastAPI server.""" logger.info("šŸš€ Starting FastAPI server...") uvicorn.run( "app.main:app", host="0.0.0.0", port=8000, log_level="info", access_log=True ) def run_gradio(): """Run Gradio interface.""" logger.info("šŸŽØ Starting Gradio interface...") launch_gradio( share=False, server_name="0.0.0.0", server_port=7860 ) if __name__ == "__main__": logger.info("=" * 60) logger.info(f"===== Application Startup at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} =====") logger.info("=" * 60) logger.info("šŸš€ Starting Tunisian License Plate Detection & OCR Application...") logger.info("šŸ“” FastAPI will be available at: http://0.0.0.0:8000") logger.info("šŸŽØ Gradio Interface will be available at: http://0.0.0.0:7860") logger.info("šŸ“š API Documentation at: http://0.0.0.0:8000/docs") logger.info("\nā³ Pre-loading models for faster inference...") # Pre-load all models at startup to avoid lazy loading delays import time startup_start = time.time() try: from app.services.pipeline import get_pipeline from app.models.state_farm_model import get_state_farm_detector from app.models.multi_car_detector import get_multi_car_detector from app.models.seat_belt_model import get_seat_belt_detector logger.info("šŸ“¦ Loading pipeline and all models...") pipeline = get_pipeline() # This will load car / plate / word / OCR models state_farm_detector = get_state_farm_detector() # Pre-load State Farm model multi_car_detector = get_multi_car_detector() # Pre-load Multi-Car Detection model seat_belt_detector = get_seat_belt_detector() # Pre-load Seat Belt Detection model logger.info(f"āœ… All models loaded successfully in {time.time() - startup_start:.2f}s") except Exception as e: logger.warning(f"āš ļø Warning: Could not pre-load models: {e}") logger.info("Models will be loaded on first use (lazy loading)") logger.info("\nPress Ctrl+C to stop both services.\n") # Start FastAPI in a separate thread fastapi_thread = threading.Thread(target=run_fastapi, daemon=True) fastapi_thread.start() # Give FastAPI a moment to start time.sleep(2) # Run Gradio in the main thread try: run_gradio() except KeyboardInterrupt: logger.info("\nšŸ‘‹ Shutting down...") sys.exit(0)