supervisely 6.73.319__py3-none-any.whl → 6.73.320__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.
@@ -818,14 +818,21 @@ class TaskApi(ModuleApiBase, ModuleWithStatus):
818
818
  pass
819
819
 
820
820
  def set_output_project(
821
- self, task_id: int, project_id: int, project_name: Optional[str] = None
821
+ self,
822
+ task_id: int,
823
+ project_id: int,
824
+ project_name: Optional[str] = None,
825
+ project_preview: Optional[str] = None,
822
826
  ) -> Dict:
823
827
  """set_output_project"""
824
828
  if project_name is None:
825
829
  project = self._api.project.get_info_by_id(project_id, raise_error=True)
826
830
  project_name = project.name
831
+ project_preview = project.image_preview_url
827
832
 
828
833
  output = {ApiField.PROJECT: {ApiField.ID: project_id, ApiField.TITLE: project_name}}
834
+ if project_preview is not None:
835
+ output[ApiField.PROJECT][ApiField.PREVIEW] = project_preview
829
836
  resp = self._api.post(
830
837
  "tasks.output.set", {ApiField.TASK_ID: task_id, ApiField.OUTPUT: output}
831
838
  )
@@ -1159,9 +1166,7 @@ class TaskApi(ModuleApiBase, ModuleWithStatus):
1159
1166
  )
1160
1167
  self._api.post("tasks.status.update", {ApiField.ID: task_id, ApiField.STATUS: status})
1161
1168
 
1162
- def set_output_experiment(
1163
- self, task_id: int, experiment_info: dict, project_name: str = None
1164
- ) -> Dict:
1169
+ def set_output_experiment(self, task_id: int, experiment_info: dict) -> Dict:
1165
1170
  """
1166
1171
  Sets output for the task with experiment info.
1167
1172
 
@@ -1216,15 +1221,7 @@ class TaskApi(ModuleApiBase, ModuleWithStatus):
1216
1221
  },
1217
1222
  }
1218
1223
  """
1219
- project_id = experiment_info.get("project_id")
1220
- if project_id is None:
1221
- raise ValueError("Key 'project_id' is required in experiment_info")
1222
- if project_name is None:
1223
- project = self._api.project.get_info_by_id(project_id, raise_error=True)
1224
- project_name = project.name
1225
-
1226
1224
  output = {
1227
- ApiField.PROJECT: {ApiField.ID: project_id, ApiField.TITLE: project_name},
1228
1225
  ApiField.EXPERIMENT: {ApiField.DATA: {**experiment_info}},
1229
1226
  }
1230
1227
  resp = self._api.post(
@@ -27,6 +27,7 @@ from fastapi import (
27
27
  )
28
28
  from fastapi.exception_handlers import http_exception_handler
29
29
  from fastapi.responses import JSONResponse
30
+ from fastapi.routing import APIRouter
30
31
  from fastapi.staticfiles import StaticFiles
31
32
 
32
33
  import supervisely.io.env as sly_env
@@ -47,7 +48,7 @@ from supervisely.app.singleton import Singleton
47
48
  from supervisely.app.widgets_context import JinjaWidgets
48
49
  from supervisely.geometry.bitmap import Bitmap
49
50
  from supervisely.io.fs import dir_exists, mkdir
50
- from supervisely.sly_logger import logger
51
+ from supervisely.sly_logger import create_formatter, logger
51
52
 
52
53
  # from supervisely.app.fastapi.request import Request
53
54
 
@@ -56,7 +57,9 @@ if TYPE_CHECKING:
56
57
 
57
58
  import logging
58
59
 
59
- uvicorn_logger = logging.getLogger("uvicorn.access")
60
+ SUPERVISELY_SERVER_PATH_PREFIX = sly_env.supervisely_server_path_prefix()
61
+ if SUPERVISELY_SERVER_PATH_PREFIX and not SUPERVISELY_SERVER_PATH_PREFIX.startswith("/"):
62
+ SUPERVISELY_SERVER_PATH_PREFIX = f"/{SUPERVISELY_SERVER_PATH_PREFIX}"
60
63
 
61
64
 
62
65
  class ReadyzFilter(logging.Filter):
@@ -67,8 +70,24 @@ class ReadyzFilter(logging.Filter):
67
70
  return True
68
71
 
69
72
 
70
- # Apply the filter
71
- uvicorn_logger.addFilter(ReadyzFilter())
73
+ def _init_uvicorn_logger():
74
+ uvicorn_logger = logging.getLogger("uvicorn.access")
75
+ for handler in uvicorn_logger.handlers:
76
+ handler.setFormatter(create_formatter())
77
+ uvicorn_logger.addFilter(ReadyzFilter())
78
+
79
+
80
+ _init_uvicorn_logger()
81
+
82
+
83
+ class PrefixRouter(APIRouter):
84
+ def add_api_route(self, path, *args, **kwargs):
85
+ allowed_paths = ["/livez", "/is_alive", "/is_running", "/readyz", "/is_ready"]
86
+ if path in allowed_paths:
87
+ super().add_api_route(path, *args, **kwargs)
88
+ if SUPERVISELY_SERVER_PATH_PREFIX:
89
+ path = SUPERVISELY_SERVER_PATH_PREFIX + path
90
+ super().add_api_route(path, *args, **kwargs)
72
91
 
73
92
 
74
93
  class Event:
@@ -864,6 +883,7 @@ def _init(
864
883
  class _MainServer(metaclass=Singleton):
865
884
  def __init__(self):
866
885
  self._server = FastAPI()
886
+ self._server.router = PrefixRouter()
867
887
 
868
888
  def get_server(self) -> FastAPI:
869
889
  return self._server
supervisely/io/env.py CHANGED
@@ -554,3 +554,19 @@ def semaphore_size() -> int:
554
554
  postprocess_fn=lambda x: int(x),
555
555
  raise_not_found=False,
556
556
  )
557
+
558
+
559
+ def supervisely_server_path_prefix() -> str:
560
+ """Returns routes prefix from environment variable using following
561
+ - SUPERVISELY_SERVER_PATH_PREFIX
562
+
563
+ :return: routes prefix
564
+ :rtype: str
565
+ """
566
+ return _parse_from_env(
567
+ name="supervisely_server_path_prefix",
568
+ keys=["SUPERVISELY_SERVER_PATH_PREFIX"],
569
+ postprocess_fn=lambda x: x,
570
+ default="",
571
+ raise_not_found=False,
572
+ )
@@ -1546,6 +1546,7 @@ class TrainApp:
1546
1546
 
1547
1547
  # Do not include this fields to uploaded file:
1548
1548
  experiment_info["primary_metric"] = primary_metric_name
1549
+ experiment_info["project_preview"] = self.project_info.image_preview_url
1549
1550
  return experiment_info
1550
1551
 
1551
1552
  def _generate_hyperparameters(self, remote_dir: str, experiment_info: Dict) -> None:
@@ -1759,7 +1760,7 @@ class TrainApp:
1759
1760
  # self.gui.training_logs.tensorboard_button.disable()
1760
1761
 
1761
1762
  # Set artifacts to GUI
1762
- self._api.task.set_output_experiment(self.task_id, experiment_info, self.project_name)
1763
+ self._api.task.set_output_experiment(self.task_id, experiment_info)
1763
1764
  set_directory(remote_dir)
1764
1765
  self.gui.training_artifacts.artifacts_thumbnail.set(file_info)
1765
1766
  self.gui.training_artifacts.artifacts_thumbnail.show()
@@ -1806,8 +1807,9 @@ class TrainApp:
1806
1807
  self.gui.training_artifacts.trt_instruction.show()
1807
1808
 
1808
1809
  # Show the inference demo widget if overview or any demo is available
1809
- if self.gui.training_artifacts.overview_demo_exists(demo_path) or any(
1810
+ if hasattr(self.gui.training_artifacts, "inference_demo_field") and any(
1810
1811
  [
1812
+ self.gui.training_artifacts.overview_demo_exists(demo_path),
1811
1813
  self.gui.training_artifacts.pytorch_demo_exists(demo_path),
1812
1814
  self.gui.training_artifacts.onnx_demo_exists(demo_path),
1813
1815
  self.gui.training_artifacts.trt_demo_exists(demo_path),
@@ -1863,13 +1865,19 @@ class TrainApp:
1863
1865
  :return: Evaluation report, report ID and evaluation metrics.
1864
1866
  :rtype: tuple
1865
1867
  """
1866
- lnk_file_info, report, report_id, eval_metrics = None, None, None, {}
1868
+ lnk_file_info, report, report_id, eval_metrics, primary_metric_name = (
1869
+ None,
1870
+ None,
1871
+ None,
1872
+ {},
1873
+ None,
1874
+ )
1867
1875
  if self._inference_class is None:
1868
1876
  logger.warning(
1869
1877
  "Inference class is not registered, model benchmark disabled. "
1870
1878
  "Use 'register_inference_class' method to register inference class."
1871
1879
  )
1872
- return lnk_file_info, report, report_id, eval_metrics
1880
+ return lnk_file_info, report, report_id, eval_metrics, primary_metric_name
1873
1881
 
1874
1882
  # Can't get task type from session. requires before session init
1875
1883
  supported_task_types = [
@@ -1883,7 +1891,7 @@ class TrainApp:
1883
1891
  f"Task type: '{task_type}' is not supported for Model Benchmark. "
1884
1892
  f"Supported tasks: {', '.join(task_type)}"
1885
1893
  )
1886
- return lnk_file_info, report, report_id, eval_metrics
1894
+ return lnk_file_info, report, report_id, eval_metrics, primary_metric_name
1887
1895
 
1888
1896
  logger.info("Running Model Benchmark evaluation")
1889
1897
  try:
@@ -2051,7 +2059,7 @@ class TrainApp:
2051
2059
  if diff_project_info:
2052
2060
  self._api.project.remove(diff_project_info.id)
2053
2061
  except Exception as e2:
2054
- return lnk_file_info, report, report_id, eval_metrics
2062
+ return lnk_file_info, report, report_id, eval_metrics, primary_metric_name
2055
2063
  return lnk_file_info, report, report_id, eval_metrics, primary_metric_name
2056
2064
 
2057
2065
  # ----------------------------------------- #
supervisely/sly_logger.py CHANGED
@@ -1,17 +1,18 @@
1
1
  # coding: utf-8
2
2
 
3
- import logging
4
- import types
5
3
  import datetime
4
+ import logging
6
5
  import os
6
+ import types
7
7
  from collections import namedtuple
8
8
  from enum import Enum
9
- #import simplejson
10
- from pythonjsonlogger import jsonlogger
11
9
 
10
+ # import simplejson
11
+ from pythonjsonlogger import jsonlogger
12
12
 
13
13
  ###############################################################################
14
14
 
15
+
15
16
  class ServiceType(Enum):
16
17
  AGENT = 1
17
18
  TASK = 2
@@ -47,20 +48,23 @@ class EventType(Enum):
47
48
 
48
49
 
49
50
  # level name: level, default exc_info, description
50
- LogLevelSpec = namedtuple('LogLevelSpec', [
51
- 'int',
52
- 'add_exc_info',
53
- 'descr',
54
- ])
51
+ LogLevelSpec = namedtuple(
52
+ "LogLevelSpec",
53
+ [
54
+ "int",
55
+ "add_exc_info",
56
+ "descr",
57
+ ],
58
+ )
55
59
 
56
60
 
57
61
  LOGGING_LEVELS = {
58
- 'FATAL': LogLevelSpec(50, True, 'Critical error'),
59
- 'ERROR': LogLevelSpec(40, True, 'Error'), # may be shown to end user
60
- 'WARN': LogLevelSpec(30, False, 'Warning'), # may be shown to end user
61
- 'INFO': LogLevelSpec(20, False, 'Info'), # may be shown to end user
62
- 'DEBUG': LogLevelSpec(10, False, 'Debug'),
63
- 'TRACE': LogLevelSpec(5, False, 'Trace'),
62
+ "FATAL": LogLevelSpec(50, True, "Critical error"),
63
+ "ERROR": LogLevelSpec(40, True, "Error"), # may be shown to end user
64
+ "WARN": LogLevelSpec(30, False, "Warning"), # may be shown to end user
65
+ "INFO": LogLevelSpec(20, False, "Info"), # may be shown to end user
66
+ "DEBUG": LogLevelSpec(10, False, "Debug"),
67
+ "TRACE": LogLevelSpec(5, False, "Trace"),
64
68
  }
65
69
 
66
70
 
@@ -69,12 +73,9 @@ def _set_logging_levels(levels, the_logger):
69
73
  logging.addLevelName(lvl, lvl_name.upper()) # two mappings
70
74
 
71
75
  def construct_logger_member(lvl_val, default_exc_info):
72
- return lambda self, msg, *args, exc_info=default_exc_info, **kwargs: \
73
- self.log(lvl_val,
74
- str(msg),
75
- *args,
76
- exc_info=exc_info,
77
- **kwargs)
76
+ return lambda self, msg, *args, exc_info=default_exc_info, **kwargs: self.log(
77
+ lvl_val, str(msg), *args, exc_info=exc_info, **kwargs
78
+ )
78
79
 
79
80
  func = construct_logger_member(lvl, def_exc_info)
80
81
  bound_method = types.MethodType(func, the_logger)
@@ -86,16 +87,16 @@ def _set_logging_levels(levels, the_logger):
86
87
 
87
88
  def _get_default_logging_fields():
88
89
  supported_keys = [
89
- 'asctime',
90
+ "asctime",
90
91
  # 'created',
91
92
  # 'filename',
92
93
  # 'funcName',
93
- 'levelname',
94
+ "levelname",
94
95
  # 'levelno',
95
96
  # 'lineno',
96
97
  # 'module',
97
98
  # 'msecs',
98
- 'message',
99
+ "message",
99
100
  # 'name',
100
101
  # 'pathname',
101
102
  # 'process',
@@ -104,10 +105,10 @@ def _get_default_logging_fields():
104
105
  # 'thread',
105
106
  # 'threadName'
106
107
  ]
107
- return ' '.join(['%({0:s})'.format(k) for k in supported_keys])
108
+ return " ".join(["%({0:s})".format(k) for k in supported_keys])
108
109
 
109
110
 
110
- #def dumps_ignore_nan(obj, *args, **kwargs):
111
+ # def dumps_ignore_nan(obj, *args, **kwargs):
111
112
  # return simplejson.dumps(obj, ignore_nan=True, *args, **kwargs)
112
113
 
113
114
 
@@ -115,21 +116,21 @@ class CustomJsonFormatter(jsonlogger.JsonFormatter):
115
116
  additional_fields = {}
116
117
 
117
118
  def __init__(self, format_string):
118
- super().__init__(format_string)#, json_serializer=dumps_ignore_nan)
119
+ super().__init__(format_string) # , json_serializer=dumps_ignore_nan)
119
120
 
120
121
  def process_log_record(self, log_record):
121
- log_record['timestamp'] = log_record.pop('asctime', None)
122
+ log_record["timestamp"] = log_record.pop("asctime", None)
122
123
 
123
- levelname = log_record.pop('levelname', None)
124
+ levelname = log_record.pop("levelname", None)
124
125
  if levelname is not None:
125
- log_record['level'] = levelname.lower()
126
+ log_record["level"] = levelname.lower()
126
127
 
127
- e_info = log_record.pop('exc_info', None)
128
+ e_info = log_record.pop("exc_info", None)
128
129
  if e_info is not None:
129
- if e_info == 'NoneType: None': # python logger is not ok here
130
+ if e_info == "NoneType: None": # python logger is not ok here
130
131
  pass
131
132
  else:
132
- log_record['stack'] = e_info.split('\n')
133
+ log_record["stack"] = e_info.split("\n")
133
134
 
134
135
  return jsonlogger.JsonFormatter.process_log_record(self, log_record)
135
136
 
@@ -142,8 +143,8 @@ class CustomJsonFormatter(jsonlogger.JsonFormatter):
142
143
 
143
144
  def formatTime(self, record, datefmt=None):
144
145
  ct = datetime.datetime.fromtimestamp(record.created)
145
- t = ct.strftime('%Y-%m-%dT%H:%M:%S')
146
- s = '%s.%03dZ' % (t, record.msecs)
146
+ t = ct.strftime("%Y-%m-%dT%H:%M:%S")
147
+ s = "%s.%03dZ" % (t, record.msecs)
147
148
  return s
148
149
 
149
150
 
@@ -164,16 +165,20 @@ def _construct_logger(the_logger, loglevel_text):
164
165
  ###############################################################################
165
166
 
166
167
 
168
+ def create_formatter(logger_fmt_string=None):
169
+ if logger_fmt_string is None:
170
+ logger_fmt_string = _get_default_logging_fields()
171
+ return CustomJsonFormatter(logger_fmt_string)
172
+
173
+
167
174
  def add_logger_handler(the_logger, log_handler): # default format
168
- logger_fmt_string = _get_default_logging_fields()
169
- formatter = CustomJsonFormatter(logger_fmt_string)
175
+ formatter = create_formatter()
170
176
  log_handler.setFormatter(formatter)
171
177
  the_logger.addHandler(log_handler)
172
178
 
173
179
 
174
180
  def add_default_logging_into_file(the_logger, log_dir):
175
- fname = 'log_{}.txt'.format(
176
- datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S"))
181
+ fname = "log_{}.txt".format(datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S"))
177
182
  ofpath = os.path.join(log_dir, fname)
178
183
 
179
184
  log_handler_file = logging.FileHandler(filename=ofpath)
@@ -191,27 +196,26 @@ def change_formatters_default_values(the_logger, field_name, value):
191
196
 
192
197
 
193
198
  def _get_loglevel_env():
194
- loglevel = os.getenv('LOG_LEVEL', None)
199
+ loglevel = os.getenv("LOG_LEVEL", None)
195
200
  if loglevel is None:
196
- loglevel = os.getenv('LOGLEVEL', 'INFO')
201
+ loglevel = os.getenv("LOGLEVEL", "INFO")
197
202
  return loglevel.upper()
198
203
 
199
204
 
200
205
  def set_global_logger():
201
206
  loglevel = _get_loglevel_env() # use the env to set loglevel
202
- the_logger = logging.getLogger('logger') # optional logger name
207
+ the_logger = logging.getLogger("logger") # optional logger name
203
208
  _construct_logger(the_logger, loglevel)
204
209
  return the_logger
205
210
 
206
211
 
207
212
  def get_task_logger(task_id, loglevel=None):
208
213
  if loglevel is None:
209
- loglevel = _get_loglevel_env() # use the env to set loglevel
210
- logger_name = 'task_{}'.format(task_id)
214
+ loglevel = _get_loglevel_env() # use the env to set loglevel
215
+ logger_name = "task_{}".format(task_id)
211
216
  the_logger = logging.getLogger(logger_name) # optional logger name
212
217
  _construct_logger(the_logger, loglevel)
213
218
  return the_logger
214
219
 
215
220
 
216
221
  logger = set_global_logger()
217
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: supervisely
3
- Version: 6.73.319
3
+ Version: 6.73.320
4
4
  Summary: Supervisely Python SDK.
5
5
  Home-page: https://github.com/supervisely/supervisely
6
6
  Author: Supervisely
@@ -2,7 +2,7 @@ supervisely/README.md,sha256=XM-DiMC6To3I9RjQZ0c61905EFRR_jnCUx2q3uNR-X8,3331
2
2
  supervisely/__init__.py,sha256=mtgVKiRSlnRU7yKG0Re130mBL10wCzsNfOfi-w-Kj4c,10833
3
3
  supervisely/_utils.py,sha256=DX_2n8zWTG2AzW8bCvU9z9joLzcwzVjLmvslVF39pE8,16022
4
4
  supervisely/function_wrapper.py,sha256=R5YajTQ0GnRp2vtjwfC9hINkzQc0JiyGsu8TER373xY,1912
5
- supervisely/sly_logger.py,sha256=LG1wTyyctyEKuCuKM2IKf_SMPH7BzkTsFdO-0tnorzg,6225
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
8
  supervisely/annotation/annotation.py,sha256=5AG1AhebkmiYy2r7nKbz6TjdmCF4tuf9FtqUjLLs7aU,114659
@@ -42,7 +42,7 @@ supervisely/api/remote_storage_api.py,sha256=qTuPhPsstgEjRm1g-ZInddik8BNC_38YvBB
42
42
  supervisely/api/report_api.py,sha256=Om7CGulUbQ4BuJ16eDtz7luLe0JQNqab-LoLpUXu7YE,7123
43
43
  supervisely/api/role_api.py,sha256=aBL4mxtn08LDPXQuS153-lQFN6N2kcwiz8MbescZ8Gk,3044
44
44
  supervisely/api/storage_api.py,sha256=FPGYf3Rn3LBoe38RBNdoiURs306oshzvKOEOQ56XAbs,13030
45
- supervisely/api/task_api.py,sha256=1xbKi6JYl8FOHno2GoE224ZiQBXdKGR4Sz5uP9LElyE,54085
45
+ supervisely/api/task_api.py,sha256=WUyovA322egcfjG6Iv_vX8RdfU_3Bw7qxcniYeLpqwA,53874
46
46
  supervisely/api/team_api.py,sha256=bEoz3mrykvliLhKnzEy52vzdd_H8VBJCpxF-Bnek9Q8,19467
47
47
  supervisely/api/user_api.py,sha256=4S97yIc6AMTZCa0N57lzETnpIE8CeqClvCb6kjUkgfc,24940
48
48
  supervisely/api/video_annotation_tool_api.py,sha256=3A9-U8WJzrTShP_n9T8U01M9FzGYdeS51CCBTzUnooo,6686
@@ -93,7 +93,7 @@ supervisely/app/fastapi/index.html,sha256=6K8akK7_k9Au-BpZ7cM2qocuiegLdXz8UFPnWg
93
93
  supervisely/app/fastapi/no_html_main.html,sha256=NhQP7noyORBx72lFh1CQKgBRupkWjiq6Gaw-9Hkvg7c,37
94
94
  supervisely/app/fastapi/offline.py,sha256=CwMMkJ1frD6wiZS-SEoNDtQ1UJcJe1Ob6ohE3r4CQL8,7414
95
95
  supervisely/app/fastapi/request.py,sha256=NU7rKmxJ1pfkDZ7_yHckRcRAueJRQIqCor11UO2OHr8,766
96
- supervisely/app/fastapi/subapp.py,sha256=uKk5epRbwlhl7ue1-OYKUC6oJ9krJ9hIEHEcFqNVdXI,44757
96
+ supervisely/app/fastapi/subapp.py,sha256=5lMfFLYBfHzE1OmITHsogB9hScyTJFjGV45AKY67Hkg,45647
97
97
  supervisely/app/fastapi/templating.py,sha256=JOAW8U-14GD47E286mzFi3mZSPbm_csJGqtXWLRM4rc,2929
98
98
  supervisely/app/fastapi/utils.py,sha256=GZuTWLcVRGVx8TL3jVEYUOZIT2FawbwIe2kAOBLw9ho,398
99
99
  supervisely/app/fastapi/websocket.py,sha256=TlRSPOAhRItTv1HGvdukK1ZvhRjMUxRa-lJlsRR9rJw,1308
@@ -706,7 +706,7 @@ supervisely/imaging/font.py,sha256=0XcmWhlw7y2PAhrWgcsfInyRWj0WnlFpMSEXXilR8UA,2
706
706
  supervisely/imaging/image.py,sha256=1KNc4qRbP9OlI4Yta07Kc2ohAgSBJ_9alF9Jag74w30,41873
707
707
  supervisely/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
708
708
  supervisely/io/docker_utils.py,sha256=hb_HXGM8IYB0PF-nD7NxMwaHgzaxIFxofsUzQ_RCUZI,7935
709
- supervisely/io/env.py,sha256=rKLLw1XQqM3s3X3k3ke9Skyy5hPK0LE_xVUBq3Qko0Q,17284
709
+ supervisely/io/env.py,sha256=QQDDE79sz4inRHfcXoAKr3IzqkXQ0qleJ0YYojmHoCk,17712
710
710
  supervisely/io/exception_handlers.py,sha256=_nAgMFeE94bCxEvWakR82hMtdOJUyn7Gc7OymMxI9WI,36484
711
711
  supervisely/io/fs.py,sha256=-KkS-w9v_46mm2ET6y8YfTB9EHu4T2iz0-ap0SNg538,52691
712
712
  supervisely/io/fs_cache.py,sha256=985gvBGzveLcDudgz10E4EWVjP9jxdU1Pa0GFfCBoCA,6520
@@ -973,7 +973,7 @@ supervisely/nn/tracker/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
973
973
  supervisely/nn/tracker/utils/gmc.py,sha256=3JX8979H3NA-YHNaRQyj9Z-xb9qtyMittPEjGw8y2Jo,11557
974
974
  supervisely/nn/tracker/utils/kalman_filter.py,sha256=eSFmCjM0mikHCAFvj-KCVzw-0Jxpoc3Cfc2NWEjJC1Q,17268
975
975
  supervisely/nn/training/__init__.py,sha256=gY4PCykJ-42MWKsqb9kl-skemKa8yB6t_fb5kzqR66U,111
976
- supervisely/nn/training/train_app.py,sha256=6bbmj4d2uemKMnv2u5d-2Wp6RFOQl3COl3CgwC6-Gqs,103966
976
+ supervisely/nn/training/train_app.py,sha256=xG7zbPEV3aNZHoubUJ8-MRTXJ1yWZ6pRMiah86U8Spc,104274
977
977
  supervisely/nn/training/gui/__init__.py,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
978
978
  supervisely/nn/training/gui/classes_selector.py,sha256=8UgzA4aogOAr1s42smwEcDbgaBj_i0JLhjwlZ9bFdIA,3772
979
979
  supervisely/nn/training/gui/gui.py,sha256=CnT_QhihrxdSHKybpI0pXhPLwCaXEana_qdn0DhXByg,25558
@@ -1075,9 +1075,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
1075
1075
  supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
1076
1076
  supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
1077
1077
  supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
1078
- supervisely-6.73.319.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1079
- supervisely-6.73.319.dist-info/METADATA,sha256=WUoELTCne2bnj7Dh4zB0DXeDtgoEl1BCmxN0jRtjxCo,33596
1080
- supervisely-6.73.319.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
1081
- supervisely-6.73.319.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1082
- supervisely-6.73.319.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1083
- supervisely-6.73.319.dist-info/RECORD,,
1078
+ supervisely-6.73.320.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1079
+ supervisely-6.73.320.dist-info/METADATA,sha256=cRTVnwUZDV5OZ4jHo0rWWPrMc5ryNCORoOOlrEu--zw,33596
1080
+ supervisely-6.73.320.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
1081
+ supervisely-6.73.320.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1082
+ supervisely-6.73.320.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1083
+ supervisely-6.73.320.dist-info/RECORD,,