Skip to content

Commit 0d36990

Browse files
author
Matt Sokoloff
committed
add cuid type
1 parent 9b0ea23 commit 0d36990

File tree

16 files changed

+344
-318
lines changed

16 files changed

+344
-318
lines changed

labelbox/data/annotation_types/annotation.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,5 @@ class VideoClassificationAnnotation(ClassificationAnnotation):
4949
frame: int
5050

5151

52-
AnnotationType = Union[ClassificationAnnotation, ObjectAnnotation]
53-
VideoAnnotationType = Union[VideoObjectAnnotation,
54-
VideoClassificationAnnotation]
55-
5652
VideoObjectAnnotation.update_forward_refs()
5753
ObjectAnnotation.update_forward_refs()

labelbox/data/annotation_types/feature.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from pydantic import BaseModel, root_validator
44

5+
from .types import Cuid
6+
57

68
class FeatureSchema(BaseModel):
79
"""
@@ -13,7 +15,7 @@ class FeatureSchema(BaseModel):
1315
to retroactively add schema ids by looking them up from the names.
1416
"""
1517
name: Optional[str] = None
16-
schema_id: Optional[str] = None
18+
schema_id: Optional[Cuid] = None
1719

1820
@root_validator
1921
def must_set_one(cls, values):

labelbox/data/annotation_types/label.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
from .data import VideoData, TextData, RasterData
99
from .geometry.mask import Mask
1010
from .metrics import Metric
11-
from .annotation import (AnnotationType, ClassificationAnnotation,
12-
ObjectAnnotation, VideoAnnotationType)
11+
from .annotation import (ClassificationAnnotation, ObjectAnnotation,
12+
VideoClassificationAnnotation, VideoObjectAnnotation)
1313

1414

1515
class Label(BaseModel):
1616
data: Union[VideoData, RasterData, TextData]
17-
annotations: List[Union[AnnotationType, VideoAnnotationType, Metric]] = []
17+
annotations: List[Union[ClassificationAnnotation, ObjectAnnotation,
18+
VideoObjectAnnotation,
19+
VideoClassificationAnnotation, Metric]] = []
1820
extra: Dict[str, Any] = {}
1921

2022
def add_url_to_data(self, signer) -> "Label":
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from pydantic import Field
2+
from typing_extensions import Annotated
3+
4+
Cuid = Annotated[str, Field(min_length=25, max_length=25)]

labelbox/data/serialization/labelbox_v1/classification.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from ...annotation_types.annotation import ClassificationAnnotation
66
from ...annotation_types.classification import Checklist, ClassificationAnswer, Radio, Text, Dropdown
7+
from ...annotation_types.types import Cuid
78
from .feature import LBV1Feature
89

910

@@ -24,7 +25,7 @@ def to_common(self):
2425
}))
2526

2627
@classmethod
27-
def from_common(cls, radio: Radio, schema_id: str, **extra) -> "LBV1Radio":
28+
def from_common(cls, radio: Radio, schema_id: Cuid, **extra) -> "LBV1Radio":
2829
return cls(schema_id=schema_id,
2930
answer=LBV1ClassificationAnswer(
3031
schema_id=radio.answer.schema_id,
@@ -48,7 +49,7 @@ def to_common(self):
4849
])
4950

5051
@classmethod
51-
def from_common(cls, checklist: Checklist, schema_id: str,
52+
def from_common(cls, checklist: Checklist, schema_id: Cuid,
5253
**extra) -> "LBV1Checklist":
5354
return cls(schema_id=schema_id,
5455
answers=[
@@ -69,22 +70,14 @@ def to_common(self):
6970
return Text(answer=self.answer)
7071

7172
@classmethod
72-
def from_common(cls, text: Text, schema_id: str, **extra) -> "LBV1Text":
73+
def from_common(cls, text: Text, schema_id: Cuid, **extra) -> "LBV1Text":
7374
return cls(schema_id=schema_id, answer=text.answer, **extra)
7475

7576

76-
classification_mapping = {
77-
Text: LBV1Text,
78-
Dropdown: LBV1Checklist,
79-
Checklist: LBV1Checklist,
80-
Radio: LBV1Radio
81-
}
82-
83-
8477
class LBV1Classifications(BaseModel):
8578
classifications: List[Union[LBV1Radio, LBV1Checklist, LBV1Text]] = []
8679

87-
def to_common(self):
80+
def to_common(self) -> List[ClassificationAnnotation]:
8881
classifications = [
8982
ClassificationAnnotation(value=classification.to_common(),
9083
classifications=[],
@@ -103,7 +96,7 @@ def from_common(
10396
) -> "LBV1Classifications":
10497
classifications = []
10598
for annotation in annotations:
106-
classification = classification_mapping.get(type(annotation.value))
99+
classification = cls.lookup_classification(annotation)
107100
if classification is not None:
108101
classifications.append(
109102
classification.from_common(annotation.value,
@@ -112,3 +105,14 @@ def from_common(
112105
else:
113106
raise TypeError(f"Unexpected type {type(annotation.value)}")
114107
return cls(classifications=classifications)
108+
109+
@staticmethod
110+
def lookup_classification(
111+
annotation: ClassificationAnnotation
112+
) -> Union[LBV1Text, LBV1Checklist, LBV1Radio]:
113+
return {
114+
Text: LBV1Text,
115+
Dropdown: LBV1Checklist,
116+
Checklist: LBV1Checklist,
117+
Radio: LBV1Radio
118+
}.get(type(annotation.value))

labelbox/data/serialization/labelbox_v1/converter.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ class LBV1VideoIterator(PrefetchGenerator):
7373

7474
def __init__(self, examples, client):
7575
self.client = client
76-
7776
super().__init__(examples)
7877

7978
def _process(self, value):

labelbox/data/serialization/labelbox_v1/feature.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
from typing import Optional
22

3-
from pydantic import BaseModel, Field, root_validator
3+
from pydantic import BaseModel, root_validator
4+
5+
from labelbox.utils import camel_case
6+
from ...annotation_types.types import Cuid
47

58

69
class LBV1Feature(BaseModel):
7-
keyframe: Optional[bool] = Field(None)
10+
keyframe: Optional[bool] = None
811
title: str = None
912
value: Optional[str] = None
10-
schema_id: str = Field(None, alias='schemaId')
11-
feature_id: Optional[str] = Field(None, alias='featureId')
13+
schema_id: Optional[Cuid] = None
14+
feature_id: Optional[Cuid] = None
1215

1316
@root_validator
1417
def check_ids(cls, values):
@@ -25,3 +28,4 @@ def dict(self, *args, **kwargs):
2528

2629
class Config:
2730
allow_population_by_field_name = True
31+
alias_generator = camel_case

0 commit comments

Comments
 (0)