supervisely 6.73.347__py3-none-any.whl → 6.73.349__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.
- supervisely/__init__.py +1 -0
- supervisely/api/constants.py +3 -0
- supervisely/api/entity_annotation/figure_api.py +208 -19
- supervisely/api/image_api.py +13 -3
- supervisely/project/download.py +57 -1
- {supervisely-6.73.347.dist-info → supervisely-6.73.349.dist-info}/METADATA +1 -1
- {supervisely-6.73.347.dist-info → supervisely-6.73.349.dist-info}/RECORD +11 -10
- {supervisely-6.73.347.dist-info → supervisely-6.73.349.dist-info}/LICENSE +0 -0
- {supervisely-6.73.347.dist-info → supervisely-6.73.349.dist-info}/WHEEL +0 -0
- {supervisely-6.73.347.dist-info → supervisely-6.73.349.dist-info}/entry_points.txt +0 -0
- {supervisely-6.73.347.dist-info → supervisely-6.73.349.dist-info}/top_level.txt +0 -0
supervisely/__init__.py
CHANGED
|
@@ -54,6 +54,7 @@ from supervisely.task.progress import (
|
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
import supervisely.project as project
|
|
57
|
+
import supervisely.api.constants as api_constants
|
|
57
58
|
from supervisely.project import read_project, get_project_class
|
|
58
59
|
from supervisely.project.download import download, download_async, download_fast
|
|
59
60
|
from supervisely.project.upload import upload
|
|
@@ -23,7 +23,7 @@ import numpy as np
|
|
|
23
23
|
from requests_toolbelt import MultipartDecoder, MultipartEncoder
|
|
24
24
|
from tqdm import tqdm
|
|
25
25
|
|
|
26
|
-
from supervisely._utils import batched
|
|
26
|
+
from supervisely._utils import batched, logger, run_coroutine
|
|
27
27
|
from supervisely.api.module_api import ApiField, ModuleApi, RemoveableBulkModuleApi
|
|
28
28
|
from supervisely.geometry.rectangle import Rectangle
|
|
29
29
|
from supervisely.video_annotation.key_id_map import KeyIdMap
|
|
@@ -473,24 +473,24 @@ class FigureApi(RemoveableBulkModuleApi):
|
|
|
473
473
|
:rtype: :class: `Dict[int, List[FigureInfo]]`
|
|
474
474
|
"""
|
|
475
475
|
fields = [
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
476
|
+
ApiField.ID,
|
|
477
|
+
ApiField.CREATED_AT,
|
|
478
|
+
ApiField.UPDATED_AT,
|
|
479
|
+
ApiField.IMAGE_ID,
|
|
480
|
+
ApiField.OBJECT_ID,
|
|
481
|
+
ApiField.CLASS_ID,
|
|
482
|
+
ApiField.PROJECT_ID,
|
|
483
|
+
ApiField.DATASET_ID,
|
|
484
|
+
ApiField.GEOMETRY,
|
|
485
|
+
ApiField.GEOMETRY_TYPE,
|
|
486
|
+
ApiField.GEOMETRY_META,
|
|
487
|
+
ApiField.TAGS,
|
|
488
|
+
ApiField.META,
|
|
489
|
+
ApiField.AREA,
|
|
490
|
+
ApiField.PRIORITY,
|
|
491
491
|
]
|
|
492
492
|
if skip_geometry is True:
|
|
493
|
-
fields = [x for x in fields if x !=
|
|
493
|
+
fields = [x for x in fields if x != ApiField.GEOMETRY]
|
|
494
494
|
|
|
495
495
|
if image_ids is None:
|
|
496
496
|
filters = []
|
|
@@ -498,8 +498,8 @@ class FigureApi(RemoveableBulkModuleApi):
|
|
|
498
498
|
filters = [
|
|
499
499
|
{
|
|
500
500
|
ApiField.FIELD: ApiField.ENTITY_ID,
|
|
501
|
-
|
|
502
|
-
|
|
501
|
+
ApiField.OPERATOR: "in",
|
|
502
|
+
ApiField.VALUE: image_ids,
|
|
503
503
|
}
|
|
504
504
|
]
|
|
505
505
|
data = {
|
|
@@ -784,3 +784,192 @@ class FigureApi(RemoveableBulkModuleApi):
|
|
|
784
784
|
|
|
785
785
|
if tasks:
|
|
786
786
|
await asyncio.gather(*tasks)
|
|
787
|
+
|
|
788
|
+
async def download_async(
|
|
789
|
+
self,
|
|
790
|
+
dataset_id: int,
|
|
791
|
+
image_ids: Optional[List[int]] = None,
|
|
792
|
+
skip_geometry: bool = False,
|
|
793
|
+
semaphore: Optional[asyncio.Semaphore] = None,
|
|
794
|
+
log_progress: bool = True,
|
|
795
|
+
) -> Dict[int, List[FigureInfo]]:
|
|
796
|
+
"""
|
|
797
|
+
Asynchronously download figures for the given dataset ID. Can be filtered by image IDs.
|
|
798
|
+
This method is significantly faster than the synchronous version for large datasets.
|
|
799
|
+
|
|
800
|
+
:param dataset_id: Dataset ID in Supervisely.
|
|
801
|
+
:type dataset_id: int
|
|
802
|
+
:param image_ids: Specify the list of image IDs within the given dataset ID. If image_ids is None, the method returns all possible pairs of images with figures.
|
|
803
|
+
:type image_ids: List[int], optional
|
|
804
|
+
:param skip_geometry: Skip the download of figure geometry. May be useful for a significant api request speed increase in the large datasets.
|
|
805
|
+
:type skip_geometry: bool
|
|
806
|
+
:param semaphore: Semaphore to limit the number of concurrent downloads.
|
|
807
|
+
:type semaphore: Optional[asyncio.Semaphore], optional
|
|
808
|
+
:param log_progress: If True, log the progress of the download.
|
|
809
|
+
:type log_progress: bool, optional
|
|
810
|
+
:return: A dictionary where keys are image IDs and values are lists of figures.
|
|
811
|
+
:rtype: Dict[int, List[FigureInfo]]
|
|
812
|
+
|
|
813
|
+
:Usage example:
|
|
814
|
+
|
|
815
|
+
.. code-block:: python
|
|
816
|
+
|
|
817
|
+
import supervisely as sly
|
|
818
|
+
|
|
819
|
+
os.environ['SERVER_ADDRESS'] = 'https://app.supervisely.com'
|
|
820
|
+
os.environ['API_TOKEN'] = 'Your Supervisely API Token'
|
|
821
|
+
api = sly.Api.from_env()
|
|
822
|
+
|
|
823
|
+
dataset_id = 12345
|
|
824
|
+
download_coroutine = api.image.figure.download_async(dataset_id)
|
|
825
|
+
figures = sly.run_coroutine(download_coroutine)
|
|
826
|
+
"""
|
|
827
|
+
fields = [
|
|
828
|
+
ApiField.ID,
|
|
829
|
+
ApiField.CREATED_AT,
|
|
830
|
+
ApiField.UPDATED_AT,
|
|
831
|
+
ApiField.IMAGE_ID,
|
|
832
|
+
ApiField.OBJECT_ID,
|
|
833
|
+
ApiField.CLASS_ID,
|
|
834
|
+
ApiField.PROJECT_ID,
|
|
835
|
+
ApiField.DATASET_ID,
|
|
836
|
+
ApiField.GEOMETRY,
|
|
837
|
+
ApiField.GEOMETRY_TYPE,
|
|
838
|
+
ApiField.GEOMETRY_META,
|
|
839
|
+
ApiField.TAGS,
|
|
840
|
+
ApiField.META,
|
|
841
|
+
ApiField.AREA,
|
|
842
|
+
ApiField.PRIORITY,
|
|
843
|
+
]
|
|
844
|
+
if skip_geometry is True:
|
|
845
|
+
fields = [x for x in fields if x != ApiField.GEOMETRY]
|
|
846
|
+
|
|
847
|
+
if image_ids is None:
|
|
848
|
+
filters = []
|
|
849
|
+
else:
|
|
850
|
+
filters = [
|
|
851
|
+
{
|
|
852
|
+
ApiField.FIELD: ApiField.ENTITY_ID,
|
|
853
|
+
ApiField.OPERATOR: "in",
|
|
854
|
+
ApiField.VALUE: image_ids,
|
|
855
|
+
}
|
|
856
|
+
]
|
|
857
|
+
|
|
858
|
+
data = {
|
|
859
|
+
ApiField.DATASET_ID: dataset_id,
|
|
860
|
+
ApiField.FIELDS: fields,
|
|
861
|
+
ApiField.FILTER: filters,
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
# Get first page to determine total pages
|
|
865
|
+
if semaphore is None:
|
|
866
|
+
semaphore = self._api.get_default_semaphore()
|
|
867
|
+
images_figures = defaultdict(list)
|
|
868
|
+
pages_count = None
|
|
869
|
+
total = 0
|
|
870
|
+
tasks = []
|
|
871
|
+
|
|
872
|
+
async def _get_page(page_data, page_num):
|
|
873
|
+
async with semaphore:
|
|
874
|
+
response = await self._api.post_async("figures.list", page_data)
|
|
875
|
+
response_json = response.json()
|
|
876
|
+
nonlocal pages_count, total
|
|
877
|
+
pages_count = response_json["pagesCount"]
|
|
878
|
+
if page_num == 1:
|
|
879
|
+
total = response_json["total"]
|
|
880
|
+
|
|
881
|
+
page_figures = []
|
|
882
|
+
for info in response_json["entities"]:
|
|
883
|
+
figure_info = self._convert_json_info(info, True)
|
|
884
|
+
page_figures.append(figure_info)
|
|
885
|
+
return page_figures
|
|
886
|
+
|
|
887
|
+
# Get first page
|
|
888
|
+
data[ApiField.PAGE] = 1
|
|
889
|
+
first_page_figures = await _get_page(data, 1)
|
|
890
|
+
|
|
891
|
+
if log_progress:
|
|
892
|
+
progress_cb = tqdm(total=total, desc="Downloading figures")
|
|
893
|
+
|
|
894
|
+
for figure in first_page_figures:
|
|
895
|
+
images_figures[figure.entity_id].append(figure)
|
|
896
|
+
if log_progress:
|
|
897
|
+
progress_cb.update(1)
|
|
898
|
+
|
|
899
|
+
# Get rest of the pages in parallel
|
|
900
|
+
if pages_count > 1:
|
|
901
|
+
for page in range(2, pages_count + 1):
|
|
902
|
+
page_data = data.copy()
|
|
903
|
+
page_data[ApiField.PAGE] = page
|
|
904
|
+
tasks.append(asyncio.create_task(_get_page(page_data, page)))
|
|
905
|
+
|
|
906
|
+
for task in asyncio.as_completed(tasks):
|
|
907
|
+
page_figures = await task
|
|
908
|
+
for figure in page_figures:
|
|
909
|
+
images_figures[figure.entity_id].append(figure)
|
|
910
|
+
if log_progress:
|
|
911
|
+
progress_cb.update(1)
|
|
912
|
+
|
|
913
|
+
return dict(images_figures)
|
|
914
|
+
|
|
915
|
+
def download_fast(
|
|
916
|
+
self,
|
|
917
|
+
dataset_id: int,
|
|
918
|
+
image_ids: Optional[List[int]] = None,
|
|
919
|
+
skip_geometry: bool = False,
|
|
920
|
+
semaphore: Optional[asyncio.Semaphore] = None,
|
|
921
|
+
log_progress: bool = True,
|
|
922
|
+
) -> Dict[int, List[FigureInfo]]:
|
|
923
|
+
"""
|
|
924
|
+
Download figures for the given dataset ID. Can be filtered by image IDs.
|
|
925
|
+
This method is significantly faster than the synchronous version for large datasets and
|
|
926
|
+
is designed to be used in an asynchronous context.
|
|
927
|
+
Will fallback to the synchronous version if async fails.
|
|
928
|
+
|
|
929
|
+
:param dataset_id: Dataset ID in Supervisely.
|
|
930
|
+
:type dataset_id: int
|
|
931
|
+
:param image_ids: Specify the list of image IDs within the given dataset ID. If image_ids is None, the method returns all possible pairs of images with figures.
|
|
932
|
+
:type image_ids: List[int], optional
|
|
933
|
+
:param skip_geometry: Skip the download of figure geometry. May be useful for a significant api request speed increase in the large datasets.
|
|
934
|
+
:type skip_geometry: bool
|
|
935
|
+
:param semaphore: Semaphore to limit the number of concurrent downloads.
|
|
936
|
+
:type semaphore: Optional[asyncio.Semaphore], optional
|
|
937
|
+
:param log_progress: If True, log the progress of the download.
|
|
938
|
+
:type log_progress: bool, optional
|
|
939
|
+
|
|
940
|
+
:return: A dictionary where keys are image IDs and values are lists of figures.
|
|
941
|
+
:rtype: Dict[int, List[FigureInfo]]
|
|
942
|
+
|
|
943
|
+
:Usage example:
|
|
944
|
+
|
|
945
|
+
.. code-block:: python
|
|
946
|
+
|
|
947
|
+
import supervisely as sly
|
|
948
|
+
|
|
949
|
+
os.environ['SERVER_ADDRESS'] = 'https://app.supervisely.com'
|
|
950
|
+
os.environ['API_TOKEN'] = 'Your Supervisely API Token'
|
|
951
|
+
api = sly.Api.from_env()
|
|
952
|
+
|
|
953
|
+
dataset_id = 12345
|
|
954
|
+
figures = api.image.figure.download_fast(dataset_id)
|
|
955
|
+
"""
|
|
956
|
+
try:
|
|
957
|
+
return run_coroutine(
|
|
958
|
+
self.download_async(
|
|
959
|
+
dataset_id=dataset_id,
|
|
960
|
+
image_ids=image_ids,
|
|
961
|
+
skip_geometry=skip_geometry,
|
|
962
|
+
semaphore=semaphore,
|
|
963
|
+
log_progress=log_progress,
|
|
964
|
+
)
|
|
965
|
+
)
|
|
966
|
+
except Exception:
|
|
967
|
+
# Fallback to the synchronous version if async fails
|
|
968
|
+
logger.debug("Async download of figures is failed, falling back to sync download.")
|
|
969
|
+
if log_progress:
|
|
970
|
+
logger.debug("Downloading figures without progress bar.")
|
|
971
|
+
return self.download(
|
|
972
|
+
dataset_id=dataset_id,
|
|
973
|
+
image_ids=image_ids,
|
|
974
|
+
skip_geometry=skip_geometry,
|
|
975
|
+
)
|
supervisely/api/image_api.py
CHANGED
|
@@ -55,6 +55,7 @@ from supervisely._utils import (
|
|
|
55
55
|
from supervisely.annotation.annotation import Annotation
|
|
56
56
|
from supervisely.annotation.tag import Tag
|
|
57
57
|
from supervisely.annotation.tag_meta import TagApplicableTo, TagMeta, TagValueType
|
|
58
|
+
from supervisely.api.constants import DOWNLOAD_BATCH_SIZE
|
|
58
59
|
from supervisely.api.dataset_api import DatasetInfo
|
|
59
60
|
from supervisely.api.entity_annotation.figure_api import FigureApi
|
|
60
61
|
from supervisely.api.entity_annotation.tag_api import TagApi
|
|
@@ -368,7 +369,7 @@ class ImageInfo(NamedTuple):
|
|
|
368
369
|
#: :class:`int`: ID of the blob file in Supervisely storage related to the image.
|
|
369
370
|
related_data_id: Optional[int] = None
|
|
370
371
|
|
|
371
|
-
#: :class:`str`: Unique ID of the image that links it to the corresponding blob file in Supervisely storage
|
|
372
|
+
#: :class:`str`: Unique ID of the image that links it to the corresponding blob file in Supervisely storage
|
|
372
373
|
#: uses for downloading source blob file.
|
|
373
374
|
download_id: Optional[str] = None
|
|
374
375
|
|
|
@@ -1015,7 +1016,14 @@ class ImageApi(RemoveableBulkModuleApi):
|
|
|
1015
1016
|
"""
|
|
1016
1017
|
Get image id and it content from given dataset and list of images ids.
|
|
1017
1018
|
"""
|
|
1018
|
-
|
|
1019
|
+
if DOWNLOAD_BATCH_SIZE is not None and isinstance(DOWNLOAD_BATCH_SIZE, int):
|
|
1020
|
+
batches = batched(ids, DOWNLOAD_BATCH_SIZE)
|
|
1021
|
+
logger.debug(
|
|
1022
|
+
f"Batch size for func 'ImageApi._download_batch' changed to: {DOWNLOAD_BATCH_SIZE}"
|
|
1023
|
+
)
|
|
1024
|
+
else:
|
|
1025
|
+
batches = batched(ids)
|
|
1026
|
+
for batch_ids in batches:
|
|
1019
1027
|
response = self._api.post(
|
|
1020
1028
|
"images.bulk.download",
|
|
1021
1029
|
{ApiField.DATASET_ID: dataset_id, ApiField.IMAGE_IDS: batch_ids},
|
|
@@ -2352,7 +2360,9 @@ class ImageApi(RemoveableBulkModuleApi):
|
|
|
2352
2360
|
|
|
2353
2361
|
for batch in blob_image_infos_generator:
|
|
2354
2362
|
names = [item.name for item in batch]
|
|
2355
|
-
metas_batch =
|
|
2363
|
+
metas_batch = (
|
|
2364
|
+
[metas[name] for name in names] if metas is not None else [{}] * len(names)
|
|
2365
|
+
)
|
|
2356
2366
|
items = [
|
|
2357
2367
|
{ApiField.TEAM_FILE_ID: team_file_id, ApiField.SOURCE_BLOB: item.offsets_dict}
|
|
2358
2368
|
for item in batch
|
supervisely/project/download.py
CHANGED
|
@@ -284,8 +284,64 @@ def download_fast(
|
|
|
284
284
|
Download project in a fast mode.
|
|
285
285
|
Items are downloaded asynchronously. If an error occurs, the method will fallback to synchronous download.
|
|
286
286
|
Automatically detects project type.
|
|
287
|
-
|
|
287
|
+
|
|
288
|
+
:param api: Supervisely API address and token.
|
|
289
|
+
:type api: :class:`Api<supervisely.api.api.Api>`
|
|
290
|
+
:param project_id: Supervisely downloadable project ID.
|
|
291
|
+
:type project_id: :class:`int`
|
|
292
|
+
:param dest_dir: Destination directory.
|
|
293
|
+
:type dest_dir: :class:`str`
|
|
294
|
+
:param dataset_ids: Filter datasets by IDs.
|
|
295
|
+
:type dataset_ids: :class:`list` [ :class:`int` ], optional
|
|
296
|
+
:param log_progress: Show uploading progress bar.
|
|
297
|
+
:type log_progress: :class:`bool`
|
|
298
|
+
:param progress_cb: Function for tracking download progress.
|
|
299
|
+
:type progress_cb: tqdm or callable, optional
|
|
300
|
+
:param semaphore: Semaphore to limit the number of concurrent downloads of items.
|
|
301
|
+
:type semaphore: :class:`asyncio.Semaphore`, optional
|
|
302
|
+
:param only_image_tags: Download project with only images tags (without objects tags).
|
|
303
|
+
:type only_image_tags: :class:`bool`, optional
|
|
304
|
+
:param save_image_info: Download images infos or not.
|
|
305
|
+
:type save_image_info: :class:`bool`, optional
|
|
306
|
+
:param save_images: Download images or not.
|
|
307
|
+
:type save_images: :class:`bool`, optional
|
|
308
|
+
:param save_image_meta: Download images metadata in JSON format or not.
|
|
309
|
+
:type save_image_meta: :class:`bool`, optional
|
|
310
|
+
:param images_ids: Filter images by IDs.
|
|
311
|
+
:type images_ids: :class:`list` [ :class:`int` ], optional
|
|
312
|
+
:param resume_download: Resume download enables to download only missing files avoiding erase of existing files.
|
|
313
|
+
:type resume_download: :class:`bool`, optional
|
|
314
|
+
:param switch_size: Size threshold that determines how an item will be downloaded.
|
|
315
|
+
Items larger than this size will be downloaded as single files, while smaller items will be downloaded as a batch.
|
|
316
|
+
Useful for projects with different item sizes and when you exactly know which size will perform better with batch download.
|
|
317
|
+
:type switch_size: :class:`int`, optional
|
|
318
|
+
:param batch_size: Number of items to download in a single batch.
|
|
319
|
+
:type batch_size: :class:`int`, optional
|
|
320
|
+
:param download_blob_files: Download project with Blob files in native format.
|
|
321
|
+
If False - download project like a regular project in classic Supervisely format.
|
|
322
|
+
:type download_blob_files: :class:`bool`, optional
|
|
323
|
+
:param project_info: Project info object. To avoid additional API requests.
|
|
324
|
+
:type project_info: :class:`ProjectInfo`, optional
|
|
325
|
+
:return: None
|
|
326
|
+
:rtype: NoneType
|
|
327
|
+
|
|
328
|
+
:Usage example:
|
|
329
|
+
|
|
330
|
+
.. code-block:: python
|
|
331
|
+
|
|
332
|
+
import supervisely as sly
|
|
333
|
+
|
|
334
|
+
os.environ['SERVER_ADDRESS'] = 'https://app.supervisely.com'
|
|
335
|
+
os.environ['API_TOKEN'] = 'Your Supervisely API Token'
|
|
336
|
+
api = sly.Api.from_env()
|
|
337
|
+
|
|
338
|
+
project_id = 8888
|
|
339
|
+
save_directory = "/path/to/save/projects"
|
|
340
|
+
|
|
341
|
+
sly.download_fast(api, project_id, save_directory)
|
|
342
|
+
|
|
288
343
|
"""
|
|
344
|
+
|
|
289
345
|
download_async_or_sync(
|
|
290
346
|
api=api,
|
|
291
347
|
project_id=project_id,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
supervisely/README.md,sha256=XM-DiMC6To3I9RjQZ0c61905EFRR_jnCUx2q3uNR-X8,3331
|
|
2
|
-
supervisely/__init__.py,sha256=
|
|
2
|
+
supervisely/__init__.py,sha256=_qphKFT0_toEQmF5IjB1sWjztbF4lP1tLY29PBJhArY,10917
|
|
3
3
|
supervisely/_utils.py,sha256=DA-sPMk68GyInrc4DMxO-Azp5-uWkwZx_NAr8mXVI0o,18280
|
|
4
4
|
supervisely/function_wrapper.py,sha256=R5YajTQ0GnRp2vtjwfC9hINkzQc0JiyGsu8TER373xY,1912
|
|
5
5
|
supervisely/sly_logger.py,sha256=z92Vu5hmC0GgTIJO1n6kPDayRW9__8ix8hL6poDZj-Y,6274
|
|
@@ -24,11 +24,12 @@ supervisely/api/agent_api.py,sha256=ShWAIlXcWXcyI9fqVuP5GZVCigCMJmjnvdGUfLspD6Y,
|
|
|
24
24
|
supervisely/api/annotation_api.py,sha256=XE3Sr_oQOMraZ9NlWs9ZqUsff1j47XRDh9Fy8rW4ubw,82763
|
|
25
25
|
supervisely/api/api.py,sha256=D90G6ivwyHHK7WVo4ByKtv65lSED_Sm1qlp_TpyCeAc,67398
|
|
26
26
|
supervisely/api/app_api.py,sha256=RsbVej8WxWVn9cNo5s3Fqd1symsCdsfOaKVBKEUapRY,71927
|
|
27
|
+
supervisely/api/constants.py,sha256=qwK9Q3mHGz5Ny5WuBmPQgawBWfzCT2DRiw3IcaCDRmo,44
|
|
27
28
|
supervisely/api/dataset_api.py,sha256=c6rEVySSxbyDB5fUCilsc5AKk0pWN_5vVN6OceDbEvc,47918
|
|
28
29
|
supervisely/api/file_api.py,sha256=EX_Cam93QkR5SOOIkIznkzERIr0u7N7GHVGK27iOm20,92952
|
|
29
30
|
supervisely/api/github_api.py,sha256=NIexNjEer9H5rf5sw2LEZd7C1WR-tK4t6IZzsgeAAwQ,623
|
|
30
31
|
supervisely/api/image_annotation_tool_api.py,sha256=YcUo78jRDBJYvIjrd-Y6FJAasLta54nnxhyaGyanovA,5237
|
|
31
|
-
supervisely/api/image_api.py,sha256=
|
|
32
|
+
supervisely/api/image_api.py,sha256=sE2lIPPYLv1tJsuFSjc9IvLVB07kmq9PnPodU3J6aEs,223637
|
|
32
33
|
supervisely/api/import_storage_api.py,sha256=BDCgmR0Hv6OoiRHLCVPKt3iDxSVlQp1WrnKhAK_Zl84,460
|
|
33
34
|
supervisely/api/issues_api.py,sha256=BqDJXmNoTzwc3xe6_-mA7FDFC5QQ-ahGbXk_HmpkSeQ,17925
|
|
34
35
|
supervisely/api/labeling_job_api.py,sha256=VM1pjM65cUTeer1hrI7cSmCUOHJb7fzK6gJ-abA07hg,55097
|
|
@@ -49,7 +50,7 @@ supervisely/api/video_annotation_tool_api.py,sha256=3A9-U8WJzrTShP_n9T8U01M9FzGY
|
|
|
49
50
|
supervisely/api/workspace_api.py,sha256=5KAxpI9DKBmgF_pyQaXHpGT30HZ9wRtR6DP3FoYFZtY,9228
|
|
50
51
|
supervisely/api/entity_annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
51
52
|
supervisely/api/entity_annotation/entity_annotation_api.py,sha256=K79KdDyepQv4FiNQHBj9V4-zLIemxK9WG1ig1bfBKb8,3083
|
|
52
|
-
supervisely/api/entity_annotation/figure_api.py,sha256=
|
|
53
|
+
supervisely/api/entity_annotation/figure_api.py,sha256=rmsE3L_JfqN94sLN637pQ0syiBAXPd8RyAwhl41j1xs,35318
|
|
53
54
|
supervisely/api/entity_annotation/object_api.py,sha256=gbcNvN_KY6G80Me8fHKQgryc2Co7VU_kfFd1GYILZ4E,8875
|
|
54
55
|
supervisely/api/entity_annotation/tag_api.py,sha256=M-28m9h8R4k9Eqo6P1S0UH8_D5kqCwAvQLYY6_Yz4oM,11161
|
|
55
56
|
supervisely/api/pointcloud/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -1017,7 +1018,7 @@ supervisely/pointcloud_episodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
|
1017
1018
|
supervisely/pointcloud_episodes/pointcloud_episodes.py,sha256=cRXdtw7bMsbsdVQjxfWxFSESrO-LGiqqsZyyExl2Mbg,3430
|
|
1018
1019
|
supervisely/project/__init__.py,sha256=hlzdj9Pgy53Q3qdP8LMtGTChvZHQuuShdtui2eRUQeE,2601
|
|
1019
1020
|
supervisely/project/data_version.py,sha256=P5Lui6i64pYeJWmAdGJDv8GRXxjfpSSZ8zT_MxIrynE,19553
|
|
1020
|
-
supervisely/project/download.py,sha256=
|
|
1021
|
+
supervisely/project/download.py,sha256=N6UEXY_eLtzjz61Y2SaJLg2-vv_Cvp9cXCUUM9R8-d8,27677
|
|
1021
1022
|
supervisely/project/pointcloud_episode_project.py,sha256=yiWdNBQiI6f1O9sr1pg8JHW6O-w3XUB1rikJNn3Oung,41866
|
|
1022
1023
|
supervisely/project/pointcloud_project.py,sha256=Kx1Vaes-krwG3BiRRtHRLQxb9G5m5bTHPN9IzRqmNWo,49399
|
|
1023
1024
|
supervisely/project/project.py,sha256=OunVB11sVQSOvkqkjsEEkX1nq9OUXOXpHTdcLDjOFe0,233256
|
|
@@ -1082,9 +1083,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
|
|
|
1082
1083
|
supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
|
|
1083
1084
|
supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
|
|
1084
1085
|
supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
|
|
1085
|
-
supervisely-6.73.
|
|
1086
|
-
supervisely-6.73.
|
|
1087
|
-
supervisely-6.73.
|
|
1088
|
-
supervisely-6.73.
|
|
1089
|
-
supervisely-6.73.
|
|
1090
|
-
supervisely-6.73.
|
|
1086
|
+
supervisely-6.73.349.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
1087
|
+
supervisely-6.73.349.dist-info/METADATA,sha256=OuZBH6eZb1yw77nA2ghY1OmGJ9ZPmki8IlMCPIE_2bU,33596
|
|
1088
|
+
supervisely-6.73.349.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
|
|
1089
|
+
supervisely-6.73.349.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
|
|
1090
|
+
supervisely-6.73.349.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
|
|
1091
|
+
supervisely-6.73.349.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|