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,62 +1,62 @@
|
|
|
1
|
-
from . import BaseAnnotationDefinition
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class FreeText(BaseAnnotationDefinition):
|
|
5
|
-
"""
|
|
6
|
-
Free text annotation type (e.g. response for a prompt)
|
|
7
|
-
"""
|
|
8
|
-
type = "text"
|
|
9
|
-
|
|
10
|
-
def __init__(self, text, label='free-text', attributes=None, description=None):
|
|
11
|
-
"""
|
|
12
|
-
Create a free text annotation
|
|
13
|
-
:param label: annotation label
|
|
14
|
-
:param text: string of the annotation
|
|
15
|
-
:param attributes: annotation attributes
|
|
16
|
-
:param description:
|
|
17
|
-
|
|
18
|
-
:return:
|
|
19
|
-
"""
|
|
20
|
-
super().__init__(description=description, attributes=attributes)
|
|
21
|
-
self.text = text
|
|
22
|
-
self.label = label
|
|
23
|
-
|
|
24
|
-
@property
|
|
25
|
-
def x(self):
|
|
26
|
-
return 0
|
|
27
|
-
|
|
28
|
-
@property
|
|
29
|
-
def y(self):
|
|
30
|
-
return 0
|
|
31
|
-
|
|
32
|
-
@property
|
|
33
|
-
def geo(self):
|
|
34
|
-
return list()
|
|
35
|
-
|
|
36
|
-
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
37
|
-
"""
|
|
38
|
-
Show annotation as ndarray
|
|
39
|
-
:param image: empty or image to draw on
|
|
40
|
-
:param thickness:
|
|
41
|
-
:param with_text: not required
|
|
42
|
-
:param height: item height
|
|
43
|
-
:param width: item width
|
|
44
|
-
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
45
|
-
:param color: color
|
|
46
|
-
:param alpha: opacity value [0 1], default 1
|
|
47
|
-
:return: ndarray
|
|
48
|
-
"""
|
|
49
|
-
return self.text
|
|
50
|
-
|
|
51
|
-
def to_coordinates(self, color):
|
|
52
|
-
return self.text
|
|
53
|
-
|
|
54
|
-
@classmethod
|
|
55
|
-
def from_json(cls, _json):
|
|
56
|
-
coordinates = _json["coordinates"]
|
|
57
|
-
|
|
58
|
-
return cls(
|
|
59
|
-
text=coordinates,
|
|
60
|
-
label=_json["label"],
|
|
61
|
-
attributes=_json.get("attributes", None),
|
|
62
|
-
)
|
|
1
|
+
from . import BaseAnnotationDefinition
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class FreeText(BaseAnnotationDefinition):
|
|
5
|
+
"""
|
|
6
|
+
Free text annotation type (e.g. response for a prompt)
|
|
7
|
+
"""
|
|
8
|
+
type = "text"
|
|
9
|
+
|
|
10
|
+
def __init__(self, text, label='free-text', attributes=None, description=None):
|
|
11
|
+
"""
|
|
12
|
+
Create a free text annotation
|
|
13
|
+
:param label: annotation label
|
|
14
|
+
:param text: string of the annotation
|
|
15
|
+
:param attributes: annotation attributes
|
|
16
|
+
:param description:
|
|
17
|
+
|
|
18
|
+
:return:
|
|
19
|
+
"""
|
|
20
|
+
super().__init__(description=description, attributes=attributes)
|
|
21
|
+
self.text = text
|
|
22
|
+
self.label = label
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def x(self):
|
|
26
|
+
return 0
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def y(self):
|
|
30
|
+
return 0
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def geo(self):
|
|
34
|
+
return list()
|
|
35
|
+
|
|
36
|
+
def show(self, image, thickness, with_text, height, width, annotation_format, color, alpha=1):
|
|
37
|
+
"""
|
|
38
|
+
Show annotation as ndarray
|
|
39
|
+
:param image: empty or image to draw on
|
|
40
|
+
:param thickness:
|
|
41
|
+
:param with_text: not required
|
|
42
|
+
:param height: item height
|
|
43
|
+
:param width: item width
|
|
44
|
+
:param annotation_format: options: list(dl.ViewAnnotationOptions)
|
|
45
|
+
:param color: color
|
|
46
|
+
:param alpha: opacity value [0 1], default 1
|
|
47
|
+
:return: ndarray
|
|
48
|
+
"""
|
|
49
|
+
return self.text
|
|
50
|
+
|
|
51
|
+
def to_coordinates(self, color):
|
|
52
|
+
return self.text
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def from_json(cls, _json):
|
|
56
|
+
coordinates = _json["coordinates"]
|
|
57
|
+
|
|
58
|
+
return cls(
|
|
59
|
+
text=coordinates,
|
|
60
|
+
label=_json["label"],
|
|
61
|
+
attributes=_json.get("attributes", None),
|
|
62
|
+
)
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
from . import BaseAnnotationDefinition
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class GisType:
|
|
5
|
-
"""
|
|
6
|
-
State enum
|
|
7
|
-
"""
|
|
8
|
-
BOX = 'box'
|
|
9
|
-
POLYGON = 'polygon'
|
|
10
|
-
POLYLINE = 'polyline'
|
|
11
|
-
POINT = 'point'
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Gis(BaseAnnotationDefinition):
|
|
15
|
-
"""
|
|
16
|
-
Box annotation object
|
|
17
|
-
Can create a box using 2 point using: "top", "left", "bottom", "right" (to form a box [(left, top), (right, bottom)])
|
|
18
|
-
For rotated box add the "angel"
|
|
19
|
-
"""
|
|
20
|
-
type = "gis"
|
|
21
|
-
|
|
22
|
-
def __init__(self,
|
|
23
|
-
annotation_type: GisType,
|
|
24
|
-
geo,
|
|
25
|
-
label=None,
|
|
26
|
-
attributes=None,
|
|
27
|
-
description=None,
|
|
28
|
-
):
|
|
29
|
-
"""
|
|
30
|
-
Can create gis annotation using points:
|
|
31
|
-
|
|
32
|
-
:param geo: list of points
|
|
33
|
-
:param label: annotation label
|
|
34
|
-
:param attributes: a list of attributes for the annotation
|
|
35
|
-
:param description:
|
|
36
|
-
|
|
37
|
-
:return:
|
|
38
|
-
"""
|
|
39
|
-
super().__init__(description=description, attributes=attributes)
|
|
40
|
-
|
|
41
|
-
if geo is None:
|
|
42
|
-
raise ValueError('geo must be provided')
|
|
43
|
-
if annotation_type is None:
|
|
44
|
-
raise ValueError('annotation_type must be provided')
|
|
45
|
-
self.label = label
|
|
46
|
-
self.annotation = None
|
|
47
|
-
self.geo = geo
|
|
48
|
-
self.annotation_type = annotation_type
|
|
49
|
-
|
|
50
|
-
def to_coordinates(self, color):
|
|
51
|
-
return {
|
|
52
|
-
"geo_type": self.annotation_type,
|
|
53
|
-
"wgs84_geo_coordinates": self.geo
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
@classmethod
|
|
57
|
-
def from_json(cls, _json):
|
|
58
|
-
json_coordinates = _json.get("coordinates", {}) if "coordinates" in _json else _json.get("data", {})
|
|
59
|
-
coordinates = json_coordinates.get("wgs84_geo_coordinates", None)
|
|
60
|
-
annotations_type = json_coordinates.get("geo_type", None)
|
|
61
|
-
if coordinates is None:
|
|
62
|
-
raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
|
|
63
|
-
|
|
64
|
-
return cls(
|
|
65
|
-
annotation_type=annotations_type,
|
|
66
|
-
geo=coordinates,
|
|
67
|
-
label=_json["label"],
|
|
68
|
-
attributes=_json.get("attributes", None)
|
|
69
|
-
)
|
|
1
|
+
from . import BaseAnnotationDefinition
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class GisType:
|
|
5
|
+
"""
|
|
6
|
+
State enum
|
|
7
|
+
"""
|
|
8
|
+
BOX = 'box'
|
|
9
|
+
POLYGON = 'polygon'
|
|
10
|
+
POLYLINE = 'polyline'
|
|
11
|
+
POINT = 'point'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Gis(BaseAnnotationDefinition):
|
|
15
|
+
"""
|
|
16
|
+
Box annotation object
|
|
17
|
+
Can create a box using 2 point using: "top", "left", "bottom", "right" (to form a box [(left, top), (right, bottom)])
|
|
18
|
+
For rotated box add the "angel"
|
|
19
|
+
"""
|
|
20
|
+
type = "gis"
|
|
21
|
+
|
|
22
|
+
def __init__(self,
|
|
23
|
+
annotation_type: GisType,
|
|
24
|
+
geo,
|
|
25
|
+
label=None,
|
|
26
|
+
attributes=None,
|
|
27
|
+
description=None,
|
|
28
|
+
):
|
|
29
|
+
"""
|
|
30
|
+
Can create gis annotation using points:
|
|
31
|
+
|
|
32
|
+
:param geo: list of points
|
|
33
|
+
:param label: annotation label
|
|
34
|
+
:param attributes: a list of attributes for the annotation
|
|
35
|
+
:param description:
|
|
36
|
+
|
|
37
|
+
:return:
|
|
38
|
+
"""
|
|
39
|
+
super().__init__(description=description, attributes=attributes)
|
|
40
|
+
|
|
41
|
+
if geo is None:
|
|
42
|
+
raise ValueError('geo must be provided')
|
|
43
|
+
if annotation_type is None:
|
|
44
|
+
raise ValueError('annotation_type must be provided')
|
|
45
|
+
self.label = label
|
|
46
|
+
self.annotation = None
|
|
47
|
+
self.geo = geo
|
|
48
|
+
self.annotation_type = annotation_type
|
|
49
|
+
|
|
50
|
+
def to_coordinates(self, color):
|
|
51
|
+
return {
|
|
52
|
+
"geo_type": self.annotation_type,
|
|
53
|
+
"wgs84_geo_coordinates": self.geo
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@classmethod
|
|
57
|
+
def from_json(cls, _json):
|
|
58
|
+
json_coordinates = _json.get("coordinates", {}) if "coordinates" in _json else _json.get("data", {})
|
|
59
|
+
coordinates = json_coordinates.get("wgs84_geo_coordinates", None)
|
|
60
|
+
annotations_type = json_coordinates.get("geo_type", None)
|
|
61
|
+
if coordinates is None:
|
|
62
|
+
raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
|
|
63
|
+
|
|
64
|
+
return cls(
|
|
65
|
+
annotation_type=annotations_type,
|
|
66
|
+
geo=coordinates,
|
|
67
|
+
label=_json["label"],
|
|
68
|
+
attributes=_json.get("attributes", None)
|
|
69
|
+
)
|
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
import time
|
|
3
|
-
|
|
4
|
-
from . import Box
|
|
5
|
-
from ...services.api_client import client as api_client
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class Note(Box):
|
|
9
|
-
"""
|
|
10
|
-
Note annotation object
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
def __init__(
|
|
14
|
-
self,
|
|
15
|
-
left,
|
|
16
|
-
top,
|
|
17
|
-
right,
|
|
18
|
-
bottom,
|
|
19
|
-
label,
|
|
20
|
-
attributes=None,
|
|
21
|
-
messages=None,
|
|
22
|
-
status='issue',
|
|
23
|
-
assignee=None,
|
|
24
|
-
create_time=None,
|
|
25
|
-
creator=None,
|
|
26
|
-
description=None
|
|
27
|
-
):
|
|
28
|
-
super(Note, self).__init__(
|
|
29
|
-
left=left,
|
|
30
|
-
top=top,
|
|
31
|
-
right=right,
|
|
32
|
-
bottom=bottom,
|
|
33
|
-
label=label,
|
|
34
|
-
attributes=attributes,
|
|
35
|
-
description=description
|
|
36
|
-
)
|
|
37
|
-
self.type = "note"
|
|
38
|
-
if messages is None:
|
|
39
|
-
messages = []
|
|
40
|
-
if not isinstance(messages, list):
|
|
41
|
-
messages = [messages]
|
|
42
|
-
for msg_index in range(len(messages)):
|
|
43
|
-
if not isinstance(messages[msg_index], Message):
|
|
44
|
-
messages[msg_index] = Message(body=messages[msg_index])
|
|
45
|
-
self.messages = messages
|
|
46
|
-
self.status = status
|
|
47
|
-
self.create_time = create_time
|
|
48
|
-
self.creator = creator
|
|
49
|
-
if self.creator is None:
|
|
50
|
-
self.creator = api_client.info()['user_email']
|
|
51
|
-
self.assignee = assignee
|
|
52
|
-
if self.assignee is None:
|
|
53
|
-
self.assignee = self.creator
|
|
54
|
-
|
|
55
|
-
def to_coordinates(self, color):
|
|
56
|
-
box = super(Note, self).to_coordinates(color=color)
|
|
57
|
-
note = {
|
|
58
|
-
'messages': [msg.to_json() for msg in self.messages],
|
|
59
|
-
'status': self.status,
|
|
60
|
-
'createTime': self.create_time,
|
|
61
|
-
'creator': self.creator,
|
|
62
|
-
'assignee': self.assignee
|
|
63
|
-
}
|
|
64
|
-
coordinates = {
|
|
65
|
-
'box': box,
|
|
66
|
-
'note': note
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return coordinates
|
|
70
|
-
|
|
71
|
-
@staticmethod
|
|
72
|
-
def from_coordinates(coordinates):
|
|
73
|
-
return Box.from_coordinates(coordinates['box'])
|
|
74
|
-
|
|
75
|
-
@classmethod
|
|
76
|
-
def from_json(cls, _json):
|
|
77
|
-
if "coordinates" in _json:
|
|
78
|
-
geo = cls.from_coordinates(_json["coordinates"])
|
|
79
|
-
note_data = _json["coordinates"].get('note', dict())
|
|
80
|
-
elif "data" in _json:
|
|
81
|
-
geo = cls.from_coordinates(_json["data"])
|
|
82
|
-
note_data = _json["data"].get('note', dict())
|
|
83
|
-
else:
|
|
84
|
-
raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
|
|
85
|
-
|
|
86
|
-
left = np.min(geo[:, 0])
|
|
87
|
-
top = np.min(geo[:, 1])
|
|
88
|
-
right = np.max(geo[:, 0])
|
|
89
|
-
bottom = np.max(geo[:, 1])
|
|
90
|
-
messages = [Message.from_json(msg) for msg in note_data.get('messages', list())]
|
|
91
|
-
|
|
92
|
-
return cls(
|
|
93
|
-
left=left,
|
|
94
|
-
top=top,
|
|
95
|
-
right=right,
|
|
96
|
-
bottom=bottom,
|
|
97
|
-
label=_json["label"],
|
|
98
|
-
attributes=_json.get("attributes", None),
|
|
99
|
-
messages=messages,
|
|
100
|
-
status=note_data.get('status', 'open'),
|
|
101
|
-
creator=note_data.get('creator', 'me'),
|
|
102
|
-
assignee=note_data.get('assignee', 'me'),
|
|
103
|
-
create_time=note_data.get('createTime', 0),
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
def add_message(self, body: str = None):
|
|
107
|
-
self.messages.append(Message(body=body))
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
class Message:
|
|
111
|
-
"""
|
|
112
|
-
Note message object
|
|
113
|
-
"""
|
|
114
|
-
|
|
115
|
-
def __init__(self, msg_id: str = None, creator: str = None, msg_time=None, body: str = None):
|
|
116
|
-
self.id = msg_id
|
|
117
|
-
self.time = msg_time if msg_time is not None else int(time.time() * 1000)
|
|
118
|
-
self.body = body
|
|
119
|
-
self.creator = creator
|
|
120
|
-
if self.creator is None:
|
|
121
|
-
self.creator = api_client.info()['user_email']
|
|
122
|
-
|
|
123
|
-
def to_json(self):
|
|
124
|
-
_json = {
|
|
125
|
-
"id": self.id,
|
|
126
|
-
"creator": self.creator,
|
|
127
|
-
"time": self.time,
|
|
128
|
-
"body": self.body
|
|
129
|
-
}
|
|
130
|
-
return _json
|
|
131
|
-
|
|
132
|
-
@staticmethod
|
|
133
|
-
def from_json(_json):
|
|
134
|
-
return Message(
|
|
135
|
-
msg_id=_json.get('id', None),
|
|
136
|
-
msg_time=_json.get('time', None),
|
|
137
|
-
body=_json.get('body', None),
|
|
138
|
-
creator=_json.get('creator', None)
|
|
139
|
-
)
|
|
1
|
+
import numpy as np
|
|
2
|
+
import time
|
|
3
|
+
|
|
4
|
+
from . import Box
|
|
5
|
+
from ...services.api_client import client as api_client
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Note(Box):
|
|
9
|
+
"""
|
|
10
|
+
Note annotation object
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
left,
|
|
16
|
+
top,
|
|
17
|
+
right,
|
|
18
|
+
bottom,
|
|
19
|
+
label,
|
|
20
|
+
attributes=None,
|
|
21
|
+
messages=None,
|
|
22
|
+
status='issue',
|
|
23
|
+
assignee=None,
|
|
24
|
+
create_time=None,
|
|
25
|
+
creator=None,
|
|
26
|
+
description=None
|
|
27
|
+
):
|
|
28
|
+
super(Note, self).__init__(
|
|
29
|
+
left=left,
|
|
30
|
+
top=top,
|
|
31
|
+
right=right,
|
|
32
|
+
bottom=bottom,
|
|
33
|
+
label=label,
|
|
34
|
+
attributes=attributes,
|
|
35
|
+
description=description
|
|
36
|
+
)
|
|
37
|
+
self.type = "note"
|
|
38
|
+
if messages is None:
|
|
39
|
+
messages = []
|
|
40
|
+
if not isinstance(messages, list):
|
|
41
|
+
messages = [messages]
|
|
42
|
+
for msg_index in range(len(messages)):
|
|
43
|
+
if not isinstance(messages[msg_index], Message):
|
|
44
|
+
messages[msg_index] = Message(body=messages[msg_index])
|
|
45
|
+
self.messages = messages
|
|
46
|
+
self.status = status
|
|
47
|
+
self.create_time = create_time
|
|
48
|
+
self.creator = creator
|
|
49
|
+
if self.creator is None:
|
|
50
|
+
self.creator = api_client.info()['user_email']
|
|
51
|
+
self.assignee = assignee
|
|
52
|
+
if self.assignee is None:
|
|
53
|
+
self.assignee = self.creator
|
|
54
|
+
|
|
55
|
+
def to_coordinates(self, color):
|
|
56
|
+
box = super(Note, self).to_coordinates(color=color)
|
|
57
|
+
note = {
|
|
58
|
+
'messages': [msg.to_json() for msg in self.messages],
|
|
59
|
+
'status': self.status,
|
|
60
|
+
'createTime': self.create_time,
|
|
61
|
+
'creator': self.creator,
|
|
62
|
+
'assignee': self.assignee
|
|
63
|
+
}
|
|
64
|
+
coordinates = {
|
|
65
|
+
'box': box,
|
|
66
|
+
'note': note
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return coordinates
|
|
70
|
+
|
|
71
|
+
@staticmethod
|
|
72
|
+
def from_coordinates(coordinates):
|
|
73
|
+
return Box.from_coordinates(coordinates['box'])
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def from_json(cls, _json):
|
|
77
|
+
if "coordinates" in _json:
|
|
78
|
+
geo = cls.from_coordinates(_json["coordinates"])
|
|
79
|
+
note_data = _json["coordinates"].get('note', dict())
|
|
80
|
+
elif "data" in _json:
|
|
81
|
+
geo = cls.from_coordinates(_json["data"])
|
|
82
|
+
note_data = _json["data"].get('note', dict())
|
|
83
|
+
else:
|
|
84
|
+
raise ValueError('can not find "coordinates" or "data" in annotation. id: {}'.format(_json["id"]))
|
|
85
|
+
|
|
86
|
+
left = np.min(geo[:, 0])
|
|
87
|
+
top = np.min(geo[:, 1])
|
|
88
|
+
right = np.max(geo[:, 0])
|
|
89
|
+
bottom = np.max(geo[:, 1])
|
|
90
|
+
messages = [Message.from_json(msg) for msg in note_data.get('messages', list())]
|
|
91
|
+
|
|
92
|
+
return cls(
|
|
93
|
+
left=left,
|
|
94
|
+
top=top,
|
|
95
|
+
right=right,
|
|
96
|
+
bottom=bottom,
|
|
97
|
+
label=_json["label"],
|
|
98
|
+
attributes=_json.get("attributes", None),
|
|
99
|
+
messages=messages,
|
|
100
|
+
status=note_data.get('status', 'open'),
|
|
101
|
+
creator=note_data.get('creator', 'me'),
|
|
102
|
+
assignee=note_data.get('assignee', 'me'),
|
|
103
|
+
create_time=note_data.get('createTime', 0),
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def add_message(self, body: str = None):
|
|
107
|
+
self.messages.append(Message(body=body))
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class Message:
|
|
111
|
+
"""
|
|
112
|
+
Note message object
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
def __init__(self, msg_id: str = None, creator: str = None, msg_time=None, body: str = None):
|
|
116
|
+
self.id = msg_id
|
|
117
|
+
self.time = msg_time if msg_time is not None else int(time.time() * 1000)
|
|
118
|
+
self.body = body
|
|
119
|
+
self.creator = creator
|
|
120
|
+
if self.creator is None:
|
|
121
|
+
self.creator = api_client.info()['user_email']
|
|
122
|
+
|
|
123
|
+
def to_json(self):
|
|
124
|
+
_json = {
|
|
125
|
+
"id": self.id,
|
|
126
|
+
"creator": self.creator,
|
|
127
|
+
"time": self.time,
|
|
128
|
+
"body": self.body
|
|
129
|
+
}
|
|
130
|
+
return _json
|
|
131
|
+
|
|
132
|
+
@staticmethod
|
|
133
|
+
def from_json(_json):
|
|
134
|
+
return Message(
|
|
135
|
+
msg_id=_json.get('id', None),
|
|
136
|
+
msg_time=_json.get('time', None),
|
|
137
|
+
body=_json.get('body', None),
|
|
138
|
+
creator=_json.get('creator', None)
|
|
139
|
+
)
|