supervisely 6.73.284__py3-none-any.whl → 6.73.285__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.
- supervisely/_utils.py +9 -0
- supervisely/api/entity_annotation/figure_api.py +3 -0
- supervisely/api/module_api.py +35 -1
- supervisely/api/video/video_api.py +1 -1
- supervisely/api/video_annotation_tool_api.py +58 -7
- supervisely/nn/inference/cache.py +19 -1
- supervisely/nn/inference/inference.py +22 -0
- supervisely/nn/inference/tracking/base_tracking.py +362 -0
- supervisely/nn/inference/tracking/bbox_tracking.py +179 -129
- supervisely/nn/inference/tracking/mask_tracking.py +420 -329
- supervisely/nn/inference/tracking/point_tracking.py +325 -288
- supervisely/nn/inference/tracking/tracker_interface.py +346 -13
- {supervisely-6.73.284.dist-info → supervisely-6.73.285.dist-info}/METADATA +1 -1
- {supervisely-6.73.284.dist-info → supervisely-6.73.285.dist-info}/RECORD +18 -17
- {supervisely-6.73.284.dist-info → supervisely-6.73.285.dist-info}/LICENSE +0 -0
- {supervisely-6.73.284.dist-info → supervisely-6.73.285.dist-info}/WHEEL +0 -0
- {supervisely-6.73.284.dist-info → supervisely-6.73.285.dist-info}/entry_points.txt +0 -0
- {supervisely-6.73.284.dist-info → supervisely-6.73.285.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|
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
|
-
|
|
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.
|
|
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[[
|
|
24
|
-
frames_loader: Callable[[
|
|
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:
|
|
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 =
|
|
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 =
|
|
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,
|
|
189
|
+
if isinstance(geometry, Point):
|
|
179
190
|
points += 1
|
|
180
|
-
elif isinstance(geometry,
|
|
191
|
+
elif isinstance(geometry, Polygon):
|
|
181
192
|
points += len(geometry.exterior) + len(geometry.interior)
|
|
182
|
-
elif isinstance(geometry,
|
|
193
|
+
elif isinstance(geometry, GraphNodes):
|
|
183
194
|
points += len(geometry.nodes.items())
|
|
184
|
-
elif isinstance(geometry,
|
|
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
|
supervisely/README.md,sha256=XM-DiMC6To3I9RjQZ0c61905EFRR_jnCUx2q3uNR-X8,3331
|
|
2
2
|
supervisely/__init__.py,sha256=bvuMHtPSeGkhj3vVvcVtyhVcMqI5OEBPflLcy8HIqN8,10833
|
|
3
|
-
supervisely/_utils.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
@@ -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=
|
|
875
|
-
supervisely/nn/inference/inference.py,sha256=
|
|
874
|
+
supervisely/nn/inference/cache.py,sha256=h-pP_7th0ana3oJ75sFfTbead3hdKUvYA8Iq2OXDx3I,31317
|
|
875
|
+
supervisely/nn/inference/inference.py,sha256=fDPiX9VNnyGgdCxNzUz456ihTD44uxuLdSOuNgvrwwY,144860
|
|
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/
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
1074
|
-
supervisely-6.73.
|
|
1075
|
-
supervisely-6.73.
|
|
1076
|
-
supervisely-6.73.
|
|
1077
|
-
supervisely-6.73.
|
|
1078
|
-
supervisely-6.73.
|
|
1074
|
+
supervisely-6.73.285.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
1075
|
+
supervisely-6.73.285.dist-info/METADATA,sha256=0qWYnG2O4PsezzNGKkLm6lvjIHZOJ-SNsLoKRnyuXQI,33573
|
|
1076
|
+
supervisely-6.73.285.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
|
1077
|
+
supervisely-6.73.285.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
|
|
1078
|
+
supervisely-6.73.285.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
|
|
1079
|
+
supervisely-6.73.285.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|