dtlpy 1.114.17__py3-none-any.whl → 1.116.6__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.
- dtlpy/__init__.py +491 -491
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/code_server/config.yaml +2 -2
- dtlpy/assets/code_server/installation.sh +24 -24
- dtlpy/assets/code_server/launch.json +13 -13
- dtlpy/assets/code_server/settings.json +2 -2
- dtlpy/assets/main.py +53 -53
- dtlpy/assets/main_partial.py +18 -18
- dtlpy/assets/mock.json +11 -11
- dtlpy/assets/model_adapter.py +83 -83
- dtlpy/assets/package.json +61 -61
- dtlpy/assets/package_catalog.json +29 -29
- dtlpy/assets/package_gitignore +307 -307
- dtlpy/assets/service_runners/__init__.py +33 -33
- dtlpy/assets/service_runners/converter.py +96 -96
- dtlpy/assets/service_runners/multi_method.py +49 -49
- dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
- dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
- dtlpy/assets/service_runners/multi_method_item.py +52 -52
- dtlpy/assets/service_runners/multi_method_json.py +52 -52
- dtlpy/assets/service_runners/single_method.py +37 -37
- dtlpy/assets/service_runners/single_method_annotation.py +43 -43
- dtlpy/assets/service_runners/single_method_dataset.py +43 -43
- dtlpy/assets/service_runners/single_method_item.py +41 -41
- dtlpy/assets/service_runners/single_method_json.py +42 -42
- dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
- dtlpy/assets/voc_annotation_template.xml +23 -23
- dtlpy/caches/base_cache.py +32 -32
- dtlpy/caches/cache.py +473 -473
- dtlpy/caches/dl_cache.py +201 -201
- dtlpy/caches/filesystem_cache.py +89 -89
- dtlpy/caches/redis_cache.py +84 -84
- dtlpy/dlp/__init__.py +20 -20
- dtlpy/dlp/cli_utilities.py +367 -367
- dtlpy/dlp/command_executor.py +764 -764
- dtlpy/dlp/dlp +1 -1
- dtlpy/dlp/dlp.bat +1 -1
- dtlpy/dlp/dlp.py +128 -128
- dtlpy/dlp/parser.py +651 -651
- dtlpy/entities/__init__.py +83 -83
- dtlpy/entities/analytic.py +347 -311
- dtlpy/entities/annotation.py +1879 -1879
- dtlpy/entities/annotation_collection.py +699 -699
- dtlpy/entities/annotation_definitions/__init__.py +20 -20
- dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
- dtlpy/entities/annotation_definitions/box.py +195 -195
- dtlpy/entities/annotation_definitions/classification.py +67 -67
- dtlpy/entities/annotation_definitions/comparison.py +72 -72
- dtlpy/entities/annotation_definitions/cube.py +204 -204
- dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
- dtlpy/entities/annotation_definitions/description.py +32 -32
- dtlpy/entities/annotation_definitions/ellipse.py +124 -124
- dtlpy/entities/annotation_definitions/free_text.py +62 -62
- dtlpy/entities/annotation_definitions/gis.py +69 -69
- dtlpy/entities/annotation_definitions/note.py +139 -139
- dtlpy/entities/annotation_definitions/point.py +117 -117
- dtlpy/entities/annotation_definitions/polygon.py +182 -182
- dtlpy/entities/annotation_definitions/polyline.py +111 -111
- dtlpy/entities/annotation_definitions/pose.py +92 -92
- dtlpy/entities/annotation_definitions/ref_image.py +86 -86
- dtlpy/entities/annotation_definitions/segmentation.py +240 -240
- dtlpy/entities/annotation_definitions/subtitle.py +34 -34
- dtlpy/entities/annotation_definitions/text.py +85 -85
- dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
- dtlpy/entities/app.py +220 -220
- dtlpy/entities/app_module.py +107 -107
- dtlpy/entities/artifact.py +174 -174
- dtlpy/entities/assignment.py +399 -399
- dtlpy/entities/base_entity.py +214 -214
- dtlpy/entities/bot.py +113 -113
- dtlpy/entities/codebase.py +292 -296
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +449 -442
- dtlpy/entities/dataset.py +1299 -1285
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +235 -223
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +145 -145
- dtlpy/entities/filters.py +798 -645
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +959 -953
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +684 -684
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +810 -803
- dtlpy/entities/organization.py +287 -287
- dtlpy/entities/package.py +657 -657
- dtlpy/entities/package_defaults.py +5 -5
- dtlpy/entities/package_function.py +185 -185
- dtlpy/entities/package_module.py +113 -113
- dtlpy/entities/package_slot.py +118 -118
- dtlpy/entities/paged_entities.py +299 -299
- dtlpy/entities/pipeline.py +624 -624
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +505 -499
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +963 -958
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +495 -495
- dtlpy/entities/time_series.py +143 -143
- dtlpy/entities/trigger.py +426 -426
- dtlpy/entities/user.py +118 -118
- dtlpy/entities/webhook.py +124 -124
- dtlpy/examples/__init__.py +19 -19
- dtlpy/examples/add_labels.py +135 -135
- dtlpy/examples/add_metadata_to_item.py +21 -21
- dtlpy/examples/annotate_items_using_model.py +65 -65
- dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
- dtlpy/examples/annotations_convert_to_voc.py +9 -9
- dtlpy/examples/annotations_convert_to_yolo.py +9 -9
- dtlpy/examples/convert_annotation_types.py +51 -51
- dtlpy/examples/converter.py +143 -143
- dtlpy/examples/copy_annotations.py +22 -22
- dtlpy/examples/copy_folder.py +31 -31
- dtlpy/examples/create_annotations.py +51 -51
- dtlpy/examples/create_video_annotations.py +83 -83
- dtlpy/examples/delete_annotations.py +26 -26
- dtlpy/examples/filters.py +113 -113
- dtlpy/examples/move_item.py +23 -23
- dtlpy/examples/play_video_annotation.py +13 -13
- dtlpy/examples/show_item_and_mask.py +53 -53
- dtlpy/examples/triggers.py +49 -49
- dtlpy/examples/upload_batch_of_items.py +20 -20
- dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
- dtlpy/examples/upload_items_with_modalities.py +43 -43
- dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
- dtlpy/examples/upload_yolo_format_annotations.py +70 -70
- dtlpy/exceptions.py +125 -125
- dtlpy/miscellaneous/__init__.py +20 -20
- dtlpy/miscellaneous/dict_differ.py +95 -95
- dtlpy/miscellaneous/git_utils.py +217 -217
- dtlpy/miscellaneous/json_utils.py +14 -14
- dtlpy/miscellaneous/list_print.py +105 -105
- dtlpy/miscellaneous/zipping.py +130 -130
- dtlpy/ml/__init__.py +20 -20
- dtlpy/ml/base_feature_extractor_adapter.py +27 -27
- dtlpy/ml/base_model_adapter.py +1257 -1086
- dtlpy/ml/metrics.py +461 -461
- dtlpy/ml/predictions_utils.py +274 -274
- dtlpy/ml/summary_writer.py +57 -57
- dtlpy/ml/train_utils.py +60 -60
- dtlpy/new_instance.py +252 -252
- dtlpy/repositories/__init__.py +56 -56
- dtlpy/repositories/analytics.py +85 -85
- dtlpy/repositories/annotations.py +916 -916
- dtlpy/repositories/apps.py +383 -383
- dtlpy/repositories/artifacts.py +452 -452
- dtlpy/repositories/assignments.py +599 -599
- dtlpy/repositories/bots.py +213 -213
- dtlpy/repositories/codebases.py +559 -559
- dtlpy/repositories/collections.py +332 -332
- dtlpy/repositories/commands.py +152 -158
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +439 -435
- dtlpy/repositories/datasets.py +1504 -1291
- dtlpy/repositories/downloader.py +976 -903
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -470
- dtlpy/repositories/executions.py +815 -817
- dtlpy/repositories/feature_sets.py +226 -226
- dtlpy/repositories/features.py +255 -238
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +912 -909
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +1000 -988
- dtlpy/repositories/nodes.py +80 -80
- dtlpy/repositories/ontologies.py +511 -511
- dtlpy/repositories/organizations.py +525 -525
- dtlpy/repositories/packages.py +1941 -1941
- dtlpy/repositories/pipeline_executions.py +451 -451
- dtlpy/repositories/pipelines.py +640 -640
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +419 -399
- dtlpy/repositories/resource_executions.py +137 -137
- dtlpy/repositories/schema.py +120 -120
- dtlpy/repositories/service_drivers.py +213 -213
- dtlpy/repositories/services.py +1704 -1704
- dtlpy/repositories/settings.py +339 -339
- dtlpy/repositories/tasks.py +1477 -1477
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +661 -651
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1785 -1782
- dtlpy/services/api_reference.py +40 -40
- dtlpy/services/async_utils.py +133 -133
- dtlpy/services/calls_counter.py +44 -44
- dtlpy/services/check_sdk.py +68 -68
- dtlpy/services/cookie.py +115 -115
- dtlpy/services/create_logger.py +156 -156
- dtlpy/services/events.py +84 -84
- dtlpy/services/logins.py +235 -235
- dtlpy/services/reporter.py +256 -256
- dtlpy/services/service_defaults.py +91 -91
- dtlpy/utilities/__init__.py +20 -20
- dtlpy/utilities/annotations/__init__.py +16 -16
- dtlpy/utilities/annotations/annotation_converters.py +269 -269
- dtlpy/utilities/base_package_runner.py +285 -264
- dtlpy/utilities/converter.py +1650 -1650
- dtlpy/utilities/dataset_generators/__init__.py +1 -1
- dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
- dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
- dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
- dtlpy/utilities/local_development/__init__.py +1 -1
- dtlpy/utilities/local_development/local_session.py +179 -179
- dtlpy/utilities/reports/__init__.py +2 -2
- dtlpy/utilities/reports/figures.py +343 -343
- dtlpy/utilities/reports/report.py +71 -71
- dtlpy/utilities/videos/__init__.py +17 -17
- dtlpy/utilities/videos/video_player.py +598 -598
- dtlpy/utilities/videos/videos.py +470 -470
- {dtlpy-1.114.17.data → dtlpy-1.116.6.data}/scripts/dlp +1 -1
- dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.114.17.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -183
- dtlpy-1.116.6.dist-info/RECORD +239 -0
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/licenses/LICENSE +200 -200
- tests/features/environment.py +551 -551
- dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
- dtlpy-1.114.17.data/scripts/dlp.bat +0 -2
- dtlpy-1.114.17.dist-info/RECORD +0 -240
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
|
@@ -1,149 +1,149 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
# import open3d as o3d
|
|
3
|
-
from . import BaseAnnotationDefinition
|
|
4
|
-
# from scipy.spatial.transform import Rotation as R
|
|
5
|
-
import logging
|
|
6
|
-
|
|
7
|
-
logger = logging.getLogger(name='dtlpy')
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class Cube3d(BaseAnnotationDefinition):
|
|
11
|
-
"""
|
|
12
|
-
Cube annotation object
|
|
13
|
-
"""
|
|
14
|
-
type = "cube_3d"
|
|
15
|
-
|
|
16
|
-
def __init__(self, label, position, scale, rotation,
|
|
17
|
-
attributes=None, description=None):
|
|
18
|
-
"""
|
|
19
|
-
:param label:
|
|
20
|
-
:param position: the XYZ position of the ‘center’ of the annotation.
|
|
21
|
-
:param scale: the scale of the object by each axis (XYZ).
|
|
22
|
-
:param rotation: an euler representation of the object rotation on each axis (with rotation order ‘XYZ’). (rotation in radians)
|
|
23
|
-
:param attributes:
|
|
24
|
-
:param description:
|
|
25
|
-
"""
|
|
26
|
-
super().__init__(description=description, attributes=attributes)
|
|
27
|
-
|
|
28
|
-
self.position = position
|
|
29
|
-
self.scale = scale
|
|
30
|
-
self.rotation = rotation
|
|
31
|
-
self.label = label
|
|
32
|
-
|
|
33
|
-
def _translate(self, points, translate_x, translate_y, translate_z):
|
|
34
|
-
translation_matrix = np.array([[1, 0, 0, 0],
|
|
35
|
-
[0, 1, 0, 0],
|
|
36
|
-
[0, 0, 1, 0],
|
|
37
|
-
[translate_x, translate_y, translate_z, 1]])
|
|
38
|
-
|
|
39
|
-
matrix = [(list(i) + [1]) for i in points]
|
|
40
|
-
pts2 = np.dot(matrix, translation_matrix)
|
|
41
|
-
return [pt[:3] for pt in pts2]
|
|
42
|
-
|
|
43
|
-
# def make_points(self):
|
|
44
|
-
# simple = [
|
|
45
|
-
# [self.scale[0] / 2, self.scale[1] / 2, self.scale[2] / 2],
|
|
46
|
-
# [-self.scale[0] / 2, self.scale[1] / 2, self.scale[2] / 2],
|
|
47
|
-
# [self.scale[0] / 2, -self.scale[1] / 2, self.scale[2] / 2],
|
|
48
|
-
# [self.scale[0] / 2, self.scale[1] / 2, -self.scale[2] / 2],
|
|
49
|
-
# [-self.scale[0] / 2, -self.scale[1] / 2, self.scale[2] / 2],
|
|
50
|
-
# [self.scale[0] / 2, -self.scale[1] / 2, -self.scale[2] / 2],
|
|
51
|
-
# [-self.scale[0] / 2, self.scale[1] / 2, -self.scale[2] / 2],
|
|
52
|
-
# [-self.scale[0] / 2, -self.scale[1] / 2, -self.scale[2] / 2],
|
|
53
|
-
# ]
|
|
54
|
-
#
|
|
55
|
-
# # matrix = R.from_euler('xyz', self.rotation, degrees=False)
|
|
56
|
-
#
|
|
57
|
-
# vecs = [np.array(p) for p in simple]
|
|
58
|
-
# rotated = matrix.apply(vecs)
|
|
59
|
-
# translation = np.array(self.position)
|
|
60
|
-
# dX = translation[0]
|
|
61
|
-
# dY = translation[1]
|
|
62
|
-
# dZ = translation[2]
|
|
63
|
-
# points = self._translate(rotated, dX, dY, dZ)
|
|
64
|
-
# return points
|
|
65
|
-
|
|
66
|
-
@property
|
|
67
|
-
def geo(self):
|
|
68
|
-
return np.asarray([
|
|
69
|
-
list(self.position),
|
|
70
|
-
list(self.scale),
|
|
71
|
-
list(self.rotation)
|
|
72
|
-
])
|
|
73
|
-
|
|
74
|
-
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
75
|
-
"""
|
|
76
|
-
Show annotation as ndarray
|
|
77
|
-
:param image: empty or image to draw on
|
|
78
|
-
:param thickness:
|
|
79
|
-
:param with_text: not required
|
|
80
|
-
:param height: item height
|
|
81
|
-
:param width: item width
|
|
82
|
-
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
83
|
-
:param color: color
|
|
84
|
-
:param alpha: opacity value [0 1], default 1
|
|
85
|
-
:return: ndarray
|
|
86
|
-
"""
|
|
87
|
-
try:
|
|
88
|
-
import cv2
|
|
89
|
-
except (ImportError, ModuleNotFoundError):
|
|
90
|
-
self.logger.error(
|
|
91
|
-
'Import Error! Cant import cv2. Annotations operations will be limited. import manually and fix errors')
|
|
92
|
-
raise
|
|
93
|
-
points = self.make_points()
|
|
94
|
-
front_bl = points[0]
|
|
95
|
-
front_br = points[1]
|
|
96
|
-
front_tr = points[2]
|
|
97
|
-
front_tl = points[3]
|
|
98
|
-
back_bl = points[4]
|
|
99
|
-
back_br = points[5]
|
|
100
|
-
back_tr = points[6]
|
|
101
|
-
back_tl = points[7]
|
|
102
|
-
logger.warning('the show for 3d_cube is not supported.')
|
|
103
|
-
return image
|
|
104
|
-
|
|
105
|
-
# image = np.zeros((100, 100, 100), dtype=np.uint8)
|
|
106
|
-
# pcd = o3d.io.read_point_cloud(r"C:\Users\97250\PycharmProjects\tt\qw\3D\D34049418_0000635.las.pcd")
|
|
107
|
-
# # o3d.visualization.draw_geometries([pcd])
|
|
108
|
-
# # points = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0], [0, 0, 1], [1, 0, 1],
|
|
109
|
-
# # [0, 1, 1], [1, 1, 1]]
|
|
110
|
-
# lines = [[0, 1], [0, 2], [1, 3], [2, 3], [4, 5], [4, 6], [5, 7], [6, 7],
|
|
111
|
-
# [0, 4], [1, 5], [2, 6], [3, 7]]
|
|
112
|
-
# colors = [[1, 0, 0] for i in range(len(lines))]
|
|
113
|
-
# points = [back_bl, back_br, back_tl, back_tr, front_bl, front_br, front_tl, front_tr]
|
|
114
|
-
# line_set = o3d.geometry.LineSet()
|
|
115
|
-
# line_set.points = o3d.utility.Vector3dVector(points)
|
|
116
|
-
# line_set.lines = o3d.utility.Vector2iVector(lines)
|
|
117
|
-
# line_set.colors = o3d.utility.Vector3dVector(colors)
|
|
118
|
-
# o3d.visualization.draw_geometries([line_set])
|
|
119
|
-
# return image
|
|
120
|
-
|
|
121
|
-
def to_coordinates(self, color=None):
|
|
122
|
-
keys = ["position", "scale", "rotation"]
|
|
123
|
-
coordinates = {keys[idx]: {"x": float(x), "y": float(y), "z": float(z)}
|
|
124
|
-
for idx, [x, y, z] in enumerate(self.geo)}
|
|
125
|
-
return coordinates
|
|
126
|
-
|
|
127
|
-
@staticmethod
|
|
128
|
-
def from_coordinates(coordinates):
|
|
129
|
-
geo = list()
|
|
130
|
-
for key, pt in coordinates.items():
|
|
131
|
-
geo.append([pt["x"], pt["y"], pt["z"]])
|
|
132
|
-
return np.asarray(geo)
|
|
133
|
-
|
|
134
|
-
@classmethod
|
|
135
|
-
def from_json(cls, _json):
|
|
136
|
-
if "coordinates" in _json:
|
|
137
|
-
key = "coordinates"
|
|
138
|
-
elif "data" in _json:
|
|
139
|
-
key = "data"
|
|
140
|
-
else:
|
|
141
|
-
raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
|
|
142
|
-
|
|
143
|
-
return cls(
|
|
144
|
-
position=list(_json[key]['position'].values()),
|
|
145
|
-
scale=list(_json[key]['scale'].values()),
|
|
146
|
-
rotation=list(_json[key]['rotation'].values()),
|
|
147
|
-
label=_json["label"],
|
|
148
|
-
attributes=_json.get("attributes", None)
|
|
149
|
-
)
|
|
1
|
+
import numpy as np
|
|
2
|
+
# import open3d as o3d
|
|
3
|
+
from . import BaseAnnotationDefinition
|
|
4
|
+
# from scipy.spatial.transform import Rotation as R
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(name='dtlpy')
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Cube3d(BaseAnnotationDefinition):
|
|
11
|
+
"""
|
|
12
|
+
Cube annotation object
|
|
13
|
+
"""
|
|
14
|
+
type = "cube_3d"
|
|
15
|
+
|
|
16
|
+
def __init__(self, label, position, scale, rotation,
|
|
17
|
+
attributes=None, description=None):
|
|
18
|
+
"""
|
|
19
|
+
:param label:
|
|
20
|
+
:param position: the XYZ position of the ‘center’ of the annotation.
|
|
21
|
+
:param scale: the scale of the object by each axis (XYZ).
|
|
22
|
+
:param rotation: an euler representation of the object rotation on each axis (with rotation order ‘XYZ’). (rotation in radians)
|
|
23
|
+
:param attributes:
|
|
24
|
+
:param description:
|
|
25
|
+
"""
|
|
26
|
+
super().__init__(description=description, attributes=attributes)
|
|
27
|
+
|
|
28
|
+
self.position = position
|
|
29
|
+
self.scale = scale
|
|
30
|
+
self.rotation = rotation
|
|
31
|
+
self.label = label
|
|
32
|
+
|
|
33
|
+
def _translate(self, points, translate_x, translate_y, translate_z):
|
|
34
|
+
translation_matrix = np.array([[1, 0, 0, 0],
|
|
35
|
+
[0, 1, 0, 0],
|
|
36
|
+
[0, 0, 1, 0],
|
|
37
|
+
[translate_x, translate_y, translate_z, 1]])
|
|
38
|
+
|
|
39
|
+
matrix = [(list(i) + [1]) for i in points]
|
|
40
|
+
pts2 = np.dot(matrix, translation_matrix)
|
|
41
|
+
return [pt[:3] for pt in pts2]
|
|
42
|
+
|
|
43
|
+
# def make_points(self):
|
|
44
|
+
# simple = [
|
|
45
|
+
# [self.scale[0] / 2, self.scale[1] / 2, self.scale[2] / 2],
|
|
46
|
+
# [-self.scale[0] / 2, self.scale[1] / 2, self.scale[2] / 2],
|
|
47
|
+
# [self.scale[0] / 2, -self.scale[1] / 2, self.scale[2] / 2],
|
|
48
|
+
# [self.scale[0] / 2, self.scale[1] / 2, -self.scale[2] / 2],
|
|
49
|
+
# [-self.scale[0] / 2, -self.scale[1] / 2, self.scale[2] / 2],
|
|
50
|
+
# [self.scale[0] / 2, -self.scale[1] / 2, -self.scale[2] / 2],
|
|
51
|
+
# [-self.scale[0] / 2, self.scale[1] / 2, -self.scale[2] / 2],
|
|
52
|
+
# [-self.scale[0] / 2, -self.scale[1] / 2, -self.scale[2] / 2],
|
|
53
|
+
# ]
|
|
54
|
+
#
|
|
55
|
+
# # matrix = R.from_euler('xyz', self.rotation, degrees=False)
|
|
56
|
+
#
|
|
57
|
+
# vecs = [np.array(p) for p in simple]
|
|
58
|
+
# rotated = matrix.apply(vecs)
|
|
59
|
+
# translation = np.array(self.position)
|
|
60
|
+
# dX = translation[0]
|
|
61
|
+
# dY = translation[1]
|
|
62
|
+
# dZ = translation[2]
|
|
63
|
+
# points = self._translate(rotated, dX, dY, dZ)
|
|
64
|
+
# return points
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def geo(self):
|
|
68
|
+
return np.asarray([
|
|
69
|
+
list(self.position),
|
|
70
|
+
list(self.scale),
|
|
71
|
+
list(self.rotation)
|
|
72
|
+
])
|
|
73
|
+
|
|
74
|
+
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
75
|
+
"""
|
|
76
|
+
Show annotation as ndarray
|
|
77
|
+
:param image: empty or image to draw on
|
|
78
|
+
:param thickness:
|
|
79
|
+
:param with_text: not required
|
|
80
|
+
:param height: item height
|
|
81
|
+
:param width: item width
|
|
82
|
+
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
83
|
+
:param color: color
|
|
84
|
+
:param alpha: opacity value [0 1], default 1
|
|
85
|
+
:return: ndarray
|
|
86
|
+
"""
|
|
87
|
+
try:
|
|
88
|
+
import cv2
|
|
89
|
+
except (ImportError, ModuleNotFoundError):
|
|
90
|
+
self.logger.error(
|
|
91
|
+
'Import Error! Cant import cv2. Annotations operations will be limited. import manually and fix errors')
|
|
92
|
+
raise
|
|
93
|
+
points = self.make_points()
|
|
94
|
+
front_bl = points[0]
|
|
95
|
+
front_br = points[1]
|
|
96
|
+
front_tr = points[2]
|
|
97
|
+
front_tl = points[3]
|
|
98
|
+
back_bl = points[4]
|
|
99
|
+
back_br = points[5]
|
|
100
|
+
back_tr = points[6]
|
|
101
|
+
back_tl = points[7]
|
|
102
|
+
logger.warning('the show for 3d_cube is not supported.')
|
|
103
|
+
return image
|
|
104
|
+
|
|
105
|
+
# image = np.zeros((100, 100, 100), dtype=np.uint8)
|
|
106
|
+
# pcd = o3d.io.read_point_cloud(r"C:\Users\97250\PycharmProjects\tt\qw\3D\D34049418_0000635.las.pcd")
|
|
107
|
+
# # o3d.visualization.draw_geometries([pcd])
|
|
108
|
+
# # points = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0], [0, 0, 1], [1, 0, 1],
|
|
109
|
+
# # [0, 1, 1], [1, 1, 1]]
|
|
110
|
+
# lines = [[0, 1], [0, 2], [1, 3], [2, 3], [4, 5], [4, 6], [5, 7], [6, 7],
|
|
111
|
+
# [0, 4], [1, 5], [2, 6], [3, 7]]
|
|
112
|
+
# colors = [[1, 0, 0] for i in range(len(lines))]
|
|
113
|
+
# points = [back_bl, back_br, back_tl, back_tr, front_bl, front_br, front_tl, front_tr]
|
|
114
|
+
# line_set = o3d.geometry.LineSet()
|
|
115
|
+
# line_set.points = o3d.utility.Vector3dVector(points)
|
|
116
|
+
# line_set.lines = o3d.utility.Vector2iVector(lines)
|
|
117
|
+
# line_set.colors = o3d.utility.Vector3dVector(colors)
|
|
118
|
+
# o3d.visualization.draw_geometries([line_set])
|
|
119
|
+
# return image
|
|
120
|
+
|
|
121
|
+
def to_coordinates(self, color=None):
|
|
122
|
+
keys = ["position", "scale", "rotation"]
|
|
123
|
+
coordinates = {keys[idx]: {"x": float(x), "y": float(y), "z": float(z)}
|
|
124
|
+
for idx, [x, y, z] in enumerate(self.geo)}
|
|
125
|
+
return coordinates
|
|
126
|
+
|
|
127
|
+
@staticmethod
|
|
128
|
+
def from_coordinates(coordinates):
|
|
129
|
+
geo = list()
|
|
130
|
+
for key, pt in coordinates.items():
|
|
131
|
+
geo.append([pt["x"], pt["y"], pt["z"]])
|
|
132
|
+
return np.asarray(geo)
|
|
133
|
+
|
|
134
|
+
@classmethod
|
|
135
|
+
def from_json(cls, _json):
|
|
136
|
+
if "coordinates" in _json:
|
|
137
|
+
key = "coordinates"
|
|
138
|
+
elif "data" in _json:
|
|
139
|
+
key = "data"
|
|
140
|
+
else:
|
|
141
|
+
raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
|
|
142
|
+
|
|
143
|
+
return cls(
|
|
144
|
+
position=list(_json[key]['position'].values()),
|
|
145
|
+
scale=list(_json[key]['scale'].values()),
|
|
146
|
+
rotation=list(_json[key]['rotation'].values()),
|
|
147
|
+
label=_json["label"],
|
|
148
|
+
attributes=_json.get("attributes", None)
|
|
149
|
+
)
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
from . import BaseAnnotationDefinition
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class Description(BaseAnnotationDefinition):
|
|
5
|
-
"""
|
|
6
|
-
Subtitle annotation object
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
def __init__(self, text, description=None):
|
|
10
|
-
super().__init__(description=description)
|
|
11
|
-
self.type = "item_description"
|
|
12
|
-
self.text = text
|
|
13
|
-
self.label = "item.description"
|
|
14
|
-
|
|
15
|
-
def to_coordinates(self, color):
|
|
16
|
-
return {"text": self.text}
|
|
17
|
-
|
|
18
|
-
@staticmethod
|
|
19
|
-
def from_coordinates(coordinates):
|
|
20
|
-
return coordinates["text"]
|
|
21
|
-
|
|
22
|
-
@classmethod
|
|
23
|
-
def from_json(cls, _json):
|
|
24
|
-
if "coordinates" in _json:
|
|
25
|
-
text = cls.from_coordinates(coordinates=_json["coordinates"])
|
|
26
|
-
elif "data" in _json:
|
|
27
|
-
text = cls.from_coordinates(coordinates=_json["data"])
|
|
28
|
-
else:
|
|
29
|
-
raise ValueError('Bad json, "coordinates", "data" or "description" not found')
|
|
30
|
-
return cls(
|
|
31
|
-
text=text,
|
|
32
|
-
)
|
|
1
|
+
from . import BaseAnnotationDefinition
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Description(BaseAnnotationDefinition):
|
|
5
|
+
"""
|
|
6
|
+
Subtitle annotation object
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, text, description=None):
|
|
10
|
+
super().__init__(description=description)
|
|
11
|
+
self.type = "item_description"
|
|
12
|
+
self.text = text
|
|
13
|
+
self.label = "item.description"
|
|
14
|
+
|
|
15
|
+
def to_coordinates(self, color):
|
|
16
|
+
return {"text": self.text}
|
|
17
|
+
|
|
18
|
+
@staticmethod
|
|
19
|
+
def from_coordinates(coordinates):
|
|
20
|
+
return coordinates["text"]
|
|
21
|
+
|
|
22
|
+
@classmethod
|
|
23
|
+
def from_json(cls, _json):
|
|
24
|
+
if "coordinates" in _json:
|
|
25
|
+
text = cls.from_coordinates(coordinates=_json["coordinates"])
|
|
26
|
+
elif "data" in _json:
|
|
27
|
+
text = cls.from_coordinates(coordinates=_json["data"])
|
|
28
|
+
else:
|
|
29
|
+
raise ValueError('Bad json, "coordinates", "data" or "description" not found')
|
|
30
|
+
return cls(
|
|
31
|
+
text=text,
|
|
32
|
+
)
|
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
|
|
3
|
-
from . import BaseAnnotationDefinition
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class Ellipse(BaseAnnotationDefinition):
|
|
7
|
-
"""
|
|
8
|
-
Ellipse annotation object
|
|
9
|
-
"""
|
|
10
|
-
type = "ellipse"
|
|
11
|
-
|
|
12
|
-
def __init__(self, x, y, rx, ry, angle, label, attributes=None, description=None):
|
|
13
|
-
super().__init__(description=description, attributes=attributes)
|
|
14
|
-
self.label = label
|
|
15
|
-
self.angle = angle
|
|
16
|
-
self.x = x
|
|
17
|
-
self.y = y
|
|
18
|
-
self.rx = rx
|
|
19
|
-
self.ry = ry
|
|
20
|
-
|
|
21
|
-
@property
|
|
22
|
-
def geo(self):
|
|
23
|
-
return np.asarray([[self.x, self.y],
|
|
24
|
-
[self.rx, self.ry],
|
|
25
|
-
[self.angle, self.rad]])
|
|
26
|
-
|
|
27
|
-
@property
|
|
28
|
-
def rad(self):
|
|
29
|
-
return np.deg2rad(self.angle)
|
|
30
|
-
|
|
31
|
-
@property
|
|
32
|
-
def left(self):
|
|
33
|
-
return self.x - np.sqrt(np.power(self.rx, 2) * np.power(np.cos(-self.rad), 2)
|
|
34
|
-
+ np.power(self.ry, 2) * np.power(np.sin(-self.rad), 2))
|
|
35
|
-
|
|
36
|
-
@property
|
|
37
|
-
def top(self):
|
|
38
|
-
return self.y - np.sqrt(np.power(self.rx, 2) * np.power(np.sin(-self.rad), 2)
|
|
39
|
-
+ np.power(self.ry, 2) * np.power(np.cos(-self.rad), 2))
|
|
40
|
-
|
|
41
|
-
@property
|
|
42
|
-
def right(self):
|
|
43
|
-
return self.x + np.sqrt(np.power(self.rx, 2) * np.power(np.cos(-self.rad), 2)
|
|
44
|
-
+ np.power(self.ry, 2) * np.power(np.sin(-self.rad), 2))
|
|
45
|
-
|
|
46
|
-
@property
|
|
47
|
-
def bottom(self):
|
|
48
|
-
return self.y + np.sqrt(np.power(self.rx, 2) * np.power(np.sin(-self.rad), 2)
|
|
49
|
-
+ np.power(self.ry, 2) * np.power(np.cos(-self.rad), 2))
|
|
50
|
-
|
|
51
|
-
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
52
|
-
"""
|
|
53
|
-
Show annotation as ndarray
|
|
54
|
-
:param image: empty or image to draw on
|
|
55
|
-
:param thickness:
|
|
56
|
-
:param with_text: not required
|
|
57
|
-
:param height: item height
|
|
58
|
-
:param width: item width
|
|
59
|
-
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
60
|
-
:param color: color
|
|
61
|
-
:param alpha: opacity value [0 1], default 1
|
|
62
|
-
:return: ndarray
|
|
63
|
-
"""
|
|
64
|
-
try:
|
|
65
|
-
import cv2
|
|
66
|
-
except (ImportError, ModuleNotFoundError):
|
|
67
|
-
self.logger.error(
|
|
68
|
-
'Import Error! Cant import cv2. Annotations operations will be limited. import manually and fix errors')
|
|
69
|
-
raise
|
|
70
|
-
|
|
71
|
-
if thickness is None:
|
|
72
|
-
thickness = 2
|
|
73
|
-
|
|
74
|
-
# draw annotation
|
|
75
|
-
image = cv2.ellipse(
|
|
76
|
-
image,
|
|
77
|
-
center=(int(np.round(self.x)), int(np.round(self.y))),
|
|
78
|
-
axes=(int(np.round(self.rx)), int(np.round(self.ry))),
|
|
79
|
-
angle=self.angle,
|
|
80
|
-
startAngle=0,
|
|
81
|
-
endAngle=360,
|
|
82
|
-
color=color,
|
|
83
|
-
thickness=thickness,
|
|
84
|
-
lineType=-1,
|
|
85
|
-
)
|
|
86
|
-
if with_text:
|
|
87
|
-
image = self.add_text_to_image(image=image, annotation=self)
|
|
88
|
-
return image
|
|
89
|
-
|
|
90
|
-
def to_coordinates(self, color):
|
|
91
|
-
return {'angle': float(self.angle),
|
|
92
|
-
'center': {'x': float(self.x),
|
|
93
|
-
'y': float(self.y),
|
|
94
|
-
'z': 0},
|
|
95
|
-
'rx': float(self.rx),
|
|
96
|
-
'ry': float(self.ry)}
|
|
97
|
-
|
|
98
|
-
@staticmethod
|
|
99
|
-
def from_coordinates(coordinates):
|
|
100
|
-
angle = coordinates["angle"]
|
|
101
|
-
x = coordinates["center"]["x"]
|
|
102
|
-
y = coordinates["center"]["y"]
|
|
103
|
-
rx = coordinates["rx"]
|
|
104
|
-
ry = coordinates["ry"]
|
|
105
|
-
return x, y, rx, ry, angle
|
|
106
|
-
|
|
107
|
-
@classmethod
|
|
108
|
-
def from_json(cls, _json):
|
|
109
|
-
if "coordinates" in _json:
|
|
110
|
-
x, y, rx, ry, angle = cls.from_coordinates(_json["coordinates"])
|
|
111
|
-
elif "data" in _json:
|
|
112
|
-
x, y, rx, ry, angle = cls.from_coordinates(_json["data"])
|
|
113
|
-
else:
|
|
114
|
-
raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
|
|
115
|
-
|
|
116
|
-
return cls(
|
|
117
|
-
angle=angle,
|
|
118
|
-
x=x,
|
|
119
|
-
y=y,
|
|
120
|
-
rx=rx,
|
|
121
|
-
ry=ry,
|
|
122
|
-
label=_json["label"],
|
|
123
|
-
attributes=_json.get("attributes", None),
|
|
124
|
-
)
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from . import BaseAnnotationDefinition
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Ellipse(BaseAnnotationDefinition):
|
|
7
|
+
"""
|
|
8
|
+
Ellipse annotation object
|
|
9
|
+
"""
|
|
10
|
+
type = "ellipse"
|
|
11
|
+
|
|
12
|
+
def __init__(self, x, y, rx, ry, angle, label, attributes=None, description=None):
|
|
13
|
+
super().__init__(description=description, attributes=attributes)
|
|
14
|
+
self.label = label
|
|
15
|
+
self.angle = angle
|
|
16
|
+
self.x = x
|
|
17
|
+
self.y = y
|
|
18
|
+
self.rx = rx
|
|
19
|
+
self.ry = ry
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def geo(self):
|
|
23
|
+
return np.asarray([[self.x, self.y],
|
|
24
|
+
[self.rx, self.ry],
|
|
25
|
+
[self.angle, self.rad]])
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def rad(self):
|
|
29
|
+
return np.deg2rad(self.angle)
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def left(self):
|
|
33
|
+
return self.x - np.sqrt(np.power(self.rx, 2) * np.power(np.cos(-self.rad), 2)
|
|
34
|
+
+ np.power(self.ry, 2) * np.power(np.sin(-self.rad), 2))
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def top(self):
|
|
38
|
+
return self.y - np.sqrt(np.power(self.rx, 2) * np.power(np.sin(-self.rad), 2)
|
|
39
|
+
+ np.power(self.ry, 2) * np.power(np.cos(-self.rad), 2))
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def right(self):
|
|
43
|
+
return self.x + np.sqrt(np.power(self.rx, 2) * np.power(np.cos(-self.rad), 2)
|
|
44
|
+
+ np.power(self.ry, 2) * np.power(np.sin(-self.rad), 2))
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def bottom(self):
|
|
48
|
+
return self.y + np.sqrt(np.power(self.rx, 2) * np.power(np.sin(-self.rad), 2)
|
|
49
|
+
+ np.power(self.ry, 2) * np.power(np.cos(-self.rad), 2))
|
|
50
|
+
|
|
51
|
+
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
52
|
+
"""
|
|
53
|
+
Show annotation as ndarray
|
|
54
|
+
:param image: empty or image to draw on
|
|
55
|
+
:param thickness:
|
|
56
|
+
:param with_text: not required
|
|
57
|
+
:param height: item height
|
|
58
|
+
:param width: item width
|
|
59
|
+
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
60
|
+
:param color: color
|
|
61
|
+
:param alpha: opacity value [0 1], default 1
|
|
62
|
+
:return: ndarray
|
|
63
|
+
"""
|
|
64
|
+
try:
|
|
65
|
+
import cv2
|
|
66
|
+
except (ImportError, ModuleNotFoundError):
|
|
67
|
+
self.logger.error(
|
|
68
|
+
'Import Error! Cant import cv2. Annotations operations will be limited. import manually and fix errors')
|
|
69
|
+
raise
|
|
70
|
+
|
|
71
|
+
if thickness is None:
|
|
72
|
+
thickness = 2
|
|
73
|
+
|
|
74
|
+
# draw annotation
|
|
75
|
+
image = cv2.ellipse(
|
|
76
|
+
image,
|
|
77
|
+
center=(int(np.round(self.x)), int(np.round(self.y))),
|
|
78
|
+
axes=(int(np.round(self.rx)), int(np.round(self.ry))),
|
|
79
|
+
angle=self.angle,
|
|
80
|
+
startAngle=0,
|
|
81
|
+
endAngle=360,
|
|
82
|
+
color=color,
|
|
83
|
+
thickness=thickness,
|
|
84
|
+
lineType=-1,
|
|
85
|
+
)
|
|
86
|
+
if with_text:
|
|
87
|
+
image = self.add_text_to_image(image=image, annotation=self)
|
|
88
|
+
return image
|
|
89
|
+
|
|
90
|
+
def to_coordinates(self, color):
|
|
91
|
+
return {'angle': float(self.angle),
|
|
92
|
+
'center': {'x': float(self.x),
|
|
93
|
+
'y': float(self.y),
|
|
94
|
+
'z': 0},
|
|
95
|
+
'rx': float(self.rx),
|
|
96
|
+
'ry': float(self.ry)}
|
|
97
|
+
|
|
98
|
+
@staticmethod
|
|
99
|
+
def from_coordinates(coordinates):
|
|
100
|
+
angle = coordinates["angle"]
|
|
101
|
+
x = coordinates["center"]["x"]
|
|
102
|
+
y = coordinates["center"]["y"]
|
|
103
|
+
rx = coordinates["rx"]
|
|
104
|
+
ry = coordinates["ry"]
|
|
105
|
+
return x, y, rx, ry, angle
|
|
106
|
+
|
|
107
|
+
@classmethod
|
|
108
|
+
def from_json(cls, _json):
|
|
109
|
+
if "coordinates" in _json:
|
|
110
|
+
x, y, rx, ry, angle = cls.from_coordinates(_json["coordinates"])
|
|
111
|
+
elif "data" in _json:
|
|
112
|
+
x, y, rx, ry, angle = cls.from_coordinates(_json["data"])
|
|
113
|
+
else:
|
|
114
|
+
raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
|
|
115
|
+
|
|
116
|
+
return cls(
|
|
117
|
+
angle=angle,
|
|
118
|
+
x=x,
|
|
119
|
+
y=y,
|
|
120
|
+
rx=rx,
|
|
121
|
+
ry=ry,
|
|
122
|
+
label=_json["label"],
|
|
123
|
+
attributes=_json.get("attributes", None),
|
|
124
|
+
)
|