diff --git a/labelbox/data/annotation_types/__init__.py b/labelbox/data/annotation_types/__init__.py index c5b000d38..d2b3bd668 100644 --- a/labelbox/data/annotation_types/__init__.py +++ b/labelbox/data/annotation_types/__init__.py @@ -24,7 +24,6 @@ from .data import VideoData from .label import Label - from .collection import LabelList from .collection import LabelGenerator diff --git a/labelbox/data/annotation_types/collection.py b/labelbox/data/annotation_types/collection.py index 096e72817..e18bda34d 100644 --- a/labelbox/data/annotation_types/collection.py +++ b/labelbox/data/annotation_types/collection.py @@ -22,10 +22,10 @@ class LabelList: Use on smaller datasets. """ - warnings.warn("LabelList is deprecated and will be " - "removed in a future release.") - def __init__(self, data: Optional[Iterable[Label]] = None): + warnings.warn("LabelList is deprecated and will be " + "removed in a future release.") + if data is None: self._data = [] elif isinstance(data, Label): @@ -179,10 +179,8 @@ def _apply_threaded(self, fns, max_concurrency, *args): class LabelGenerator(PrefetchGenerator): """ - A container for interacting with a collection of labels. - - Use this class if you have larger data. It is slightly harder to work with - than the LabelList but will be much more memory efficient. + A container for interacting with a large collection of labels. + For a small number of labels, just use a list of Label objects. """ def __init__(self, data: Generator[Label, None, None], *args, **kwargs): @@ -191,7 +189,7 @@ def __init__(self, data: Generator[Label, None, None], *args, **kwargs): def as_list(self) -> "LabelList": warnings.warn("This method is deprecated and will be " - "removed in a future release. LabeList" + "removed in a future release. LabelList" " class will be deprecated.") return LabelList(data=list(self)) @@ -304,4 +302,4 @@ def __next__(self): return self._process(value) -LabelCollection = Union[LabelList, LabelGenerator, Iterable[Label]] +LabelCollection = Union[LabelGenerator, Iterable[Label]] diff --git a/labelbox/data/metrics/group.py b/labelbox/data/metrics/group.py index 3e17d1676..6c14648ac 100644 --- a/labelbox/data/metrics/group.py +++ b/labelbox/data/metrics/group.py @@ -12,7 +12,7 @@ from typing_extensions import Literal from ..annotation_types.feature import FeatureSchema -from ..annotation_types import ObjectAnnotation, ClassificationAnnotation, Label, LabelList +from ..annotation_types import ObjectAnnotation, ClassificationAnnotation, Label def get_identifying_key( @@ -79,8 +79,8 @@ def all_have_key(features: List[FeatureSchema]) -> Tuple[bool, bool]: return all_schemas, all_names -def get_label_pairs(labels_a: LabelList, - labels_b: LabelList, +def get_label_pairs(labels_a: list, + labels_b: list, match_on="uid", filter_mismatch=False) -> Dict[str, Tuple[Label, Label]]: """ @@ -91,8 +91,8 @@ def get_label_pairs(labels_a: LabelList, If this assumption fails, then the user has to determine their own matching strategy. Args: - labels_a (LabelList): A collection of labels to match with labels_b - labels_b (LabelList): A collection of labels to match with labels_a + labels_a (list): A collection of labels to match with labels_b + labels_b (list): A collection of labels to match with labels_a match_on ('uid' or 'external_id'): The data row key to match labels by. Can either be uid or external id. filter_mismatch (bool): Whether or not to ignore mismatches diff --git a/labelbox/data/serialization/labelbox_v1/converter.py b/labelbox/data/serialization/labelbox_v1/converter.py index 47dd6e104..946abdc1e 100644 --- a/labelbox/data/serialization/labelbox_v1/converter.py +++ b/labelbox/data/serialization/labelbox_v1/converter.py @@ -69,7 +69,7 @@ def serialize( Note that any metric annotations will not be written since they are not defined in the LBV1 format. Args: - labels: Either a LabelList or a LabelGenerator (LabelCollection) + labels: Either a list of Label objects or a LabelGenerator (LabelCollection) Returns: A generator for accessing the labelbox json export representation of the data """ diff --git a/labelbox/data/serialization/labelbox_v1/objects.py b/labelbox/data/serialization/labelbox_v1/objects.py index 62a5bd485..2ff7119bf 100644 --- a/labelbox/data/serialization/labelbox_v1/objects.py +++ b/labelbox/data/serialization/labelbox_v1/objects.py @@ -219,7 +219,7 @@ def from_common(cls, mask: Mask, extra: Dict[str, Any]) -> "LBV1Mask": if mask.mask.url is None: raise ValueError( - "Mask does not have a url. Use `LabelGenerator.add_url_to_masks`, `LabelList.add_url_to_masks`, or `Label.add_url_to_masks`." + "Mask does not have a url. Use `LabelGenerator.add_url_to_masks`, or `Label.add_url_to_masks`." ) return cls(instanceURI=mask.mask.url, classifications=classifications, diff --git a/labelbox/data/serialization/ndjson/base.py b/labelbox/data/serialization/ndjson/base.py index 2f83ddd78..654c32495 100644 --- a/labelbox/data/serialization/ndjson/base.py +++ b/labelbox/data/serialization/ndjson/base.py @@ -13,7 +13,7 @@ class DataRow(BaseModel): def validate_id(cls, v): if v is None: raise ValueError( - "Data row ids are not set. Use `LabelGenerator.add_to_dataset`, `LabelList.add_to_dataset`, or `Label.create_data_row`. " + "Data row ids are not set. Use `LabelGenerator.add_to_dataset`,or `Label.create_data_row`. " "You can also manually assign the id for each `BaseData` object" ) return v diff --git a/labelbox/data/serialization/ndjson/converter.py b/labelbox/data/serialization/ndjson/converter.py index 6defd622e..29db466ba 100644 --- a/labelbox/data/serialization/ndjson/converter.py +++ b/labelbox/data/serialization/ndjson/converter.py @@ -36,7 +36,7 @@ def serialize( We will continue to improve the error messages and add helper functions to deal with this. Args: - labels: Either a LabelList or a LabelGenerator + labels: Either a list of Label objects or a LabelGenerator Returns: A generator for accessing the ndjson representation of the data """ diff --git a/tests/data/annotation_types/test_collection.py b/tests/data/annotation_types/test_collection.py index e78cddeda..34b868162 100644 --- a/tests/data/annotation_types/test_collection.py +++ b/tests/data/annotation_types/test_collection.py @@ -4,9 +4,9 @@ import numpy as np import pytest -from labelbox.data.annotation_types import (LabelList, LabelGenerator, - ObjectAnnotation, ImageData, - MaskData, Line, Mask, Point, Label) +from labelbox.data.annotation_types import (LabelGenerator, ObjectAnnotation, + ImageData, MaskData, Line, Mask, + Point, Label) from labelbox import OntologyBuilder, Tool @@ -61,7 +61,7 @@ def test_generator(list_of_labels): def test_conversion(list_of_labels): generator = LabelGenerator(list_of_labels) - label_collection = generator.as_list() + label_collection = list(generator) assert len(label_collection) == len(list_of_labels) assert [x for x in label_collection] == list_of_labels @@ -83,9 +83,6 @@ def test_adding_schema_ids(): ]) generator = LabelGenerator([label]).assign_feature_schema_ids(ontology) assert next(generator).annotations[0].feature_schema_id == feature_schema_id - labels = LabelList([label]).assign_feature_schema_ids(ontology) - assert next(labels).annotations[0].feature_schema_id == feature_schema_id - assert labels[0].annotations[0].feature_schema_id == feature_schema_id def test_adding_urls(signer): @@ -98,15 +95,6 @@ def test_adding_urls(signer): assert next(generator).data.url == uuid assert label.data.url == uuid - label = Label(data=ImageData(arr=np.random.random((32, 32, - 3)).astype(np.uint8)), - annotations=[]) - assert label.data.url != uuid - labels = LabelList([label]).add_url_to_data(signer(uuid)) - assert label.data.url == uuid - assert next(labels).data.url == uuid - assert labels[0].data.url == uuid - def test_adding_to_dataset(signer): dataset = FakeDataset() @@ -122,22 +110,6 @@ def test_adding_to_dataset(signer): assert generated_label.data.uid == dataset.uid assert label.data.url == uuid - dataset = FakeDataset() - label = Label(data=ImageData(arr=np.random.random((32, 32, - 3)).astype(np.uint8)), - annotations=[]) - assert label.data.url != uuid - assert label.data.external_id == None - assert label.data.uid != dataset.uid - labels = LabelList([label]).add_to_dataset(dataset, signer(uuid)) - assert label.data.url == uuid - assert label.data.external_id != None - assert label.data.uid == dataset.uid - generated_label = next(labels) - assert generated_label.data.url == uuid - assert generated_label.data.external_id != None - assert generated_label.data.uid == dataset.uid - def test_adding_to_masks(signer): label = Label( @@ -154,17 +126,3 @@ def test_adding_to_masks(signer): assert label.annotations[0].value.mask.url != uuid assert next(generator).annotations[0].value.mask.url == uuid assert label.annotations[0].value.mask.url == uuid - - label = Label( - data=ImageData(arr=np.random.random((32, 32, 3)).astype(np.uint8)), - annotations=[ - ObjectAnnotation(name="1234", - value=Mask(mask=MaskData( - arr=np.random.random((32, 32, - 3)).astype(np.uint8)), - color=[255, 255, 255])) - ]) - assert label.annotations[0].value.mask.url != uuid - labels = LabelList([label]).add_url_to_masks(signer(uuid)) - assert next(labels).annotations[0].value.mask.url == uuid - assert labels[0].annotations[0].value.mask.url == uuid diff --git a/tests/data/annotation_types/test_metrics.py b/tests/data/annotation_types/test_metrics.py index 0d797d1b0..389c154aa 100644 --- a/tests/data/annotation_types/test_metrics.py +++ b/tests/data/annotation_types/test_metrics.py @@ -3,7 +3,6 @@ from labelbox.data.annotation_types.metrics import ConfusionMatrixAggregation, ScalarMetricAggregation from labelbox.data.annotation_types.metrics import ConfusionMatrixMetric, ScalarMetric -from labelbox.data.annotation_types.collection import LabelList from labelbox.data.annotation_types import ScalarMetric, Label, ImageData from labelbox.data.annotation_types.metrics.scalar import RESERVED_METRIC_NAMES @@ -34,7 +33,6 @@ def test_legacy_scalar_metric(): 'uid': None } assert label.dict() == expected - assert next(LabelList([label])).dict() == expected # TODO: Test with confidence @@ -96,7 +94,6 @@ def test_custom_scalar_metric(feature_name, subclass_name, aggregation, value): } assert label.dict() == expected - assert next(LabelList([label])).dict() == expected @pytest.mark.parametrize('feature_name,subclass_name,aggregation,value', [ @@ -152,7 +149,6 @@ def test_custom_confusison_matrix_metric(feature_name, subclass_name, 'uid': None } assert label.dict() == expected - assert next(LabelList([label])).dict() == expected def test_name_exists(): diff --git a/tests/data/serialization/labelbox_v1/test_tiled_image.py b/tests/data/serialization/labelbox_v1/test_tiled_image.py index f39616974..e5afce4ef 100644 --- a/tests/data/serialization/labelbox_v1/test_tiled_image.py +++ b/tests/data/serialization/labelbox_v1/test_tiled_image.py @@ -20,7 +20,7 @@ def test_image(file_path): payload = json.load(f) collection = LBV1Converter.deserialize(payload) - collection_as_list = collection.as_list() + collection_as_list = list(collection) assert len(collection_as_list) == 2 diff --git a/tests/data/serialization/ndjson/test_classification.py b/tests/data/serialization/ndjson/test_classification.py index c897717d4..1c56d90ec 100644 --- a/tests/data/serialization/ndjson/test_classification.py +++ b/tests/data/serialization/ndjson/test_classification.py @@ -9,7 +9,7 @@ def test_classification(): with open('tests/data/assets/ndjson/classification_import.json', 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert res == data @@ -18,6 +18,6 @@ def test_classification_with_name(): with open('tests/data/assets/ndjson/classification_import_name_only.json', 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert res == data diff --git a/tests/data/serialization/ndjson/test_document.py b/tests/data/serialization/ndjson/test_document.py index 3fe87c429..a1c7d084d 100644 --- a/tests/data/serialization/ndjson/test_document.py +++ b/tests/data/serialization/ndjson/test_document.py @@ -22,7 +22,7 @@ def test_pdf(): """ with open('tests/data/assets/ndjson/pdf_import.json', 'r') as f: data = json.load(f) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert [round_dict(x) for x in res] == [round_dict(x) for x in data] f.close() @@ -34,7 +34,7 @@ def test_pdf_with_name_only(): """ with open('tests/data/assets/ndjson/pdf_import_name_only.json', 'r') as f: data = json.load(f) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert [round_dict(x) for x in res] == [round_dict(x) for x in data] f.close() diff --git a/tests/data/serialization/ndjson/test_image.py b/tests/data/serialization/ndjson/test_image.py index cbabedcdc..9358eca12 100644 --- a/tests/data/serialization/ndjson/test_image.py +++ b/tests/data/serialization/ndjson/test_image.py @@ -23,7 +23,7 @@ def test_image(): with open('tests/data/assets/ndjson/image_import.json', 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) for r in res: r.pop('classifications', None) @@ -35,7 +35,7 @@ def test_image_with_name_only(): 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) for r in res: r.pop('classifications', None) @@ -66,7 +66,7 @@ def test_mask(): "colorRGB": [255, 0, 0] } }] - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) for r in res: r.pop('classifications', None) diff --git a/tests/data/serialization/ndjson/test_metric.py b/tests/data/serialization/ndjson/test_metric.py index a41a3d909..057603963 100644 --- a/tests/data/serialization/ndjson/test_metric.py +++ b/tests/data/serialization/ndjson/test_metric.py @@ -8,7 +8,7 @@ def test_metric(): with open('tests/data/assets/ndjson/metric_import.json', 'r') as file: data = json.load(file) - label_list = NDJsonConverter.deserialize(data).as_list() + label_list = list(NDJsonConverter.deserialize(data)) reserialized = list(NDJsonConverter.serialize(label_list)) assert reserialized == data @@ -21,7 +21,7 @@ def test_custom_scalar_metric(): 'r') as file: data = json.load(file) - label_list = NDJsonConverter.deserialize(data).as_list() + label_list = list(NDJsonConverter.deserialize(data)) reserialized = list(NDJsonConverter.serialize(label_list)) assert json.dumps(reserialized, sort_keys=True) == json.dumps(data, sort_keys=True) @@ -35,7 +35,7 @@ def test_custom_confusion_matrix_metric(): 'r') as file: data = json.load(file) - label_list = NDJsonConverter.deserialize(data).as_list() + label_list = list(NDJsonConverter.deserialize(data)) reserialized = list(NDJsonConverter.serialize(label_list)) assert json.dumps(reserialized, sort_keys=True) == json.dumps(data, sort_keys=True) diff --git a/tests/data/serialization/ndjson/test_nested.py b/tests/data/serialization/ndjson/test_nested.py index 54b2d32ee..69fddf1ff 100644 --- a/tests/data/serialization/ndjson/test_nested.py +++ b/tests/data/serialization/ndjson/test_nested.py @@ -6,7 +6,7 @@ def test_nested(): with open('tests/data/assets/ndjson/nested_import.json', 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert res == data @@ -15,6 +15,6 @@ def test_nested_name_only(): with open('tests/data/assets/ndjson/nested_import_name_only.json', 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert res == data diff --git a/tests/data/serialization/ndjson/test_polyline.py b/tests/data/serialization/ndjson/test_polyline.py index 0b0067fcc..933c378df 100644 --- a/tests/data/serialization/ndjson/test_polyline.py +++ b/tests/data/serialization/ndjson/test_polyline.py @@ -10,6 +10,6 @@ def test_polyline_import(filename: str): with open(filename, 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert res == data diff --git a/tests/data/serialization/ndjson/test_text.py b/tests/data/serialization/ndjson/test_text.py index 30e0f6e46..b1df95f1c 100644 --- a/tests/data/serialization/ndjson/test_text.py +++ b/tests/data/serialization/ndjson/test_text.py @@ -6,7 +6,7 @@ def test_text(): with open('tests/data/assets/ndjson/text_import.json', 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert res == data @@ -15,6 +15,6 @@ def test_text_name_only(): with open('tests/data/assets/ndjson/text_import_name_only.json', 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert res == data diff --git a/tests/data/serialization/ndjson/test_text_entity.py b/tests/data/serialization/ndjson/test_text_entity.py index 821cb96ef..e7939923b 100644 --- a/tests/data/serialization/ndjson/test_text_entity.py +++ b/tests/data/serialization/ndjson/test_text_entity.py @@ -12,6 +12,6 @@ def test_text_entity_import(filename: str): with open(filename, 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert res == data diff --git a/tests/data/serialization/ndjson/test_video.py b/tests/data/serialization/ndjson/test_video.py index baa029f34..b7f7d887b 100644 --- a/tests/data/serialization/ndjson/test_video.py +++ b/tests/data/serialization/ndjson/test_video.py @@ -7,7 +7,7 @@ def test_video(): with open('tests/data/assets/ndjson/video_import.json', 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert res == [data[2], data[0], data[1], data[3], data[4], data[5]] @@ -17,6 +17,6 @@ def test_video_name_only(): 'r') as file: data = json.load(file) - res = NDJsonConverter.deserialize(data).as_list() + res = list(NDJsonConverter.deserialize(data)) res = list(NDJsonConverter.serialize(res)) assert res == [data[2], data[0], data[1], data[3], data[4], data[5]]