Powrót do strony głównej

Augmentacja bbox w Albumentations: formaty i błędy

Artykuł omawia konfigurację augmentacji bounding box w Albumentations dla zadań detekcji. Opisano formaty współrzędnych, parametry BboxParams, wiązanie metadanych i obsługę błędów adnotacji. Przykłady kodu dla potoku z label_fields.

Augmentacja bbox: pełne przewodnictwo po Albumentations
Advertisement 728x90

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:

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']

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:

Google AdInline article slot
  • Anotacje wideo: frame_ids do śledzenia źródła bounding boxa
  • Segmentacja instancji: instance_ids do 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:

Google AdInline article slot

| 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.0 dla 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

Advertisement 728x90

Czytaj dalej