Skip to content
Merged
1 change: 0 additions & 1 deletion labelbox/data/annotation_types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
from .data import VideoData

from .label import Label

from .collection import LabelList
from .collection import LabelGenerator

Expand Down
16 changes: 7 additions & 9 deletions labelbox/data/annotation_types/collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand All @@ -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))

Expand Down Expand Up @@ -304,4 +302,4 @@ def __next__(self):
return self._process(value)


LabelCollection = Union[LabelList, LabelGenerator, Iterable[Label]]
LabelCollection = Union[LabelGenerator, Iterable[Label]]
10 changes: 5 additions & 5 deletions labelbox/data/metrics/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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]]:
"""
Expand All @@ -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

Expand Down
2 changes: 1 addition & 1 deletion labelbox/data/serialization/labelbox_v1/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
"""
Expand Down
2 changes: 1 addition & 1 deletion labelbox/data/serialization/labelbox_v1/objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion labelbox/data/serialization/ndjson/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion labelbox/data/serialization/ndjson/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
"""
Expand Down
50 changes: 4 additions & 46 deletions tests/data/annotation_types/test_collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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

Expand All @@ -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):
Expand All @@ -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()
Expand All @@ -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(
Expand All @@ -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
4 changes: 0 additions & 4 deletions tests/data/annotation_types/test_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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', [
Expand Down Expand Up @@ -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():
Expand Down
2 changes: 1 addition & 1 deletion tests/data/serialization/labelbox_v1/test_tiled_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions tests/data/serialization/ndjson/test_classification.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
4 changes: 2 additions & 2 deletions tests/data/serialization/ndjson/test_document.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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()
6 changes: 3 additions & 3 deletions tests/data/serialization/ndjson/test_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
6 changes: 3 additions & 3 deletions tests/data/serialization/ndjson/test_metric.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
Expand All @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions tests/data/serialization/ndjson/test_nested.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
2 changes: 1 addition & 1 deletion tests/data/serialization/ndjson/test_polyline.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions tests/data/serialization/ndjson/test_text.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
2 changes: 1 addition & 1 deletion tests/data/serialization/ndjson/test_text_entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading