scale-nucleus 0.14.5b1__tar.gz → 0.14.14__tar.gz
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.
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/LICENSE +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/PKG-INFO +1 -1
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/README.md +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/client.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/datasets.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/helpers/__init__.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/helpers/nucleus_url.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/helpers/web_helper.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/install_completion.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/jobs.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/models.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/nu.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/reference.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/slices.py +14 -28
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/tests.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/__init__.py +13 -15
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/annotation.py +5 -4
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/annotation_uploader.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/async_utils.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/autocurate.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/camera_params.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/connection.py +9 -1
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/constants.py +4 -3
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/__init__.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/dataset_details.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/dataset_info.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/dataset_size.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/scenes_list.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/dataset.py +166 -59
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/dataset_item.py +11 -1
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/dataset_item_uploader.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/deprecation_warning.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/errors.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/job.py +1 -1
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/logger.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metadata_manager.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/__init__.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/base.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/categorization_metrics.py +6 -2
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/cuboid_metrics.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/cuboid_utils.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/custom_types.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/errors.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/filtering.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/filters.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/metric_utils.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/polygon_metrics.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/polygon_utils.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/segmentation_loader.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/segmentation_metrics.py +6 -10
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/segmentation_to_poly_metrics.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/segmentation_utils.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/model.py +16 -14
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/model_run.py +1 -1
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/package_not_installed.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/payload_constructor.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/prediction.py +3 -3
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/pydantic_base.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/quaternion.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/retry_strategy.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/scene.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/slice.py +100 -19
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/upload_response.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/url_utils.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/utils.py +14 -8
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/__init__.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/client.py +11 -6
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/constants.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/data_transfer_objects/__init__.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/data_transfer_objects/eval_function.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/data_transfer_objects/scenario_test.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/data_transfer_objects/scenario_test_evaluations.py +0 -8
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/data_transfer_objects/scenario_test_metric.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/errors.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/eval_functions/__init__.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/eval_functions/available_eval_functions.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/eval_functions/base_eval_function.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/eval_functions/config_classes/__init__.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/eval_functions/config_classes/segmentation.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/scenario_test.py +22 -14
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/scenario_test_evaluation.py +21 -21
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/scenario_test_metric.py +0 -0
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/utils.py +1 -1
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/pyproject.toml +1 -1
- {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/setup.py +1 -1
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -23,12 +23,9 @@ def slices(ctx, web):
|
|
23
23
|
@slices.command("list")
|
24
24
|
def list_slices():
|
25
25
|
"""List all available Slices"""
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
) as live:
|
30
|
-
client = init_client()
|
31
|
-
datasets = client.datasets
|
26
|
+
client = init_client()
|
27
|
+
console = Console()
|
28
|
+
with console.status("Finding your Slices!", spinner="dots4"):
|
32
29
|
table = Table(
|
33
30
|
Column("id", overflow="fold", min_width=24),
|
34
31
|
"name",
|
@@ -37,26 +34,15 @@ def list_slices():
|
|
37
34
|
title=":cake: Slices",
|
38
35
|
title_justify="left",
|
39
36
|
)
|
40
|
-
|
41
|
-
for
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
)
|
51
|
-
live.update(table)
|
52
|
-
except NucleusAPIError as e:
|
53
|
-
errors[ds.id] = e
|
54
|
-
|
55
|
-
error_tree = Tree(
|
56
|
-
":x: Encountered the following errors while fetching information"
|
57
|
-
)
|
58
|
-
for ds_id, error in errors.items():
|
59
|
-
dataset_branch = error_tree.add(f"Dataset: {ds_id}")
|
60
|
-
dataset_branch.add(f"Error: {error}")
|
37
|
+
datasets = client.datasets
|
38
|
+
id_to_datasets = {d.id: d for d in datasets}
|
39
|
+
all_slices = client.slices
|
40
|
+
for s in all_slices:
|
41
|
+
table.add_row(
|
42
|
+
s.id,
|
43
|
+
s.name,
|
44
|
+
id_to_datasets[s.dataset_id].name,
|
45
|
+
nucleus_url(f"{s.dataset_id}/{s.id}"),
|
46
|
+
)
|
61
47
|
|
62
|
-
|
48
|
+
console.print(table)
|
File without changes
|
@@ -235,6 +235,12 @@ class NucleusClient:
|
|
235
235
|
"""
|
236
236
|
return self.list_jobs()
|
237
237
|
|
238
|
+
@property
|
239
|
+
def slices(self) -> List[Slice]:
|
240
|
+
response = self.make_request({}, "slice/", requests.get)
|
241
|
+
slices = [Slice.from_request(info, self) for info in response]
|
242
|
+
return slices
|
243
|
+
|
238
244
|
@deprecated(msg="Use the NucleusClient.models property in the future.")
|
239
245
|
def list_models(self) -> List[Model]:
|
240
246
|
return self.models
|
@@ -441,7 +447,8 @@ class NucleusClient:
|
|
441
447
|
Deletes a dataset by ID.
|
442
448
|
|
443
449
|
All items, annotations, and predictions associated with the dataset will
|
444
|
-
be deleted as well.
|
450
|
+
be deleted as well. Note that if this dataset is linked to a Scale or Rapid
|
451
|
+
labeling project, the project itself will not be deleted.
|
445
452
|
|
446
453
|
Parameters:
|
447
454
|
dataset_id: The ID of the dataset to delete.
|
@@ -852,7 +859,7 @@ class NucleusClient:
|
|
852
859
|
|
853
860
|
@deprecated("Prefer calling Dataset.delete_annotations instead.")
|
854
861
|
def delete_annotations(
|
855
|
-
self, dataset_id: str, reference_ids: list = None, keep_history=
|
862
|
+
self, dataset_id: str, reference_ids: list = None, keep_history=True
|
856
863
|
) -> AsyncJob:
|
857
864
|
dataset = self.get_dataset(dataset_id)
|
858
865
|
return dataset.delete_annotations(reference_ids, keep_history)
|
@@ -1020,6 +1027,7 @@ class NucleusClient:
|
|
1020
1027
|
payload: Optional[dict],
|
1021
1028
|
route: str,
|
1022
1029
|
requests_command=requests.post,
|
1030
|
+
return_raw_response: bool = False,
|
1023
1031
|
) -> dict:
|
1024
1032
|
"""Makes a request to a Nucleus API endpoint.
|
1025
1033
|
|
@@ -1029,9 +1037,10 @@ class NucleusClient:
|
|
1029
1037
|
payload: Given request payload.
|
1030
1038
|
route: Route for the request.
|
1031
1039
|
Requests command: ``requests.post``, ``requests.get``, or ``requests.delete``.
|
1040
|
+
return_raw_response: return the request's response object entirely
|
1032
1041
|
|
1033
1042
|
Returns:
|
1034
|
-
Response payload as JSON dict.
|
1043
|
+
Response payload as JSON dict or request object.
|
1035
1044
|
"""
|
1036
1045
|
if payload is None:
|
1037
1046
|
payload = {}
|
@@ -1041,18 +1050,7 @@ class NucleusClient:
|
|
1041
1050
|
"Received defined payload with GET request! Will ignore payload"
|
1042
1051
|
)
|
1043
1052
|
payload = None
|
1044
|
-
return self._connection.make_request(payload, route, requests_command) # type: ignore
|
1045
|
-
|
1046
|
-
def handle_bad_response(
|
1047
|
-
self,
|
1048
|
-
endpoint,
|
1049
|
-
requests_command,
|
1050
|
-
requests_response=None,
|
1051
|
-
aiohttp_response=None,
|
1052
|
-
):
|
1053
|
-
self._connection.handle_bad_response(
|
1054
|
-
endpoint, requests_command, requests_response, aiohttp_response
|
1055
|
-
)
|
1053
|
+
return self._connection.make_request(payload, route, requests_command, return_raw_response) # type: ignore
|
1056
1054
|
|
1057
1055
|
def _set_api_key(self, api_key):
|
1058
1056
|
"""Fetch API key from environment variable NUCLEUS_API_KEY if not set"""
|
@@ -105,7 +105,7 @@ class BoxAnnotation(Annotation): # pylint: disable=R0902
|
|
105
105
|
reference_id="image_1",
|
106
106
|
annotation_id="image_1_car_box_1",
|
107
107
|
metadata={"vehicle_color": "red"},
|
108
|
-
embedding_vector=[0.1423, 1.432,
|
108
|
+
embedding_vector=[0.1423, 1.432, ..., 3.829],
|
109
109
|
)
|
110
110
|
|
111
111
|
Parameters:
|
@@ -310,7 +310,7 @@ class PolygonAnnotation(Annotation):
|
|
310
310
|
reference_id="image_2",
|
311
311
|
annotation_id="image_2_bus_polygon_1",
|
312
312
|
metadata={"vehicle_color": "yellow"},
|
313
|
-
embedding_vector=[0.1423, 1.432,
|
313
|
+
embedding_vector=[0.1423, 1.432, ..., 3.829],
|
314
314
|
)
|
315
315
|
|
316
316
|
Parameters:
|
@@ -691,7 +691,7 @@ class SegmentationAnnotation(Annotation):
|
|
691
691
|
from nucleus import SegmentationAnnotation
|
692
692
|
|
693
693
|
segmentation = SegmentationAnnotation(
|
694
|
-
mask_url="s3://your-bucket-name/segmentation-masks/
|
694
|
+
mask_url="s3://your-bucket-name/segmentation-masks/image_2_mask_id_1.png",
|
695
695
|
annotations=[
|
696
696
|
Segment(label="grass", index="1"),
|
697
697
|
Segment(label="road", index="2"),
|
@@ -704,7 +704,8 @@ class SegmentationAnnotation(Annotation):
|
|
704
704
|
|
705
705
|
Parameters:
|
706
706
|
mask_url (str): A URL pointing to the segmentation prediction mask which is
|
707
|
-
accessible to Scale
|
707
|
+
accessible to Scale. This "URL" can also be a path to a local file.
|
708
|
+
The mask is an HxW int8 array saved in PNG format,
|
708
709
|
with each pixel value ranging from [0, N), where N is the number of
|
709
710
|
possible classes (for semantic segmentation) or instances (for instance
|
710
711
|
segmentation).
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -40,7 +40,11 @@ class Connection:
|
|
40
40
|
return self.make_request(payload, route, requests_command=requests.put)
|
41
41
|
|
42
42
|
def make_request(
|
43
|
-
self,
|
43
|
+
self,
|
44
|
+
payload: dict,
|
45
|
+
route: str,
|
46
|
+
requests_command=requests.post,
|
47
|
+
return_raw_response: bool = False,
|
44
48
|
) -> dict:
|
45
49
|
"""
|
46
50
|
Makes a request to Nucleus endpoint and logs a warning if not
|
@@ -49,6 +53,7 @@ class Connection:
|
|
49
53
|
:param payload: given payload
|
50
54
|
:param route: route for the request
|
51
55
|
:param requests_command: requests.post, requests.get, requests.delete
|
56
|
+
:param return_raw_response: return the request's response object entirely
|
52
57
|
:return: response JSON
|
53
58
|
"""
|
54
59
|
endpoint = f"{self.endpoint}/{route}"
|
@@ -73,6 +78,9 @@ class Connection:
|
|
73
78
|
if not response.ok:
|
74
79
|
self.handle_bad_response(endpoint, requests_command, response)
|
75
80
|
|
81
|
+
if return_raw_response:
|
82
|
+
return response
|
83
|
+
|
76
84
|
return response.json()
|
77
85
|
|
78
86
|
def handle_bad_response(
|
@@ -28,6 +28,7 @@ AUTOTAGS_KEY = "autotags"
|
|
28
28
|
AUTOTAG_SCORE_THRESHOLD = "score_threshold"
|
29
29
|
EXPORTED_ROWS = "exportedRows"
|
30
30
|
EXPORTED_SCALE_TASK_INFO_ROWS = "exportedScaleTaskInfoRows"
|
31
|
+
EXPORT_FOR_TRAINING_KEY = "data"
|
31
32
|
CAMERA_MODEL_KEY = "camera_model"
|
32
33
|
CAMERA_PARAMS_KEY = "camera_params"
|
33
34
|
CLASS_PDF_KEY = "class_pdf"
|
@@ -82,7 +83,6 @@ JOB_CREATION_TIME_KEY = "job_creation_time"
|
|
82
83
|
KEYPOINTS_KEY = "keypoints"
|
83
84
|
KEYPOINTS_NAMES_KEY = "names"
|
84
85
|
KEYPOINTS_SKELETON_KEY = "skeleton"
|
85
|
-
LAST_PAGE = "lastPage"
|
86
86
|
LABEL_KEY = "label"
|
87
87
|
LABELS_KEY = "labels"
|
88
88
|
MASK_URL_KEY = "mask_url"
|
@@ -98,8 +98,9 @@ NEW_ITEMS = "new_items"
|
|
98
98
|
NUCLEUS_ENDPOINT = "https://api.scale.com/v1/nucleus"
|
99
99
|
NUM_SENSORS_KEY = "num_sensors"
|
100
100
|
ORIGINAL_IMAGE_URL_KEY = "original_image_url"
|
101
|
-
|
102
|
-
|
101
|
+
PAGE_SIZE_KEY = "pageSize"
|
102
|
+
PAGE_TOKEN_KEY = "pageToken"
|
103
|
+
NEXT_TOKEN_KEY = "nextPageToken"
|
103
104
|
P1_KEY = "p1"
|
104
105
|
P2_KEY = "p2"
|
105
106
|
POINTCLOUD_KEY = "pointcloud"
|
File without changes
|
{scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/dataset_details.py
RENAMED
File without changes
|
{scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/dataset_info.py
RENAMED
File without changes
|
{scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/dataset_size.py
RENAMED
File without changes
|
{scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/scenes_list.py
RENAMED
File without changes
|