supervisely 6.73.370__py3-none-any.whl → 6.73.372__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.
@@ -13,10 +13,11 @@ from supervisely._utils import get_valid_kwargs
13
13
  from supervisely.api.api import Api
14
14
  from supervisely.io.fs import get_file_name_with_ext
15
15
  from supervisely.nn.experiments import ExperimentInfo
16
+ from supervisely.nn.utils import RuntimeType
16
17
  from supervisely.sly_logger import logger
17
18
 
18
19
 
19
- def get_runtime(runtime: str):
20
+ def get_runtime(runtime: Optional[str] = None):
20
21
  from supervisely.nn.utils import RuntimeType
21
22
 
22
23
  if runtime is None:
@@ -554,7 +555,10 @@ class DeployApi:
554
555
  exclude=["self", "module_id", "workspace_id", "agent_id"],
555
556
  )
556
557
  task_info = self._api.task.start(
557
- agent_id=agent_id, module_id=module_id, workspace_id=workspace_id, **kwargs
558
+ agent_id=agent_id,
559
+ module_id=module_id,
560
+ workspace_id=workspace_id,
561
+ **kwargs,
558
562
  )
559
563
  ready = self._api.app.wait_until_ready_for_api_calls(
560
564
  task_info["id"], _attempts, _attempt_delay_sec
@@ -691,7 +695,7 @@ class DeployApi:
691
695
  artifacts_dir: str,
692
696
  checkpoint_name: str,
693
697
  device: str,
694
- runtime: str,
698
+ runtime: Optional[str] = None,
695
699
  with_module: bool = True,
696
700
  ):
697
701
  from supervisely.nn.experiments import get_experiment_info_by_artifacts_dir
@@ -723,10 +727,25 @@ class DeployApi:
723
727
 
724
728
  checkpoint = None
725
729
  if checkpoint_name is not None:
726
- for checkpoint_path in experiment_info.checkpoints:
727
- if get_file_name_with_ext(checkpoint_path) == checkpoint_name:
728
- checkpoint = get_file_name_with_ext(checkpoint_path)
729
- break
730
+ if checkpoint_name.endswith(".pt") or checkpoint_name.endswith(".pth"):
731
+ for checkpoint_path in experiment_info.checkpoints:
732
+ if get_file_name_with_ext(checkpoint_path) == checkpoint_name:
733
+ checkpoint = get_file_name_with_ext(checkpoint_path)
734
+ break
735
+ elif checkpoint_name.endswith(".onnx"):
736
+ checkpoint_path = experiment_info.export.get("ONNXRuntime")
737
+ if checkpoint_path is None:
738
+ raise ValueError(f"ONNXRuntime export not found in: '{artifacts_dir}'.")
739
+ elif checkpoint_name.endswith(".engine"):
740
+ checkpoint_path = experiment_info.export.get("TensorRT")
741
+ if checkpoint_path is None:
742
+ raise ValueError(f"TensorRT export not found in: '{artifacts_dir}'.")
743
+ else:
744
+ raise ValueError(
745
+ f"Unknown checkpoint format: '{checkpoint_name}'. Expected formats: '.pt', '.pth', '.onnx' or '.engine'"
746
+ )
747
+
748
+ checkpoint = get_file_name_with_ext(checkpoint_path)
730
749
  if checkpoint is None:
731
750
  raise ValueError(f"Provided checkpoint '{checkpoint_name}' not found")
732
751
  else:
@@ -736,12 +755,15 @@ class DeployApi:
736
755
  model_info_dict = asdict(experiment_info)
737
756
  model_info_dict["artifacts_dir"] = artifacts_dir
738
757
  checkpoint_name = checkpoint
758
+ checkpoints_dir = self._get_checkpoints_dir(checkpoint_name)
759
+ checkpoint_path = f"/{artifacts_dir.strip('/')}/{checkpoints_dir}/{checkpoint_name}"
760
+ if runtime is None:
761
+ runtime = self._set_auto_runtime_by_checkpoint(checkpoint_path)
762
+
739
763
  deploy_params = {
740
764
  "device": device,
741
765
  "model_source": ModelSource.CUSTOM,
742
- "model_files": {
743
- "checkpoint": f"/{artifacts_dir.strip('/')}/checkpoints/{checkpoint_name}"
744
- },
766
+ "model_files": {"checkpoint": checkpoint_path},
745
767
  "model_info": model_info_dict,
746
768
  "runtime": runtime,
747
769
  }
@@ -752,6 +774,16 @@ class DeployApi:
752
774
  logger.debug(f"Config file added: {experiment_info.artifacts_dir}{config}")
753
775
  return module_id, serve_app_name, deploy_params
754
776
 
777
+ def _set_auto_runtime_by_checkpoint(self, checkpoint_path: str) -> str:
778
+ if checkpoint_path.endswith(".pt") or checkpoint_path.endswith(".pth"):
779
+ return RuntimeType.PYTORCH
780
+ elif checkpoint_path.endswith(".onnx"):
781
+ return RuntimeType.ONNXRUNTIME
782
+ elif checkpoint_path.endswith(".engine"):
783
+ return RuntimeType.TENSORRT
784
+ else:
785
+ raise ValueError(f"Unknown checkpoint format: '{checkpoint_path}'")
786
+
755
787
  def wait(self, model_id, target: Literal["started", "deployed"] = "started", timeout=5 * 60):
756
788
  t = time.monotonic()
757
789
  method = "is_alive" if target == "started" else "is_ready"
@@ -764,13 +796,24 @@ class DeployApi:
764
796
  raise ValueError(f"Path must start with '/'")
765
797
 
766
798
  if model.startswith("/experiments"):
767
- try:
768
- artifacts_dir, checkpoint_name = model.split("/checkpoints/")
769
- return artifacts_dir, checkpoint_name
770
- except:
771
- raise ValueError(
772
- "Bad format of checkpoint path. Expected format: '/artifacts_dir/checkpoints/checkpoint_name'"
773
- )
799
+ if model.endswith(".pt") or model.endswith(".pth"):
800
+ try:
801
+ artifacts_dir, checkpoint_name = model.split("/checkpoints/")
802
+ return artifacts_dir, checkpoint_name
803
+ except:
804
+ raise ValueError(
805
+ "Bad format of checkpoint path. Expected format: '/artifacts_dir/checkpoints/checkpoint_name'"
806
+ )
807
+ elif model.endswith(".onnx") or model.endswith(".engine"):
808
+ try:
809
+ artifacts_dir, checkpoint_name = model.split("/export/")
810
+ return artifacts_dir, checkpoint_name
811
+ except:
812
+ raise ValueError(
813
+ "Bad format of checkpoint path. Expected format: '/artifacts_dir/export/checkpoint_name'"
814
+ )
815
+ else:
816
+ raise ValueError(f"Unknown model format: '{get_file_name_with_ext(model)}'")
774
817
 
775
818
  framework_cls = self._get_framework_by_path(model)
776
819
  if framework_cls is None:
@@ -786,6 +829,14 @@ class DeployApi:
786
829
  artifacts_dir = checkpoints_dir
787
830
  return artifacts_dir, checkpoint_name
788
831
 
832
+ def _get_checkpoints_dir(self, checkpoint_name: str) -> str:
833
+ if checkpoint_name.endswith(".pt") or checkpoint_name.endswith(".pth"):
834
+ return "checkpoints"
835
+ elif checkpoint_name.endswith(".onnx") or checkpoint_name.endswith(".engine"):
836
+ return "export"
837
+ else:
838
+ raise ValueError(f"Unknown checkpoint format: '{checkpoint_name}'")
839
+
789
840
  def _get_framework_by_path(self, path: str):
790
841
  from supervisely.nn.artifacts import (
791
842
  RITM,
@@ -3,12 +3,17 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
- from typing import Dict, List
6
+ from typing import TYPE_CHECKING, Dict, List
7
7
 
8
8
  import supervisely.io.env as sly_env
9
9
  import supervisely.io.env as env
10
10
  from supervisely.sly_logger import logger
11
11
 
12
+ if TYPE_CHECKING:
13
+ from supervisely.api.api import Api
14
+ from supervisely.nn.experiments import ExperimentInfo
15
+ from supervisely.nn.model.model_api import ModelAPI
16
+
12
17
 
13
18
  class NeuralNetworkApi:
14
19
  """
@@ -30,7 +35,7 @@ class NeuralNetworkApi:
30
35
  workspace_id: int = None,
31
36
  agent_id: int = None,
32
37
  **kwargs,
33
- ) -> "ModelAPI":
38
+ ) -> ModelAPI:
34
39
  """
35
40
  Deploy a pretrained model or a custom model checkpoint in Supervisely platform.
36
41
  This method will start a new Serving App in Supervisely, deploy a given model, and return a `ModelAPI` object for running predictions and managing the model.
@@ -214,7 +219,7 @@ class NeuralNetworkApi:
214
219
  )
215
220
  return result
216
221
 
217
- def get_experiment_info(self, task_id: int) -> "ExperimentInfo":
222
+ def get_experiment_info(self, task_id: int) -> ExperimentInfo:
218
223
  """
219
224
  Returns the experiment info of a finished training task by its task_id.
220
225
 
@@ -237,7 +242,7 @@ class NeuralNetworkApi:
237
242
  def connect(
238
243
  self,
239
244
  task_id: int,
240
- ) -> "ModelAPI":
245
+ ) -> ModelAPI:
241
246
  """
242
247
  Connect to a running Serving App by its `task_id`. This allows you to make predictions and control the model state via API.
243
248
 
@@ -36,6 +36,7 @@ from supervisely.io.fs import (
36
36
  )
37
37
  from supervisely.pointcloud.pointcloud import is_valid_format
38
38
  from supervisely.sly_logger import logger
39
+ from supervisely.imaging import image as sly_image
39
40
 
40
41
 
41
42
  class PointcloudInfo(NamedTuple):
@@ -420,7 +421,7 @@ class PointcloudApi(RemoveableBulkModuleApi):
420
421
  convert_json_info_cb=lambda x: x,
421
422
  )
422
423
 
423
- def download_related_image(self, id: int, path: str) -> Response:
424
+ def download_related_image(self, id: int, path: str = None) -> Response:
424
425
  """
425
426
  Download a related context image from Supervisely to local directory by image id.
426
427
 
@@ -454,11 +455,16 @@ class PointcloudApi(RemoveableBulkModuleApi):
454
455
  {ApiField.ID: id},
455
456
  stream=True,
456
457
  )
457
- ensure_base_path(path)
458
- with open(path, "wb") as fd:
459
- for chunk in response.iter_content(chunk_size=1024 * 1024):
460
- fd.write(chunk)
461
- return response
458
+
459
+ if path:
460
+ ensure_base_path(path)
461
+ with open(path, "wb") as fd:
462
+ for chunk in response.iter_content(chunk_size=1024 * 1024):
463
+ fd.write(chunk)
464
+ return response
465
+ else:
466
+ related_image = sly_image.read_bytes(response.content, False)
467
+ return related_image
462
468
 
463
469
  # @TODO: copypaste from video_api
464
470
  def upload_hash(
@@ -207,7 +207,8 @@ def _fetch_experiment_data(api, team_id: int, experiment_path: str) -> Union[Exp
207
207
  f"Missing required fields: {missing_required_fields} for '{experiment_path}'. Skipping."
208
208
  )
209
209
  return None
210
- return ExperimentInfo(**{k: v for k, v in response_json.items() if k in required_fields})
210
+ all_fields = required_fields | optional_fields
211
+ return ExperimentInfo(**{k: v for k, v in response_json.items() if k in all_fields})
211
212
  except requests.exceptions.RequestException as e:
212
213
  logger.debug(f"Request failed for '{experiment_path}': {e}")
213
214
  except JSONDecodeError as e:
@@ -233,14 +233,17 @@ class InferenceImageCache:
233
233
  with self._lock:
234
234
  self._cache.clear(False)
235
235
 
236
- def download_image(self, api: sly.Api, image_id: int):
236
+ def download_image(self, api: sly.Api, image_id: int, related: bool = False):
237
237
  name = self._image_name(image_id)
238
238
  self._wait_if_in_queue(name, api.logger)
239
239
 
240
240
  if name not in self._cache:
241
241
  self._load_queue.set(name, image_id)
242
242
  api.logger.debug(f"Add image #{image_id} to cache")
243
- img = api.image.download_np(image_id)
243
+ if not related:
244
+ img = api.image.download_np(image_id)
245
+ else:
246
+ img = api.pointcloud.download_related_image(image_id)
244
247
  self._add_to_cache(name, img)
245
248
  return img
246
249
 
@@ -611,9 +611,20 @@ class Inference:
611
611
  deploy_params = {}
612
612
  selected_model = None
613
613
  for model in self.pretrained_models:
614
- if model["meta"]["model_name"].lower() == model_name.lower():
615
- selected_model = model
616
- break
614
+ model_meta = model.get("meta")
615
+ if model_meta is not None:
616
+ model_name = model_meta.get("model_name")
617
+ if model_name is not None:
618
+ if model_name.lower() == model_name.lower():
619
+ selected_model = model
620
+ break
621
+ else:
622
+ model_name = model.get("model_name")
623
+ if model_name is not None:
624
+ if model_name.lower() == model_name.lower():
625
+ selected_model = model
626
+ break
627
+
617
628
  if selected_model is None:
618
629
  raise ValueError(f"Model {model_name} not found in models.json of serving app")
619
630
  deploy_params["model_files"] = selected_model["meta"]["model_files"]
@@ -657,11 +668,11 @@ class Inference:
657
668
  export = {}
658
669
  export_model = export.get(deploy_params["runtime"], None)
659
670
  if export_model is not None:
660
- if sly_fs.get_file_name(export_model) == sly_fs.get_file_name(
661
- deploy_params["model_files"]["checkpoint"]
662
- ):
671
+ checkpoint = deploy_params["model_files"]["checkpoint"]
672
+ artifacts_dir = deploy_params["model_info"]["artifacts_dir"].rstrip("/")
673
+ if sly_fs.get_file_name(export_model) == sly_fs.get_file_name(checkpoint):
663
674
  deploy_params["model_files"]["checkpoint"] = (
664
- deploy_params["model_info"]["artifacts_dir"] + export_model
675
+ artifacts_dir + "/" + export_model
665
676
  )
666
677
  logger.info(f"Found model checkpoint for '{deploy_params['runtime']}'")
667
678
  return self._download_custom_model(deploy_params["model_files"], log_progress)
@@ -2610,7 +2621,7 @@ class Inference:
2610
2621
  inference_request.set_stage(InferenceRequest.Stage.PREPARING, 0, file.size)
2611
2622
 
2612
2623
  img_bytes = b""
2613
- while buf := file.read(64 * 1024 * 1024):
2624
+ while buf := file.file.read(64 * 1024 * 1024):
2614
2625
  img_bytes += buf
2615
2626
  inference_request.done(len(buf))
2616
2627
 
@@ -52,6 +52,10 @@ def download_image_from_context(
52
52
  return api.video.frame.download_np(
53
53
  context["video"]["video_id"], context["video"]["frame_index"]
54
54
  )
55
+ elif "pcd_related_image_id" in context:
56
+ if cache_load_img is not None:
57
+ return cache_load_img(api, context["pcd_related_image_id"], related=True)
58
+ return api.pointcloud.download_related_image(context["pcd_related_image_id"])
55
59
  else:
56
60
  raise Exception("Project type is not supported")
57
61
 
@@ -110,6 +114,8 @@ def get_hash_from_context(context: dict):
110
114
  return "_".join(map(str, [volume_id, slice_index, plane, window_center, window_width]))
111
115
  elif "video" in context:
112
116
  return "_".join(map(str, [context["video"]["video_id"], context["video"]["frame_index"]]))
117
+ elif "pcd_related_image_id" in context:
118
+ return str(context["pcd_related_image_id"])
113
119
  else:
114
120
  raise Exception("Project type is not supported")
115
121
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: supervisely
3
- Version: 6.73.370
3
+ Version: 6.73.372
4
4
  Summary: Supervisely Python SDK.
5
5
  Home-page: https://github.com/supervisely/supervisely
6
6
  Author: Supervisely
@@ -55,11 +55,11 @@ supervisely/api/entity_annotation/figure_api.py,sha256=rmsE3L_JfqN94sLN637pQ0syi
55
55
  supervisely/api/entity_annotation/object_api.py,sha256=gbcNvN_KY6G80Me8fHKQgryc2Co7VU_kfFd1GYILZ4E,8875
56
56
  supervisely/api/entity_annotation/tag_api.py,sha256=h19YsJzJLDp0VIicQzoYCRyVhY149KY7pUysb4XX0RI,11114
57
57
  supervisely/api/nn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
- supervisely/api/nn/deploy_api.py,sha256=V7zWO8yoroFDifIqLIFYmZA72tLQriH5kYAhN0-50co,34326
59
- supervisely/api/nn/neural_network_api.py,sha256=vZyYBaKQzLJX9G3SAt09LmsxNLC8h88oYJ9b_PACzp0,10466
58
+ supervisely/api/nn/deploy_api.py,sha256=fA5yk3-Q66BL821iu68HpsGWWO2qHXCcWTmrXoHE4gE,37008
59
+ supervisely/api/nn/neural_network_api.py,sha256=dVETXQzMpmrLe3S5-jUx5Hw-rAjX8wdS_2f3XbQa3ic,10648
60
60
  supervisely/api/pointcloud/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  supervisely/api/pointcloud/pointcloud_annotation_api.py,sha256=xIXqCu0rKYsGt5ezh2EFT2utwsVrr2Xo-MOWUCnbvXc,11259
62
- supervisely/api/pointcloud/pointcloud_api.py,sha256=PKfgh-ssK9W1wLXSEuFgC36DSMoZAzo1cY_bu-inV-8,53280
62
+ supervisely/api/pointcloud/pointcloud_api.py,sha256=Gii6INYqo5f3EUCkI14VMi2XuaxbRHEaqSb_HHmJJTA,53497
63
63
  supervisely/api/pointcloud/pointcloud_episode_annotation_api.py,sha256=zmDWDkRzUSfHKX65qDVrc44kNyYjfvItSwYmsERJ_8g,7012
64
64
  supervisely/api/pointcloud/pointcloud_episode_api.py,sha256=xg1zRKONV9ly0-B72V1dR6OMPFIw35bujazuEdrPGTQ,7922
65
65
  supervisely/api/pointcloud/pointcloud_episode_object_api.py,sha256=k2_wV0EVPo9vxSTVe1qOvqVOMSVE6zGDSkfR6TRNsKs,691
@@ -742,7 +742,7 @@ supervisely/metric/pixel_accuracy.py,sha256=qjtxInOTkGDwPeLUnjBdzOrVRT3V6kGGOWjB
742
742
  supervisely/metric/precision_recall_metric.py,sha256=4AQCkcB84mpYQS94yJ-wkG1LBuXlQf3X_tI9f67vtR8,3426
743
743
  supervisely/metric/projects_applier.py,sha256=ORtgLQHYtNi4KYsSGaGPPWiZPexTJF9IWqX_RuLRxPk,3415
744
744
  supervisely/nn/__init__.py,sha256=ZGCDjx_cGIW8CxIWNCzVDRVfAzt7QzlkcvKvLBE8wMc,669
745
- supervisely/nn/experiments.py,sha256=6jCVGQTd6CIf1M3Ef_Vo4NvxSBJQiQVoXoWcp0w0hiI,9685
745
+ supervisely/nn/experiments.py,sha256=hJNQtvAuxZgo8BDlp41_WpJcGVUCeYqQCkyOQi5oN1Q,9735
746
746
  supervisely/nn/prediction_dto.py,sha256=oi146DJpUUBDbR-b-vYkL5WAhCZQYOGomqBDEQGbPdY,2700
747
747
  supervisely/nn/task_type.py,sha256=UJvSJ4L3I08j_e6sU6Ptu7kS5p1H09rfhfoDUSZ2iys,522
748
748
  supervisely/nn/utils.py,sha256=WoEidpLo5__R6eXsvEFH7VRxb4MtXCr9H-kchg25FDY,2965
@@ -887,8 +887,8 @@ supervisely/nn/benchmark/visualization/widgets/sidebar/sidebar.py,sha256=tKPURRS
887
887
  supervisely/nn/benchmark/visualization/widgets/table/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
888
888
  supervisely/nn/benchmark/visualization/widgets/table/table.py,sha256=atmDnF1Af6qLQBUjLhK18RMDKAYlxnsuVHMSEa5a-e8,4319
889
889
  supervisely/nn/inference/__init__.py,sha256=QFukX2ip-U7263aEPCF_UCFwj6EujbMnsgrXp5Bbt8I,1623
890
- supervisely/nn/inference/cache.py,sha256=rc_CRlCuTCzLDtcl1paTJib7ALTer0ge9o32WtoUMkY,34795
891
- supervisely/nn/inference/inference.py,sha256=gq0yvMiFZ2FfJvvEmw7PRHa0GikCwRX9S2CE_0fuGX4,177798
890
+ supervisely/nn/inference/cache.py,sha256=yqVPIWzhIDRHwrCIpdm-gPxUM2rH8BD98omF659RElw,34938
891
+ supervisely/nn/inference/inference.py,sha256=xRlxOm8ep_Zha97NpRszrxVdg5xDregpShKkZNNTq0g,178340
892
892
  supervisely/nn/inference/inference_request.py,sha256=y6yw0vbaRRcEBS27nq3y0sL6Gmq2qLA_Bm0GrnJGegE,14267
893
893
  supervisely/nn/inference/session.py,sha256=dIg2F-OBl68pUzcmtmcI0YQIp1WWNnrJTVMjwFN91Q4,35824
894
894
  supervisely/nn/inference/uploader.py,sha256=21a9coOimCHhEqAbV-llZWcp12847DEMoQp3N16bpK0,5425
@@ -906,7 +906,7 @@ supervisely/nn/inference/instance_segmentation/dashboard/main_ui.py,sha256=_M46q
906
906
  supervisely/nn/inference/instance_segmentation/dashboard/preview.py,sha256=uwUDlJzDLgKlGOn5CovCh03WAijlx04iyPs00qbsUpU,847
907
907
  supervisely/nn/inference/instance_segmentation/dashboard/preview_image.py,sha256=wXfPg7bAT2xXPlnl2zywkx4MJ66myl5KBGzrvoyS8zQ,279
908
908
  supervisely/nn/inference/interactive_segmentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
909
- supervisely/nn/inference/interactive_segmentation/functional.py,sha256=m2eL7e-yCVPsg9D26YtmWCnJd7t3Y-974b0PnTvTSBQ,4554
909
+ supervisely/nn/inference/interactive_segmentation/functional.py,sha256=3GaeeOemji_ym0-C2mwj6SVEhnPkq7v3KCc4npw3iZ8,4905
910
910
  supervisely/nn/inference/interactive_segmentation/interactive_segmentation.py,sha256=vX1H9eaR8oRfMecQxJfpu6hGxbtf8bEESGJp_fPmfWc,20402
911
911
  supervisely/nn/inference/object_detection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
912
912
  supervisely/nn/inference/object_detection/object_detection.py,sha256=Ki4updsAid1KOI2ahcdVVZ9lzdyRcYKyuQyzSz_9sXQ,1746
@@ -1097,9 +1097,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
1097
1097
  supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
1098
1098
  supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
1099
1099
  supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
1100
- supervisely-6.73.370.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1101
- supervisely-6.73.370.dist-info/METADATA,sha256=fcZ2RfmecBVHdsVjrjwfDZ4Uv2z21M0Y-jJYbnaiFRE,35154
1102
- supervisely-6.73.370.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1103
- supervisely-6.73.370.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1104
- supervisely-6.73.370.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1105
- supervisely-6.73.370.dist-info/RECORD,,
1100
+ supervisely-6.73.372.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1101
+ supervisely-6.73.372.dist-info/METADATA,sha256=XPL2_lh1M9AS2npHgR0X2gs4DTWhMwvycMQuLo3wZws,35154
1102
+ supervisely-6.73.372.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1103
+ supervisely-6.73.372.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1104
+ supervisely-6.73.372.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1105
+ supervisely-6.73.372.dist-info/RECORD,,