Augmentace bounding box v Albumentations: parametry a zpracování chyb
V úlohách detekce objektů jsou problémy s mAP často spojeny ne s architekturou modelu, ale s nekonzistencí bounding boxů po augmentaci. Prostorové transformace vyžadují synchronní aktualizaci souřadnic objektů a obrazu. Albumentations to zajišťuje prostřednictvím A.BboxParams, podporující pět formátů souřadnic: pascal_voc, albumentations, coco, yolo, cxcywh.
Nesprávný coord_format vede k posunutí boxů bez viditelných chyb v kódu. Pro obraz 640×480 box od (98,345) do (420,462) v různých formátech:
- 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]
Sestavení pipeline s podporou detekce
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)
Pixelové augmentace (jas, kontrast) neovlivňují bbox. Geometrické (překlopení, oříznutí, otočení) automaticky aktualizují souřadnice. Použití:
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']
Knihovna filtruje boxy, které přesahují hranice nebo jsou příliš malé.
Propojení metadat s bounding box
Prostřednictvím label_fields
Předávejte třídy a další data samostatnými poli:
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],
)
Seznam podporovaných případů:
- Videoanotace:
frame_idspro sledování zdroje boxu - Instance segmentation:
instance_idspro spojení s maskami - Tracking: class_id + track_id v dalších polích
Filtrace synchronizuje všechna pole automaticky.
Vložená metadata
Pro numerická data přidejte sloupce do pole 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 pro kontrolu kvality
Klíčová nastavení:
| Parametr | Popis | Výchozí hodnota |
|----------|-------|-----------------|
| coord_format | Formát souřadnic | Povinný |
| label_fields | Metadata | [] |
| min_area | Min. plocha v pixelech | 0.0 |
| min_visibility | Min. viditelný podíl | 0.0 |
| min_width/height | Rozměry | 0.0 |
| clip_bboxes_on_input | Oříznutí před augmentací | False |
| filter_invalid_bboxes | Odstranění nevalidních | False |
| max_accept_ratio | Max. poměr stran | None |
Pro neideální anotace:
bbox_params = A.BboxParams(
coord_format='yolo',
label_fields=['class_labels'],
clip_bboxes_on_input=True,
filter_invalid_bboxes=True,
)
min_visibility=0.3 odmítá boxy s malou viditelnou částí po oříznutí. min_area=100 vylučuje malé fragmenty.
Strategie oříznutí a typické chyby
RandomCrop může vytvořit boxy s nulovou užitečnou plochou. Doporučení:
- Nastavte
min_visibility > 0pro zachování signálu - Použijte
p < 1.0pro oříznutí, abyste se vyhnuli přefiltrování - Zkontrolujte distribuci velikostí bbox před/po pipeline
Časté problémy:
- Nesprávný coord_format (YOLO vyžaduje 'yolo')
- Absence label_fields pro třídy
- Ignorování clip/filter pro "špinavé" datasety
- Nulové min_ parametry vedou k učení na odpadu
Co je důležité
- coord_format je povinný: pascal_voc pro většinu datasetů, yolo pro Ultralytics
- label_fields synchronizuje štítky automaticky při filtraci
- clip + filter čistí anotace před trénováním
- min_visibility 0.3–0.5 optimálně pro oříznutí
- Zkontrolujte vizuálně první batchy po pipeline
— Editorial Team
Zatím žádné komentáře.