|
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] |
|
|