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.
- supervisely/annotation/json_geometries_map.py +2 -0
- supervisely/geometry/polyline_3d.py +110 -0
- supervisely/nn/prediction_dto.py +7 -0
- supervisely/nn/training/gui/train_val_splits_selector.py +52 -31
- {supervisely-6.73.448.dist-info → supervisely-6.73.450.dist-info}/METADATA +1 -1
- {supervisely-6.73.448.dist-info → supervisely-6.73.450.dist-info}/RECORD +10 -9
- {supervisely-6.73.448.dist-info → supervisely-6.73.450.dist-info}/LICENSE +0 -0
- {supervisely-6.73.448.dist-info → supervisely-6.73.450.dist-info}/WHEEL +0 -0
- {supervisely-6.73.448.dist-info → supervisely-6.73.450.dist-info}/entry_points.txt +0 -0
- {supervisely-6.73.448.dist-info → supervisely-6.73.450.dist-info}/top_level.txt +0 -0
@@ -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
|
+
)
|
supervisely/nn/prediction_dto.py
CHANGED
@@ -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 = [
|
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
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
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(
|
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
|
@@ -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=
|
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=
|
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=
|
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.
|
1131
|
-
supervisely-6.73.
|
1132
|
-
supervisely-6.73.
|
1133
|
-
supervisely-6.73.
|
1134
|
-
supervisely-6.73.
|
1135
|
-
supervisely-6.73.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|