|
|
from dataclasses import dataclass, fields, asdict, field |
|
|
from typing import Any |
|
|
|
|
|
from numpy import ndarray |
|
|
|
|
|
from scorevision.chute_template.schemas import SVFrameResult |
|
|
from scorevision.chute_template.schemas import TVPredictInput |
|
|
from scorevision.vlm_pipeline.domain_specific_schemas.challenge_types import ( |
|
|
ChallengeType, |
|
|
) |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class Evaluation: |
|
|
@property |
|
|
def average(self) -> float: |
|
|
values = [float(getattr(self, f.name)) for f in fields(self)] |
|
|
return sum(values) / len(values) if values else 0.0 |
|
|
|
|
|
def __float__(self) -> float: |
|
|
return self.average |
|
|
|
|
|
def to_dict(self) -> dict: |
|
|
return asdict(self) |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class KeypointsScore(Evaluation): |
|
|
floor_markings_alignment: float = ( |
|
|
0.0 |
|
|
) |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class ActionScore(Evaluation): |
|
|
categorisation: float = ( |
|
|
0.0 |
|
|
) |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class ObjectsScore(Evaluation): |
|
|
bbox_placement: float = ( |
|
|
0.0 |
|
|
) |
|
|
categorisation: float = ( |
|
|
0.0 |
|
|
) |
|
|
team: float = ( |
|
|
0.0 |
|
|
) |
|
|
enumeration: float = ( |
|
|
0.0 |
|
|
) |
|
|
tracking_stability: float = ( |
|
|
0.0 |
|
|
) |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class LatencyScore(Evaluation): |
|
|
inference: float = ( |
|
|
0.0 |
|
|
) |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class TotalScore(Evaluation): |
|
|
action: ActionScore = field(default_factory=ActionScore) |
|
|
keypoints: KeypointsScore = field(default_factory=KeypointsScore) |
|
|
objects: ObjectsScore = field(default_factory=ObjectsScore) |
|
|
latency: LatencyScore = field(default_factory=LatencyScore) |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class SVChallenge: |
|
|
env: str |
|
|
payload: TVPredictInput |
|
|
meta: dict[str, Any] |
|
|
prompt: str |
|
|
challenge_id: str |
|
|
frame_numbers: list[int] |
|
|
frames: list[ndarray] |
|
|
dense_optical_flow_frames: list[ndarray] |
|
|
api_task_id: str | int | None = None |
|
|
challenge_type: ChallengeType | None = None |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class SVRunOutput: |
|
|
success: bool |
|
|
latency_ms: float |
|
|
predictions: dict[str, list[SVFrameResult]] | None |
|
|
error: str | None |
|
|
model: str | None = None |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class SVPredictResult: |
|
|
success: bool |
|
|
model: str | None |
|
|
latency_seconds: float |
|
|
predictions: dict[str, Any] | None |
|
|
error: str | None |
|
|
raw: dict[str, Any] | None = None |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class SVEvaluation: |
|
|
acc_breakdown: dict[str, float] |
|
|
acc: float |
|
|
latency_ms: float |
|
|
score: float |
|
|
details: dict[str, Any] |
|
|
|