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.
Files changed (85) hide show
  1. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/LICENSE +0 -0
  2. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/PKG-INFO +1 -1
  3. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/README.md +0 -0
  4. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/client.py +0 -0
  5. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/datasets.py +0 -0
  6. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/helpers/__init__.py +0 -0
  7. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/helpers/nucleus_url.py +0 -0
  8. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/helpers/web_helper.py +0 -0
  9. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/install_completion.py +0 -0
  10. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/jobs.py +0 -0
  11. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/models.py +0 -0
  12. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/nu.py +0 -0
  13. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/reference.py +0 -0
  14. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/slices.py +14 -28
  15. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/cli/tests.py +0 -0
  16. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/__init__.py +13 -15
  17. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/annotation.py +5 -4
  18. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/annotation_uploader.py +0 -0
  19. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/async_utils.py +0 -0
  20. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/autocurate.py +0 -0
  21. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/camera_params.py +0 -0
  22. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/connection.py +9 -1
  23. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/constants.py +4 -3
  24. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/__init__.py +0 -0
  25. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/dataset_details.py +0 -0
  26. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/dataset_info.py +0 -0
  27. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/dataset_size.py +0 -0
  28. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/data_transfer_object/scenes_list.py +0 -0
  29. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/dataset.py +166 -59
  30. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/dataset_item.py +11 -1
  31. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/dataset_item_uploader.py +0 -0
  32. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/deprecation_warning.py +0 -0
  33. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/errors.py +0 -0
  34. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/job.py +1 -1
  35. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/logger.py +0 -0
  36. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metadata_manager.py +0 -0
  37. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/__init__.py +0 -0
  38. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/base.py +0 -0
  39. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/categorization_metrics.py +6 -2
  40. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/cuboid_metrics.py +0 -0
  41. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/cuboid_utils.py +0 -0
  42. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/custom_types.py +0 -0
  43. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/errors.py +0 -0
  44. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/filtering.py +0 -0
  45. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/filters.py +0 -0
  46. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/metric_utils.py +0 -0
  47. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/polygon_metrics.py +0 -0
  48. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/polygon_utils.py +0 -0
  49. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/segmentation_loader.py +0 -0
  50. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/segmentation_metrics.py +6 -10
  51. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/segmentation_to_poly_metrics.py +0 -0
  52. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/metrics/segmentation_utils.py +0 -0
  53. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/model.py +16 -14
  54. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/model_run.py +1 -1
  55. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/package_not_installed.py +0 -0
  56. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/payload_constructor.py +0 -0
  57. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/prediction.py +3 -3
  58. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/pydantic_base.py +0 -0
  59. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/quaternion.py +0 -0
  60. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/retry_strategy.py +0 -0
  61. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/scene.py +0 -0
  62. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/slice.py +100 -19
  63. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/upload_response.py +0 -0
  64. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/url_utils.py +0 -0
  65. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/utils.py +14 -8
  66. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/__init__.py +0 -0
  67. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/client.py +11 -6
  68. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/constants.py +0 -0
  69. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/data_transfer_objects/__init__.py +0 -0
  70. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/data_transfer_objects/eval_function.py +0 -0
  71. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/data_transfer_objects/scenario_test.py +0 -0
  72. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/data_transfer_objects/scenario_test_evaluations.py +0 -8
  73. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/data_transfer_objects/scenario_test_metric.py +0 -0
  74. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/errors.py +0 -0
  75. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/eval_functions/__init__.py +0 -0
  76. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/eval_functions/available_eval_functions.py +0 -0
  77. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/eval_functions/base_eval_function.py +0 -0
  78. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/eval_functions/config_classes/__init__.py +0 -0
  79. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/eval_functions/config_classes/segmentation.py +0 -0
  80. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/scenario_test.py +22 -14
  81. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/scenario_test_evaluation.py +21 -21
  82. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/scenario_test_metric.py +0 -0
  83. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/nucleus/validate/utils.py +1 -1
  84. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/pyproject.toml +1 -1
  85. {scale-nucleus-0.14.5b1 → scale-nucleus-0.14.14}/setup.py +1 -1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: scale-nucleus
3
- Version: 0.14.5b1
3
+ Version: 0.14.14
4
4
  Summary: The official Python client library for Nucleus, the Data Platform for AI
5
5
  Home-page: https://scale.com/nucleus
6
6
  License: MIT
@@ -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
- with Live(
27
- Spinner("dots4", text="Finding your Slices!"),
28
- vertical_overflow="visible",
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
- errors = {}
41
- for ds in datasets:
42
- try:
43
- ds_slices = ds.slices
44
- if ds_slices:
45
- for slc_id in ds_slices:
46
- slice_url = nucleus_url(f"{ds.id}/{slc_id}")
47
- slice_info = client.get_slice(slc_id).info()
48
- table.add_row(
49
- slc_id, slice_info["name"], ds.name, slice_url
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
- Console().print(error_tree)
48
+ console.print(table)
@@ -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=False
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, ...3.829],
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, ...3.829],
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/image_2_mask_id1.png",
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, or a local path. The mask is an HxW int8 array saved in PNG format,
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).
@@ -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, payload: dict, route: str, requests_command=requests.post
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
- PAGE_SIZE = "pageSize"
102
- PAGE_TOKEN = "pageToken"
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"