supervisely 6.73.284__py3-none-any.whl → 6.73.286__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.

Potentially problematic release.


This version of supervisely might be problematic. Click here for more details.

@@ -1,15 +1,26 @@
1
+ import time
1
2
  import uuid
2
- from collections import OrderedDict
3
+ from collections import OrderedDict, namedtuple
3
4
  from logging import Logger
4
- from typing import Callable, Dict, Generator, List, Optional
5
+ from queue import Queue
6
+ from threading import Lock, Thread
7
+ from typing import Any, Callable, Dict, Generator, List, Optional
5
8
  from typing import OrderedDict as OrderedDictType
6
9
 
7
10
  import numpy as np
8
11
 
9
- import supervisely as sly
12
+ from supervisely._utils import find_value_by_keys
13
+ from supervisely.api.api import Api
10
14
  from supervisely.api.module_api import ApiField
11
15
  from supervisely.geometry.geometry import Geometry
12
- from supervisely.video_annotation.video_figure import VideoFigure
16
+ from supervisely.geometry.graph import GraphNodes
17
+ from supervisely.geometry.helpers import deserialize_geometry
18
+ from supervisely.geometry.point import Point
19
+ from supervisely.geometry.polygon import Polygon
20
+ from supervisely.geometry.polyline import Polyline
21
+ from supervisely.nn.inference.cache import InferenceImageCache
22
+ from supervisely.sly_logger import logger
23
+ from supervisely.video_annotation.key_id_map import KeyIdMap
13
24
 
14
25
 
15
26
  class TrackerInterface:
@@ -20,11 +31,11 @@ class TrackerInterface:
20
31
  load_all_frames=False,
21
32
  notify_in_predict=False,
22
33
  per_point_polygon_tracking=True,
23
- frame_loader: Callable[[sly.Api, int, int], np.ndarray] = None,
24
- frames_loader: Callable[[sly.Api, int, List[int]], List[np.ndarray]] = None,
34
+ frame_loader: Callable[[Api, int, int], np.ndarray] = None,
35
+ frames_loader: Callable[[Api, int, List[int]], List[np.ndarray]] = None,
25
36
  should_notify: bool = True,
26
37
  ):
27
- self.api: sly.Api = api
38
+ self.api: Api = api
28
39
  self.logger: Logger = api.logger
29
40
  self.frame_index = context["frameIndex"]
30
41
  self.frames_count = context["frames"]
@@ -131,7 +142,7 @@ class TrackerInterface:
131
142
  for geometry, frame_index in geometries_frame_indexes
132
143
  ]
133
144
  figures_keys = [uuid.uuid4() for _ in figures_json]
134
- key_id_map = sly.KeyIdMap()
145
+ key_id_map = KeyIdMap()
135
146
  self.api.video.figure._append_bulk(
136
147
  entity_id=self.video_id,
137
148
  figures_json=figures_json,
@@ -169,19 +180,19 @@ class TrackerInterface:
169
180
  points = 0
170
181
  for figure_id in self.figure_ids:
171
182
  figure = self.api.video.figure.get_info_by_id(figure_id)
172
- geometry = sly.deserialize_geometry(figure.geometry_type, figure.geometry)
183
+ geometry = deserialize_geometry(figure.geometry_type, figure.geometry)
173
184
  self.geometries[figure_id] = geometry
174
185
 
175
186
  self.api.logger.debug(f"Added {figure.geometry_type} #{figure_id}")
176
187
 
177
188
  # per point track notification
178
- if isinstance(geometry, sly.Point):
189
+ if isinstance(geometry, Point):
179
190
  points += 1
180
- elif isinstance(geometry, sly.Polygon):
191
+ elif isinstance(geometry, Polygon):
181
192
  points += len(geometry.exterior) + len(geometry.interior)
182
- elif isinstance(geometry, sly.GraphNodes):
193
+ elif isinstance(geometry, GraphNodes):
183
194
  points += len(geometry.nodes.items())
184
- elif isinstance(geometry, sly.Polyline):
195
+ elif isinstance(geometry, Polyline):
185
196
  points += len(geometry.exterior)
186
197
 
187
198
  if self.per_point_polygon_tracking:
@@ -289,3 +300,325 @@ class TrackerInterface:
289
300
  """Use this in prediction."""
290
301
  self._notify(task="get frames")
291
302
  return self._frames
303
+
304
+
305
+ class ThreadSafeStopIndicator:
306
+ def __init__(self):
307
+ self._stopped = False
308
+ self._reason = None
309
+ self._lock = Lock()
310
+
311
+ def stop(self, reason: Any = None):
312
+ if self.is_stopped():
313
+ return
314
+ with self._lock:
315
+ self._stopped = True
316
+ self._reason = reason
317
+
318
+ def is_stopped(self):
319
+ with self._lock:
320
+ return self._stopped
321
+
322
+ def get_reason(self):
323
+ with self._lock:
324
+ return self._reason
325
+
326
+
327
+ FrameImage = namedtuple("FrameImage", ["frame_index", "image"])
328
+
329
+
330
+ class TrackerInterfaceV2:
331
+ UPLOAD_SLEEP_TIME = 0.001 # 1ms
332
+ NOTIFY_SLEEP_TIME = 1 # 1s
333
+
334
+ def __init__(
335
+ self,
336
+ api: Api,
337
+ context: Dict,
338
+ cache: InferenceImageCache,
339
+ ):
340
+ self.api = api
341
+ self.context = context
342
+ self.video_id = find_value_by_keys(context, ["videoId", "video_id"])
343
+ self.frame_index = find_value_by_keys(context, ["frameIndex", "frame_index"])
344
+ self.frames_count = find_value_by_keys(context, ["frames", "framesCount", "frames_count"])
345
+ self.track_id = context.get("trackId", "auto")
346
+ self.direction = context.get("direction", "forward")
347
+ self.session_id = find_value_by_keys(context, ["sessionId", "session_id"], None)
348
+ self.figures = context.get("figures", None)
349
+ self.direct_progress = context.get("useDirectProgressMessages", False)
350
+ self.direction_n = 1 if self.direction == "forward" else -1
351
+ self.stop_indicator = ThreadSafeStopIndicator()
352
+ self.cache = cache
353
+ self.frame_indexes = list(
354
+ range(
355
+ self.frame_index,
356
+ self.frame_index + self.frames_count * self.direction_n + self.direction_n,
357
+ self.direction_n,
358
+ )
359
+ )
360
+
361
+ self.log_extra = {
362
+ "video_id": self.video_id,
363
+ "track_id": self.track_id,
364
+ "session_id": self.session_id,
365
+ }
366
+
367
+ # start caching task
368
+ self.run_cache_frames_task()
369
+
370
+ self.upload_sleep_time = self.UPLOAD_SLEEP_TIME
371
+ self.notify_sleep_time = self.NOTIFY_SLEEP_TIME
372
+ self.upload_queue = Queue()
373
+ self.notify_queue = Queue()
374
+ self.upload_thread = None
375
+ self.notify_thread = None
376
+ self._upload_f = None
377
+ self._notify_f = None
378
+
379
+ def __call__(self, upload_f, notify_f):
380
+ self.upload_f = upload_f
381
+ self.notify_f = notify_f
382
+ return self
383
+
384
+ def __enter__(self):
385
+ self.start()
386
+ return self
387
+
388
+ def __exit__(self, exc_type, exc_value, traceback):
389
+ self.wait_stop(exception=exc_value)
390
+ return False
391
+
392
+ @property
393
+ def upload_f(self):
394
+ return self._upload_f
395
+
396
+ @upload_f.setter
397
+ def upload_f(self, upload_f):
398
+ self._upload_f = upload_f
399
+ self.upload_thread = Thread(
400
+ target=self._upload_loop,
401
+ args=[
402
+ self.upload_queue,
403
+ self.notify_queue,
404
+ self.stop_indicator,
405
+ self._upload_f,
406
+ self.upload_sleep_time,
407
+ self._upload_exception_handler,
408
+ ],
409
+ daemon=True,
410
+ )
411
+
412
+ @property
413
+ def notify_f(self):
414
+ return self._notify_f
415
+
416
+ @notify_f.setter
417
+ def notify_f(self, notify_f):
418
+ self._notify_f = notify_f
419
+ self.notify_thread = Thread(
420
+ target=self._nofify_loop,
421
+ args=[
422
+ self.notify_queue,
423
+ self.stop_indicator,
424
+ self._notify_f,
425
+ self.notify_sleep_time,
426
+ self._notify_exception_handler,
427
+ ],
428
+ daemon=True,
429
+ )
430
+
431
+ def start(self):
432
+ if self.upload_thread is not None:
433
+ self.upload_thread.start()
434
+ if self.notify_thread is not None:
435
+ self.notify_thread.start()
436
+
437
+ def stop(self, exception: Exception = None):
438
+ self.stop_indicator.stop(exception)
439
+
440
+ def join(self, timeout: Optional[float] = 5 * 60):
441
+ if self.upload_thread is not None and self.upload_thread.is_alive():
442
+ self.upload_thread.join(timeout=timeout)
443
+ if self.notify_thread is not None and self.notify_thread.is_alive():
444
+ self.notify_thread.join(timeout=timeout)
445
+
446
+ def wait_stop(self, exception: Exception = None, timeout: Optional[float] = 5 * 60):
447
+ self.stop(exception)
448
+ self.join(timeout=timeout)
449
+
450
+ def is_stopped(self):
451
+ return self.stop_indicator.is_stopped()
452
+
453
+ def stop_reason(self):
454
+ return self.stop_indicator.get_reason()
455
+
456
+ @classmethod
457
+ def _upload_loop(
458
+ cls,
459
+ q: Queue,
460
+ notify_q: Queue,
461
+ stop_indicator: ThreadSafeStopIndicator,
462
+ upload_f: callable = None,
463
+ upload_sleep_time: float = None,
464
+ exception_handler: callable = None,
465
+ ):
466
+ logger.debug("Upload loop started")
467
+ if upload_f is None:
468
+ logger.warning("Upload function is not provided. Exiting upload loop.")
469
+ return
470
+ upload_sleep_time = upload_sleep_time or cls.UPLOAD_SLEEP_TIME
471
+ try:
472
+ while True:
473
+ items = []
474
+ while not q.empty():
475
+ items.append(q.get_nowait())
476
+ if len(items) > 0:
477
+ upload_f(items)
478
+ for item in items:
479
+ notify_q.put(item)
480
+ elif stop_indicator.is_stopped():
481
+ logger.debug("stop event is set. returning from upload loop")
482
+ return
483
+ time.sleep(upload_sleep_time)
484
+ except Exception as e:
485
+ if exception_handler is not None:
486
+ e = exception_handler(e)
487
+ if not isinstance(e, Exception):
488
+ return
489
+ raise e
490
+ logger.error("Error in upload loop: %s", str(e), exc_info=True)
491
+ raise
492
+
493
+ @classmethod
494
+ def _nofify_loop(
495
+ cls,
496
+ q: Queue,
497
+ stop_indicator: ThreadSafeStopIndicator,
498
+ notify_f: callable = None,
499
+ notify_sleep_time: float = None,
500
+ exception_handler: callable = None,
501
+ ):
502
+ logger.debug("Notify loop started")
503
+ if notify_f is None:
504
+ logger.warning("Notify function is not provided. Exiting notify loop.")
505
+ return
506
+ notify_sleep_time = notify_sleep_time or cls.NOTIFY_SLEEP_TIME
507
+ try:
508
+ while True:
509
+ items = []
510
+ while not q.empty():
511
+ items.append(q.get_nowait())
512
+ if len(items) > 0:
513
+ notify_f(items)
514
+ elif stop_indicator.is_stopped():
515
+ logger.debug(f"stop event is set. returning from notify loop")
516
+ return
517
+ time.sleep(notify_sleep_time)
518
+ except Exception as e:
519
+ if exception_handler is not None:
520
+ e = exception_handler(e)
521
+ if not isinstance(e, Exception):
522
+ return
523
+ raise e
524
+ logger.error("Error in notify loop: %s", str(e), exc_info=True)
525
+ raise
526
+
527
+ def run_cache_frames_task(self):
528
+ if self.cache.is_persistent:
529
+ frame_ranges = None
530
+ else:
531
+ frame_ranges = [
532
+ self.frame_index,
533
+ self.frame_index + self.frames_count * self.direction_n,
534
+ ]
535
+ if self.direction_n == -1:
536
+ frame_ranges = frame_ranges[::-1]
537
+ frame_ranges = [frame_ranges]
538
+ self.cache.run_cache_task_manually(
539
+ self.api,
540
+ frame_ranges,
541
+ video_id=self.video_id,
542
+ )
543
+
544
+ def frames_loader_generator(
545
+ self, batch_size=2, step=1
546
+ ) -> Generator[List[FrameImage], None, None]:
547
+ step = step * self.direction_n
548
+ batch = []
549
+ t = time.monotonic()
550
+ for frame_i, frame in zip(
551
+ self.frame_indexes,
552
+ self.cache.frames_loader(
553
+ self.api, video_id=self.video_id, frame_indexes=self.frame_indexes
554
+ ),
555
+ ):
556
+ batch.append(FrameImage(frame_i, frame))
557
+ if len(batch) == batch_size:
558
+ _get_indexes_str = lambda b: ", ".join(map(lambda x: str(x.frame_index), b))
559
+ if len(batch) > 16:
560
+ batch_indexes_str = (
561
+ _get_indexes_str(batch[:8]) + " ... " + _get_indexes_str(batch[-8:])
562
+ )
563
+ else:
564
+ batch_indexes_str = _get_indexes_str(batch)
565
+
566
+ logger.debug(
567
+ f"Frames [{batch_indexes_str}] loaded. Time: {time.monotonic() - t}",
568
+ extra=self.log_extra,
569
+ )
570
+ yield batch
571
+ t = time.monotonic()
572
+ batch = batch[step:]
573
+
574
+ def load_all_frames(self):
575
+ return next(self.frames_loader_generator(batch_size=len(self.frame_indexes)))
576
+
577
+ def add_prediction(self, item: Any):
578
+ self.upload_queue.put(item)
579
+
580
+ def notify_progress(
581
+ self,
582
+ progress_current: int,
583
+ progress_total: int,
584
+ frame_range: List[int] = None,
585
+ ):
586
+ logger.debug(
587
+ f"Notify progress: {progress_current}/{progress_total} on frames {frame_range}",
588
+ extra=self.log_extra,
589
+ )
590
+ if self.direct_progress:
591
+ self.api.vid_ann_tool.set_direct_tracking_progress(
592
+ self.session_id,
593
+ self.video_id,
594
+ self.track_id,
595
+ frame_range=frame_range,
596
+ progress_current=progress_current,
597
+ progress_total=progress_total,
598
+ )
599
+ else:
600
+ stopped = self.api.video.notify_progress(
601
+ self.track_id,
602
+ self.video_id,
603
+ frame_range[0],
604
+ frame_range[1],
605
+ progress_current,
606
+ progress_total,
607
+ )
608
+ if stopped and progress_current < progress_total:
609
+ logger.info("Task stopped by user.", extra=self.log_extra)
610
+ self.stop()
611
+
612
+ def _upload_exception_handler(self, exception: Exception):
613
+ logger.error(
614
+ "Error in upload loop: %s", str(exception), exc_info=True, extra=self.log_extra
615
+ )
616
+ self.stop_indicator.stop(exception)
617
+ raise exception
618
+
619
+ def _notify_exception_handler(self, exception: Exception):
620
+ logger.error(
621
+ "Error in notify loop: %s", str(exception), exc_info=True, extra=self.log_extra
622
+ )
623
+ self.stop_indicator.stop(exception)
624
+ raise exception
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: supervisely
3
- Version: 6.73.284
3
+ Version: 6.73.286
4
4
  Summary: Supervisely Python SDK.
5
5
  Home-page: https://github.com/supervisely/supervisely
6
6
  Author: Supervisely
@@ -1,6 +1,6 @@
1
1
  supervisely/README.md,sha256=XM-DiMC6To3I9RjQZ0c61905EFRR_jnCUx2q3uNR-X8,3331
2
- supervisely/__init__.py,sha256=bvuMHtPSeGkhj3vVvcVtyhVcMqI5OEBPflLcy8HIqN8,10833
3
- supervisely/_utils.py,sha256=I4nZ0L7NS6144r-CQ2VJvLeUJZ1bCi4pYXH4Gxo3-D4,15763
2
+ supervisely/__init__.py,sha256=xrUgQsIthS0kN4wPKAWP38oNX1KGQSg6MtJux9joKbA,10833
3
+ supervisely/_utils.py,sha256=DX_2n8zWTG2AzW8bCvU9z9joLzcwzVjLmvslVF39pE8,16022
4
4
  supervisely/function_wrapper.py,sha256=R5YajTQ0GnRp2vtjwfC9hINkzQc0JiyGsu8TER373xY,1912
5
5
  supervisely/sly_logger.py,sha256=LG1wTyyctyEKuCuKM2IKf_SMPH7BzkTsFdO-0tnorzg,6225
6
6
  supervisely/tiny_timer.py,sha256=hkpe_7FE6bsKL79blSs7WBaktuPavEVu67IpEPrfmjE,183
@@ -32,7 +32,7 @@ supervisely/api/image_api.py,sha256=qZwTjeCo6bkEuXDuB8RhhP0g6PzlRuCXJkUfN9rsUZ4,
32
32
  supervisely/api/import_storage_api.py,sha256=BDCgmR0Hv6OoiRHLCVPKt3iDxSVlQp1WrnKhAK_Zl84,460
33
33
  supervisely/api/issues_api.py,sha256=BqDJXmNoTzwc3xe6_-mA7FDFC5QQ-ahGbXk_HmpkSeQ,17925
34
34
  supervisely/api/labeling_job_api.py,sha256=odnzZjp29yM16Gq-FYkv-OA4WFMNJCLFo4qSikW2A7c,56280
35
- supervisely/api/module_api.py,sha256=Jc_nf5ZgQdzcLYVbt6Vx7IT7KvXOKNqVIETXuewhnpg,43359
35
+ supervisely/api/module_api.py,sha256=HrHndEvG684ULGchmFiFx0VsbSoihkq97iFPBFMY-dM,44345
36
36
  supervisely/api/neural_network_api.py,sha256=ktPVRO4Jeulougio8F0mioJJHwRJcX250Djp1wBoQ9c,7620
37
37
  supervisely/api/object_class_api.py,sha256=-rQcKwhBw3iL9KNH9c1ROgoimgWM1ls6Wi_tb1R-MzY,7683
38
38
  supervisely/api/plugin_api.py,sha256=TlfrosdRuYG4NUxk92QiQoVaOdztFspPpygyVa3M3zk,5283
@@ -45,11 +45,11 @@ supervisely/api/storage_api.py,sha256=FPGYf3Rn3LBoe38RBNdoiURs306oshzvKOEOQ56XAb
45
45
  supervisely/api/task_api.py,sha256=yX0GqL5Kg5DuPXP0GpoRSVmjrzSzIvMMHo5Lrf4_R1c,39610
46
46
  supervisely/api/team_api.py,sha256=bEoz3mrykvliLhKnzEy52vzdd_H8VBJCpxF-Bnek9Q8,19467
47
47
  supervisely/api/user_api.py,sha256=4S97yIc6AMTZCa0N57lzETnpIE8CeqClvCb6kjUkgfc,24940
48
- supervisely/api/video_annotation_tool_api.py,sha256=Uy1MvT-M7vjC6y-0-V4wFCO-fZt8_aWneNiEJgr_jhU,5133
48
+ supervisely/api/video_annotation_tool_api.py,sha256=3A9-U8WJzrTShP_n9T8U01M9FzGYdeS51CCBTzUnooo,6686
49
49
  supervisely/api/workspace_api.py,sha256=5KAxpI9DKBmgF_pyQaXHpGT30HZ9wRtR6DP3FoYFZtY,9228
50
50
  supervisely/api/entity_annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
51
  supervisely/api/entity_annotation/entity_annotation_api.py,sha256=K79KdDyepQv4FiNQHBj9V4-zLIemxK9WG1ig1bfBKb8,3083
52
- supervisely/api/entity_annotation/figure_api.py,sha256=_JS1x0jn5neoCnZCBKHUBwspoHg92N-sJ9Ty9h07Mvg,24427
52
+ supervisely/api/entity_annotation/figure_api.py,sha256=deYCZNG7JeDhxlYew51FyGvqY3dc7fkERtwmBPJmHcw,24503
53
53
  supervisely/api/entity_annotation/object_api.py,sha256=gbcNvN_KY6G80Me8fHKQgryc2Co7VU_kfFd1GYILZ4E,8875
54
54
  supervisely/api/entity_annotation/tag_api.py,sha256=M-28m9h8R4k9Eqo6P1S0UH8_D5kqCwAvQLYY6_Yz4oM,11161
55
55
  supervisely/api/pointcloud/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -64,7 +64,7 @@ supervisely/api/pointcloud/pointcloud_object_api.py,sha256=bO1USWb9HAywG_CW4CDu1
64
64
  supervisely/api/pointcloud/pointcloud_tag_api.py,sha256=iShtr052nOElxsyMyZEUT2vypEm6kP00gnP13ABX24A,4691
65
65
  supervisely/api/video/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
66
  supervisely/api/video/video_annotation_api.py,sha256=nvbn_ofcqFCZ2qKgu0O5y5zOHxFc4tsY-o93sUgqlWk,14134
67
- supervisely/api/video/video_api.py,sha256=KO_Nfqa4xDWrc7FqOR14PciC0TX8PF0g0peqgPnctEE,94677
67
+ supervisely/api/video/video_api.py,sha256=ma33Et1LKlACpyvksBYG9tbGNV_1ZSEuSAAsYpLP8qU,94666
68
68
  supervisely/api/video/video_figure_api.py,sha256=quksohjhgrK2l2-PtbbNE99fOW6uWXX59-_4xfc-I-k,6244
69
69
  supervisely/api/video/video_frame_api.py,sha256=4GwSI4xdCNYEUvTqzKc-Ewd44fw5zqkFoD24jrrN_aY,10214
70
70
  supervisely/api/video/video_object_api.py,sha256=IC0NP8EoIT_d3xxDRgz2cA3ixSiuJ5ymy64eS-RfmDM,2227
@@ -93,7 +93,7 @@ supervisely/app/fastapi/index.html,sha256=wMMWSRCoVeOnIJYUHR6Aj-jebOuian963Si-cz
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=jjEfqNUjlwiNKFf9UKOHmVO1vGgvGjE-R_oyN0WFUbk,43561
96
+ supervisely/app/fastapi/subapp.py,sha256=MlB2dcHEtF0RPk-hxk67Gb1wBeGHsgCEIqAaBHzLEoY,43653
97
97
  supervisely/app/fastapi/templating.py,sha256=sxp8QMYfWd6ARDTl6c4JqY985-BSkM_WLxHEH2kv3bg,2929
98
98
  supervisely/app/fastapi/utils.py,sha256=GZuTWLcVRGVx8TL3jVEYUOZIT2FawbwIe2kAOBLw9ho,398
99
99
  supervisely/app/fastapi/websocket.py,sha256=TlRSPOAhRItTv1HGvdukK1ZvhRjMUxRa-lJlsRR9rJw,1308
@@ -871,8 +871,8 @@ supervisely/nn/benchmark/visualization/widgets/sidebar/sidebar.py,sha256=tKPURRS
871
871
  supervisely/nn/benchmark/visualization/widgets/table/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
872
872
  supervisely/nn/benchmark/visualization/widgets/table/table.py,sha256=atmDnF1Af6qLQBUjLhK18RMDKAYlxnsuVHMSEa5a-e8,4319
873
873
  supervisely/nn/inference/__init__.py,sha256=mtEci4Puu-fRXDnGn8RP47o97rv3VTE0hjbYO34Zwqg,1622
874
- supervisely/nn/inference/cache.py,sha256=_pPSpkl8Wkqkiidn0vu6kWE19cngd80av--jncHxMEQ,30510
875
- supervisely/nn/inference/inference.py,sha256=IDkMFsURnB-vBM-2Kf-M7D5IQw6VUoIwVoh_IIdzA9Q,143958
874
+ supervisely/nn/inference/cache.py,sha256=h-pP_7th0ana3oJ75sFfTbead3hdKUvYA8Iq2OXDx3I,31317
875
+ supervisely/nn/inference/inference.py,sha256=WsxKGawOxxziL5sGQebN_KQ5hi22lZOGXODOM5ev1uE,144908
876
876
  supervisely/nn/inference/session.py,sha256=jmkkxbe2kH-lEgUU6Afh62jP68dxfhF5v6OGDfLU62E,35757
877
877
  supervisely/nn/inference/video_inference.py,sha256=8Bshjr6rDyLay5Za8IB8Dr6FURMO2R_v7aELasO8pR4,5746
878
878
  supervisely/nn/inference/gui/__init__.py,sha256=wCxd-lF5Zhcwsis-wScDA8n1Gk_1O00PKgDviUZ3F1U,221
@@ -905,13 +905,14 @@ supervisely/nn/inference/salient_object_segmentation/salient_object_segmentation
905
905
  supervisely/nn/inference/semantic_segmentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
906
906
  supervisely/nn/inference/semantic_segmentation/semantic_segmentation.py,sha256=xpmViSYm1v_ZxlYyqiD_DiB7_LEynv9ZoU0t2QHEx8A,3370
907
907
  supervisely/nn/inference/tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
908
- supervisely/nn/inference/tracking/bbox_tracking.py,sha256=EBEwLczXugCSYaIUFxB33h7SOIkPDEBWLhr_TbASNOA,17441
908
+ supervisely/nn/inference/tracking/base_tracking.py,sha256=OW7Rt7MIoyKvMEFBMpdCp80Kj7cLoZ3bkYE4YaYtN0I,13865
909
+ supervisely/nn/inference/tracking/bbox_tracking.py,sha256=sPE-jZjSKf5QuMXmYUOkP1N6guOHK1_MvXK30MapB8A,21090
909
910
  supervisely/nn/inference/tracking/functional.py,sha256=LpVu2gvOOpr9D_uvwTPZey1wUCAhV-E20RPKmCSIrK4,1774
910
- supervisely/nn/inference/tracking/mask_tracking.py,sha256=qL9eUSqhzJwJMYaAzXX31oOu9EgdnGbsNwK9pOlV148,19610
911
+ supervisely/nn/inference/tracking/mask_tracking.py,sha256=1G0yHMw5BSzDGD4Ps-yRhr50ZeB88pMY6b-rmg2FFHw,25576
911
912
  supervisely/nn/inference/tracking/object_tracking_3d.py,sha256=Kqvx1qe1G8F1VtdBiy2HJ251rJU6s3LWhj0ZedhrmUw,4327
912
- supervisely/nn/inference/tracking/point_tracking.py,sha256=Dweiq3dJUuwlFYnJbyx28L3IisNeg-1KQf2mBHrr7yI,22050
913
+ supervisely/nn/inference/tracking/point_tracking.py,sha256=I0kT_YGqOudyX4LMSZfnWkB1UnUQ9ucawTyR-tFonc8,24644
913
914
  supervisely/nn/inference/tracking/tracker3d_interface.py,sha256=7yIkNO9rgkzQuyXUUccLwqlv5k7RPbxTqz9uI4FylLE,2781
914
- supervisely/nn/inference/tracking/tracker_interface.py,sha256=FXI9f0I5Tb5HN7l8fvxJ5wJ-QYuKyxfXiDpfXRLsSq4,10766
915
+ supervisely/nn/inference/tracking/tracker_interface.py,sha256=lrIo6ULa4GYd_QclALt82k5d9cLpH0Ss3--XFhPBgUQ,21913
915
916
  supervisely/nn/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
916
917
  supervisely/nn/legacy/config.py,sha256=TKdyGtURJKzKoyydCZAfujoUnbC0SO8GeVLTSnoyS_w,2994
917
918
  supervisely/nn/legacy/dataset.py,sha256=-56EI6OYbkTWx4y8hOgD76y47zUoJNjGFyZ6JaP8iqg,6055
@@ -1070,9 +1071,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
1070
1071
  supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
1071
1072
  supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
1072
1073
  supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
1073
- supervisely-6.73.284.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1074
- supervisely-6.73.284.dist-info/METADATA,sha256=GriDRRnOtHK84_HcMIMCD6z4qfCCZSHH5NyJsTmW3e4,33573
1075
- supervisely-6.73.284.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
1076
- supervisely-6.73.284.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1077
- supervisely-6.73.284.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1078
- supervisely-6.73.284.dist-info/RECORD,,
1074
+ supervisely-6.73.286.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1075
+ supervisely-6.73.286.dist-info/METADATA,sha256=ulxDJ50Pdv9rflRKXgqgB8fpw1pOMrd4xzC1uDdIseU,33573
1076
+ supervisely-6.73.286.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
1077
+ supervisely-6.73.286.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1078
+ supervisely-6.73.286.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1079
+ supervisely-6.73.286.dist-info/RECORD,,