from typing import Any, List, Optional, Union from uuid import uuid4 from pydantic import BaseModel, ConfigDict, Field from inference.core.entities.common import ApiKey, ModelID, ModelType class BaseRequest(BaseModel): """Base request for inference. Attributes: id (str_): A unique request identifier. api_key (Optional[str]): Roboflow API Key that will be passed to the model during initialization for artifact retrieval. start (Optional[float]): start time of request """ def __init__(self, **kwargs): kwargs["id"] = str(uuid4()) super().__init__(**kwargs) model_config = ConfigDict(protected_namespaces=()) id: str api_key: Optional[str] = ApiKey start: Optional[float] = None source: Optional[str] = None source_info: Optional[str] = None class InferenceRequest(BaseRequest): """Base request for inference. Attributes: model_id (str): A unique model identifier. model_type (Optional[str]): The type of the model, usually referring to what task the model performs. """ model_id: Optional[str] = ModelID model_type: Optional[str] = ModelType class InferenceRequestImage(BaseModel): """Image data for inference request. Attributes: type (str): The type of image data provided, one of 'url', 'base64', or 'numpy'. value (Optional[Any]): Image data corresponding to the image type. """ type: str = Field( examples=["url"], description="The type of image data provided, one of 'url', 'base64', or 'numpy'", ) value: Optional[Any] = Field( None, examples=["http://www.example-image-url.com"], description="Image data corresponding to the image type, if type = 'url' then value is a string containing the url of an image, else if type = 'base64' then value is a string containing base64 encoded image data, else if type = 'numpy' then value is binary numpy data serialized using pickle.dumps(); array should 3 dimensions, channels last, with values in the range [0,255].", ) class CVInferenceRequest(InferenceRequest): """Computer Vision inference request. Attributes: image (Union[List[InferenceRequestImage], InferenceRequestImage]): Image(s) for inference. disable_preproc_auto_orient (Optional[bool]): If true, the auto orient preprocessing step is disabled for this call. Default is False. disable_preproc_contrast (Optional[bool]): If true, the auto contrast preprocessing step is disabled for this call. Default is False. disable_preproc_grayscale (Optional[bool]): If true, the grayscale preprocessing step is disabled for this call. Default is False. disable_preproc_static_crop (Optional[bool]): If true, the static crop preprocessing step is disabled for this call. Default is False. """ image: Union[List[InferenceRequestImage], InferenceRequestImage] disable_preproc_auto_orient: Optional[bool] = Field( default=False, description="If true, the auto orient preprocessing step is disabled for this call.", ) disable_preproc_contrast: Optional[bool] = Field( default=False, description="If true, the auto contrast preprocessing step is disabled for this call.", ) disable_preproc_grayscale: Optional[bool] = Field( default=False, description="If true, the grayscale preprocessing step is disabled for this call.", ) disable_preproc_static_crop: Optional[bool] = Field( default=False, description="If true, the static crop preprocessing step is disabled for this call.", ) class ObjectDetectionInferenceRequest(CVInferenceRequest): """Object Detection inference request. Attributes: class_agnostic_nms (Optional[bool]): If true, NMS is applied to all detections at once, if false, NMS is applied per class. class_filter (Optional[List[str]]): If provided, only predictions for the listed classes will be returned. confidence (Optional[float]): The confidence threshold used to filter out predictions. fix_batch_size (Optional[bool]): If true, the batch size will be fixed to the maximum batch size configured for this server. iou_threshold (Optional[float]): The IoU threshold that must be met for a box pair to be considered duplicate during NMS. max_detections (Optional[int]): The maximum number of detections that will be returned. max_candidates (Optional[int]): The maximum number of candidate detections passed to NMS. visualization_labels (Optional[bool]): If true, labels will be rendered on prediction visualizations. visualization_stroke_width (Optional[int]): The stroke width used when visualizing predictions. visualize_predictions (Optional[bool]): If true, the predictions will be drawn on the original image and returned as a base64 string. """ class_agnostic_nms: Optional[bool] = Field( default=False, examples=[False], description="If true, NMS is applied to all detections at once, if false, NMS is applied per class", ) class_filter: Optional[List[str]] = Field( default=None, examples=[["class-1", "class-2", "class-n"]], description="If provided, only predictions for the listed classes will be returned", ) confidence: Optional[float] = Field( default=0.4, examples=[0.5], description="The confidence threshold used to filter out predictions", ) fix_batch_size: Optional[bool] = Field( default=False, examples=[False], description="If true, the batch size will be fixed to the maximum batch size configured for this server", ) iou_threshold: Optional[float] = Field( default=0.3, examples=[0.5], description="The IoU threhsold that must be met for a box pair to be considered duplicate during NMS", ) max_detections: Optional[int] = Field( default=300, examples=[300], description="The maximum number of detections that will be returned", ) max_candidates: Optional[int] = Field( default=3000, description="The maximum number of candidate detections passed to NMS", ) visualization_labels: Optional[bool] = Field( default=False, examples=[False], description="If true, labels will be rendered on prediction visualizations", ) visualization_stroke_width: Optional[int] = Field( default=1, examples=[1], description="The stroke width used when visualizing predictions", ) visualize_predictions: Optional[bool] = Field( default=False, examples=[False], description="If true, the predictions will be drawn on the original image and returned as a base64 string", ) disable_active_learning: Optional[bool] = Field( default=False, examples=[False], description="If true, the predictions will be prevented from registration by Active Learning (if the functionality is enabled)", ) class KeypointsDetectionInferenceRequest(ObjectDetectionInferenceRequest): keypoint_confidence: Optional[float] = Field( default=0.0, examples=[0.5], description="The confidence threshold used to filter out non visible keypoints", ) class InstanceSegmentationInferenceRequest(ObjectDetectionInferenceRequest): """Instance Segmentation inference request. Attributes: mask_decode_mode (Optional[str]): The mode used to decode instance segmentation masks, one of 'accurate', 'fast', 'tradeoff'. tradeoff_factor (Optional[float]): The amount to tradeoff between 0='fast' and 1='accurate'. """ mask_decode_mode: Optional[str] = Field( default="accurate", examples=["accurate"], description="The mode used to decode instance segmentation masks, one of 'accurate', 'fast', 'tradeoff'", ) tradeoff_factor: Optional[float] = Field( default=0.0, examples=[0.5], description="The amount to tradeoff between 0='fast' and 1='accurate'", ) class ClassificationInferenceRequest(CVInferenceRequest): """Classification inference request. Attributes: confidence (Optional[float]): The confidence threshold used to filter out predictions. visualization_stroke_width (Optional[int]): The stroke width used when visualizing predictions. visualize_predictions (Optional[bool]): If true, the predictions will be drawn on the original image and returned as a base64 string. """ confidence: Optional[float] = Field( default=0.4, examples=[0.5], description="The confidence threshold used to filter out predictions", ) visualization_stroke_width: Optional[int] = Field( default=1, examples=[1], description="The stroke width used when visualizing predictions", ) visualize_predictions: Optional[bool] = Field( default=False, examples=[False], description="If true, the predictions will be drawn on the original image and returned as a base64 string", ) disable_active_learning: Optional[bool] = Field( default=False, examples=[False], description="If true, the predictions will be prevented from registration by Active Learning (if the functionality is enabled)", ) def request_from_type(model_type, request_dict): """Uses original request id""" if model_type == "classification": request = ClassificationInferenceRequest(**request_dict) elif model_type == "instance-segmentation": request = InstanceSegmentationInferenceRequest(**request_dict) elif model_type == "object-detection": request = ObjectDetectionInferenceRequest(**request_dict) else: raise ValueError(f"Uknown task type {model_type}") request.id = request_dict.get("id") return request