From a25b066cb67f819a68b69defdaa7feaa04a14b91 Mon Sep 17 00:00:00 2001 From: Val Brodsky Date: Thu, 14 Nov 2024 11:01:13 -0800 Subject: [PATCH 1/3] Remove NDSegments --- .../src/labelbox/data/serialization/ndjson/label.py | 12 +----------- .../labelbox/data/serialization/ndjson/objects.py | 2 -- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/libs/labelbox/src/labelbox/data/serialization/ndjson/label.py b/libs/labelbox/src/labelbox/data/serialization/ndjson/label.py index f8fd832f4..7efc8aa20 100644 --- a/libs/labelbox/src/labelbox/data/serialization/ndjson/label.py +++ b/libs/labelbox/src/labelbox/data/serialization/ndjson/label.py @@ -38,7 +38,6 @@ from .objects import ( NDObject, NDObjectType, - NDSegments, NDVideoMasks, ) from .relationship import NDRelationship @@ -49,7 +48,6 @@ NDPromptClassificationType, NDConfusionMatrixMetric, NDScalarMetric, - NDSegments, NDVideoMasks, NDRelationship, NDPromptText, @@ -133,15 +131,7 @@ def _generate_annotations( # deserialized objects in the _AnnotationGroupTuple # object *if* the object can be used in a relationship for uuid, ndjson_annotation in group.ndjson_annotations.items(): - if isinstance(ndjson_annotation, NDSegments): - annotations.extend( - NDSegments.to_common( - ndjson_annotation, - ndjson_annotation.name, - ndjson_annotation.schema_id, - ) - ) - elif isinstance(ndjson_annotation, NDVideoMasks): + if isinstance(ndjson_annotation, NDVideoMasks): annotations.append( NDVideoMasks.to_common(ndjson_annotation) ) diff --git a/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py b/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py index fe45bed86..d18d5c4fe 100644 --- a/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py +++ b/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py @@ -724,8 +724,6 @@ def lookup_object( ) -> "NDObjectType": if isinstance(annotation, VideoMaskAnnotation): result = NDVideoMasks - elif isinstance(annotation, list): - result = NDSegments else: result = { Line: NDLine, From 95cbc6edcd8f7260238b57fb576eeca1ffda219b Mon Sep 17 00:00:00 2001 From: Val Brodsky Date: Thu, 14 Nov 2024 11:54:23 -0800 Subject: [PATCH 2/3] Revert "Remove NDSegments" This reverts commit a25b066cb67f819a68b69defdaa7feaa04a14b91. --- .../src/labelbox/data/serialization/ndjson/label.py | 12 +++++++++++- .../labelbox/data/serialization/ndjson/objects.py | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/libs/labelbox/src/labelbox/data/serialization/ndjson/label.py b/libs/labelbox/src/labelbox/data/serialization/ndjson/label.py index 7efc8aa20..f8fd832f4 100644 --- a/libs/labelbox/src/labelbox/data/serialization/ndjson/label.py +++ b/libs/labelbox/src/labelbox/data/serialization/ndjson/label.py @@ -38,6 +38,7 @@ from .objects import ( NDObject, NDObjectType, + NDSegments, NDVideoMasks, ) from .relationship import NDRelationship @@ -48,6 +49,7 @@ NDPromptClassificationType, NDConfusionMatrixMetric, NDScalarMetric, + NDSegments, NDVideoMasks, NDRelationship, NDPromptText, @@ -131,7 +133,15 @@ def _generate_annotations( # deserialized objects in the _AnnotationGroupTuple # object *if* the object can be used in a relationship for uuid, ndjson_annotation in group.ndjson_annotations.items(): - if isinstance(ndjson_annotation, NDVideoMasks): + if isinstance(ndjson_annotation, NDSegments): + annotations.extend( + NDSegments.to_common( + ndjson_annotation, + ndjson_annotation.name, + ndjson_annotation.schema_id, + ) + ) + elif isinstance(ndjson_annotation, NDVideoMasks): annotations.append( NDVideoMasks.to_common(ndjson_annotation) ) diff --git a/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py b/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py index d18d5c4fe..fe45bed86 100644 --- a/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py +++ b/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py @@ -724,6 +724,8 @@ def lookup_object( ) -> "NDObjectType": if isinstance(annotation, VideoMaskAnnotation): result = NDVideoMasks + elif isinstance(annotation, list): + result = NDSegments else: result = { Line: NDLine, From fa0c8bcda24d9d88cbb6541491cc06c054a99510 Mon Sep 17 00:00:00 2001 From: Val Brodsky Date: Thu, 14 Nov 2024 14:01:35 -0800 Subject: [PATCH 3/3] Bring back NDSegments --- .../data/serialization/ndjson/objects.py | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py b/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py index fe45bed86..55d6b5e62 100644 --- a/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py +++ b/libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py @@ -426,6 +426,42 @@ def from_common(cls, segment): ) +class NDSegments(NDBaseObject): + segments: List[NDSegment] + + def to_common(self, name: str, feature_schema_id: Cuid): + result = [] + for idx, segment in enumerate(self.segments): + result.extend( + segment.to_common( + name=name, + feature_schema_id=feature_schema_id, + segment_index=idx, + uuid=self.uuid, + ) + ) + return result + + @classmethod + def from_common( + cls, + segments: List[VideoObjectAnnotation], + data: GenericDataRowData, + name: str, + feature_schema_id: Cuid, + extra: Dict[str, Any], + ) -> "NDSegments": + segments = [NDSegment.from_common(segment) for segment in segments] + + return cls( + segments=segments, + data_row=DataRow(id=data.uid, global_key=data.global_key), + name=name, + schema_id=feature_schema_id, + uuid=extra.get("uuid"), + ) + + class _URIMask(BaseModel): instanceURI: str colorRGB: Tuple[int, int, int] @@ -693,7 +729,18 @@ def from_common( obj = cls.lookup_object(annotation) # if it is video segments - if obj == NDVideoMasks: + if obj == NDSegments: + first_video_annotation = annotation[0][0] + args = dict( + segments=annotation, + data=data, + name=first_video_annotation.name, + feature_schema_id=first_video_annotation.feature_schema_id, + extra=first_video_annotation.extra, + ) + + return obj.from_common(**args) + elif obj == NDVideoMasks: return obj.from_common(annotation, data) subclasses = [