Fucius's picture
Upload 422 files
df6c67d verified
import base64
from typing import Any, Dict, List, Optional, Union
from uuid import uuid4
from pydantic import BaseModel, ConfigDict, Field, ValidationError, field_serializer
class ObjectDetectionPrediction(BaseModel):
"""Object Detection prediction.
Attributes:
x (float): The center x-axis pixel coordinate of the prediction.
y (float): The center y-axis pixel coordinate of the prediction.
width (float): The width of the prediction bounding box in number of pixels.
height (float): The height of the prediction bounding box in number of pixels.
confidence (float): The detection confidence as a fraction between 0 and 1.
class_name (str): The predicted class label.
class_confidence (Union[float, None]): The class label confidence as a fraction between 0 and 1.
class_id (int): The class id of the prediction
"""
x: float = Field(description="The center x-axis pixel coordinate of the prediction")
y: float = Field(description="The center y-axis pixel coordinate of the prediction")
width: float = Field(
description="The width of the prediction bounding box in number of pixels"
)
height: float = Field(
description="The height of the prediction bounding box in number of pixels"
)
confidence: float = Field(
description="The detection confidence as a fraction between 0 and 1"
)
class_name: str = Field(alias="class", description="The predicted class label")
class_confidence: Union[float, None] = Field(
None, description="The class label confidence as a fraction between 0 and 1"
)
class_id: int = Field(description="The class id of the prediction")
tracker_id: Optional[int] = Field(
description="The tracker id of the prediction if tracking is enabled",
default=None,
)
detection_id: str = Field(
description="Unique identifier of detection",
default_factory=lambda: str(uuid4()),
)
parent_id: Optional[str] = Field(
description="Identifier of parent image region. Useful when stack of detection-models is in use to refer the RoI being the input to inference",
default=None,
)
class Point(BaseModel):
"""Point coordinates.
Attributes:
x (float): The x-axis pixel coordinate of the point.
y (float): The y-axis pixel coordinate of the point.
"""
x: float = Field(description="The x-axis pixel coordinate of the point")
y: float = Field(description="The y-axis pixel coordinate of the point")
class Point3D(Point):
"""3D Point coordinates.
Attributes:
z (float): The z-axis pixel coordinate of the point.
"""
z: float = Field(description="The z-axis pixel coordinate of the point")
class InstanceSegmentationPrediction(BaseModel):
"""Instance Segmentation prediction.
Attributes:
x (float): The center x-axis pixel coordinate of the prediction.
y (float): The center y-axis pixel coordinate of the prediction.
width (float): The width of the prediction bounding box in number of pixels.
height (float): The height of the prediction bounding box in number of pixels.
confidence (float): The detection confidence as a fraction between 0 and 1.
class_name (str): The predicted class label.
class_confidence (Union[float, None]): The class label confidence as a fraction between 0 and 1.
points (List[Point]): The list of points that make up the instance polygon.
class_id: int = Field(description="The class id of the prediction")
"""
x: float = Field(description="The center x-axis pixel coordinate of the prediction")
y: float = Field(description="The center y-axis pixel coordinate of the prediction")
width: float = Field(
description="The width of the prediction bounding box in number of pixels"
)
height: float = Field(
description="The height of the prediction bounding box in number of pixels"
)
confidence: float = Field(
description="The detection confidence as a fraction between 0 and 1"
)
class_name: str = Field(alias="class", description="The predicted class label")
class_confidence: Union[float, None] = Field(
None, description="The class label confidence as a fraction between 0 and 1"
)
points: List[Point] = Field(
description="The list of points that make up the instance polygon"
)
class_id: int = Field(description="The class id of the prediction")
detection_id: str = Field(
description="Unique identifier of detection",
default_factory=lambda: str(uuid4()),
)
parent_id: Optional[str] = Field(
description="Identifier of parent image region. Useful when stack of detection-models is in use to refer the RoI being the input to inference",
default=None,
)
class ClassificationPrediction(BaseModel):
"""Classification prediction.
Attributes:
class_name (str): The predicted class label.
class_id (int): Numeric ID associated with the class label.
confidence (float): The class label confidence as a fraction between 0 and 1.
"""
class_name: str = Field(alias="class", description="The predicted class label")
class_id: int = Field(description="Numeric ID associated with the class label")
confidence: float = Field(
description="The class label confidence as a fraction between 0 and 1"
)
class MultiLabelClassificationPrediction(BaseModel):
"""Multi-label Classification prediction.
Attributes:
confidence (float): The class label confidence as a fraction between 0 and 1.
"""
confidence: float = Field(
description="The class label confidence as a fraction between 0 and 1"
)
class InferenceResponseImage(BaseModel):
"""Inference response image information.
Attributes:
width (int): The original width of the image used in inference.
height (int): The original height of the image used in inference.
"""
width: int = Field(description="The original width of the image used in inference")
height: int = Field(
description="The original height of the image used in inference"
)
class InferenceResponse(BaseModel):
"""Base inference response.
Attributes:
frame_id (Optional[int]): The frame id of the image used in inference if the input was a video.
time (Optional[float]): The time in seconds it took to produce the predictions including image preprocessing.
"""
model_config = ConfigDict(protected_namespaces=())
frame_id: Optional[int] = Field(
default=None,
description="The frame id of the image used in inference if the input was a video",
)
time: Optional[float] = Field(
default=None,
description="The time in seconds it took to produce the predictions including image preprocessing",
)
class CvInferenceResponse(InferenceResponse):
"""Computer Vision inference response.
Attributes:
image (Union[List[inference.core.entities.responses.inference.InferenceResponseImage], inference.core.entities.responses.inference.InferenceResponseImage]): Image(s) used in inference.
"""
image: Union[List[InferenceResponseImage], InferenceResponseImage]
class WithVisualizationResponse(BaseModel):
"""Response with visualization.
Attributes:
visualization (Optional[Any]): Base64 encoded string containing prediction visualization image data.
"""
visualization: Optional[Any] = Field(
default=None,
description="Base64 encoded string containing prediction visualization image data",
)
@field_serializer("visualization", when_used="json")
def serialize_visualisation(self, visualization: Optional[Any]) -> Optional[str]:
if visualization is None:
return None
return base64.b64encode(visualization).decode("utf-8")
class ObjectDetectionInferenceResponse(CvInferenceResponse, WithVisualizationResponse):
"""Object Detection inference response.
Attributes:
predictions (List[inference.core.entities.responses.inference.ObjectDetectionPrediction]): List of object detection predictions.
"""
predictions: List[ObjectDetectionPrediction]
class Keypoint(Point):
confidence: float = Field(
description="Model confidence regarding keypoint visibility."
)
class_id: int = Field(description="Identifier of keypoint.")
class_name: str = Field(field="class", description="Type of keypoint.")
class KeypointsPrediction(ObjectDetectionPrediction):
keypoints: List[Keypoint]
class KeypointsDetectionInferenceResponse(
CvInferenceResponse, WithVisualizationResponse
):
predictions: List[KeypointsPrediction]
class InstanceSegmentationInferenceResponse(
CvInferenceResponse, WithVisualizationResponse
):
"""Instance Segmentation inference response.
Attributes:
predictions (List[inference.core.entities.responses.inference.InstanceSegmentationPrediction]): List of instance segmentation predictions.
"""
predictions: List[InstanceSegmentationPrediction]
class ClassificationInferenceResponse(CvInferenceResponse, WithVisualizationResponse):
"""Classification inference response.
Attributes:
predictions (List[inference.core.entities.responses.inference.ClassificationPrediction]): List of classification predictions.
top (str): The top predicted class label.
confidence (float): The confidence of the top predicted class label.
"""
predictions: List[ClassificationPrediction]
top: str = Field(description="The top predicted class label")
confidence: float = Field(
description="The confidence of the top predicted class label"
)
parent_id: Optional[str] = Field(
description="Identifier of parent image region. Useful when stack of detection-models is in use to refer the RoI being the input to inference",
default=None,
)
class MultiLabelClassificationInferenceResponse(
CvInferenceResponse, WithVisualizationResponse
):
"""Multi-label Classification inference response.
Attributes:
predictions (Dict[str, inference.core.entities.responses.inference.MultiLabelClassificationPrediction]): Dictionary of multi-label classification predictions.
predicted_classes (List[str]): The list of predicted classes.
"""
predictions: Dict[str, MultiLabelClassificationPrediction]
predicted_classes: List[str] = Field(description="The list of predicted classes")
parent_id: Optional[str] = Field(
description="Identifier of parent image region. Useful when stack of detection-models is in use to refer the RoI being the input to inference",
default=None,
)
class FaceDetectionPrediction(ObjectDetectionPrediction):
"""Face Detection prediction.
Attributes:
class_name (str): fixed value "face".
landmarks (Union[List[inference.core.entities.responses.inference.Point], List[inference.core.entities.responses.inference.Point3D]]): The detected face landmarks.
"""
class_id: Optional[int] = Field(
description="The class id of the prediction", default=0
)
class_name: str = Field(
alias="class", default="face", description="The predicted class label"
)
landmarks: Union[List[Point], List[Point3D]]
def response_from_type(model_type, response_dict):
if model_type == "classification":
try:
return ClassificationInferenceResponse(**response_dict)
except ValidationError:
return MultiLabelClassificationInferenceResponse(**response_dict)
elif model_type == "instance-segmentation":
return InstanceSegmentationInferenceResponse(**response_dict)
elif model_type == "object-detection":
return ObjectDetectionInferenceResponse(**response_dict)
else:
raise ValueError(f"Uknown task type {model_type}")
class StubResponse(InferenceResponse, WithVisualizationResponse):
is_stub: bool = Field(description="Field to mark prediction type as stub")
model_id: str = Field(description="Identifier of a model stub that was called")
task_type: str = Field(description="Task type of the project")