supervisely 6.73.448__py3-none-any.whl → 6.73.450__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.
@@ -15,6 +15,7 @@ from supervisely.geometry.multichannel_bitmap import MultichannelBitmap
15
15
  from supervisely.geometry.closed_surface_mesh import ClosedSurfaceMesh
16
16
  from supervisely.geometry.alpha_mask import AlphaMask
17
17
  from supervisely.geometry.cuboid_2d import Cuboid2d
18
+ from supervisely.geometry.polyline_3d import Polyline3D
18
19
 
19
20
 
20
21
  _INPUT_GEOMETRIES = [
@@ -34,6 +35,7 @@ _INPUT_GEOMETRIES = [
34
35
  ClosedSurfaceMesh,
35
36
  AlphaMask,
36
37
  Cuboid2d,
38
+ Polyline3D,
37
39
  ]
38
40
  _JSON_SHAPE_TO_GEOMETRY_TYPE = {
39
41
  geometry.geometry_name(): geometry for geometry in _INPUT_GEOMETRIES
@@ -0,0 +1,110 @@
1
+ from supervisely.geometry.geometry import Geometry
2
+ from supervisely.geometry.constants import LABELER_LOGIN, UPDATED_AT, CREATED_AT, ID, CLASS_ID
3
+ from supervisely.geometry.cuboid_3d import Vector3d
4
+ from typing import List, Union
5
+
6
+
7
+ class Polyline3D(Geometry):
8
+ """
9
+ Polyline3D geometry
10
+
11
+ :param points: List of 3D point coordinates which define the polyline in 3D space.
12
+ :type points: List[List[int, int, int]]
13
+ :param sly_id: Polyline ID in Supervisely server.
14
+ :type sly_id: int, optional
15
+ :param class_id: ID of :class:`ObjClass<supervisely.annotation.obj_class.ObjClass>` to which Polyline belongs.
16
+ :type class_id: int, optional
17
+ :param labeler_login: Login of the user who created Polyline.
18
+ :type labeler_login: str, optional
19
+ :param updated_at: Date and Time when Polyline was modified last. Date Format: Year:Month:Day:Hour:Minute:Seconds. Example: '2021-01-22T19:37:50.158Z'.
20
+ :type updated_at: str, optional
21
+ :param created_at: Date and Time when Polyline was created. Date Format is the same as in "updated_at" parameter.
22
+ :type created_at: str, optional
23
+
24
+ :Usage example:
25
+
26
+ .. code-block:: python
27
+
28
+ import supervisely as sly
29
+
30
+ points = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
31
+ figure = sly.Polyline(points)
32
+ """
33
+
34
+ @staticmethod
35
+ def geometry_name():
36
+ return "polyline_3d"
37
+
38
+ def __init__(
39
+ self,
40
+ points: Union[List[float], List[Vector3d]],
41
+ sly_id=None,
42
+ class_id=None,
43
+ labeler_login=None,
44
+ updated_at=None,
45
+ created_at=None,
46
+ ):
47
+ if not isinstance(points[0], Vector3d):
48
+ points = [Vector3d(point[0], point[1], point[2]) for point in points]
49
+ super().__init__(
50
+ sly_id=sly_id,
51
+ class_id=class_id,
52
+ labeler_login=labeler_login,
53
+ updated_at=updated_at,
54
+ created_at=created_at,
55
+ )
56
+
57
+ self._points = points
58
+
59
+ @property
60
+ def points(self):
61
+ return self._points
62
+
63
+ def to_json(self):
64
+ points = [[point.x, point.y, point.z] for point in self._points]
65
+ res = {"points": points}
66
+ self._add_creation_info(res)
67
+ return res
68
+
69
+ @classmethod
70
+ def from_json(cls, data):
71
+ """
72
+ Convert a json dict to Polyline3D.
73
+
74
+ :param data: Polyline3D in json format as a dict.
75
+ :type data: dict
76
+ :return: Polyline3D object
77
+ :rtype: :class:`Polyline3D<Polyline3D>`
78
+ :Usage example:
79
+
80
+ .. code-block:: python
81
+
82
+ import supervisely as sly
83
+
84
+ figure_json = {
85
+ "points": {
86
+ [
87
+ [1, 2, 3],
88
+ [4, 5, 6],
89
+ [7, 8, 9]
90
+ ],
91
+ }
92
+ }
93
+ figure = sly.Polyline3D.from_json(figure_json)
94
+ """
95
+ if not data.get("points"):
96
+ raise ValueError("Data dict must contain 'points' field!")
97
+ points = data["points"]
98
+ labeler_login = data.get(LABELER_LOGIN, None)
99
+ updated_at = data.get(UPDATED_AT, None)
100
+ created_at = data.get(CREATED_AT, None)
101
+ sly_id = data.get(ID, None)
102
+ class_id = data.get(CLASS_ID, None)
103
+ return cls(
104
+ points,
105
+ sly_id=sly_id,
106
+ class_id=class_id,
107
+ labeler_login=labeler_login,
108
+ updated_at=updated_at,
109
+ created_at=created_at,
110
+ )
@@ -3,6 +3,7 @@ from typing import List, Optional
3
3
  import numpy as np
4
4
 
5
5
  from supervisely.geometry.cuboid_3d import Cuboid3d
6
+ from supervisely.geometry.polyline_3d import Polyline3D
6
7
 
7
8
 
8
9
  class Prediction:
@@ -81,3 +82,9 @@ class PredictionCuboid3d(Prediction):
81
82
  super(PredictionCuboid3d, self).__init__(class_name=class_name)
82
83
  self.cuboid_3d = cuboid_3d
83
84
  self.score = score
85
+
86
+
87
+ class PredictionPolyline3D(Prediction):
88
+ def __init__(self, class_name: str, polyline_3d: Polyline3D):
89
+ super(PredictionPolyline3D, self).__init__(class_name=class_name)
90
+ self.polyline_3d = polyline_3d
@@ -180,7 +180,13 @@ class TrainValSplitsSelector:
180
180
  return False
181
181
 
182
182
  # Check if datasets are not empty
183
- filters = [{ ApiField.FIELD: ApiField.ID, ApiField.OPERATOR: "in", ApiField.VALUE: train_dataset_id + val_dataset_id}]
183
+ filters = [
184
+ {
185
+ ApiField.FIELD: ApiField.ID,
186
+ ApiField.OPERATOR: "in",
187
+ ApiField.VALUE: train_dataset_id + val_dataset_id,
188
+ }
189
+ ]
184
190
  selected_datasets = self.api.dataset.get_list(self.project_id, filters, recursive=True)
185
191
  datasets_count = {}
186
192
  for dataset in selected_datasets:
@@ -334,6 +340,7 @@ class TrainValSplitsSelector:
334
340
 
335
341
  def _detect_splits(self, collections_split: bool, datasets_split: bool) -> bool:
336
342
  """Detect splits based on the selected method"""
343
+ self._parse_collections()
337
344
  splits_found = False
338
345
  if collections_split:
339
346
  splits_found = self._detect_collections()
@@ -341,47 +348,59 @@ class TrainValSplitsSelector:
341
348
  splits_found = self._detect_datasets()
342
349
  return splits_found
343
350
 
351
+ def _parse_collections(self) -> None:
352
+ """Parse collections with train and val prefixes and set them to train_val_splits variables"""
353
+ all_collections = self.api.entities_collection.get_list(self.project_id)
354
+ existing_train_collections = [
355
+ collection for collection in all_collections if collection.name.startswith("train_")
356
+ ]
357
+ existing_val_collections = [
358
+ collection for collection in all_collections if collection.name.startswith("val_")
359
+ ]
360
+
361
+ self._all_train_collections = existing_train_collections
362
+ self._all_val_collections = existing_val_collections
363
+ self._latest_train_collection = self._get_latest_collection(existing_train_collections, "train")
364
+ self._latest_val_collection = self._get_latest_collection(existing_val_collections, "val")
365
+
366
+ def _get_latest_collection(
367
+ self, collections: List[EntitiesCollectionInfo], expected_prefix: str
368
+ ) -> EntitiesCollectionInfo:
369
+ curr_collection = None
370
+ curr_idx = 0
371
+ for collection in collections:
372
+ parts = collection.name.split("_")
373
+ if len(parts) == 2:
374
+ prefix = parts[0].lower()
375
+ if prefix == expected_prefix:
376
+ if parts[1].isdigit():
377
+ collection_idx = int(parts[1])
378
+ if collection_idx > curr_idx:
379
+ curr_idx = collection_idx
380
+ curr_collection = collection
381
+ return curr_collection
382
+
383
+
344
384
  def _detect_collections(self) -> bool:
345
385
  """Find collections with train and val prefixes and set them to train_val_splits"""
346
- def _get_latest_collection(collections: List[EntitiesCollectionInfo]) -> EntitiesCollectionInfo:
347
- curr_collection = None
348
- curr_idx = 0
349
- for collection in collections:
350
- collection_idx = int(collection.name.rsplit('_', 1)[-1])
351
- if collection_idx > curr_idx:
352
- curr_idx = collection_idx
353
- curr_collection = collection
354
- return curr_collection
355
386
 
356
- all_collections = self.api.entities_collection.get_list(self.project_id)
357
- train_collections = []
358
- val_collections = []
359
387
  collections_found = False
360
- for collection in all_collections:
361
- if collection.name.lower().startswith("train_"):
362
- train_collections.append(collection)
363
- elif collection.name.lower().startswith("val_"):
364
- val_collections.append(collection)
365
-
366
- train_collection = _get_latest_collection(train_collections)
367
- val_collection = _get_latest_collection(val_collections)
368
- if train_collection is not None and val_collection is not None:
369
- self.train_val_splits.set_collections_splits([train_collection.id], [val_collection.id])
388
+ if self._latest_train_collection is not None and self._latest_val_collection is not None:
389
+ self.train_val_splits.set_collections_splits(
390
+ [self._latest_train_collection.id], [self._latest_val_collection.id]
391
+ )
370
392
  self.validator_text = Text("Train and val collections are detected", status="info")
371
393
  self.validator_text.show()
372
394
  collections_found = True
373
- self._all_train_collections = train_collections
374
- self._all_val_collections = val_collections
375
- self._latest_train_collection = train_collection
376
- self._latest_val_collection = val_collection
377
395
  else:
378
396
  self.validator_text = Text("")
379
397
  self.validator_text.hide()
380
398
  collections_found = False
381
399
  return collections_found
382
-
400
+
383
401
  def _detect_datasets(self) -> bool:
384
402
  """Find datasets with train and val prefixes and set them to train_val_splits"""
403
+
385
404
  def _extend_with_nested(root_ds):
386
405
  nested = self.api.dataset.get_nested(self.project_id, root_ds.id)
387
406
  nested_ids = [ds.id for ds in nested]
@@ -407,7 +426,9 @@ class TrainValSplitsSelector:
407
426
  val_count = len(train_val_dataset_ids["val"])
408
427
 
409
428
  if train_count > 0 and val_count > 0:
410
- self.train_val_splits.set_datasets_splits(train_val_dataset_ids["train"], train_val_dataset_ids["val"])
429
+ self.train_val_splits.set_datasets_splits(
430
+ train_val_dataset_ids["train"], train_val_dataset_ids["val"]
431
+ )
411
432
  datasets_found = True
412
433
 
413
434
  if train_count > 0 and val_count > 0:
@@ -415,7 +436,7 @@ class TrainValSplitsSelector:
415
436
  message = "train and val datasets are detected"
416
437
  else:
417
438
  message = "Multiple train and val datasets are detected. Check manually if selection is correct"
418
-
439
+
419
440
  self.validator_text = Text(message, status="info")
420
441
  self.validator_text.show()
421
442
  datasets_found = True
@@ -423,4 +444,4 @@ class TrainValSplitsSelector:
423
444
  self.validator_text = Text("")
424
445
  self.validator_text.hide()
425
446
  datasets_found = False
426
- return datasets_found
447
+ return datasets_found
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: supervisely
3
- Version: 6.73.448
3
+ Version: 6.73.450
4
4
  Summary: Supervisely Python SDK.
5
5
  Home-page: https://github.com/supervisely/supervisely
6
6
  Author: Supervisely
@@ -8,7 +8,7 @@ supervisely/versions.json,sha256=J7V7XPpDno0fvmNaAXXcxNksXqpRFaYRrG4POC0UDKQ,608
8
8
  supervisely/annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  supervisely/annotation/annotation.py,sha256=th4gsIU-LNGcMRohHrtupmjxDwdzx1g4_0xIAa6NyJU,114717
10
10
  supervisely/annotation/annotation_transforms.py,sha256=TlVy_gUbM-XH6GbLpZPrAi6pMIGTr7Ow02iSKOSTa-I,9582
11
- supervisely/annotation/json_geometries_map.py,sha256=nL6AmMhFy02fw9ryBm75plKyOkDh61QdOToSuLAcz_Q,1659
11
+ supervisely/annotation/json_geometries_map.py,sha256=2MaOklrooKc6QUGXEEEhatPsNxRodp2cPsaiYENlv98,1731
12
12
  supervisely/annotation/label.py,sha256=sOK6lGDa-uSNCb7o4F9BJwnPia-Qp36OmFOU8oHyHPA,40601
13
13
  supervisely/annotation/obj_class.py,sha256=W7-958-E9TfsL7eKAI3bbOvfAVxd3Unq-7F3lc2Gxjg,16672
14
14
  supervisely/annotation/obj_class_collection.py,sha256=lsBJ8mElvwMHky2vsj4GfZ9_Uq186eS-o4ldoNeUJnw,12416
@@ -721,6 +721,7 @@ supervisely/geometry/point_location.py,sha256=ufGPj5BShL3QbE1eAMlnKpSSnb1S23Gfsk
721
721
  supervisely/geometry/pointcloud.py,sha256=cc4P_UNLGx5dWah3caRJytW7_mAi8UnYsJOa20mUy8s,1472
722
722
  supervisely/geometry/polygon.py,sha256=lqXS8xkBay8UhkVsB7eG_gRhwP1lBqyPaEri85ZMK8c,11597
723
723
  supervisely/geometry/polyline.py,sha256=r6KKJhJT8Au9Ds94Oa7saKdz2IPaEtR4SuVJBc4-uiA,8191
724
+ supervisely/geometry/polyline_3d.py,sha256=3uG-SszDH2iZPo2ES9ibMxvAjO2gEmr2PZIqN53Q2Hs,3458
724
725
  supervisely/geometry/rectangle.py,sha256=hWYNcVLzFTFf0WiDNhNFi9ktrgLPYxcow3QKltaQOiI,33875
725
726
  supervisely/geometry/sliding_windows.py,sha256=VWtE3DS9AaIlS0ch0PY6wwtWU89J82icDRZ-F0LFrjM,1700
726
727
  supervisely/geometry/sliding_windows_fuzzy.py,sha256=InvJlH6MEW55DM1IdoMHP2MLFLieTDZfHrZZEINLQOc,3626
@@ -759,7 +760,7 @@ supervisely/metric/precision_recall_metric.py,sha256=4AQCkcB84mpYQS94yJ-wkG1LBuX
759
760
  supervisely/metric/projects_applier.py,sha256=ORtgLQHYtNi4KYsSGaGPPWiZPexTJF9IWqX_RuLRxPk,3415
760
761
  supervisely/nn/__init__.py,sha256=ZGCDjx_cGIW8CxIWNCzVDRVfAzt7QzlkcvKvLBE8wMc,669
761
762
  supervisely/nn/experiments.py,sha256=1m5qq7LbHEVzI6nS4dFZg1zwJvjmhIvUoQ3iFhD8GBc,10387
762
- supervisely/nn/prediction_dto.py,sha256=oi146DJpUUBDbR-b-vYkL5WAhCZQYOGomqBDEQGbPdY,2700
763
+ supervisely/nn/prediction_dto.py,sha256=Z0WDcSnz5tEVTZ-eyDvD1CpIXlM7OYSZhK2A1TVZTEY,2977
763
764
  supervisely/nn/task_type.py,sha256=UJvSJ4L3I08j_e6sU6Ptu7kS5p1H09rfhfoDUSZ2iys,522
764
765
  supervisely/nn/utils.py,sha256=WoEidpLo5__R6eXsvEFH7VRxb4MtXCr9H-kchg25FDY,2965
765
766
  supervisely/nn/artifacts/__init__.py,sha256=DOkRrpvwQoTMH1GaAGHxwgYWshORAhxpeyvzmXt_F50,588
@@ -1020,7 +1021,7 @@ supervisely/nn/training/gui/hyperparameters_selector.py,sha256=tEyppV5ay7nECi6qB
1020
1021
  supervisely/nn/training/gui/input_selector.py,sha256=rmirJzpdxuYONI6y5_cvMdGWBJ--T20YTsISghATHu4,2510
1021
1022
  supervisely/nn/training/gui/model_selector.py,sha256=YKBAk6MheulFEl9TF9_mVtE3-Hsc0B3LmeOzMiV6AlQ,7487
1022
1023
  supervisely/nn/training/gui/tags_selector.py,sha256=0yg2OGPqiHUBp3iML2vrzTOVeSKtRtR9JoMy4Snx41U,3755
1023
- supervisely/nn/training/gui/train_val_splits_selector.py,sha256=CqVRp3nz6nJ8nk9J-5QiMMYiTsaTCAwLMg-ZqRr0Fto,18866
1024
+ supervisely/nn/training/gui/train_val_splits_selector.py,sha256=NWyulmr3lBZU1tcT_2HXXVIag-vpQjSjzNvtqJ_f2kw,19409
1024
1025
  supervisely/nn/training/gui/training_artifacts.py,sha256=ZyTnB9PyhwsqGAANwnpyLriJtAb4p0f03Yhmm_jkfIE,10946
1025
1026
  supervisely/nn/training/gui/training_logs.py,sha256=GgEQMj9p98Z3p2b_-3BkHOhY7WQYELxctsRKmkbg3JY,4966
1026
1027
  supervisely/nn/training/gui/training_process.py,sha256=XJ3ELyys_rBFmLQnI9qe3QhmfZ6U0CrK1FbI6d-Fbns,3664
@@ -1127,9 +1128,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
1127
1128
  supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
1128
1129
  supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
1129
1130
  supervisely_lib/__init__.py,sha256=yRwzEQmVwSd6lUQoAUdBngKEOlnoQ6hA9ZcoZGJRNC4,331
1130
- supervisely-6.73.448.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1131
- supervisely-6.73.448.dist-info/METADATA,sha256=VS9lv6VB9ZzDgTBuFYAqg219eOSnybIeTAggm0K_7xE,35480
1132
- supervisely-6.73.448.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1133
- supervisely-6.73.448.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1134
- supervisely-6.73.448.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1135
- supervisely-6.73.448.dist-info/RECORD,,
1131
+ supervisely-6.73.450.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1132
+ supervisely-6.73.450.dist-info/METADATA,sha256=zWQ1yBvKetrO79_43cLFyW2uZrlzRt56bNFIsRUsPes,35480
1133
+ supervisely-6.73.450.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1134
+ supervisely-6.73.450.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1135
+ supervisely-6.73.450.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1136
+ supervisely-6.73.450.dist-info/RECORD,,