Fucius's picture
Upload 422 files
df6c67d verified
raw
history blame
4.05 kB
from dataclasses import dataclass
from datetime import datetime
from typing import Dict, List, Optional, Union
from inference.core.env import (
CLASS_AGNOSTIC_NMS_ENV,
DEFAULT_CLASS_AGNOSTIC_NMS,
DEFAULT_CONFIDENCE,
DEFAULT_IOU_THRESHOLD,
DEFAULT_MAX_CANDIDATES,
DEFAULT_MAX_DETECTIONS,
IOU_THRESHOLD_ENV,
MAX_CANDIDATES_ENV,
MAX_DETECTIONS_ENV,
)
from inference.core.interfaces.camera.entities import StatusUpdate
from inference.core.interfaces.camera.video_source import SourceMetadata
from inference.core.utils.environment import safe_env_to_type, str2bool
ObjectDetectionPrediction = dict
@dataclass(frozen=True)
class ModelConfig:
class_agnostic_nms: Optional[bool]
confidence: Optional[float]
iou_threshold: Optional[float]
max_candidates: Optional[int]
max_detections: Optional[int]
mask_decode_mode: Optional[str]
tradeoff_factor: Optional[float]
@classmethod
def init(
cls,
class_agnostic_nms: Optional[bool] = None,
confidence: Optional[float] = None,
iou_threshold: Optional[float] = None,
max_candidates: Optional[int] = None,
max_detections: Optional[int] = None,
mask_decode_mode: Optional[str] = None,
tradeoff_factor: Optional[float] = None,
) -> "ModelConfig":
if class_agnostic_nms is None:
class_agnostic_nms = safe_env_to_type(
variable_name=CLASS_AGNOSTIC_NMS_ENV,
default_value=DEFAULT_CLASS_AGNOSTIC_NMS,
type_constructor=str2bool,
)
if confidence is None:
confidence = safe_env_to_type(
variable_name=CLASS_AGNOSTIC_NMS_ENV,
default_value=DEFAULT_CONFIDENCE,
type_constructor=float,
)
if iou_threshold is None:
iou_threshold = safe_env_to_type(
variable_name=IOU_THRESHOLD_ENV,
default_value=DEFAULT_IOU_THRESHOLD,
type_constructor=float,
)
if max_candidates is None:
max_candidates = safe_env_to_type(
variable_name=MAX_CANDIDATES_ENV,
default_value=DEFAULT_MAX_CANDIDATES,
type_constructor=int,
)
if max_detections is None:
max_detections = safe_env_to_type(
variable_name=MAX_DETECTIONS_ENV,
default_value=DEFAULT_MAX_DETECTIONS,
type_constructor=int,
)
return ModelConfig(
class_agnostic_nms=class_agnostic_nms,
confidence=confidence,
iou_threshold=iou_threshold,
max_candidates=max_candidates,
max_detections=max_detections,
mask_decode_mode=mask_decode_mode,
tradeoff_factor=tradeoff_factor,
)
def to_postprocessing_params(self) -> Dict[str, Union[bool, float, int]]:
result = {}
for field in [
"class_agnostic_nms",
"confidence",
"iou_threshold",
"max_candidates",
"max_detections",
"mask_decode_mode",
"tradeoff_factor",
]:
result[field] = getattr(self, field, None)
return {name: value for name, value in result.items() if value is not None}
@dataclass(frozen=True)
class ModelActivityEvent:
frame_decoding_timestamp: datetime
event_timestamp: datetime
frame_id: int
@dataclass(frozen=True)
class LatencyMonitorReport:
frame_decoding_latency: Optional[float] = None
pre_processing_latency: Optional[float] = None
inference_latency: Optional[float] = None
post_processing_latency: Optional[float] = None
model_latency: Optional[float] = None
e2e_latency: Optional[float] = None
@dataclass(frozen=True)
class PipelineStateReport:
video_source_status_updates: List[StatusUpdate]
latency_report: LatencyMonitorReport
inference_throughput: float
source_metadata: Optional[SourceMetadata]