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:
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:
- Videoannotationen:
frame_idszur Verfolgung der Box-Herkunft - Instanzsegmentierung:
instance_idszur 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:
| 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 > 0setzen, um Signal zu erhaltenp < 1.0fü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
Noch keine Kommentare.