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