Zurück zur Startseite

Bbox-Augmentierung in Albumentations: Formate und Fehler

Der Artikel behandelt die Einrichtung von Bounding-Box-Augmentierungen in Albumentations für Erkennungsaufgaben. Beschreibt Koordinatenformate, BboxParams-Parameter, Metadatenbindung und Annotation-Fehlerbehandlung. Code-Beispiele für Pipeline mit label_fields.

Bbox-Augmentierung: vollständiger Leitfaden zu Albumentations
Advertisement 728x90

Bounding-Box-Augmentation in Albumentations: Parameter und Fehlerbehandlung

Bei Objekterkennungsaufgaben führen mAP-Einbrüche oft nicht zu Problemen mit der Modellarchitektur, sondern zu Inkonsistenzen bei den Bounding Boxes nach Augmentationen. Räumliche Transformationen erfordern synchronisierte Updates sowohl der Objektkoordinaten als auch des Bildes selbst. Albumentations meistert das nahtlos über A.BboxParams und unterstützt fünf Koordinatenformate: pascal_voc, albumentations, coco, yolo und cxcywh.

Ein falsches coord_format verschiebt Boxen stillschweigend, ohne Code-Fehler zu werfen. Für ein 640×480-Bild mit einer Box von (98,345) bis (420,462) in verschiedenen Formaten:

  • pascal_voc: [98, 345, 420, 462]
  • albumentations: [0.153, 0.719, 0.656, 0.962]
  • coco: [98, 345, 322, 117]
  • yolo: [0.405, 0.841, 0.503, 0.244]
  • cxcywh: [259, 403.5, 322, 117]

Aufbau einer Erkennungspipeline

import albumentations as A
import cv2
import numpy as np

train_transform = A.Compose([
    A.RandomCrop(width=450, height=450, p=1.0),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.2),
], bbox_params=A.BboxParams(
    coord_format='coco',
    label_fields=['class_labels'],
), seed=137)

Pixelbasierte Augmentationen (Helligkeit, Kontrast) lassen Bounding Boxes unberührt. Geometrische (Spiegelung, Zuschneiden, Drehen) aktualisieren Koordinaten automatisch. So wendet man sie an:

Google AdInline article slot
image = cv2.imread("image.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

bboxes = np.array([
    [23, 74, 295, 388],
    [377, 294, 252, 161],
    [333, 421, 49, 49],
], dtype=np.float32)

class_labels = np.array(['dog', 'cat', 'sports ball'])

result = train_transform(image=image, bboxes=bboxes, class_labels=class_labels)

augmented_image = result['image']
augmented_bboxes = result['bboxes']
augmented_labels = result['class_labels']

Die Bibliothek filtert automatisch Boxen heraus, die außerhalb der Grenzen liegen oder zu klein werden.

Metadaten an Bounding Boxes anhängen

Mit label_fields

Klassen und Zusatzdaten als separate Arrays übergeben:

bbox_params = A.BboxParams(
    coord_format='pascal_voc',
    label_fields=['class_labels', 'difficult_flags'],
)

result = transform(
    image=image,
    bboxes=bboxes,
    class_labels=['dog', 'cat', 'ball'],
    difficult_flags=[0, 0, 1],
)

Unterstützte Anwendungsfälle:

Google AdInline article slot
  • Videoannotationen: frame_ids zur Verfolgung der Box-Herkunft
  • Instanzsegmentierung: instance_ids zur Verknüpfung mit Masken
  • Tracking: class_id + track_id in Extra-Feldern

Das Filtering synchronisiert alle Arrays automatisch.

Eingebettete Metadaten

Für numerische Daten Spalten an das BBox-Array anhängen:

bboxes = np.array([
    [23, 74, 295, 388, 1, 17],  # + class_id, track_id
    [377, 294, 252, 161, 2, 23],
], dtype=np.float32)

bbox_params = A.BboxParams(coord_format='coco')

A.BboxParams für Qualitätskontrolle

Wichtige Einstellungen:

Google AdInline article slot

| Parameter | Beschreibung | Standardwert |

|-----------|--------------|--------------|

| coord_format | Koordinatenformat | Erforderlich |

| label_fields | Metadaten | [] |

| min_area | Min. Pixel-Fläche | 0.0 |

| min_visibility | Min. sichtbarer Anteil | 0.0 |

| min_width/height | Größenschwellen | 0.0 |

| clip_bboxes_on_input | Zuschneiden vor Augmentation | False |

| filter_invalid_bboxes | Ungültige Boxen entfernen | False |

| max_accept_ratio | Max. Seitenverhältnis | None |

Für unvollständige Annotationen:

bbox_params = A.BboxParams(
    coord_format='yolo',
    label_fields=['class_labels'],
    clip_bboxes_on_input=True,
    filter_invalid_bboxes=True,
)

min_visibility=0.3 wirft Boxen mit zu geringer sichtbarer Fläche nach Zuschneiden raus. min_area=100 schließt winzige Fragmente aus.

Zuschneidestrategien und gängige Fallen

RandomCrop kann Boxen mit null nutzbarer Fläche erzeugen. Best Practices:

  • min_visibility > 0 setzen, um Signal zu erhalten
  • p < 1.0 für Crops nutzen, um Überfilterung zu vermeiden
  • BBox-Größenverteilungen vor/nach der Pipeline prüfen

Häufige Probleme:

  • Falsches coord_format (YOLO braucht 'yolo')
  • Fehlende label_fields für Klassen
  • Auslassen von Clip/Filter bei chaotischen Datensätzen
  • Null-min_-Parameter trainieren auf Müll

Wichtige Erkenntnisse

  • coord_format ist Pflicht: pascal_voc für die meisten Datensätze, yolo für Ultralytics
  • label_fields synchronisiert Labels automatisch beim Filtern
  • clip + filter bereinigt Annotationen vor dem Training
  • min_visibility 0.3–0.5 eignet sich optimal für Crops
  • Visuell prüfen der ersten Batches nach der Pipeline

— Editorial Team

Advertisement 728x90

Weiterlesen