File size: 3,190 Bytes
e19b795
 
 
 
bed8d9e
981025a
e19b795
981025a
 
 
e19b795
 
 
c303abd
b4627df
22a85f1
 
 
e19b795
 
 
 
 
 
 
 
 
 
 
22a85f1
e19b795
 
ac14e44
83180e3
3a8656e
 
e19b795
83180e3
 
a3a6b45
e19b795
 
22a85f1
 
 
 
 
 
 
 
 
 
 
 
 
e19b795
 
 
 
 
b4627df
22a85f1
e19b795
c303abd
84dbb52
c303abd
84dbb52
c303abd
e19b795
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from fastapi import FastAPI
# from prometheus_client import metrics
from ai.depth.depth_anything import DepthAnything
from ai.detectors.yolo_detector import YOLO_Detector
from config.settings import AppConfig
from api.routers.metrics import metrics_asgi_app
from infra.system_metrics import log_system_metrics
from api.routers import camera_stream
from api.routers import dashboard_stream
from api.routers import health
from contextlib import asynccontextmanager
from infra.logger_structlog import StructLogger
import asyncio
import mlflow
import torch
from huggingface_hub import hf_hub_download
import redis.asyncio as aioredis


@asynccontextmanager
async def lifespan(app: FastAPI):
    """
    This is on_event("startup") new alternative, Make sure you load models here.
    """
    
    settings = AppConfig()
    logger = StructLogger(settings=settings)
   
    logger.info("Starting Server.... ")
    asyncio.create_task(log_system_metrics(logger, logger_interval_sec=settings.intervals.system_metrics_seconds))    
    
    # Using this way to can store data. it is acts as a dict which holds instances
    app.state.detection_model = YOLO_Detector(model_path="yolo26n.pt")

    depth_model_path = hf_hub_download(repo_id="depth-anything/Depth-Anything-V2-Small", filename="depth_anything_v2_vits.pth")
    app.state.depth_model = DepthAnything(encoder=settings.depth.encoder, depth_model_path=depth_model_path, DEVICE="cuda")

    safety_detection_path = hf_hub_download(repo_id="e1250/safety_detection", filename="yolo_smoke_fire.pt")
    app.state.safety_detection_model = YOLO_Detector(safety_detection_path)

    app.state.logger = logger
    app.state.settings = settings
    # app.state.camera_metadata = {}
    # app.state.dashboard_clients = set()
    # Redis(host="localhost", port=6379, db=0, decode_responses=True)
    app.state.redis = aioredis.from_url("redis://localhost:6379", db=0, decode_responses=True)
    # Cnecking connection to redis. 
    # Thinking of moving this to the health check. 
    try:
        await app.state.redis.ping()
        logger.info("Redis connected successfully...")
    except Exception as e:
        logger.error(f"Failed to connect to Redis: {e}")
        raise e

    # Each camera should have its tracker to be able to work fine. 
    # app.state.camera_trackers = {}
    yield

    logger.warn("Shutting down the server....")
    torch.cuda.empty_cache()
    await app.state.redis.close()
    # You can remove connections and release gpu here .  

mlflow.set_tracking_uri("sqlite:///config/logs/mlflow.db")
mlflow.set_experiment("realtime-detection-system")
mlflow.enable_system_metrics_logging()

app = FastAPI(
    title="Tracking System Backend",
    description="real-time frame processing API",
    version="0.1.0",
    lifespan=lifespan
    )

# Routes
app.mount("/metrics", metrics_asgi_app)    # Starting Prometheus server attached to my server.
app.include_router(camera_stream.router, prefix="/detectors")
app.include_router(dashboard_stream.router, prefix="/dashboard")
app.include_router(health.router, prefix="/health")

@app.get("/")
async def root():
    return {"status": "Real-Time tracker backend is running..."}