inference-models 0.18.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. inference_models/__init__.py +36 -0
  2. inference_models/configuration.py +72 -0
  3. inference_models/constants.py +2 -0
  4. inference_models/entities.py +5 -0
  5. inference_models/errors.py +137 -0
  6. inference_models/logger.py +52 -0
  7. inference_models/model_pipelines/__init__.py +0 -0
  8. inference_models/model_pipelines/auto_loaders/__init__.py +0 -0
  9. inference_models/model_pipelines/auto_loaders/core.py +120 -0
  10. inference_models/model_pipelines/auto_loaders/pipelines_registry.py +36 -0
  11. inference_models/model_pipelines/face_and_gaze_detection/__init__.py +0 -0
  12. inference_models/model_pipelines/face_and_gaze_detection/mediapipe_l2cs.py +200 -0
  13. inference_models/models/__init__.py +0 -0
  14. inference_models/models/auto_loaders/__init__.py +0 -0
  15. inference_models/models/auto_loaders/access_manager.py +168 -0
  16. inference_models/models/auto_loaders/auto_negotiation.py +1329 -0
  17. inference_models/models/auto_loaders/auto_resolution_cache.py +129 -0
  18. inference_models/models/auto_loaders/constants.py +7 -0
  19. inference_models/models/auto_loaders/core.py +1341 -0
  20. inference_models/models/auto_loaders/dependency_models.py +52 -0
  21. inference_models/models/auto_loaders/entities.py +57 -0
  22. inference_models/models/auto_loaders/models_registry.py +497 -0
  23. inference_models/models/auto_loaders/presentation_utils.py +333 -0
  24. inference_models/models/auto_loaders/ranking.py +413 -0
  25. inference_models/models/auto_loaders/utils.py +31 -0
  26. inference_models/models/base/__init__.py +0 -0
  27. inference_models/models/base/classification.py +123 -0
  28. inference_models/models/base/depth_estimation.py +62 -0
  29. inference_models/models/base/documents_parsing.py +111 -0
  30. inference_models/models/base/embeddings.py +66 -0
  31. inference_models/models/base/instance_segmentation.py +87 -0
  32. inference_models/models/base/keypoints_detection.py +93 -0
  33. inference_models/models/base/object_detection.py +143 -0
  34. inference_models/models/base/semantic_segmentation.py +74 -0
  35. inference_models/models/base/types.py +5 -0
  36. inference_models/models/clip/__init__.py +0 -0
  37. inference_models/models/clip/clip_onnx.py +148 -0
  38. inference_models/models/clip/clip_pytorch.py +104 -0
  39. inference_models/models/clip/preprocessing.py +162 -0
  40. inference_models/models/common/__init__.py +0 -0
  41. inference_models/models/common/cuda.py +30 -0
  42. inference_models/models/common/model_packages.py +25 -0
  43. inference_models/models/common/onnx.py +379 -0
  44. inference_models/models/common/roboflow/__init__.py +0 -0
  45. inference_models/models/common/roboflow/model_packages.py +361 -0
  46. inference_models/models/common/roboflow/post_processing.py +436 -0
  47. inference_models/models/common/roboflow/pre_processing.py +1332 -0
  48. inference_models/models/common/torch.py +20 -0
  49. inference_models/models/common/trt.py +266 -0
  50. inference_models/models/deep_lab_v3_plus/__init__.py +0 -0
  51. inference_models/models/deep_lab_v3_plus/deep_lab_v3_plus_segmentation_onnx.py +282 -0
  52. inference_models/models/deep_lab_v3_plus/deep_lab_v3_plus_segmentation_torch.py +264 -0
  53. inference_models/models/deep_lab_v3_plus/deep_lab_v3_plus_segmentation_trt.py +313 -0
  54. inference_models/models/depth_anything_v2/__init__.py +0 -0
  55. inference_models/models/depth_anything_v2/depth_anything_v2_hf.py +77 -0
  56. inference_models/models/dinov3/__init__.py +0 -0
  57. inference_models/models/dinov3/dinov3_classification_onnx.py +348 -0
  58. inference_models/models/dinov3/dinov3_classification_torch.py +323 -0
  59. inference_models/models/doctr/__init__.py +0 -0
  60. inference_models/models/doctr/doctr_torch.py +304 -0
  61. inference_models/models/easy_ocr/__init__.py +0 -0
  62. inference_models/models/easy_ocr/easy_ocr_torch.py +222 -0
  63. inference_models/models/florence2/__init__.py +0 -0
  64. inference_models/models/florence2/florence2_hf.py +897 -0
  65. inference_models/models/grounding_dino/__init__.py +0 -0
  66. inference_models/models/grounding_dino/grounding_dino_torch.py +227 -0
  67. inference_models/models/l2cs/__init__.py +0 -0
  68. inference_models/models/l2cs/l2cs_onnx.py +216 -0
  69. inference_models/models/mediapipe_face_detection/__init__.py +0 -0
  70. inference_models/models/mediapipe_face_detection/face_detection.py +203 -0
  71. inference_models/models/moondream2/__init__.py +0 -0
  72. inference_models/models/moondream2/moondream2_hf.py +281 -0
  73. inference_models/models/owlv2/__init__.py +0 -0
  74. inference_models/models/owlv2/cache.py +182 -0
  75. inference_models/models/owlv2/entities.py +112 -0
  76. inference_models/models/owlv2/owlv2_hf.py +695 -0
  77. inference_models/models/owlv2/reference_dataset.py +291 -0
  78. inference_models/models/paligemma/__init__.py +0 -0
  79. inference_models/models/paligemma/paligemma_hf.py +209 -0
  80. inference_models/models/perception_encoder/__init__.py +0 -0
  81. inference_models/models/perception_encoder/perception_encoder_pytorch.py +197 -0
  82. inference_models/models/perception_encoder/vision_encoder/__init__.py +0 -0
  83. inference_models/models/perception_encoder/vision_encoder/config.py +160 -0
  84. inference_models/models/perception_encoder/vision_encoder/pe.py +742 -0
  85. inference_models/models/perception_encoder/vision_encoder/rope.py +344 -0
  86. inference_models/models/perception_encoder/vision_encoder/tokenizer.py +342 -0
  87. inference_models/models/perception_encoder/vision_encoder/transforms.py +33 -0
  88. inference_models/models/qwen25vl/__init__.py +1 -0
  89. inference_models/models/qwen25vl/qwen25vl_hf.py +285 -0
  90. inference_models/models/resnet/__init__.py +0 -0
  91. inference_models/models/resnet/resnet_classification_onnx.py +330 -0
  92. inference_models/models/resnet/resnet_classification_torch.py +305 -0
  93. inference_models/models/resnet/resnet_classification_trt.py +369 -0
  94. inference_models/models/rfdetr/__init__.py +0 -0
  95. inference_models/models/rfdetr/backbone_builder.py +101 -0
  96. inference_models/models/rfdetr/class_remapping.py +41 -0
  97. inference_models/models/rfdetr/common.py +115 -0
  98. inference_models/models/rfdetr/default_labels.py +108 -0
  99. inference_models/models/rfdetr/dinov2_with_windowed_attn.py +1330 -0
  100. inference_models/models/rfdetr/misc.py +26 -0
  101. inference_models/models/rfdetr/ms_deform_attn.py +180 -0
  102. inference_models/models/rfdetr/ms_deform_attn_func.py +60 -0
  103. inference_models/models/rfdetr/position_encoding.py +166 -0
  104. inference_models/models/rfdetr/post_processor.py +83 -0
  105. inference_models/models/rfdetr/projector.py +373 -0
  106. inference_models/models/rfdetr/rfdetr_backbone_pytorch.py +394 -0
  107. inference_models/models/rfdetr/rfdetr_base_pytorch.py +807 -0
  108. inference_models/models/rfdetr/rfdetr_instance_segmentation_onnx.py +206 -0
  109. inference_models/models/rfdetr/rfdetr_instance_segmentation_pytorch.py +373 -0
  110. inference_models/models/rfdetr/rfdetr_instance_segmentation_trt.py +227 -0
  111. inference_models/models/rfdetr/rfdetr_object_detection_onnx.py +244 -0
  112. inference_models/models/rfdetr/rfdetr_object_detection_pytorch.py +470 -0
  113. inference_models/models/rfdetr/rfdetr_object_detection_trt.py +270 -0
  114. inference_models/models/rfdetr/segmentation_head.py +273 -0
  115. inference_models/models/rfdetr/transformer.py +767 -0
  116. inference_models/models/roboflow_instant/__init__.py +0 -0
  117. inference_models/models/roboflow_instant/roboflow_instant_hf.py +141 -0
  118. inference_models/models/sam/__init__.py +0 -0
  119. inference_models/models/sam/cache.py +147 -0
  120. inference_models/models/sam/entities.py +25 -0
  121. inference_models/models/sam/sam_torch.py +675 -0
  122. inference_models/models/sam2/__init__.py +0 -0
  123. inference_models/models/sam2/cache.py +162 -0
  124. inference_models/models/sam2/entities.py +43 -0
  125. inference_models/models/sam2/sam2_torch.py +905 -0
  126. inference_models/models/sam2_rt/__init__.py +0 -0
  127. inference_models/models/sam2_rt/sam2_pytorch.py +119 -0
  128. inference_models/models/smolvlm/__init__.py +0 -0
  129. inference_models/models/smolvlm/smolvlm_hf.py +245 -0
  130. inference_models/models/trocr/__init__.py +0 -0
  131. inference_models/models/trocr/trocr_hf.py +53 -0
  132. inference_models/models/vit/__init__.py +0 -0
  133. inference_models/models/vit/vit_classification_huggingface.py +319 -0
  134. inference_models/models/vit/vit_classification_onnx.py +326 -0
  135. inference_models/models/vit/vit_classification_trt.py +365 -0
  136. inference_models/models/yolact/__init__.py +1 -0
  137. inference_models/models/yolact/yolact_instance_segmentation_onnx.py +336 -0
  138. inference_models/models/yolact/yolact_instance_segmentation_trt.py +361 -0
  139. inference_models/models/yolo_world/__init__.py +1 -0
  140. inference_models/models/yolonas/__init__.py +0 -0
  141. inference_models/models/yolonas/nms.py +44 -0
  142. inference_models/models/yolonas/yolonas_object_detection_onnx.py +204 -0
  143. inference_models/models/yolonas/yolonas_object_detection_trt.py +230 -0
  144. inference_models/models/yolov10/__init__.py +0 -0
  145. inference_models/models/yolov10/yolov10_object_detection_onnx.py +187 -0
  146. inference_models/models/yolov10/yolov10_object_detection_trt.py +215 -0
  147. inference_models/models/yolov11/__init__.py +0 -0
  148. inference_models/models/yolov11/yolov11_onnx.py +28 -0
  149. inference_models/models/yolov11/yolov11_torch_script.py +25 -0
  150. inference_models/models/yolov11/yolov11_trt.py +21 -0
  151. inference_models/models/yolov12/__init__.py +0 -0
  152. inference_models/models/yolov12/yolov12_onnx.py +7 -0
  153. inference_models/models/yolov12/yolov12_torch_script.py +7 -0
  154. inference_models/models/yolov12/yolov12_trt.py +7 -0
  155. inference_models/models/yolov5/__init__.py +0 -0
  156. inference_models/models/yolov5/nms.py +99 -0
  157. inference_models/models/yolov5/yolov5_instance_segmentation_onnx.py +225 -0
  158. inference_models/models/yolov5/yolov5_instance_segmentation_trt.py +255 -0
  159. inference_models/models/yolov5/yolov5_object_detection_onnx.py +192 -0
  160. inference_models/models/yolov5/yolov5_object_detection_trt.py +218 -0
  161. inference_models/models/yolov7/__init__.py +0 -0
  162. inference_models/models/yolov7/yolov7_instance_segmentation_onnx.py +226 -0
  163. inference_models/models/yolov7/yolov7_instance_segmentation_trt.py +253 -0
  164. inference_models/models/yolov8/__init__.py +0 -0
  165. inference_models/models/yolov8/yolov8_classification_onnx.py +181 -0
  166. inference_models/models/yolov8/yolov8_instance_segmentation_onnx.py +239 -0
  167. inference_models/models/yolov8/yolov8_instance_segmentation_torch_script.py +201 -0
  168. inference_models/models/yolov8/yolov8_instance_segmentation_trt.py +268 -0
  169. inference_models/models/yolov8/yolov8_key_points_detection_onnx.py +263 -0
  170. inference_models/models/yolov8/yolov8_key_points_detection_torch_script.py +218 -0
  171. inference_models/models/yolov8/yolov8_key_points_detection_trt.py +287 -0
  172. inference_models/models/yolov8/yolov8_object_detection_onnx.py +213 -0
  173. inference_models/models/yolov8/yolov8_object_detection_torch_script.py +166 -0
  174. inference_models/models/yolov8/yolov8_object_detection_trt.py +231 -0
  175. inference_models/models/yolov9/__init__.py +0 -0
  176. inference_models/models/yolov9/yolov9_onnx.py +7 -0
  177. inference_models/models/yolov9/yolov9_torch_script.py +7 -0
  178. inference_models/models/yolov9/yolov9_trt.py +7 -0
  179. inference_models/runtime_introspection/__init__.py +0 -0
  180. inference_models/runtime_introspection/core.py +410 -0
  181. inference_models/utils/__init__.py +0 -0
  182. inference_models/utils/download.py +608 -0
  183. inference_models/utils/environment.py +28 -0
  184. inference_models/utils/file_system.py +51 -0
  185. inference_models/utils/hashing.py +7 -0
  186. inference_models/utils/imports.py +48 -0
  187. inference_models/utils/onnx_introspection.py +17 -0
  188. inference_models/weights_providers/__init__.py +0 -0
  189. inference_models/weights_providers/core.py +20 -0
  190. inference_models/weights_providers/entities.py +159 -0
  191. inference_models/weights_providers/roboflow.py +601 -0
  192. inference_models-0.18.3.dist-info/METADATA +466 -0
  193. inference_models-0.18.3.dist-info/RECORD +195 -0
  194. inference_models-0.18.3.dist-info/WHEEL +5 -0
  195. inference_models-0.18.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,253 @@
1
+ from threading import Lock
2
+ from typing import List, Optional, Tuple, Union
3
+
4
+ import numpy as np
5
+ import torch
6
+
7
+ from inference_models import InstanceDetections, InstanceSegmentationModel
8
+ from inference_models.configuration import DEFAULT_DEVICE
9
+ from inference_models.entities import ColorFormat
10
+ from inference_models.errors import (
11
+ CorruptedModelPackageError,
12
+ MissingDependencyError,
13
+ ModelRuntimeError,
14
+ )
15
+ from inference_models.models.common.cuda import (
16
+ use_cuda_context,
17
+ use_primary_cuda_context,
18
+ )
19
+ from inference_models.models.common.model_packages import get_model_package_contents
20
+ from inference_models.models.common.roboflow.model_packages import (
21
+ InferenceConfig,
22
+ PreProcessingMetadata,
23
+ ResizeMode,
24
+ TRTConfig,
25
+ parse_class_names_file,
26
+ parse_inference_config,
27
+ parse_trt_config,
28
+ )
29
+ from inference_models.models.common.roboflow.post_processing import (
30
+ align_instance_segmentation_results,
31
+ crop_masks_to_boxes,
32
+ preprocess_segmentation_masks,
33
+ run_nms_for_instance_segmentation,
34
+ )
35
+ from inference_models.models.common.roboflow.pre_processing import (
36
+ pre_process_network_input,
37
+ )
38
+ from inference_models.models.common.trt import (
39
+ get_engine_inputs_and_outputs,
40
+ infer_from_trt_engine,
41
+ load_model,
42
+ )
43
+
44
+ try:
45
+ import tensorrt as trt
46
+ except ImportError as import_error:
47
+ raise MissingDependencyError(
48
+ message=f"Could not import YOLOv7 model with TRT backend - this error means that some additional dependencies "
49
+ f"are not installed in the environment. If you run the `inference-models` library directly in your Python "
50
+ f"program, make sure the following extras of the package are installed: `trt10` - installation can only "
51
+ f"succeed for Linux and Windows machines with Cuda 12 installed. Jetson devices, should have TRT 10.x "
52
+ f"installed for all builds with Jetpack 6. "
53
+ f"If you see this error using Roboflow infrastructure, make sure the service you use does support the model. "
54
+ f"You can also contact Roboflow to get support.",
55
+ help_url="https://todo",
56
+ ) from import_error
57
+
58
+ try:
59
+ import pycuda.driver as cuda
60
+ except ImportError as import_error:
61
+ raise MissingDependencyError(
62
+ message="TODO",
63
+ help_url="https://todo",
64
+ ) from import_error
65
+
66
+
67
+ class YOLOv7ForInstanceSegmentationTRT(
68
+ InstanceSegmentationModel[
69
+ torch.Tensor, PreProcessingMetadata, Tuple[torch.Tensor, torch.Tensor]
70
+ ]
71
+ ):
72
+
73
+ @classmethod
74
+ def from_pretrained(
75
+ cls,
76
+ model_name_or_path: str,
77
+ device: torch.device = DEFAULT_DEVICE,
78
+ engine_host_code_allowed: bool = False,
79
+ **kwargs,
80
+ ) -> "YOLOv7ForInstanceSegmentationTRT":
81
+ if device.type != "cuda":
82
+ raise ModelRuntimeError(
83
+ message=f"TRT engine only runs on CUDA device - {device} device detected.",
84
+ help_url="https://todo",
85
+ )
86
+ model_package_content = get_model_package_contents(
87
+ model_package_dir=model_name_or_path,
88
+ elements=[
89
+ "class_names.txt",
90
+ "inference_config.json",
91
+ "trt_config.json",
92
+ "engine.plan",
93
+ ],
94
+ )
95
+ class_names = parse_class_names_file(
96
+ class_names_path=model_package_content["class_names.txt"]
97
+ )
98
+ inference_config = parse_inference_config(
99
+ config_path=model_package_content["inference_config.json"],
100
+ allowed_resize_modes={
101
+ ResizeMode.STRETCH_TO,
102
+ ResizeMode.LETTERBOX,
103
+ ResizeMode.CENTER_CROP,
104
+ ResizeMode.LETTERBOX_REFLECT_EDGES,
105
+ },
106
+ )
107
+ trt_config = parse_trt_config(
108
+ config_path=model_package_content["trt_config.json"]
109
+ )
110
+ cuda.init()
111
+ cuda_device = cuda.Device(device.index or 0)
112
+ with use_primary_cuda_context(cuda_device=cuda_device) as cuda_context:
113
+ engine = load_model(
114
+ model_path=model_package_content["engine.plan"],
115
+ engine_host_code_allowed=engine_host_code_allowed,
116
+ )
117
+ execution_context = engine.create_execution_context()
118
+ inputs, outputs = get_engine_inputs_and_outputs(engine=engine)
119
+ if len(inputs) != 1:
120
+ raise CorruptedModelPackageError(
121
+ message=f"Implementation assume single model input, found: {len(inputs)}.",
122
+ help_url="https://todo",
123
+ )
124
+ if len(outputs) < 5:
125
+ raise CorruptedModelPackageError(
126
+ message=f"Implementation assume at least 5 model outputs, found: {len(outputs)}.",
127
+ help_url="https://todo",
128
+ )
129
+ output_tensors = [outputs[0], outputs[4]]
130
+ return cls(
131
+ engine=engine,
132
+ input_name=inputs[0],
133
+ output_tensors=output_tensors,
134
+ class_names=class_names,
135
+ inference_config=inference_config,
136
+ trt_config=trt_config,
137
+ device=device,
138
+ cuda_context=cuda_context,
139
+ execution_context=execution_context,
140
+ )
141
+
142
+ def __init__(
143
+ self,
144
+ engine: trt.ICudaEngine,
145
+ input_name: str,
146
+ output_tensors: List[str],
147
+ class_names: List[str],
148
+ inference_config: InferenceConfig,
149
+ trt_config: TRTConfig,
150
+ device: torch.device,
151
+ cuda_context: cuda.Context,
152
+ execution_context: trt.IExecutionContext,
153
+ ):
154
+ self._engine = engine
155
+ self._input_name = input_name
156
+ self._output_tensors = output_tensors
157
+ self._class_names = class_names
158
+ self._inference_config = inference_config
159
+ self._trt_config = trt_config
160
+ self._device = device
161
+ self._cuda_context = cuda_context
162
+ self._execution_context = execution_context
163
+ self._session_thread_lock = Lock()
164
+
165
+ @property
166
+ def class_names(self) -> List[str]:
167
+ return self._class_names
168
+
169
+ def pre_process(
170
+ self,
171
+ images: Union[torch.Tensor, List[torch.Tensor], np.ndarray, List[np.ndarray]],
172
+ input_color_format: Optional[ColorFormat] = None,
173
+ **kwargs,
174
+ ) -> Tuple[torch.Tensor, List[PreProcessingMetadata]]:
175
+ return pre_process_network_input(
176
+ images=images,
177
+ image_pre_processing=self._inference_config.image_pre_processing,
178
+ network_input=self._inference_config.network_input,
179
+ target_device=self._device,
180
+ input_color_format=input_color_format,
181
+ )
182
+
183
+ def forward(
184
+ self, pre_processed_images: torch.Tensor, **kwargs
185
+ ) -> Tuple[torch.Tensor, torch.Tensor]:
186
+ with self._session_thread_lock:
187
+ with use_cuda_context(context=self._cuda_context):
188
+ instances, protos = infer_from_trt_engine(
189
+ pre_processed_images=pre_processed_images,
190
+ trt_config=self._trt_config,
191
+ engine=self._engine,
192
+ context=self._execution_context,
193
+ device=self._device,
194
+ input_name=self._input_name,
195
+ outputs=self._output_tensors,
196
+ )
197
+ return instances, protos
198
+
199
+ def post_process(
200
+ self,
201
+ model_results: Tuple[torch.Tensor, torch.Tensor],
202
+ pre_processing_meta: List[PreProcessingMetadata],
203
+ conf_thresh: float = 0.25,
204
+ iou_thresh: float = 0.45,
205
+ max_detections: int = 100,
206
+ class_agnostic: bool = False,
207
+ **kwargs,
208
+ ) -> List[InstanceDetections]:
209
+ instances, protos = model_results
210
+ nms_results = run_nms_for_instance_segmentation(
211
+ output=instances.permute(0, 2, 1),
212
+ conf_thresh=conf_thresh,
213
+ iou_thresh=iou_thresh,
214
+ max_detections=max_detections,
215
+ class_agnostic=class_agnostic,
216
+ )
217
+ final_results = []
218
+ for image_bboxes, image_protos, image_meta in zip(
219
+ nms_results, protos, pre_processing_meta
220
+ ):
221
+ pre_processed_masks = preprocess_segmentation_masks(
222
+ protos=image_protos,
223
+ masks_in=image_bboxes[:, 6:],
224
+ )
225
+ cropped_masks = crop_masks_to_boxes(
226
+ image_bboxes[:, :4], pre_processed_masks
227
+ )
228
+ padding = (
229
+ image_meta.pad_left,
230
+ image_meta.pad_top,
231
+ image_meta.pad_right,
232
+ image_meta.pad_bottom,
233
+ )
234
+ aligned_boxes, aligned_masks = align_instance_segmentation_results(
235
+ image_bboxes=image_bboxes,
236
+ masks=cropped_masks,
237
+ padding=padding,
238
+ scale_height=image_meta.scale_height,
239
+ scale_width=image_meta.scale_width,
240
+ original_size=image_meta.original_size,
241
+ size_after_pre_processing=image_meta.size_after_pre_processing,
242
+ inference_size=image_meta.inference_size,
243
+ static_crop_offset=image_meta.static_crop_offset,
244
+ )
245
+ final_results.append(
246
+ InstanceDetections(
247
+ xyxy=aligned_boxes[:, :4].round().int(),
248
+ class_id=aligned_boxes[:, 5].int(),
249
+ confidence=aligned_boxes[:, 4],
250
+ mask=aligned_masks,
251
+ )
252
+ )
253
+ return final_results
File without changes
@@ -0,0 +1,181 @@
1
+ from threading import Lock
2
+ from typing import List, Optional, Tuple, Union
3
+
4
+ import numpy as np
5
+ import torch
6
+
7
+ from inference_models import ClassificationModel, ClassificationPrediction
8
+ from inference_models.configuration import DEFAULT_DEVICE
9
+ from inference_models.entities import ColorFormat
10
+ from inference_models.errors import (
11
+ CorruptedModelPackageError,
12
+ EnvironmentConfigurationError,
13
+ MissingDependencyError,
14
+ )
15
+ from inference_models.models.base.types import PreprocessedInputs
16
+ from inference_models.models.common.model_packages import get_model_package_contents
17
+ from inference_models.models.common.onnx import (
18
+ run_session_with_batch_size_limit,
19
+ set_execution_provider_defaults,
20
+ )
21
+ from inference_models.models.common.roboflow.model_packages import (
22
+ InferenceConfig,
23
+ ResizeMode,
24
+ parse_class_names_file,
25
+ parse_inference_config,
26
+ )
27
+ from inference_models.models.common.roboflow.pre_processing import (
28
+ pre_process_network_input,
29
+ )
30
+ from inference_models.utils.onnx_introspection import (
31
+ get_selected_onnx_execution_providers,
32
+ )
33
+
34
+ try:
35
+ import onnxruntime
36
+ except ImportError as import_error:
37
+ raise MissingDependencyError(
38
+ message=f"Could not import ResNet model with ONNX backend - this error means that some additional dependencies "
39
+ f"are not installed in the environment. If you run the `inference-models` library directly in your Python "
40
+ f"program, make sure the following extras of the package are installed: \n"
41
+ f"\t* `onnx-cpu` - when you wish to use library with CPU support only\n"
42
+ f"\t* `onnx-cu12` - for running on GPU with Cuda 12 installed\n"
43
+ f"\t* `onnx-cu118` - for running on GPU with Cuda 11.8 installed\n"
44
+ f"\t* `onnx-jp6-cu126` - for running on Jetson with Jetpack 6\n"
45
+ f"If you see this error using Roboflow infrastructure, make sure the service you use does support the model. "
46
+ f"You can also contact Roboflow to get support.",
47
+ help_url="https://todo",
48
+ ) from import_error
49
+
50
+
51
+ class YOLOv8ForClassificationOnnx(ClassificationModel[torch.Tensor, torch.Tensor]):
52
+
53
+ @classmethod
54
+ def from_pretrained(
55
+ cls,
56
+ model_name_or_path: str,
57
+ onnx_execution_providers: Optional[List[Union[str, tuple]]] = None,
58
+ default_onnx_trt_options: bool = True,
59
+ device: torch.device = DEFAULT_DEVICE,
60
+ **kwargs,
61
+ ) -> "YOLOv8ForClassificationOnnx":
62
+ if onnx_execution_providers is None:
63
+ onnx_execution_providers = get_selected_onnx_execution_providers()
64
+ if not onnx_execution_providers:
65
+ raise EnvironmentConfigurationError(
66
+ message=f"Could not initialize model - selected backend is ONNX which requires execution provider to "
67
+ f"be specified - explicitly in `from_pretrained(...)` method or via env variable "
68
+ f"`ONNXRUNTIME_EXECUTION_PROVIDERS`. If you run model locally - adjust your setup, otherwise "
69
+ f"contact the platform support.",
70
+ help_url="https://todo",
71
+ )
72
+ onnx_execution_providers = set_execution_provider_defaults(
73
+ providers=onnx_execution_providers,
74
+ model_package_path=model_name_or_path,
75
+ device=device,
76
+ default_onnx_trt_options=default_onnx_trt_options,
77
+ )
78
+ model_package_content = get_model_package_contents(
79
+ model_package_dir=model_name_or_path,
80
+ elements=[
81
+ "class_names.txt",
82
+ "inference_config.json",
83
+ "weights.onnx",
84
+ ],
85
+ )
86
+ class_names = parse_class_names_file(
87
+ class_names_path=model_package_content["class_names.txt"]
88
+ )
89
+ inference_config = parse_inference_config(
90
+ config_path=model_package_content["inference_config.json"],
91
+ allowed_resize_modes={
92
+ ResizeMode.STRETCH_TO,
93
+ ResizeMode.LETTERBOX,
94
+ ResizeMode.CENTER_CROP,
95
+ ResizeMode.LETTERBOX_REFLECT_EDGES,
96
+ },
97
+ )
98
+ if inference_config.post_processing.type != "softmax":
99
+ raise CorruptedModelPackageError(
100
+ message="Expected Softmax to be the post-processing",
101
+ help_url="https://todo",
102
+ )
103
+ session = onnxruntime.InferenceSession(
104
+ path_or_bytes=model_package_content["weights.onnx"],
105
+ providers=onnx_execution_providers,
106
+ )
107
+ input_shape = session.get_inputs()[0].shape
108
+ input_batch_size = input_shape[0]
109
+ if isinstance(input_batch_size, str):
110
+ input_batch_size = None
111
+ input_name = session.get_inputs()[0].name
112
+ return cls(
113
+ session=session,
114
+ input_name=input_name,
115
+ inference_config=inference_config,
116
+ class_names=class_names,
117
+ device=device,
118
+ input_batch_size=input_batch_size,
119
+ )
120
+
121
+ def __init__(
122
+ self,
123
+ session: onnxruntime.InferenceSession,
124
+ input_name: str,
125
+ inference_config: InferenceConfig,
126
+ class_names: List[str],
127
+ device: torch.device,
128
+ input_batch_size: Optional[int],
129
+ ):
130
+ self._session = session
131
+ self._input_name = input_name
132
+ self._inference_config = inference_config
133
+ self._class_names = class_names
134
+ self._device = device
135
+ self._input_batch_size = input_batch_size
136
+ self._session_thread_lock = Lock()
137
+
138
+ @property
139
+ def class_names(self) -> List[str]:
140
+ return self._class_names
141
+
142
+ def pre_process(
143
+ self,
144
+ images: Union[torch.Tensor, List[torch.Tensor], np.ndarray, List[np.ndarray]],
145
+ input_color_format: Optional[ColorFormat] = None,
146
+ image_size: Optional[Tuple[int, int]] = None,
147
+ **kwargs,
148
+ ) -> torch.Tensor:
149
+ return pre_process_network_input(
150
+ images=images,
151
+ image_pre_processing=self._inference_config.image_pre_processing,
152
+ network_input=self._inference_config.network_input,
153
+ target_device=self._device,
154
+ input_color_format=input_color_format,
155
+ image_size_wh=image_size,
156
+ )[0]
157
+
158
+ def forward(
159
+ self, pre_processed_images: PreprocessedInputs, **kwargs
160
+ ) -> torch.Tensor:
161
+ with self._session_thread_lock:
162
+ return run_session_with_batch_size_limit(
163
+ session=self._session,
164
+ inputs={self._input_name: pre_processed_images},
165
+ min_batch_size=self._input_batch_size,
166
+ max_batch_size=self._input_batch_size,
167
+ )[0]
168
+
169
+ def post_process(
170
+ self,
171
+ model_results: torch.Tensor,
172
+ **kwargs,
173
+ ) -> ClassificationPrediction:
174
+ if self._inference_config.post_processing.fused:
175
+ confidence = model_results
176
+ else:
177
+ confidence = torch.nn.functional.softmax(model_results, dim=-1)
178
+ return ClassificationPrediction(
179
+ class_id=confidence.argmax(dim=-1),
180
+ confidence=confidence,
181
+ )
@@ -0,0 +1,239 @@
1
+ from threading import Lock
2
+ from typing import List, Optional, Tuple, Union
3
+
4
+ import numpy as np
5
+ import torch
6
+
7
+ from inference_models import InstanceDetections, InstanceSegmentationModel
8
+ from inference_models.configuration import DEFAULT_DEVICE
9
+ from inference_models.entities import ColorFormat
10
+ from inference_models.errors import (
11
+ CorruptedModelPackageError,
12
+ EnvironmentConfigurationError,
13
+ MissingDependencyError,
14
+ )
15
+ from inference_models.models.common.model_packages import get_model_package_contents
16
+ from inference_models.models.common.onnx import (
17
+ run_session_with_batch_size_limit,
18
+ set_execution_provider_defaults,
19
+ )
20
+ from inference_models.models.common.roboflow.model_packages import (
21
+ InferenceConfig,
22
+ PreProcessingMetadata,
23
+ ResizeMode,
24
+ parse_class_names_file,
25
+ parse_inference_config,
26
+ )
27
+ from inference_models.models.common.roboflow.post_processing import (
28
+ align_instance_segmentation_results,
29
+ crop_masks_to_boxes,
30
+ post_process_nms_fused_model_output,
31
+ preprocess_segmentation_masks,
32
+ run_nms_for_instance_segmentation,
33
+ )
34
+ from inference_models.models.common.roboflow.pre_processing import (
35
+ pre_process_network_input,
36
+ )
37
+ from inference_models.utils.onnx_introspection import (
38
+ get_selected_onnx_execution_providers,
39
+ )
40
+
41
+ try:
42
+ import onnxruntime
43
+ except ImportError as import_error:
44
+ raise MissingDependencyError(
45
+ message=f"Could not import YOLOv8 model with ONNX backend - this error means that some additional dependencies "
46
+ f"are not installed in the environment. If you run the `inference-models` library directly in your Python "
47
+ f"program, make sure the following extras of the package are installed: \n"
48
+ f"\t* `onnx-cpu` - when you wish to use library with CPU support only\n"
49
+ f"\t* `onnx-cu12` - for running on GPU with Cuda 12 installed\n"
50
+ f"\t* `onnx-cu118` - for running on GPU with Cuda 11.8 installed\n"
51
+ f"\t* `onnx-jp6-cu126` - for running on Jetson with Jetpack 6\n"
52
+ f"If you see this error using Roboflow infrastructure, make sure the service you use does support the model. "
53
+ f"You can also contact Roboflow to get support.",
54
+ help_url="https://todo",
55
+ ) from import_error
56
+
57
+
58
+ class YOLOv8ForInstanceSegmentationOnnx(
59
+ InstanceSegmentationModel[
60
+ torch.Tensor, PreProcessingMetadata, Tuple[torch.Tensor, torch.Tensor]
61
+ ]
62
+ ):
63
+
64
+ @classmethod
65
+ def from_pretrained(
66
+ cls,
67
+ model_name_or_path: str,
68
+ onnx_execution_providers: Optional[List[Union[str, tuple]]] = None,
69
+ default_onnx_trt_options: bool = True,
70
+ device: torch.device = DEFAULT_DEVICE,
71
+ **kwargs,
72
+ ) -> "YOLOv8ForInstanceSegmentationOnnx":
73
+ if onnx_execution_providers is None:
74
+ onnx_execution_providers = get_selected_onnx_execution_providers()
75
+ if not onnx_execution_providers:
76
+ raise EnvironmentConfigurationError(
77
+ message=f"Could not initialize model - selected backend is ONNX which requires execution provider to "
78
+ f"be specified - explicitly in `from_pretrained(...)` method or via env variable "
79
+ f"`ONNXRUNTIME_EXECUTION_PROVIDERS`. If you run model locally - adjust your setup, otherwise "
80
+ f"contact the platform support.",
81
+ help_url="https://todo",
82
+ )
83
+ onnx_execution_providers = set_execution_provider_defaults(
84
+ providers=onnx_execution_providers,
85
+ model_package_path=model_name_or_path,
86
+ device=device,
87
+ default_onnx_trt_options=default_onnx_trt_options,
88
+ )
89
+ model_package_content = get_model_package_contents(
90
+ model_package_dir=model_name_or_path,
91
+ elements=[
92
+ "class_names.txt",
93
+ "inference_config.json",
94
+ "weights.onnx",
95
+ ],
96
+ )
97
+ class_names = parse_class_names_file(
98
+ class_names_path=model_package_content["class_names.txt"]
99
+ )
100
+ inference_config = parse_inference_config(
101
+ config_path=model_package_content["inference_config.json"],
102
+ allowed_resize_modes={
103
+ ResizeMode.STRETCH_TO,
104
+ ResizeMode.LETTERBOX,
105
+ ResizeMode.CENTER_CROP,
106
+ ResizeMode.LETTERBOX_REFLECT_EDGES,
107
+ },
108
+ )
109
+ if inference_config.post_processing.type != "nms":
110
+ raise CorruptedModelPackageError(
111
+ message="Expected NMS to be the post-processing",
112
+ help_url="https://todo",
113
+ )
114
+ session = onnxruntime.InferenceSession(
115
+ path_or_bytes=model_package_content["weights.onnx"],
116
+ providers=onnx_execution_providers,
117
+ )
118
+ input_batch_size = session.get_inputs()[0].shape[0]
119
+ if isinstance(input_batch_size, str):
120
+ input_batch_size = None
121
+ input_name = session.get_inputs()[0].name
122
+ return cls(
123
+ session=session,
124
+ input_name=input_name,
125
+ class_names=class_names,
126
+ inference_config=inference_config,
127
+ device=device,
128
+ input_batch_size=input_batch_size,
129
+ )
130
+
131
+ def __init__(
132
+ self,
133
+ session: onnxruntime.InferenceSession,
134
+ input_name: str,
135
+ inference_config: InferenceConfig,
136
+ class_names: List[str],
137
+ device: torch.device,
138
+ input_batch_size: Optional[int],
139
+ ):
140
+ self._session = session
141
+ self._input_name = input_name
142
+ self._inference_config = inference_config
143
+ self._class_names = class_names
144
+ self._device = device
145
+ self._input_batch_size = input_batch_size
146
+ self._session_thread_lock = Lock()
147
+
148
+ @property
149
+ def class_names(self) -> List[str]:
150
+ return self._class_names
151
+
152
+ def pre_process(
153
+ self,
154
+ images: Union[torch.Tensor, List[torch.Tensor], np.ndarray, List[np.ndarray]],
155
+ input_color_format: Optional[ColorFormat] = None,
156
+ image_size: Optional[Tuple[int, int]] = None,
157
+ **kwargs,
158
+ ) -> Tuple[torch.Tensor, List[PreProcessingMetadata]]:
159
+ return pre_process_network_input(
160
+ images=images,
161
+ image_pre_processing=self._inference_config.image_pre_processing,
162
+ network_input=self._inference_config.network_input,
163
+ target_device=self._device,
164
+ input_color_format=input_color_format,
165
+ image_size_wh=image_size,
166
+ )
167
+
168
+ def forward(
169
+ self, pre_processed_images: torch.Tensor, **kwargs
170
+ ) -> Tuple[torch.Tensor, torch.Tensor]:
171
+ with self._session_thread_lock:
172
+ instances, protos = run_session_with_batch_size_limit(
173
+ session=self._session,
174
+ inputs={self._input_name: pre_processed_images},
175
+ min_batch_size=self._input_batch_size,
176
+ max_batch_size=self._input_batch_size,
177
+ )
178
+ return instances, protos
179
+
180
+ def post_process(
181
+ self,
182
+ model_results: Tuple[torch.Tensor, torch.Tensor],
183
+ pre_processing_meta: List[PreProcessingMetadata],
184
+ conf_thresh: float = 0.25,
185
+ iou_thresh: float = 0.45,
186
+ max_detections: int = 100,
187
+ class_agnostic: bool = False,
188
+ **kwargs,
189
+ ) -> List[InstanceDetections]:
190
+ instances, protos = model_results
191
+ if self._inference_config.post_processing.fused:
192
+ nms_results = post_process_nms_fused_model_output(
193
+ output=instances, conf_thresh=conf_thresh
194
+ )
195
+ else:
196
+ nms_results = run_nms_for_instance_segmentation(
197
+ output=instances,
198
+ conf_thresh=conf_thresh,
199
+ iou_thresh=iou_thresh,
200
+ max_detections=max_detections,
201
+ class_agnostic=class_agnostic,
202
+ )
203
+ final_results = []
204
+ for image_bboxes, image_protos, image_meta in zip(
205
+ nms_results, protos, pre_processing_meta
206
+ ):
207
+ pre_processed_masks = preprocess_segmentation_masks(
208
+ protos=image_protos,
209
+ masks_in=image_bboxes[:, 6:],
210
+ )
211
+ cropped_masks = crop_masks_to_boxes(
212
+ image_bboxes[:, :4], pre_processed_masks
213
+ )
214
+ padding = (
215
+ image_meta.pad_left,
216
+ image_meta.pad_top,
217
+ image_meta.pad_right,
218
+ image_meta.pad_bottom,
219
+ )
220
+ aligned_boxes, aligned_masks = align_instance_segmentation_results(
221
+ image_bboxes=image_bboxes,
222
+ masks=cropped_masks,
223
+ padding=padding,
224
+ scale_height=image_meta.scale_height,
225
+ scale_width=image_meta.scale_width,
226
+ original_size=image_meta.original_size,
227
+ size_after_pre_processing=image_meta.size_after_pre_processing,
228
+ inference_size=image_meta.inference_size,
229
+ static_crop_offset=image_meta.static_crop_offset,
230
+ )
231
+ final_results.append(
232
+ InstanceDetections(
233
+ xyxy=aligned_boxes[:, :4].round().int(),
234
+ class_id=aligned_boxes[:, 5].int(),
235
+ confidence=aligned_boxes[:, 4],
236
+ mask=aligned_masks,
237
+ )
238
+ )
239
+ return final_results