dtlpy 1.113.10__py3-none-any.whl → 1.114.13__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 +488 -488
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/__pycache__/__init__.cpython-38.pyc +0 -0
- 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 +311 -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 +296 -296
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +442 -442
- dtlpy/entities/dataset.py +1285 -1285
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +222 -222
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +145 -145
- dtlpy/entities/filters.py +641 -641
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +953 -953
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +694 -691
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +803 -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 +290 -267
- dtlpy/entities/pipeline.py +593 -593
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +499 -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 +958 -958
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +491 -491
- 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 +945 -940
- 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 -348
- dtlpy/repositories/commands.py +158 -158
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +434 -406
- dtlpy/repositories/datasets.py +1291 -1291
- dtlpy/repositories/downloader.py +895 -895
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +266 -266
- dtlpy/repositories/executions.py +817 -817
- dtlpy/repositories/feature_sets.py +226 -226
- dtlpy/repositories/features.py +238 -238
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +909 -915
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +877 -867
- 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 +448 -448
- dtlpy/repositories/pipelines.py +642 -642
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +399 -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 +1124 -1124
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +651 -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 +1782 -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 +264 -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.113.10.data → dtlpy-1.114.13.data}/scripts/dlp +1 -1
- dtlpy-1.114.13.data/scripts/dlp.bat +2 -0
- {dtlpy-1.113.10.data → dtlpy-1.114.13.data}/scripts/dlp.py +128 -128
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/LICENSE +200 -200
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/METADATA +172 -172
- dtlpy-1.114.13.dist-info/RECORD +240 -0
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/WHEEL +1 -1
- tests/features/environment.py +551 -550
- dtlpy-1.113.10.data/scripts/dlp.bat +0 -2
- dtlpy-1.113.10.dist-info/RECORD +0 -244
- tests/assets/__init__.py +0 -0
- tests/assets/models_flow/__init__.py +0 -0
- tests/assets/models_flow/failedmain.py +0 -52
- tests/assets/models_flow/main.py +0 -62
- tests/assets/models_flow/main_model.py +0 -54
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/top_level.txt +0 -0
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
|
|
3
|
-
from . import BaseAnnotationDefinition
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class Polyline(BaseAnnotationDefinition):
|
|
7
|
-
"""
|
|
8
|
-
Polyline annotation object
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
def __init__(self, geo, label, attributes=None, description=None):
|
|
12
|
-
super().__init__(description=description, attributes=attributes)
|
|
13
|
-
self.type = "polyline"
|
|
14
|
-
self.geo = geo
|
|
15
|
-
self.label = label
|
|
16
|
-
|
|
17
|
-
@property
|
|
18
|
-
def x(self):
|
|
19
|
-
return self.geo[:, 0]
|
|
20
|
-
|
|
21
|
-
@property
|
|
22
|
-
def y(self):
|
|
23
|
-
return self.geo[:, 1]
|
|
24
|
-
|
|
25
|
-
@property
|
|
26
|
-
def left(self):
|
|
27
|
-
return np.min(self.x)
|
|
28
|
-
|
|
29
|
-
@property
|
|
30
|
-
def top(self):
|
|
31
|
-
return np.min(self.y)
|
|
32
|
-
|
|
33
|
-
@property
|
|
34
|
-
def right(self):
|
|
35
|
-
return np.max(self.x)
|
|
36
|
-
|
|
37
|
-
@property
|
|
38
|
-
def bottom(self):
|
|
39
|
-
return np.max(self.y)
|
|
40
|
-
|
|
41
|
-
def to_coordinates(self, color):
|
|
42
|
-
return [[{"x": float(x), "y": float(y)} for x, y in self.geo]]
|
|
43
|
-
|
|
44
|
-
@staticmethod
|
|
45
|
-
def from_coordinates(coordinates):
|
|
46
|
-
return np.asarray([[pt["x"], pt["y"]] for pt in coordinates])
|
|
47
|
-
|
|
48
|
-
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
49
|
-
"""
|
|
50
|
-
Show annotation as ndarray
|
|
51
|
-
:param image: empty or image to draw on
|
|
52
|
-
:param thickness:
|
|
53
|
-
:param with_text: not required
|
|
54
|
-
:param height: item height
|
|
55
|
-
:param width: item width
|
|
56
|
-
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
57
|
-
:param color: color
|
|
58
|
-
:param alpha: opacity value [0 1], default 1
|
|
59
|
-
:return: ndarray
|
|
60
|
-
"""
|
|
61
|
-
try:
|
|
62
|
-
import cv2
|
|
63
|
-
except (ImportError, ModuleNotFoundError):
|
|
64
|
-
self.logger.error(
|
|
65
|
-
'Import Error! Cant import cv2. Annotations operations will be limited. import manually and fix errors')
|
|
66
|
-
raise
|
|
67
|
-
|
|
68
|
-
# polyline cant have thickness -1
|
|
69
|
-
if thickness is None or thickness == -1:
|
|
70
|
-
thickness = 2
|
|
71
|
-
|
|
72
|
-
if alpha != 1:
|
|
73
|
-
overlay = image.copy()
|
|
74
|
-
else:
|
|
75
|
-
overlay = image
|
|
76
|
-
|
|
77
|
-
overlay = cv2.polylines(
|
|
78
|
-
img=overlay,
|
|
79
|
-
pts=[np.round(self.geo).astype(int)],
|
|
80
|
-
color=color,
|
|
81
|
-
isClosed=False,
|
|
82
|
-
thickness=thickness,
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
if not isinstance(color, int) and len(color) == 4 and color[3] != 255:
|
|
86
|
-
# add with opacity
|
|
87
|
-
image = cv2.addWeighted(src1=overlay,
|
|
88
|
-
alpha=alpha,
|
|
89
|
-
src2=image,
|
|
90
|
-
beta=1 - alpha,
|
|
91
|
-
gamma=0)
|
|
92
|
-
else:
|
|
93
|
-
image = overlay
|
|
94
|
-
|
|
95
|
-
if with_text:
|
|
96
|
-
image = self.add_text_to_image(image=image, annotation=self)
|
|
97
|
-
return image
|
|
98
|
-
|
|
99
|
-
@classmethod
|
|
100
|
-
def from_json(cls, _json):
|
|
101
|
-
if "coordinates" in _json:
|
|
102
|
-
geo = cls.from_coordinates(coordinates=_json["coordinates"][0])
|
|
103
|
-
elif "data" in _json:
|
|
104
|
-
geo = cls.from_coordinates(coordinates=_json["data"][0])
|
|
105
|
-
else:
|
|
106
|
-
raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
|
|
107
|
-
return cls(
|
|
108
|
-
geo=geo,
|
|
109
|
-
label=_json["label"],
|
|
110
|
-
attributes=_json.get("attributes", None),
|
|
111
|
-
)
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from . import BaseAnnotationDefinition
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Polyline(BaseAnnotationDefinition):
|
|
7
|
+
"""
|
|
8
|
+
Polyline annotation object
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def __init__(self, geo, label, attributes=None, description=None):
|
|
12
|
+
super().__init__(description=description, attributes=attributes)
|
|
13
|
+
self.type = "polyline"
|
|
14
|
+
self.geo = geo
|
|
15
|
+
self.label = label
|
|
16
|
+
|
|
17
|
+
@property
|
|
18
|
+
def x(self):
|
|
19
|
+
return self.geo[:, 0]
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def y(self):
|
|
23
|
+
return self.geo[:, 1]
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def left(self):
|
|
27
|
+
return np.min(self.x)
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def top(self):
|
|
31
|
+
return np.min(self.y)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def right(self):
|
|
35
|
+
return np.max(self.x)
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def bottom(self):
|
|
39
|
+
return np.max(self.y)
|
|
40
|
+
|
|
41
|
+
def to_coordinates(self, color):
|
|
42
|
+
return [[{"x": float(x), "y": float(y)} for x, y in self.geo]]
|
|
43
|
+
|
|
44
|
+
@staticmethod
|
|
45
|
+
def from_coordinates(coordinates):
|
|
46
|
+
return np.asarray([[pt["x"], pt["y"]] for pt in coordinates])
|
|
47
|
+
|
|
48
|
+
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
49
|
+
"""
|
|
50
|
+
Show annotation as ndarray
|
|
51
|
+
:param image: empty or image to draw on
|
|
52
|
+
:param thickness:
|
|
53
|
+
:param with_text: not required
|
|
54
|
+
:param height: item height
|
|
55
|
+
:param width: item width
|
|
56
|
+
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
57
|
+
:param color: color
|
|
58
|
+
:param alpha: opacity value [0 1], default 1
|
|
59
|
+
:return: ndarray
|
|
60
|
+
"""
|
|
61
|
+
try:
|
|
62
|
+
import cv2
|
|
63
|
+
except (ImportError, ModuleNotFoundError):
|
|
64
|
+
self.logger.error(
|
|
65
|
+
'Import Error! Cant import cv2. Annotations operations will be limited. import manually and fix errors')
|
|
66
|
+
raise
|
|
67
|
+
|
|
68
|
+
# polyline cant have thickness -1
|
|
69
|
+
if thickness is None or thickness == -1:
|
|
70
|
+
thickness = 2
|
|
71
|
+
|
|
72
|
+
if alpha != 1:
|
|
73
|
+
overlay = image.copy()
|
|
74
|
+
else:
|
|
75
|
+
overlay = image
|
|
76
|
+
|
|
77
|
+
overlay = cv2.polylines(
|
|
78
|
+
img=overlay,
|
|
79
|
+
pts=[np.round(self.geo).astype(int)],
|
|
80
|
+
color=color,
|
|
81
|
+
isClosed=False,
|
|
82
|
+
thickness=thickness,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
if not isinstance(color, int) and len(color) == 4 and color[3] != 255:
|
|
86
|
+
# add with opacity
|
|
87
|
+
image = cv2.addWeighted(src1=overlay,
|
|
88
|
+
alpha=alpha,
|
|
89
|
+
src2=image,
|
|
90
|
+
beta=1 - alpha,
|
|
91
|
+
gamma=0)
|
|
92
|
+
else:
|
|
93
|
+
image = overlay
|
|
94
|
+
|
|
95
|
+
if with_text:
|
|
96
|
+
image = self.add_text_to_image(image=image, annotation=self)
|
|
97
|
+
return image
|
|
98
|
+
|
|
99
|
+
@classmethod
|
|
100
|
+
def from_json(cls, _json):
|
|
101
|
+
if "coordinates" in _json:
|
|
102
|
+
geo = cls.from_coordinates(coordinates=_json["coordinates"][0])
|
|
103
|
+
elif "data" in _json:
|
|
104
|
+
geo = cls.from_coordinates(coordinates=_json["data"][0])
|
|
105
|
+
else:
|
|
106
|
+
raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
|
|
107
|
+
return cls(
|
|
108
|
+
geo=geo,
|
|
109
|
+
label=_json["label"],
|
|
110
|
+
attributes=_json.get("attributes", None),
|
|
111
|
+
)
|
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
import uuid
|
|
3
|
-
|
|
4
|
-
from . import BaseAnnotationDefinition
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class Pose(BaseAnnotationDefinition):
|
|
8
|
-
"""
|
|
9
|
-
Classification annotation object
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
def __init__(self, label, template_id, instance_id=None, attributes=None, points=None, description=None):
|
|
13
|
-
super().__init__(description=description, attributes=attributes)
|
|
14
|
-
self.type = "pose"
|
|
15
|
-
self.label = label
|
|
16
|
-
self.template_id = template_id
|
|
17
|
-
if instance_id is None:
|
|
18
|
-
instance_id = str(uuid.uuid1())
|
|
19
|
-
self.instance_id = instance_id
|
|
20
|
-
if points is None:
|
|
21
|
-
points = list()
|
|
22
|
-
self.points = points
|
|
23
|
-
|
|
24
|
-
@property
|
|
25
|
-
def x(self):
|
|
26
|
-
return [point.x for point in self.points]
|
|
27
|
-
|
|
28
|
-
@property
|
|
29
|
-
def y(self):
|
|
30
|
-
return [point.y for point in self.points]
|
|
31
|
-
|
|
32
|
-
@property
|
|
33
|
-
def geo(self):
|
|
34
|
-
return list()
|
|
35
|
-
|
|
36
|
-
@property
|
|
37
|
-
def left(self):
|
|
38
|
-
if not len(self.points):
|
|
39
|
-
return 0
|
|
40
|
-
return np.min(self.x)
|
|
41
|
-
|
|
42
|
-
@property
|
|
43
|
-
def top(self):
|
|
44
|
-
if not len(self.points):
|
|
45
|
-
return 0
|
|
46
|
-
return np.min(self.y)
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def right(self):
|
|
50
|
-
if not len(self.points):
|
|
51
|
-
return 0
|
|
52
|
-
return np.max(self.x)
|
|
53
|
-
|
|
54
|
-
@property
|
|
55
|
-
def bottom(self):
|
|
56
|
-
if not len(self.points):
|
|
57
|
-
return 0
|
|
58
|
-
return np.max(self.y)
|
|
59
|
-
|
|
60
|
-
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
61
|
-
"""
|
|
62
|
-
Show annotation as ndarray
|
|
63
|
-
:param image: empty or image to draw on
|
|
64
|
-
:param thickness:
|
|
65
|
-
:param with_text: not required
|
|
66
|
-
:param height: item height
|
|
67
|
-
:param width: item width
|
|
68
|
-
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
69
|
-
:param color: color
|
|
70
|
-
:param alpha: opacity value [0 1], default 1
|
|
71
|
-
:return: ndarray
|
|
72
|
-
"""
|
|
73
|
-
if with_text:
|
|
74
|
-
image = self.add_text_to_image(image=image, annotation=self)
|
|
75
|
-
return image
|
|
76
|
-
|
|
77
|
-
def to_coordinates(self, color):
|
|
78
|
-
return {'templateId': self.template_id,
|
|
79
|
-
'instanceId': self.instance_id}
|
|
80
|
-
|
|
81
|
-
@staticmethod
|
|
82
|
-
def from_coordinates(coordinates):
|
|
83
|
-
return coordinates
|
|
84
|
-
|
|
85
|
-
@classmethod
|
|
86
|
-
def from_json(cls, _json):
|
|
87
|
-
return cls(
|
|
88
|
-
label=_json["label"],
|
|
89
|
-
attributes=_json.get("attributes", None),
|
|
90
|
-
template_id=cls.from_coordinates(_json["coordinates"])['templateId'],
|
|
91
|
-
instance_id=cls.from_coordinates(_json["coordinates"])['instanceId']
|
|
92
|
-
)
|
|
1
|
+
import numpy as np
|
|
2
|
+
import uuid
|
|
3
|
+
|
|
4
|
+
from . import BaseAnnotationDefinition
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Pose(BaseAnnotationDefinition):
|
|
8
|
+
"""
|
|
9
|
+
Classification annotation object
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
def __init__(self, label, template_id, instance_id=None, attributes=None, points=None, description=None):
|
|
13
|
+
super().__init__(description=description, attributes=attributes)
|
|
14
|
+
self.type = "pose"
|
|
15
|
+
self.label = label
|
|
16
|
+
self.template_id = template_id
|
|
17
|
+
if instance_id is None:
|
|
18
|
+
instance_id = str(uuid.uuid1())
|
|
19
|
+
self.instance_id = instance_id
|
|
20
|
+
if points is None:
|
|
21
|
+
points = list()
|
|
22
|
+
self.points = points
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def x(self):
|
|
26
|
+
return [point.x for point in self.points]
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def y(self):
|
|
30
|
+
return [point.y for point in self.points]
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def geo(self):
|
|
34
|
+
return list()
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def left(self):
|
|
38
|
+
if not len(self.points):
|
|
39
|
+
return 0
|
|
40
|
+
return np.min(self.x)
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def top(self):
|
|
44
|
+
if not len(self.points):
|
|
45
|
+
return 0
|
|
46
|
+
return np.min(self.y)
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def right(self):
|
|
50
|
+
if not len(self.points):
|
|
51
|
+
return 0
|
|
52
|
+
return np.max(self.x)
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def bottom(self):
|
|
56
|
+
if not len(self.points):
|
|
57
|
+
return 0
|
|
58
|
+
return np.max(self.y)
|
|
59
|
+
|
|
60
|
+
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
61
|
+
"""
|
|
62
|
+
Show annotation as ndarray
|
|
63
|
+
:param image: empty or image to draw on
|
|
64
|
+
:param thickness:
|
|
65
|
+
:param with_text: not required
|
|
66
|
+
:param height: item height
|
|
67
|
+
:param width: item width
|
|
68
|
+
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
69
|
+
:param color: color
|
|
70
|
+
:param alpha: opacity value [0 1], default 1
|
|
71
|
+
:return: ndarray
|
|
72
|
+
"""
|
|
73
|
+
if with_text:
|
|
74
|
+
image = self.add_text_to_image(image=image, annotation=self)
|
|
75
|
+
return image
|
|
76
|
+
|
|
77
|
+
def to_coordinates(self, color):
|
|
78
|
+
return {'templateId': self.template_id,
|
|
79
|
+
'instanceId': self.instance_id}
|
|
80
|
+
|
|
81
|
+
@staticmethod
|
|
82
|
+
def from_coordinates(coordinates):
|
|
83
|
+
return coordinates
|
|
84
|
+
|
|
85
|
+
@classmethod
|
|
86
|
+
def from_json(cls, _json):
|
|
87
|
+
return cls(
|
|
88
|
+
label=_json["label"],
|
|
89
|
+
attributes=_json.get("attributes", None),
|
|
90
|
+
template_id=cls.from_coordinates(_json["coordinates"])['templateId'],
|
|
91
|
+
instance_id=cls.from_coordinates(_json["coordinates"])['instanceId']
|
|
92
|
+
)
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
from . import BaseAnnotationDefinition
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class RefImage(BaseAnnotationDefinition):
|
|
5
|
-
"""
|
|
6
|
-
Create an image annotation. Reference the url or item id in this annotation type
|
|
7
|
-
"""
|
|
8
|
-
type = "ref_image"
|
|
9
|
-
|
|
10
|
-
def __init__(self, ref, ref_type=None, mimetype=None, label='ref-image', attributes=None, description=None):
|
|
11
|
-
|
|
12
|
-
"""
|
|
13
|
-
Create an image annotation. Used for generative model and any other algorithm where and image is the output
|
|
14
|
-
|
|
15
|
-
For type 'id', need to upload the image as item in the platform and reference the item id in the annotation.
|
|
16
|
-
For type 'url', mimetype must be provided to load the ref correctly in the platform
|
|
17
|
-
|
|
18
|
-
:param str ref: the reference to the image annotation, represented by an ‘itemId’ or ‘url’
|
|
19
|
-
:param str ref_type: one of ‘id’ | ‘url’
|
|
20
|
-
:param str mimetype: optional. in case the refType is URL, e.g. image/jpeg, video/mpeg
|
|
21
|
-
:param label: annotation label
|
|
22
|
-
:param attributes: annotation attributes
|
|
23
|
-
:param description:
|
|
24
|
-
|
|
25
|
-
:return:
|
|
26
|
-
"""
|
|
27
|
-
super().__init__(description=description, attributes=attributes)
|
|
28
|
-
if ref_type is None:
|
|
29
|
-
if ref.startswith('http'):
|
|
30
|
-
ref_type = 'url'
|
|
31
|
-
else:
|
|
32
|
-
ref_type = 'id'
|
|
33
|
-
self.ref = ref
|
|
34
|
-
self.ref_type = ref_type
|
|
35
|
-
self.mimetype = mimetype
|
|
36
|
-
self.label = label
|
|
37
|
-
|
|
38
|
-
@property
|
|
39
|
-
def x(self):
|
|
40
|
-
return 0
|
|
41
|
-
|
|
42
|
-
@property
|
|
43
|
-
def y(self):
|
|
44
|
-
return 0
|
|
45
|
-
|
|
46
|
-
@property
|
|
47
|
-
def geo(self):
|
|
48
|
-
return list()
|
|
49
|
-
|
|
50
|
-
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
51
|
-
"""
|
|
52
|
-
Show annotation as ndarray
|
|
53
|
-
:param image: empty or image to draw on
|
|
54
|
-
:param thickness:
|
|
55
|
-
:param with_text: not required
|
|
56
|
-
:param height: item height
|
|
57
|
-
:param width: item width
|
|
58
|
-
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
59
|
-
:param color: color
|
|
60
|
-
:param alpha: opacity value [0 1], default 1
|
|
61
|
-
:return: ndarray
|
|
62
|
-
"""
|
|
63
|
-
# TODO over or show the image annotations
|
|
64
|
-
return self.add_text_to_image(image=image, annotation=self)
|
|
65
|
-
|
|
66
|
-
def to_coordinates(self, color):
|
|
67
|
-
coordinates = {
|
|
68
|
-
"ref": self.ref,
|
|
69
|
-
"refType": self.ref_type,
|
|
70
|
-
"mimetype": self.mimetype,
|
|
71
|
-
}
|
|
72
|
-
return coordinates
|
|
73
|
-
|
|
74
|
-
@classmethod
|
|
75
|
-
def from_json(cls, _json):
|
|
76
|
-
coordinates = _json["coordinates"]
|
|
77
|
-
ref = coordinates.get('ref')
|
|
78
|
-
ref_type = coordinates.get('refType')
|
|
79
|
-
mimetype = coordinates.get('mimetype')
|
|
80
|
-
return cls(
|
|
81
|
-
ref=ref,
|
|
82
|
-
ref_type=ref_type,
|
|
83
|
-
mimetype=mimetype,
|
|
84
|
-
label=_json["label"],
|
|
85
|
-
attributes=_json.get("attributes", None),
|
|
86
|
-
)
|
|
1
|
+
from . import BaseAnnotationDefinition
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class RefImage(BaseAnnotationDefinition):
|
|
5
|
+
"""
|
|
6
|
+
Create an image annotation. Reference the url or item id in this annotation type
|
|
7
|
+
"""
|
|
8
|
+
type = "ref_image"
|
|
9
|
+
|
|
10
|
+
def __init__(self, ref, ref_type=None, mimetype=None, label='ref-image', attributes=None, description=None):
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
Create an image annotation. Used for generative model and any other algorithm where and image is the output
|
|
14
|
+
|
|
15
|
+
For type 'id', need to upload the image as item in the platform and reference the item id in the annotation.
|
|
16
|
+
For type 'url', mimetype must be provided to load the ref correctly in the platform
|
|
17
|
+
|
|
18
|
+
:param str ref: the reference to the image annotation, represented by an ‘itemId’ or ‘url’
|
|
19
|
+
:param str ref_type: one of ‘id’ | ‘url’
|
|
20
|
+
:param str mimetype: optional. in case the refType is URL, e.g. image/jpeg, video/mpeg
|
|
21
|
+
:param label: annotation label
|
|
22
|
+
:param attributes: annotation attributes
|
|
23
|
+
:param description:
|
|
24
|
+
|
|
25
|
+
:return:
|
|
26
|
+
"""
|
|
27
|
+
super().__init__(description=description, attributes=attributes)
|
|
28
|
+
if ref_type is None:
|
|
29
|
+
if ref.startswith('http'):
|
|
30
|
+
ref_type = 'url'
|
|
31
|
+
else:
|
|
32
|
+
ref_type = 'id'
|
|
33
|
+
self.ref = ref
|
|
34
|
+
self.ref_type = ref_type
|
|
35
|
+
self.mimetype = mimetype
|
|
36
|
+
self.label = label
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def x(self):
|
|
40
|
+
return 0
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def y(self):
|
|
44
|
+
return 0
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def geo(self):
|
|
48
|
+
return list()
|
|
49
|
+
|
|
50
|
+
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
51
|
+
"""
|
|
52
|
+
Show annotation as ndarray
|
|
53
|
+
:param image: empty or image to draw on
|
|
54
|
+
:param thickness:
|
|
55
|
+
:param with_text: not required
|
|
56
|
+
:param height: item height
|
|
57
|
+
:param width: item width
|
|
58
|
+
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
59
|
+
:param color: color
|
|
60
|
+
:param alpha: opacity value [0 1], default 1
|
|
61
|
+
:return: ndarray
|
|
62
|
+
"""
|
|
63
|
+
# TODO over or show the image annotations
|
|
64
|
+
return self.add_text_to_image(image=image, annotation=self)
|
|
65
|
+
|
|
66
|
+
def to_coordinates(self, color):
|
|
67
|
+
coordinates = {
|
|
68
|
+
"ref": self.ref,
|
|
69
|
+
"refType": self.ref_type,
|
|
70
|
+
"mimetype": self.mimetype,
|
|
71
|
+
}
|
|
72
|
+
return coordinates
|
|
73
|
+
|
|
74
|
+
@classmethod
|
|
75
|
+
def from_json(cls, _json):
|
|
76
|
+
coordinates = _json["coordinates"]
|
|
77
|
+
ref = coordinates.get('ref')
|
|
78
|
+
ref_type = coordinates.get('refType')
|
|
79
|
+
mimetype = coordinates.get('mimetype')
|
|
80
|
+
return cls(
|
|
81
|
+
ref=ref,
|
|
82
|
+
ref_type=ref_type,
|
|
83
|
+
mimetype=mimetype,
|
|
84
|
+
label=_json["label"],
|
|
85
|
+
attributes=_json.get("attributes", None),
|
|
86
|
+
)
|