Skip to content

Commit 0ce36bf

Browse files
Add object track id to youtubevis annotation models (#68)
1 parent ef60da9 commit 0ce36bf

File tree

6 files changed

+15
-0
lines changed

6 files changed

+15
-0
lines changed

src/labelformat/formats/youtubevis.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ def get_labels(self) -> Iterable[VideoObjectDetectionTrack]:
8484
SingleObjectDetectionTrack(
8585
category=category_id_to_category[track["category_id"]],
8686
boxes=boxes,
87+
object_track_id=track.get("id"),
8788
)
8889
)
8990
yield VideoObjectDetectionTrack(
@@ -115,6 +116,7 @@ def get_labels(self) -> Iterable[VideoInstanceSegmentationTrack]:
115116
SingleInstanceSegmentationTrack(
116117
category=category_id_to_category[track["category_id"]],
117118
segmentations=segmentations,
119+
object_track_id=track.get("id"),
118120
)
119121
)
120122
yield VideoInstanceSegmentationTrack(

src/labelformat/model/instance_segmentation_track.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
class SingleInstanceSegmentationTrack:
1616
category: Category
1717
segmentations: list[MultiPolygon | BinaryMaskSegmentation | None]
18+
object_track_id: int | None = None
1819

1920

2021
@dataclass(frozen=True)

src/labelformat/model/object_detection_track.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
class SingleObjectDetectionTrack:
1515
category: Category
1616
boxes: list[BoundingBox | None]
17+
object_track_id: int | None = None
1718
# TODO (Jonas, 01/2026): Add confidence
1819

1920

tests/unit/formats/test_youtubevis.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def test_get_labels(self, tmp_path: Path) -> None:
7070
),
7171
None,
7272
],
73+
object_track_id=10,
7374
)
7475
],
7576
)
@@ -103,6 +104,7 @@ def test_get_labels(self, tmp_path: Path) -> None:
103104
SingleInstanceSegmentationTrack(
104105
category=Category(id=1, name="cat"),
105106
segmentations=[expected_segmentation, None],
107+
object_track_id=20,
106108
)
107109
],
108110
)
@@ -125,6 +127,7 @@ def _write_youtube_vis_json(input_file: Path) -> Path:
125127
],
126128
"annotations": [
127129
{
130+
"id": 10,
128131
"video_id": 5,
129132
"category_id": 1,
130133
"bboxes": [
@@ -156,6 +159,7 @@ def _write_youtube_vis_instance_segmentation_json(input_file: Path) -> Path:
156159
],
157160
"annotations": [
158161
{
162+
"id": 20,
159163
"video_id": 5,
160164
"category_id": 1,
161165
"bboxes": [

tests/unit/model/test_instance_segmentation_track.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def test_post_init__frames_equal_segmentations_length__valid(self) -> None:
1919
MultiPolygon(polygons=[[(0.0, 0.0), (1.0, 0.0), (1.0, 1.0)]]),
2020
None,
2121
],
22+
object_track_id=0,
2223
)
2324

2425
track_b = SingleInstanceSegmentationTrack(
@@ -27,6 +28,7 @@ def test_post_init__frames_equal_segmentations_length__valid(self) -> None:
2728
MultiPolygon(polygons=[[(2.0, 2.0), (3.0, 2.0), (3.0, 3.0)]]),
2829
MultiPolygon(polygons=[[(4.0, 4.0), (5.0, 4.0), (5.0, 5.0)]]),
2930
],
31+
object_track_id=1,
3032
)
3133

3234
video = Video(id=0, filename="test.mov", width=1, height=1, number_of_frames=2)
@@ -46,6 +48,7 @@ def test_post_init__frames_equal_segmentations_length___invalid(self) -> None:
4648
None,
4749
None,
4850
],
51+
object_track_id=0,
4952
)
5053

5154
video = Video(id=0, filename="test.mov", width=1, height=1, number_of_frames=2)

tests/unit/model/test_object_detection_track.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ def test_post_init__frames_equal_boxes_length__valid(self) -> None:
1616
track_a = SingleObjectDetectionTrack(
1717
category=Category(id=0, name="cat"),
1818
boxes=[BoundingBox(xmin=0, ymin=0, xmax=1, ymax=1) for _ in range(2)],
19+
object_track_id=0,
1920
)
2021

2122
track_b = SingleObjectDetectionTrack(
2223
category=Category(id=1, name="dog"),
2324
boxes=[BoundingBox(xmin=0, ymin=0, xmax=1, ymax=1) for _ in range(2)],
25+
object_track_id=1,
2426
)
2527

2628
video = Video(id=0, filename="test.mov", width=1, height=1, number_of_frames=2)
@@ -36,11 +38,13 @@ def test_post_init__frames_equal_boxes_length___invalid(self) -> None:
3638
track_a = SingleObjectDetectionTrack(
3739
category=Category(id=0, name="cat"),
3840
boxes=[BoundingBox(xmin=0, ymin=0, xmax=1, ymax=1) for _ in range(2)],
41+
object_track_id=0,
3942
)
4043

4144
track_b = SingleObjectDetectionTrack(
4245
category=Category(id=1, name="dog"),
4346
boxes=[BoundingBox(xmin=0, ymin=0, xmax=1, ymax=1) for _ in range(3)],
47+
object_track_id=1,
4448
)
4549

4650
video = Video(id=0, filename="test.mov", width=1, height=1, number_of_frames=2)

0 commit comments

Comments
 (0)