Skip to content

Commit 99fa917

Browse files
authored
loading with empty annotations (#210)
1 parent abf2f9a commit 99fa917

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

luxonis_ml/data/loaders/luxonis_loader.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,4 +323,30 @@ def _load_image_with_annotations(
323323

324324
labels[task] = (array, anns[0]._label_type)
325325

326+
missing_tasks = set(self.classes_by_task) - set(labels_by_task)
327+
if missing_tasks and missing_tasks.issubset(
328+
{
329+
LabelType.SEGMENTATION,
330+
LabelType.BOUNDINGBOX,
331+
LabelType.KEYPOINTS,
332+
LabelType.CLASSIFICATION,
333+
}
334+
):
335+
for task in missing_tasks:
336+
class_mapping_len = len(self.class_mappings[task])
337+
if task == LabelType.SEGMENTATION:
338+
empty_array = np.zeros(
339+
(class_mapping_len, height, width),
340+
dtype=np.uint8,
341+
)
342+
elif task == LabelType.BOUNDINGBOX:
343+
empty_array = np.zeros((0, 6), dtype=np.float32)
344+
elif task == LabelType.KEYPOINTS:
345+
empty_array = np.zeros((0, 3), dtype=np.float32)
346+
elif task == LabelType.CLASSIFICATION:
347+
empty_array = np.zeros(
348+
(0, class_mapping_len), dtype=np.float32
349+
)
350+
labels[task] = (empty_array, task)
351+
326352
return img, labels

tests/test_data/test_dataset.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,3 +595,63 @@ def generator():
595595
loader = LuxonisLoader(dataset, augmentations=augments)
596596
for _, labels in loader:
597597
assert labels == {}
598+
599+
600+
def test_partial_labels():
601+
dataset = LuxonisDataset("__partial_labels", delete_existing=True)
602+
603+
def generator():
604+
for i in range(8):
605+
img = make_image(i)
606+
if i < 2:
607+
yield {
608+
"file": img,
609+
}
610+
elif i < 4:
611+
yield {
612+
"file": img,
613+
"annotation": {
614+
"type": "classification",
615+
"class": "dog",
616+
},
617+
}
618+
elif i < 6:
619+
yield {
620+
"file": img,
621+
"annotation": {
622+
"type": "boundingbox",
623+
"class": "dog",
624+
"x": 0.1,
625+
"y": 0.1,
626+
"w": 0.1,
627+
"h": 0.1,
628+
},
629+
}
630+
yield {
631+
"file": img,
632+
"annotation": {
633+
"type": "keypoints",
634+
"class": "dog",
635+
"keypoints": [[0.1, 0.1, 0], [0.2, 0.2, 1]],
636+
},
637+
}
638+
elif i < 8:
639+
yield {
640+
"file": img,
641+
"annotation": {
642+
"type": "mask",
643+
"class": "dog",
644+
"mask": np.random.rand(512, 512) > 0.5,
645+
},
646+
}
647+
648+
dataset.add(generator())
649+
dataset.make_splits([1, 0, 0])
650+
651+
augments = Augmentations([512, 512], [{"name": "Rotate", "params": {}}])
652+
loader = LuxonisLoader(dataset, augmentations=augments, view="train")
653+
for _, labels in loader:
654+
assert labels.get("boundingbox") is not None
655+
assert labels.get("classification") is not None
656+
assert labels.get("segmentation") is not None
657+
assert labels.get("keypoints") is not None

0 commit comments

Comments
 (0)