Augmentacja bounding box w Albumentations: parametry i obsługa błędów
W zadaniach wykrywania obiektów problemy z mAP często są związane nie z architekturą modelu, ale z niespójnością bounding box po augmentacjach. Transformacje przestrzenne wymagają synchronizacji współrzędnych obiektów i obrazu. Albumentations zapewnia to poprzez A.BboxParams, obsługując pięć formatów współrzędnych: pascal_voc, albumentations, coco, yolo, cxcywh.
Nieprawidłowy coord_format prowadzi do przesunięcia bounding boxów bez widocznych błędów w kodzie. Dla obrazu 640×480 bounding box od (98,345) do (420,462) w różnych formatach:
- 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]
Budowanie pipeline'u z obsługą detekcji
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)
Augmentacje pikselowe (jasność, kontrast) nie wpływają na bbox. Geometryczne (odwrócenie, kropowanie, obrót) aktualizują współrzędne automatycznie. Zastosowanie:
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']
Biblioteka filtruje bounding boxy, które wychodzą poza granice lub są zbyt małe.
Dołączanie metadanych do bounding box
Poprzez label_fields
Przekazuj klasy i dodatkowe dane osobno:
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],
)
Lista obsługiwanych przypadków:
- Anotacje wideo:
frame_idsdo śledzenia źródła bounding boxa - Segmentacja instancji:
instance_idsdo powiązania z maskami - Śledzenie: class_id + track_id w dodatkowych polach
Filtracja synchronizuje wszystkie tablice automatycznie.
Wbudowane metadane
Dla danych numerycznych dodawaj kolumny do tablicy bbox:
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')
Parametry A.BboxParams do kontroli jakości
Kluczowe ustawienia:
| Parametr | Opis | Wartość domyślna |
|----------|------|------------------|
| coord_format | Format współrzędnych | Wymagany |
| label_fields | Metadane | [] |
| min_area | Minimalny obszar w pikselach | 0.0 |
| min_visibility | Minimalna widoczna część | 0.0 |
| min_width/height | Wymiary | 0.0 |
| clip_bboxes_on_input | Przycinanie przed augmentacją | False |
| filter_invalid_bboxes | Usuwanie nieprawidłowych | False |
| max_accept_ratio | Maksymalny stosunek boków | None |
Dla nieidealnego oznakowania:
bbox_params = A.BboxParams(
coord_format='yolo',
label_fields=['class_labels'],
clip_bboxes_on_input=True,
filter_invalid_bboxes=True,
)
min_visibility=0.3 odrzuca bounding boxy z małą widoczną częścią po kropowaniu. min_area=100 wyklucza małe fragmenty.
Strategie kropowania i typowe błędy
RandomCrop może tworzyć bounding boxy z zerową użyteczną powierzchnią. Zalecenia:
- Ustawiaj
min_visibility > 0, aby zachować sygnał - Używaj
p < 1.0dla kropowania, aby uniknąć nadmiernej filtracji - Sprawdzaj rozkład rozmiarów bbox przed/po pipeline
Częste problemy:
- Nieprawidłowy coord_format (YOLO wymaga 'yolo')
- Brak label_fields dla klas
- Ignorowanie clip/filter dla „brudnych” datasetów
- Parametry min_ na zero prowadzą do uczenia na śmieciach
Co jest ważne
- coord_format jest obowiązkowy: pascal_voc dla większości datasetów, yolo dla Ultralytics
- label_fields synchronizują etykiety automatycznie podczas filtracji
- clip + filter oczyszczają oznakowanie przed uczeniem
- min_visibility 0.3–0.5 optymalnie dla kropowania
- Sprawdzaj wizualnie pierwsze partie po pipeline
— Editorial Team
Brak komentarzy.