supervisely 6.73.326__py3-none-any.whl → 6.73.328__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 (27) hide show
  1. supervisely/annotation/annotation.py +1 -1
  2. supervisely/annotation/tag_meta.py +1 -1
  3. supervisely/api/api.py +8 -5
  4. supervisely/app/widgets/pretrained_models_selector/pretrained_models_selector.py +17 -14
  5. supervisely/app/widgets/pretrained_models_selector/template.html +2 -1
  6. supervisely/convert/image/yolo/yolo_helper.py +95 -25
  7. supervisely/io/env.py +15 -0
  8. supervisely/nn/inference/gui/serving_gui_template.py +2 -3
  9. supervisely/nn/inference/inference.py +33 -25
  10. supervisely/nn/training/gui/classes_selector.py +24 -19
  11. supervisely/nn/training/gui/gui.py +90 -37
  12. supervisely/nn/training/gui/hyperparameters_selector.py +32 -15
  13. supervisely/nn/training/gui/input_selector.py +13 -2
  14. supervisely/nn/training/gui/model_selector.py +16 -6
  15. supervisely/nn/training/gui/train_val_splits_selector.py +10 -1
  16. supervisely/nn/training/gui/training_artifacts.py +23 -4
  17. supervisely/nn/training/gui/training_logs.py +15 -3
  18. supervisely/nn/training/gui/training_process.py +14 -13
  19. supervisely/nn/training/train_app.py +59 -24
  20. supervisely/nn/utils.py +9 -0
  21. supervisely/project/project.py +16 -3
  22. {supervisely-6.73.326.dist-info → supervisely-6.73.328.dist-info}/METADATA +1 -1
  23. {supervisely-6.73.326.dist-info → supervisely-6.73.328.dist-info}/RECORD +27 -27
  24. {supervisely-6.73.326.dist-info → supervisely-6.73.328.dist-info}/WHEEL +1 -1
  25. {supervisely-6.73.326.dist-info → supervisely-6.73.328.dist-info}/LICENSE +0 -0
  26. {supervisely-6.73.326.dist-info → supervisely-6.73.328.dist-info}/entry_points.txt +0 -0
  27. {supervisely-6.73.326.dist-info → supervisely-6.73.328.dist-info}/top_level.txt +0 -0
@@ -1,16 +1,12 @@
1
1
  from typing import Any, Dict
2
2
 
3
- from supervisely import Api
4
3
  from supervisely.app.widgets import (
5
4
  Button,
6
5
  Card,
7
6
  Container,
8
- DoneLabel,
9
7
  Empty,
10
8
  Field,
11
- FolderThumbnail,
12
9
  Input,
13
- ReportThumbnail,
14
10
  SelectCudaDevice,
15
11
  Text,
16
12
  )
@@ -19,14 +15,25 @@ from supervisely.app.widgets import (
19
15
  class TrainingProcess:
20
16
  title = "Training Process"
21
17
  description = "Manage training process"
22
- lock_message = "Select hyperparametrs to unlock"
18
+ lock_message = "Select hyperparameters to unlock"
23
19
 
24
20
  def __init__(self, app_options: Dict[str, Any]):
21
+ # Initialize widgets to None
22
+ self.select_device = None
23
+ self.select_device_field = None
24
+ self.experiment_name_input = None
25
+ self.experiment_name_field = None
26
+ self.start_button = None
27
+ self.stop_button = None
28
+ self.validator_text = None
29
+ self.container = None
30
+ self.card = None
31
+ # -------------------------------- #
32
+
25
33
  self.display_widgets = []
26
34
  self.app_options = app_options
27
35
 
28
36
  # GUI Components
29
- # Optional Select CUDA device
30
37
  if self.app_options.get("device_selector", False):
31
38
  self.select_device = SelectCudaDevice()
32
39
  self.select_device_field = Field(
@@ -35,7 +42,6 @@ class TrainingProcess:
35
42
  content=self.select_device,
36
43
  )
37
44
  self.display_widgets.extend([self.select_device_field])
38
- # -------------------------------- #
39
45
 
40
46
  self.experiment_name_input = Input("Enter experiment name")
41
47
  self.experiment_name_field = Field(
@@ -59,13 +65,8 @@ class TrainingProcess:
59
65
  self.validator_text.hide()
60
66
 
61
67
  self.display_widgets.extend(
62
- [
63
- self.experiment_name_field,
64
- button_container,
65
- self.validator_text,
66
- ]
68
+ [self.experiment_name_field, button_container, self.validator_text]
67
69
  )
68
- # -------------------------------- #
69
70
 
70
71
  self.container = Container(self.display_widgets)
71
72
  self.card = Card(
@@ -8,7 +8,7 @@ training workflows in a Supervisely application.
8
8
  import shutil
9
9
  import subprocess
10
10
  from datetime import datetime
11
- from os import getcwd, listdir
11
+ from os import getcwd, listdir, walk
12
12
  from os.path import basename, exists, expanduser, isdir, isfile, join
13
13
  from typing import Any, Dict, List, Literal, Optional, Union
14
14
  from urllib.request import urlopen
@@ -56,7 +56,7 @@ from supervisely.nn.inference.inference import Inference
56
56
  from supervisely.nn.task_type import TaskType
57
57
  from supervisely.nn.training.gui.gui import TrainGUI
58
58
  from supervisely.nn.training.loggers import setup_train_logger, train_logger
59
- from supervisely.nn.utils import ModelSource
59
+ from supervisely.nn.utils import ModelSource, _get_model_name
60
60
  from supervisely.output import set_directory
61
61
  from supervisely.project.download import (
62
62
  copy_from_cache,
@@ -135,6 +135,7 @@ class TrainApp:
135
135
  self._hyperparameters = self._load_hyperparameters(hyperparameters)
136
136
  self._app_options = self._load_app_options(app_options)
137
137
  self._inference_class = None
138
+ self._is_inference_class_regirested = False
138
139
  # ----------------------------------------- #
139
140
 
140
141
  # Directories
@@ -174,6 +175,7 @@ class TrainApp:
174
175
  self.gui: TrainGUI = TrainGUI(
175
176
  self.framework_name, self._models, self._hyperparameters, self._app_options
176
177
  )
178
+
177
179
  self.app = Application(layout=self.gui.layout)
178
180
  self._server = self.app.get_server()
179
181
  self._train_func = None
@@ -345,6 +347,16 @@ class TrainApp:
345
347
  """
346
348
  return self.gui.model_selector.get_model_info()
347
349
 
350
+ @property
351
+ def task_type(self) -> TaskType:
352
+ """
353
+ Returns the task type of the model.
354
+
355
+ :return: Task type.
356
+ :rtype: TaskType
357
+ """
358
+ return self.gui.model_selector.get_selected_task_type()
359
+
348
360
  @property
349
361
  def device(self) -> str:
350
362
  """
@@ -359,9 +371,9 @@ class TrainApp:
359
371
  @property
360
372
  def classes(self) -> List[str]:
361
373
  """
362
- Returns the selected classes for training.
374
+ Returns the selected classes names for training.
363
375
 
364
- :return: List of selected classes.
376
+ :return: List of selected classes names.
365
377
  :rtype: List[str]
366
378
  """
367
379
  selected_classes = set(self.gui.classes_selector.get_selected_classes())
@@ -556,7 +568,10 @@ class TrainApp:
556
568
  model_meta,
557
569
  gt_project_id,
558
570
  )
559
- evaluation_report_link = abs_url(f"/model-benchmark?id={str(mb_eval_report_id)}")
571
+ if mb_eval_report_id is not None:
572
+ evaluation_report_link = abs_url(
573
+ f"/model-benchmark?id={str(mb_eval_report_id)}"
574
+ )
560
575
  except Exception as e:
561
576
  logger.error(f"Model benchmark failed: {e}")
562
577
 
@@ -596,7 +611,7 @@ class TrainApp:
596
611
  self._workflow_output(remote_dir, file_info, mb_eval_lnk_file_info, mb_eval_report_id)
597
612
 
598
613
  def register_inference_class(
599
- self, inference_class: Inference, inference_settings: dict = None
614
+ self, inference_class: Inference, inference_settings: Union[str, dict] = None
600
615
  ) -> None:
601
616
  """
602
617
  Registers an inference class for the training application to do model benchmarking.
@@ -606,8 +621,19 @@ class TrainApp:
606
621
  :param inference_settings: Settings for the inference class.
607
622
  :type inference_settings: dict
608
623
  """
624
+ # if not self.is_model_benchmark_enabled:
625
+ # raise ValueError(
626
+ # "Enable 'model_benchmark' in app_options.yaml to register an inference class."
627
+ # )
628
+
629
+ self._is_inference_class_regirested = True
609
630
  self._inference_class = inference_class
610
- self._inference_settings = inference_settings
631
+ self._inference_settings = None
632
+ if isinstance(inference_settings, str):
633
+ with open(inference_settings, "r") as file:
634
+ self._inference_settings = yaml.safe_load(file)
635
+ else:
636
+ self._inference_settings = inference_settings
611
637
 
612
638
  def get_app_state(self, experiment_info: dict = None) -> dict:
613
639
  """
@@ -616,7 +642,6 @@ class TrainApp:
616
642
  :return: Application state.
617
643
  :rtype: dict
618
644
  """
619
- input_data = {"project_id": self.project_id}
620
645
  train_val_splits = self._get_train_val_splits_for_app_state()
621
646
  model = self._get_model_config_for_app_state(experiment_info)
622
647
 
@@ -629,7 +654,6 @@ class TrainApp:
629
654
  }
630
655
 
631
656
  app_state = {
632
- "input": input_data,
633
657
  "train_val_split": train_val_splits,
634
658
  "classes": self.classes,
635
659
  "model": model,
@@ -778,6 +802,7 @@ class TrainApp:
778
802
  if not self.gui.input_selector.get_cache_value() or is_development():
779
803
  self._download_no_cache(dataset_infos, total_images)
780
804
  self.sly_project = Project(self.project_dir, OpenMode.READ)
805
+ self.sly_project.remove_classes_except(self.project_dir, self.classes, True)
781
806
  return
782
807
 
783
808
  try:
@@ -792,6 +817,7 @@ class TrainApp:
792
817
  self._download_no_cache(dataset_infos, total_images)
793
818
  finally:
794
819
  self.sly_project = Project(self.project_dir, OpenMode.READ)
820
+ self.sly_project.remove_classes_except(self.project_dir, self.classes, True)
795
821
  logger.info(f"Project downloaded successfully to: '{self.project_dir}'")
796
822
 
797
823
  def _download_no_cache(self, dataset_infos: List[DatasetInfo], total_images: int) -> None:
@@ -1160,9 +1186,9 @@ class TrainApp:
1160
1186
  experiment_info should contain the following keys:
1161
1187
  - model_name": str
1162
1188
  - task_type": str
1163
- - model_files": dict
1164
1189
  - checkpoints": list
1165
1190
  - best_checkpoint": str
1191
+ - model_files": Optional[dict]
1166
1192
 
1167
1193
  Other keys are generated by the TrainApp class automatically
1168
1194
 
@@ -1179,7 +1205,6 @@ class TrainApp:
1179
1205
  required_keys = {
1180
1206
  "model_name": str,
1181
1207
  "task_type": str,
1182
- "model_files": dict,
1183
1208
  "checkpoints": (list, str),
1184
1209
  "best_checkpoint": str,
1185
1210
  }
@@ -1388,7 +1413,14 @@ class TrainApp:
1388
1413
  # Prepare logs
1389
1414
  if sly_fs.dir_exists(self.log_dir):
1390
1415
  logs_dir = join(self.output_dir, "logs")
1391
- shutil.copytree(self.log_dir, logs_dir)
1416
+ logger_type = self._app_options.get("train_logger", None)
1417
+ for root, _, files in walk(self.log_dir):
1418
+ for file in files:
1419
+ if logger_type is None or logger_type == "tensorboard":
1420
+ if ".tfevents." in file:
1421
+ src_log_path = join(root, file)
1422
+ dst_log_path = join(logs_dir, file)
1423
+ sly_fs.copy_file(src_log_path, dst_log_path)
1392
1424
  return experiment_info
1393
1425
 
1394
1426
  # Generate experiment_info.json and app_state.json
@@ -1534,9 +1566,11 @@ class TrainApp:
1534
1566
  experiment_info["best_checkpoint"] = sly_fs.get_file_name_with_ext(
1535
1567
  experiment_info["best_checkpoint"]
1536
1568
  )
1537
- experiment_info["model_files"]["config"] = sly_fs.get_file_name_with_ext(
1538
- experiment_info["model_files"]["config"]
1539
- )
1569
+
1570
+ for file in experiment_info["model_files"]:
1571
+ experiment_info["model_files"][file] = sly_fs.get_file_name_with_ext(
1572
+ experiment_info["model_files"][file]
1573
+ )
1540
1574
 
1541
1575
  local_path = join(self.output_dir, self._experiment_json_file)
1542
1576
  remote_path = join(remote_dir, self._experiment_json_file)
@@ -1594,6 +1628,8 @@ class TrainApp:
1594
1628
  )
1595
1629
 
1596
1630
  def _upload_demo_files(self, remote_dir: str) -> None:
1631
+ if not self.gui.training_artifacts.need_upload_demo:
1632
+ return
1597
1633
  demo = self._app_options.get("demo")
1598
1634
  if demo is None:
1599
1635
  return
@@ -1671,9 +1707,7 @@ class TrainApp:
1671
1707
  experiment_info = experiment_info or {}
1672
1708
 
1673
1709
  if self.model_source == ModelSource.PRETRAINED:
1674
- model_name = experiment_info.get("model_name") or self.model_info.get("meta", {}).get(
1675
- "model_name"
1676
- )
1710
+ model_name = experiment_info.get("model_name") or _get_model_name(self.model_info)
1677
1711
  return {
1678
1712
  "source": ModelSource.PRETRAINED,
1679
1713
  "model_name": model_name,
@@ -1682,7 +1716,7 @@ class TrainApp:
1682
1716
  return {
1683
1717
  "source": ModelSource.CUSTOM,
1684
1718
  "task_id": self.task_id,
1685
- "checkpoint": "checkpoint.pth",
1719
+ "checkpoint": "custom checkpoint",
1686
1720
  }
1687
1721
 
1688
1722
  # ----------------------------------------- #
@@ -1764,10 +1798,10 @@ class TrainApp:
1764
1798
  self.gui.training_process.start_button.loading = False
1765
1799
  self.gui.training_process.start_button.disable()
1766
1800
  self.gui.training_process.stop_button.disable()
1767
- # self.gui.training_logs.tensorboard_button.disable()
1768
1801
 
1769
1802
  # Set artifacts to GUI
1770
- self._api.task.set_output_experiment(self.task_id, experiment_info)
1803
+ if is_production():
1804
+ self._api.task.set_output_experiment(self.task_id, experiment_info)
1771
1805
  set_directory(remote_dir)
1772
1806
  self.gui.training_artifacts.artifacts_thumbnail.set(file_info)
1773
1807
  self.gui.training_artifacts.artifacts_thumbnail.show()
@@ -1814,7 +1848,7 @@ class TrainApp:
1814
1848
  self.gui.training_artifacts.trt_instruction.show()
1815
1849
 
1816
1850
  # Show the inference demo widget if overview or any demo is available
1817
- if hasattr(self.gui.training_artifacts, "inference_demo_field") and any(
1851
+ if self.gui.training_artifacts.inference_demo_field is not None and any(
1818
1852
  [
1819
1853
  self.gui.training_artifacts.overview_demo_exists(demo_path),
1820
1854
  self.gui.training_artifacts.pytorch_demo_exists(demo_path),
@@ -1822,7 +1856,8 @@ class TrainApp:
1822
1856
  self.gui.training_artifacts.trt_demo_exists(demo_path),
1823
1857
  ]
1824
1858
  ):
1825
- self.gui.training_artifacts.inference_demo_field.show()
1859
+ if self.gui.training_artifacts.inference_demo_field is not None:
1860
+ self.gui.training_artifacts.inference_demo_field.show()
1826
1861
  # ---------------------------- #
1827
1862
 
1828
1863
  # Set status to completed and unlock
@@ -1932,6 +1967,7 @@ class TrainApp:
1932
1967
  "model_name": experiment_info["model_name"],
1933
1968
  "framework_name": self.framework_name,
1934
1969
  "model_meta": model_meta.to_json(),
1970
+ "task_type": task_type,
1935
1971
  }
1936
1972
 
1937
1973
  logger.info(f"Deploy parameters: {self._benchmark_params}")
@@ -2551,7 +2587,6 @@ class TrainApp:
2551
2587
  if task_type == TaskType.OBJECT_DETECTION:
2552
2588
  Project.to_detection_task(project.directory, inplace=True)
2553
2589
  pr_prefix = "[detection]: "
2554
- # @TODO: dont convert segmentation?
2555
2590
  elif (
2556
2591
  task_type == TaskType.INSTANCE_SEGMENTATION
2557
2592
  or task_type == TaskType.SEMANTIC_SEGMENTATION
supervisely/nn/utils.py CHANGED
@@ -55,3 +55,12 @@ class DeployInfo:
55
55
  model_precision: str
56
56
  hardware: str
57
57
  deploy_params: dict
58
+
59
+
60
+ def _get_model_name(model_info: dict):
61
+ name = model_info.get("model_name")
62
+ if not name:
63
+ name = model_info.get("meta", {}).get("model_name")
64
+ if not name:
65
+ raise ValueError("Model name not found not in model_info nor in meta.")
66
+ return name
@@ -1933,9 +1933,10 @@ class Dataset(KeyObject):
1933
1933
  self,
1934
1934
  meta: ProjectMeta,
1935
1935
  dest_dir: Optional[str] = None,
1936
- task_type: Literal["detection", "segmentation", "pose"] = "detection",
1936
+ task_type: Literal["detect", "segment", "pose"] = "detect",
1937
1937
  log_progress: bool = False,
1938
1938
  progress_cb: Optional[Callable] = None,
1939
+ is_val: Optional[bool] = None,
1939
1940
  ):
1940
1941
  """
1941
1942
  Convert Supervisely dataset to YOLO format.
@@ -1950,6 +1951,8 @@ class Dataset(KeyObject):
1950
1951
  :type log_progress: :class:`str`, optional
1951
1952
  :param progress_cb: Progress callback.
1952
1953
  :type progress_cb: :class:`Callable`, optional
1954
+ :param is_val: If True, the dataset is a validation dataset.
1955
+ :type is_val: :class:`bool`, optional
1953
1956
  :return: YOLO dataset in dictionary format.
1954
1957
  :rtype: :class:`dict`
1955
1958
 
@@ -1975,6 +1978,7 @@ class Dataset(KeyObject):
1975
1978
  task_type=task_type,
1976
1979
  log_progress=log_progress,
1977
1980
  progress_cb=progress_cb,
1981
+ is_val=is_val,
1978
1982
  )
1979
1983
 
1980
1984
  def to_pascal_voc(
@@ -3821,19 +3825,27 @@ class Project:
3821
3825
  def to_yolo(
3822
3826
  self,
3823
3827
  dest_dir: Optional[str] = None,
3824
- task_type: Literal["detection", "segmentation", "pose"] = "detection",
3828
+ task_type: Literal["detect", "segment", "pose"] = "detect",
3825
3829
  log_progress: bool = True,
3826
3830
  progress_cb: Optional[Callable] = None,
3831
+ val_datasets: Optional[List[str]] = None,
3827
3832
  ) -> None:
3828
3833
  """
3829
3834
  Convert Supervisely project to YOLO format.
3830
3835
 
3831
3836
  :param dest_dir: Destination directory.
3832
3837
  :type dest_dir: :class:`str`, optional
3838
+ :param task_type: Task type for YOLO format. Possible values: 'detection', 'segmentation', 'pose'.
3839
+ :type task_type: :class:`str` or :class:`TaskType`, optional
3833
3840
  :param log_progress: Show uploading progress bar.
3834
3841
  :type log_progress: :class:`bool`
3835
3842
  :param progress_cb: Function for tracking conversion progress (for all items in the project).
3836
3843
  :type progress_cb: callable, optional
3844
+ :param val_datasets: List of dataset names for validation.
3845
+ Full dataset names are required (e.g., 'ds0/nested_ds1/ds3').
3846
+ If specified, datasets from the list will be marked as val, others as train.
3847
+ If not specified, the function will determine the validation datasets automatically.
3848
+ :type val_datasets: :class:`list` [ :class:`str` ], optional
3837
3849
  :return: None
3838
3850
  :rtype: NoneType
3839
3851
 
@@ -3855,12 +3867,13 @@ class Project:
3855
3867
 
3856
3868
  from supervisely.convert import project_to_yolo
3857
3869
 
3858
- project_to_yolo(
3870
+ return project_to_yolo(
3859
3871
  project=self,
3860
3872
  dest_dir=dest_dir,
3861
3873
  task_type=task_type,
3862
3874
  log_progress=log_progress,
3863
3875
  progress_cb=progress_cb,
3876
+ val_datasets=val_datasets,
3864
3877
  )
3865
3878
 
3866
3879
  def to_pascal_voc(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: supervisely
3
- Version: 6.73.326
3
+ Version: 6.73.328
4
4
  Summary: Supervisely Python SDK.
5
5
  Home-page: https://github.com/supervisely/supervisely
6
6
  Author: Supervisely
@@ -5,7 +5,7 @@ supervisely/function_wrapper.py,sha256=R5YajTQ0GnRp2vtjwfC9hINkzQc0JiyGsu8TER373
5
5
  supervisely/sly_logger.py,sha256=z92Vu5hmC0GgTIJO1n6kPDayRW9__8ix8hL6poDZj-Y,6274
6
6
  supervisely/tiny_timer.py,sha256=hkpe_7FE6bsKL79blSs7WBaktuPavEVu67IpEPrfmjE,183
7
7
  supervisely/annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- supervisely/annotation/annotation.py,sha256=x1RizD9DPiwk14Mf8xGvuwPdzx_zI5Zx1CVvmCy_sII,114665
8
+ supervisely/annotation/annotation.py,sha256=eUcakVkh6AHYJTqeh5ope4Wqm8isRu-5m0U4ghPcmSE,114654
9
9
  supervisely/annotation/annotation_transforms.py,sha256=TlVy_gUbM-XH6GbLpZPrAi6pMIGTr7Ow02iSKOSTa-I,9582
10
10
  supervisely/annotation/json_geometries_map.py,sha256=nL6AmMhFy02fw9ryBm75plKyOkDh61QdOToSuLAcz_Q,1659
11
11
  supervisely/annotation/label.py,sha256=NpHZ5o2H6dI4KiII22o2HpiLXG1yekh-bEy8WvI2Ljg,37498
@@ -15,14 +15,14 @@ supervisely/annotation/obj_class_mapper.py,sha256=aIJDoRULqcAOD2a1CQPk2OOF8k3VPP
15
15
  supervisely/annotation/renamer.py,sha256=rVvNLtpfd1kKUVPgm8VlLmYSDByWjriJ92FobC4buqY,1944
16
16
  supervisely/annotation/tag.py,sha256=iBHI0s52TiSvuGKL2p-mkd1Jpkmx4d7tTy9QZ7Ta9Hk,17635
17
17
  supervisely/annotation/tag_collection.py,sha256=MVPTzer9rLpD4O0g2XhYFUheK7-ILgwAXDJd1em3kZ8,10015
18
- supervisely/annotation/tag_meta.py,sha256=nTRKVuW_h6mGdTxuwXvtR2ERhwOvjjdUf635ONLFFx8,27767
18
+ supervisely/annotation/tag_meta.py,sha256=GESucIwSbgrZEo22XMWdghb7iySws-VanWQmmDddHwM,27767
19
19
  supervisely/annotation/tag_meta_collection.py,sha256=JY2wAo4dF47UylYeglkJtRtpVOArGjf3dXeEYIHFWP0,14491
20
20
  supervisely/annotation/tag_meta_mapper.py,sha256=RWeTrxJ64syodyhXIRSH007bX6Hr3B45tG14YTcpwSU,1639
21
21
  supervisely/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  supervisely/api/advanced_api.py,sha256=Nd5cCnHFWc3PSUrCtENxTGtDjS37_lCHXsgXvUI3Ti8,2054
23
23
  supervisely/api/agent_api.py,sha256=ShWAIlXcWXcyI9fqVuP5GZVCigCMJmjnvdGUfLspD6Y,8890
24
24
  supervisely/api/annotation_api.py,sha256=kuk4qwojTJxYr2iqAKbW-QhWw_DFc4TsjA2Wc2MEaqw,68449
25
- supervisely/api/api.py,sha256=6TczKT1t0MWlbArSW31RmeyWP04pqngfUO_NrG5FETE,66287
25
+ supervisely/api/api.py,sha256=DpLa2rTFKa9we4WUZD8jRuurK6G3OYsdnBb2VehEik0,66585
26
26
  supervisely/api/app_api.py,sha256=RsbVej8WxWVn9cNo5s3Fqd1symsCdsfOaKVBKEUapRY,71927
27
27
  supervisely/api/dataset_api.py,sha256=GH7prDRJKyJlTv_7_Y-RkTwJN7ED4EkXNqqmi3iIdI4,41352
28
28
  supervisely/api/file_api.py,sha256=bVWv6kf3B5n6qlB14HmUa6iUr8ara5cr-pPK8QC7XWg,92932
@@ -386,9 +386,9 @@ supervisely/app/widgets/pagination/template.html,sha256=1z9pt2SOTjA5Kmt8YjSiyO8X
386
386
  supervisely/app/widgets/pie_chart/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
387
387
  supervisely/app/widgets/pie_chart/pie_chart.py,sha256=E0erw7kPXiudJzNhWMKdOnMgK9u6yYlPw10noKoO2jw,7809
388
388
  supervisely/app/widgets/pretrained_models_selector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
389
- supervisely/app/widgets/pretrained_models_selector/pretrained_models_selector.py,sha256=y21fRcDWuP1RbqxNzy3MRxWFi8-f9pV0SsDaNIWqlvE,14102
389
+ supervisely/app/widgets/pretrained_models_selector/pretrained_models_selector.py,sha256=o5inxg0mQnX6b4D1Ipod7OqddrpKx6RfuoJcN3lGVgM,14374
390
390
  supervisely/app/widgets/pretrained_models_selector/style.css,sha256=po3FssuZhg3lKFU3VcTLqTW-qTCXLDnxYi2lCtYXhBc,363
391
- supervisely/app/widgets/pretrained_models_selector/template.html,sha256=4owO7X84Ii35vMioeTOwMAdR9OwlvLFe19MNPDX4kWM,5170
391
+ supervisely/app/widgets/pretrained_models_selector/template.html,sha256=f4pDne6ZH6kDpxntfVi_1xI2KmMDU2DzXZ6iL4EWehU,5239
392
392
  supervisely/app/widgets/project_selector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
393
393
  supervisely/app/widgets/project_selector/project_selector.py,sha256=qWieMLjCp8m2QtzPEtbhiTpXKsPYoEc0gqEnhULO3QM,2112
394
394
  supervisely/app/widgets/project_selector/style.css,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -611,7 +611,7 @@ supervisely/convert/image/sly/sly_image_converter.py,sha256=097ijLa_62ZBu0elRx0x
611
611
  supervisely/convert/image/sly/sly_image_helper.py,sha256=5Ri8fKb5dzh5b3v8AJ5u8xVFOQfAtoWqZ7HktPsCjTI,7373
612
612
  supervisely/convert/image/yolo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
613
613
  supervisely/convert/image/yolo/yolo_converter.py,sha256=Wn5dR05y4SEPONcaxWr9ofnbvbf-SbRZN0fkksk5Dps,11391
614
- supervisely/convert/image/yolo/yolo_helper.py,sha256=ePBnt8c52JM-lh-bH7XdIal4_UkjysSK7yVX0qhVqdE,22556
614
+ supervisely/convert/image/yolo/yolo_helper.py,sha256=5b0ShsVlqikA071VT8AiRW_079_WD6pdB5Bx3OU12Bw,25989
615
615
  supervisely/convert/pointcloud/__init__.py,sha256=WPeIpPoTWDIKAa0lF6t2SMUhFNZ0l-vKujf6yD6w7SA,589
616
616
  supervisely/convert/pointcloud/pointcloud_converter.py,sha256=yCCpzm7GrvL6WT4lNesvtYWWwdO3DO32JIOBBSSQgSA,7130
617
617
  supervisely/convert/pointcloud/bag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -713,7 +713,7 @@ supervisely/imaging/font.py,sha256=0XcmWhlw7y2PAhrWgcsfInyRWj0WnlFpMSEXXilR8UA,2
713
713
  supervisely/imaging/image.py,sha256=1KNc4qRbP9OlI4Yta07Kc2ohAgSBJ_9alF9Jag74w30,41873
714
714
  supervisely/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
715
715
  supervisely/io/docker_utils.py,sha256=hb_HXGM8IYB0PF-nD7NxMwaHgzaxIFxofsUzQ_RCUZI,7935
716
- supervisely/io/env.py,sha256=QQDDE79sz4inRHfcXoAKr3IzqkXQ0qleJ0YYojmHoCk,17712
716
+ supervisely/io/env.py,sha256=DLsoRhouPT-y5wJzzJBs7zhJ2UxOIvIcQVbVLP5Yx7U,18256
717
717
  supervisely/io/exception_handlers.py,sha256=_nAgMFeE94bCxEvWakR82hMtdOJUyn7Gc7OymMxI9WI,36484
718
718
  supervisely/io/fs.py,sha256=DvLDzZUEpo7_ieSbt1gw8BYmoSsNUBcGKpXVs0Wqckk,55296
719
719
  supervisely/io/fs_cache.py,sha256=985gvBGzveLcDudgz10E4EWVjP9jxdU1Pa0GFfCBoCA,6520
@@ -740,7 +740,7 @@ supervisely/nn/__init__.py,sha256=bG1CTEriUn31-lqGeYF4yUO0MtfYN68zdsObmEFPFZ8,61
740
740
  supervisely/nn/experiments.py,sha256=0RFYp-LZTRny9tsyeVV58GKtPWngxTw54abfrk3052g,8742
741
741
  supervisely/nn/prediction_dto.py,sha256=oi146DJpUUBDbR-b-vYkL5WAhCZQYOGomqBDEQGbPdY,2700
742
742
  supervisely/nn/task_type.py,sha256=UJvSJ4L3I08j_e6sU6Ptu7kS5p1H09rfhfoDUSZ2iys,522
743
- supervisely/nn/utils.py,sha256=-Xjv5KLu8CTtyi7acqsIX1E0dDwKZPED4D6b4Z_Ln3k,1451
743
+ supervisely/nn/utils.py,sha256=b2ckqZKa3se9wATE7OSa6bZcTMcvHoZJGoRYddE4dTI,1722
744
744
  supervisely/nn/artifacts/__init__.py,sha256=m7KYTMzEJnoV9wcU_0xzgLuPz69Dqp9va0fP32tohV4,576
745
745
  supervisely/nn/artifacts/artifacts.py,sha256=Ol6Tt3CHGbGm_7rR3iClokOArUj6z4ky92YKozpewRM,22859
746
746
  supervisely/nn/artifacts/detectron2.py,sha256=g2F47GS1LryWng1zMAXW5ZLnz0fcRuYAY3sX6LcuHUs,1961
@@ -883,13 +883,13 @@ supervisely/nn/benchmark/visualization/widgets/table/__init__.py,sha256=47DEQpj8
883
883
  supervisely/nn/benchmark/visualization/widgets/table/table.py,sha256=atmDnF1Af6qLQBUjLhK18RMDKAYlxnsuVHMSEa5a-e8,4319
884
884
  supervisely/nn/inference/__init__.py,sha256=QFukX2ip-U7263aEPCF_UCFwj6EujbMnsgrXp5Bbt8I,1623
885
885
  supervisely/nn/inference/cache.py,sha256=q4F7ZRzZghNWSVFClXEIHNMNW4PK6xddYckCFUgyhCo,32027
886
- supervisely/nn/inference/inference.py,sha256=SqfIgohv0U3USQpHerzkrnfIeC7JKGeQA49Tocliu1k,165877
886
+ supervisely/nn/inference/inference.py,sha256=O0GR2o0t9hDh-bMdiKrxk-hxdmQU1M-44aIcZM89Qo8,166222
887
887
  supervisely/nn/inference/session.py,sha256=jmkkxbe2kH-lEgUU6Afh62jP68dxfhF5v6OGDfLU62E,35757
888
888
  supervisely/nn/inference/video_inference.py,sha256=8Bshjr6rDyLay5Za8IB8Dr6FURMO2R_v7aELasO8pR4,5746
889
889
  supervisely/nn/inference/gui/__init__.py,sha256=wCxd-lF5Zhcwsis-wScDA8n1Gk_1O00PKgDviUZ3F1U,221
890
890
  supervisely/nn/inference/gui/gui.py,sha256=5xoPmBrCcIAIgh_RFe9qi488MzRRDwLgUmmGiH--q_I,20274
891
891
  supervisely/nn/inference/gui/serving_gui.py,sha256=MCGyN-ASusn0vAug24AWEmmKF8qwvo-Pk3WQSJGX8ec,8446
892
- supervisely/nn/inference/gui/serving_gui_template.py,sha256=yO3IjqxZSpTe7Ca-ak6-7FrX-GXmiEMJvaTbDUf-YlI,7178
892
+ supervisely/nn/inference/gui/serving_gui_template.py,sha256=LkKnhZGqCPtW5nI2ACR_3T4rn4t1kF4__tPQMPgXqIc,7142
893
893
  supervisely/nn/inference/instance_segmentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
894
894
  supervisely/nn/inference/instance_segmentation/instance_segmentation.py,sha256=TWasw61P4CDiWi2zWuIYJLZ9woLA5IxWtUNRn9u6qEU,2211
895
895
  supervisely/nn/inference/instance_segmentation/dashboard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -980,17 +980,17 @@ supervisely/nn/tracker/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
980
980
  supervisely/nn/tracker/utils/gmc.py,sha256=3JX8979H3NA-YHNaRQyj9Z-xb9qtyMittPEjGw8y2Jo,11557
981
981
  supervisely/nn/tracker/utils/kalman_filter.py,sha256=eSFmCjM0mikHCAFvj-KCVzw-0Jxpoc3Cfc2NWEjJC1Q,17268
982
982
  supervisely/nn/training/__init__.py,sha256=gY4PCykJ-42MWKsqb9kl-skemKa8yB6t_fb5kzqR66U,111
983
- supervisely/nn/training/train_app.py,sha256=lFvYxt2Zsd7FrqfeA2C-eNX0tQVLtz3V8om3DwvNFtM,104720
983
+ supervisely/nn/training/train_app.py,sha256=mUEXGE9rQZKyVCrX1qjyDFOEuKqdVVa5jQ0EnP0gBGI,106273
984
984
  supervisely/nn/training/gui/__init__.py,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
985
- supervisely/nn/training/gui/classes_selector.py,sha256=8UgzA4aogOAr1s42smwEcDbgaBj_i0JLhjwlZ9bFdIA,3772
986
- supervisely/nn/training/gui/gui.py,sha256=CnT_QhihrxdSHKybpI0pXhPLwCaXEana_qdn0DhXByg,25558
987
- supervisely/nn/training/gui/hyperparameters_selector.py,sha256=UAXZYyhuUOY7d2ZKAx4R5Kz-KQaiFZ7AnY8BDoj3_30,7071
988
- supervisely/nn/training/gui/input_selector.py,sha256=Jp9PnVVADv1fhndPuZdMlKuzWTOBQZogrOks5dwATlc,2179
989
- supervisely/nn/training/gui/model_selector.py,sha256=n2Xn6as60bNPtSlImJtyrVEo0gjKnvHLT3yq_m39TXk,4334
990
- supervisely/nn/training/gui/train_val_splits_selector.py,sha256=MLryFD2Tj_RobkFzZOeQXzXpch0eGiVFisq3FGA3dFg,8549
991
- supervisely/nn/training/gui/training_artifacts.py,sha256=nZFxUChT6-MddRaAc2daufsq0ta1OugEHj1vehbkjjU,9797
992
- supervisely/nn/training/gui/training_logs.py,sha256=oLrQR7Mdjazy69BuVKsZTvfvyILAy3amF-5fj2bBr2g,4504
993
- supervisely/nn/training/gui/training_process.py,sha256=wqlwt1cHG-HoVEOotDiBjp9YTTIbeMr1bHY2zVRaNH8,3071
985
+ supervisely/nn/training/gui/classes_selector.py,sha256=Bpp-RFDQqcZ0kLJmS6ZnExkdscWwRusvF4vbWjEsKlQ,3926
986
+ supervisely/nn/training/gui/gui.py,sha256=QDeWa6iow3z3EwLZcHlQ48d4Ur6hCmedNvCod-8qZ-k,27978
987
+ supervisely/nn/training/gui/hyperparameters_selector.py,sha256=5dUCYAx4E0HBLguj2B_s2nWeGGCWzv6vJeT0XvDJO3M,7746
988
+ supervisely/nn/training/gui/input_selector.py,sha256=tFf14jqtG1LoSi1xJb0uU2yDn6hAoATKfZGFcmr9dzY,2511
989
+ supervisely/nn/training/gui/model_selector.py,sha256=6tniZ_-qTI5QM3AIdVYgHN1lOkY6JzLAXxanT_UpGTU,4649
990
+ supervisely/nn/training/gui/train_val_splits_selector.py,sha256=n4DcijNw30H71Hv_tGdAqQ9Pc-w7ZxEX1NcJY_HZLZw,8816
991
+ supervisely/nn/training/gui/training_artifacts.py,sha256=c0GH70ZByvnL413KWHjSKcSX8V5DStXM5sjFVZafSZo,10519
992
+ supervisely/nn/training/gui/training_logs.py,sha256=fXj1Cszu7Qi4p8tNdBPqwet08I4xcphB5jbTPjCDmVk,4851
993
+ supervisely/nn/training/gui/training_process.py,sha256=2F65cuu5ypKWkdaO4uVpNLMkwXjM8dpprd7Km5aedds,3192
994
994
  supervisely/nn/training/gui/utils.py,sha256=EO629fSOwxOsiXL7mr1EXTiKKMIg7xgVm3jtCnF4r7Q,4268
995
995
  supervisely/nn/training/loggers/__init__.py,sha256=DOqR-4NJv25C4Y1HCWggvGNM5mgo1CbwQOdvROOL-60,777
996
996
  supervisely/nn/training/loggers/base_train_logger.py,sha256=Gf_TKwSfQdSVG6P3wAeWf5t2_EJWJqOPqt_TsJ5jpBY,1914
@@ -1020,7 +1020,7 @@ supervisely/project/data_version.py,sha256=6vOz5ovBeCIiMAKUG7lGQ5IXvQnU1GbcnrWxd
1020
1020
  supervisely/project/download.py,sha256=GQFYN3KCdM_egXDzoyZrzl6Yeg2QshYQNFNlKi8Nh8A,25471
1021
1021
  supervisely/project/pointcloud_episode_project.py,sha256=yiWdNBQiI6f1O9sr1pg8JHW6O-w3XUB1rikJNn3Oung,41866
1022
1022
  supervisely/project/pointcloud_project.py,sha256=Kx1Vaes-krwG3BiRRtHRLQxb9G5m5bTHPN9IzRqmNWo,49399
1023
- supervisely/project/project.py,sha256=nKnnYVrSx_MWh5G_fObaAegkRxLFJg_J074SaduEYGo,205871
1023
+ supervisely/project/project.py,sha256=3b5tslwDcQYd-7K-r5Yo9DqOgEZ1iKjwu6jaQXLTYAw,206749
1024
1024
  supervisely/project/project_meta.py,sha256=26s8IiHC5Pg8B1AQi6_CrsWteioJP2in00cRNe8QlW0,51423
1025
1025
  supervisely/project/project_settings.py,sha256=NLThzU_DCynOK6hkHhVdFyezwprn9UqlnrLDe_3qhkY,9347
1026
1026
  supervisely/project/project_type.py,sha256=EZDJFRi4MmC_5epYexBgML5WMZsWdEVk_CjqDQy5m3c,572
@@ -1082,9 +1082,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
1082
1082
  supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
1083
1083
  supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
1084
1084
  supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
1085
- supervisely-6.73.326.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1086
- supervisely-6.73.326.dist-info/METADATA,sha256=0hQAKuBU9KX8mYNuop6LSvLzz0RQmCGZSdFIqqgmJUE,33596
1087
- supervisely-6.73.326.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
1088
- supervisely-6.73.326.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1089
- supervisely-6.73.326.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1090
- supervisely-6.73.326.dist-info/RECORD,,
1085
+ supervisely-6.73.328.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1086
+ supervisely-6.73.328.dist-info/METADATA,sha256=zb3oE_o2mfmVo-yfobR0aPJ4AjQYZFIpldlNALmq59Y,33596
1087
+ supervisely-6.73.328.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1088
+ supervisely-6.73.328.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1089
+ supervisely-6.73.328.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1090
+ supervisely-6.73.328.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (75.3.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5