Augmentacje

Augmentację konfiguruje się parametrami w TrainConfig, ale każda rodzina modeli uruchamia własny pipeline trenowania. Pipeline bez gałęzi mozaiki ignoruje mosaic_prob, zamiast próbować go przybliżać.

Ustawianie parametrów

Parametry augmentacji są zwykłymi argumentami train().

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(    data="my-dataset.yaml",    epochs=100,    mosaic_prob=1.0,    mixup_prob=0.15,    hsv_prob=1.0,    flip_prob=0.5,    no_aug_epochs=15,)
CLI
# W CLI parametr mosaic_prob zapisuje się jako mosaic, a mixup_prob jako mixup.libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \  epochs=100 mosaic=1.0 mixup=0.15 hsv_prob=1.0 \  flip_prob=0.5 no_aug_epochs=15

Trzy z nich mają krótszą pisownię, akceptowaną zarówno przez train(), jak i przez CLI: mosaic odpowiada mosaic_prob, fliplr odpowiada flip_prob, a w detekcji mixup odpowiada mixup_prob. Przekazanie krótkiej pisowni i odpowiadającego jej pola z różnymi wartościami zgłasza błąd. Każdy inny parametr zapisuje się identycznie w obu miejscach.

Trzy stany, nie dwa

To, czy parametr ma wpływ, zależy od rodziny. Biblioteka przechowuje deklaratywną tabelę tych informacji, a każdy wpis ma jeden z trzech stanów.

used oznacza, że parametr dociera do pipeline'u i zmienia próbki. ignored oznacza, że nigdy nie dociera do pipeline'u, więc jego ustawienie niczego nie zmienia. gated_by_mosaic oznacza, że parametr dotyczy tylko próbek, które trafiły do gałęzi mozaiki. Przy mosaic_prob=0 nigdy się więc nie uruchamia, mimo że jest podłączony.

Ten trzeci stan często zaskakuje. W pipelinie w stylu YOLOX transformacja afiniczna działa na obszarze mozaiki, a MixUp łączy próbkę mozaikową. Wartość mosaic_prob=0 po cichu wyłącza więc jednocześnie degrees, translate, shear, perspective, mosaic_scale, mixup_prob i mixup_scale. Trener zapisuje ostrzeżenie specjalnie dla przypadku MixUp:

mixup_prob=0.15 has no effect for YOLOv9: mixup only applies to mosaic samplesand mosaic_prob=0. Set mosaic_prob > 0 to enable mixup.

CLI ostrzega również o ignorowanych parametrach, wymieniając tylko te, które faktycznie podano:

Warning: RF-DETR ignores these parameters: degrees, mosaic

Cztery warianty pipeline'u

Rodziny grupują się w cztery pipeline'y trenowania, a wybrany pipeline określa prawie wszystkie odpowiedzi.

Pipeline mozaikowy w stylu YOLOX stosuje zaburzenie HSV i odbicia dla każdej próbki, a następnie uruchamia transformację afiniczną oraz MixUp wewnątrz gałęzi mozaiki. Obejmuje YOLOX, YOLOv7, YOLOv9 i jego warianty E2E oraz P2, RTMDet, PicoDet, RT-DETR, RT-DETRv2 i FOMO.

Przekazujący pipeline w stylu DETR nie ma mozaiki ani transformacji afinicznej. Jego zniekształcenie fotometryczne, pomniejszenie i wycinek IoU są stałymi receptury, a nie parametrami konfiguracji, dlatego aktywne są tylko flip_prob i no_aug_epochs. Obejmuje D-FINE, Dome-DETR, DEIM, DEIMv2, RT-DETRv4, EC oraz, z jedną zmianą, RF-DETR.

Pipeline klasyfikacji ImageFolder ma własne parametry augmentacji. flip_prob kontroluje odbicia poziome i domyślnie wynosi 0.5; fliplr jest jego aliasem.

YOLO-NAS ma własny wariant: bez mozaiki, z zawsze aktywną transformacją afiniczną dla każdej próbki i z MixUp stosowanym niezależnie zamiast warunkowo. Wartość mosaic_scale jest ponownie używana jako zakres skali transformacji afinicznej.

SegFormer, LingBot-Vision i NAFNet uruchamiają pipeline specyficzny dla zadania, którego losowość jest ustalona w rodzinie, a nie konfigurowalna. Dla SegFormer i LingBot-Vision aktywnymi parametrami są atrybuty klasy semantic_scale_jitter i semantic_hsv_prob, a nie mosaic_scale oraz hsv_prob. Wycinanie i odbicia NAFNet są sprzężonymi operacjami wejścia i celu o stałym prawdopodobieństwie 0.5.

Parametry obsługiwane przez poszczególne rodziny

Poniższa tabela przedstawia dostarczaną specyfikację z libreyolo/data/augment/spec.py, której zgodność z rzeczywistym połączeniem pipeline'u sprawdzają testy biblioteki. Należy ją odczytywać z tego miejsca, zamiast wnioskować na podstawie architektury.

Odczytywanie tabeli obsługi rodziny
from libreyolo.data.augment.spec import AUG_KNOBS, aug_support for knob, description in AUG_KNOBS.items():    support = aug_support("yolo9")[knob]    print(f"{knob:16} {support.status:16} {support.note or description}")
Tylko ignorowane parametry
from libreyolo.data.augment.spec import ignored_aug_params print(sorted(ignored_aug_params("rfdetr")))

Podsumowanie według pipeline'u dla parametrów podstawowych:

ParametrStyl YOLOXYOLO-NASStyl DETRKlasyfikacja
mosaic_probużywanyignorowanyignorowanyignorowany
mixup_probwarunkowy od mozaikiużywanyignorowanyignorowany
hsv_probużywanyużywanyignorowanyignorowany
flip_probużywanyużywanyużywanyużywany
flipudużywanyużywanyignorowanyużywany
degreeswarunkowy od mozaikiużywanyignorowanyignorowany
translatewarunkowy od mozaikiużywanyignorowanyignorowany
shearwarunkowy od mozaikiużywanyignorowanyignorowany
perspectivewarunkowy od mozaikiużywanyignorowanyignorowany
mosaic_scalewarunkowy od mozaikiużywanyignorowanyignorowany
mixup_scalewarunkowy od mozaikiużywanyignorowanyignorowany
no_aug_epochsużywanyużywanyużywanyużywany

Wyjątki wewnątrz tych kolumn, wszystkie zawężające zakres:

  • RTMDet, PicoDet, RT-DETR, RT-DETRv2 i FOMO nie mają odbicia pionowego, dlatego flipud jest ignorowany. Wrapper mozaiki FOMO również nie obsługuje perspektywy.
  • Natywny pipeline RF-DETR nie ma zaburzenia HSV, dlatego hsv_prob jest ignorowany dodatkowo względem kolumny w stylu DETR.
  • EC respektuje hsv_prob, degrees i translate, ale tylko dla task="pose", którego transformacja uwzględniająca punkty kluczowe odczytuje te wartości. Ścieżki detect i segment używają stałych receptur fotometrycznych.
  • DINOv2 stosuje kolumnę w stylu DETR dla zadań detect i semantic oraz dodaje pakiet klasyfikacji dla task="classify".

no_aug_epochs jest used wszędzie, lecz nie wszędzie oznacza to samo. W pipeline'ach mozaikowych wyłącza mozaikę i MixUp na ostatnie epoki. W pipeline'ach w stylu DETR zatrzymuje augmentacje fotometryczne, pomniejszenie i wycinanie oraz kształtuje końcówkę harmonogramu. W pipeline'ach klasyfikacji wyłącza automatyczną augmentację, erasing, MixUp i CutMix; wycinanie i odbicia pozostają.

perspective dodaje transformację projekcyjną na wierzchu obrotu, skali, ścinania i przesunięcia. Każdy narożnik płótna przesuwa się do środka o losową wartość do min(perspective * 100, 0.2) połowy boku płótna, na każdej osi, więc perspective=0.001 przesuwa narożnik najwyżej o 5 procent boku przy dowolnej rozdzielczości, a każda wartość od 0.002 w górę osiąga to samo maksimum. Domyślne 0 zachowuje transformację afiniczną, a wartość ujemna zgłasza ValueError przy zniekształcaniu pierwszej próbki. Stosują ją YOLOv9 i jego warianty E2E i P2, YOLOX, YOLOv7, YOLO-NAS, PP-YOLOE, RTMDet, PicoDet, RT-DETR i RT-DETRv2.

MixUp w pipeline'ie mosaic YOLOv9, przez który trenują YOLOv9 i jego warianty, YOLOv7, RT-DETR i RT-DETRv2, losuje współczynnik mieszania z rozkładu Beta(1, 1), jednostajnego na [0, 1]. Nakładka mosaic YOLOX, używana przez YOLOX, RTMDet i PicoDet, miesza ze stałym współczynnikiem 0.5.

Pakiet klasyfikacji

Cztery parametry sterują pipeline'em klasyfikacji i żadnym innym. Rodziny detekcji ignorują wszystkie cztery.

Pakiet klasyfikacji
from libreyolo import LibreYOLO model = LibreYOLO("LibreConvNeXtt-cls.pt")model.train(    data="my-classification-dataset",    epochs=50,    auto_augment="randaugment",    erasing=0.25,    mixup=0.2,    cutmix=0.2,)

auto_augment przyjmuje "randaugment", "autoaugment", "augmix" lub None. erasing jest prawdopodobieństwem RandomErasing. mixup i cutmix są prawdopodobieństwami dla każdego batcha, które tworzą miękkie etykiety. W jednym batchu uruchamiany jest najwyżej jeden z nich, najpierw MixUp, więc wartości się sumują i ich suma powinna wynosić najwyżej 1.

Wszystkie cztery są domyślnie wyłączone, dlatego trenowanie klasyfikacji nie zmienia się bez jawnego żądania.

train() i CLI kierują mixup według zadania: klasyfikacja używa mieszania batchy, a detekcja mixup_prob.

scale=0.5 oznacza losowy zakres obszaru wycinka (0.5, 1.0); jawna para ustawia obie granice. crop_pct=None zachowuje współczynnik zmiany rozmiaru rodziny podczas ewaluacji; nadpisanie wpływa na ewaluację podczas trenowania i walidacji, a eksport zachowuje natywne przetwarzanie wstępne rodziny.

CLI udostępnia auto_augment, erasing, cutmix, fliplr i flipud. mixup w klasyfikacji oznacza mieszanie batchy i ma domyślną wartość 0.0. Odbicia poziome mają domyślnie prawdopodobieństwo 0.5, a pionowe 0.0. mixup + cutmix nie może przekraczać 1.

no_aug_epochs wyłącza automatyczną augmentację, erasing, MixUp i CutMix w końcowych epokach, zachowując wycinanie i odbicia. Receptury klasyfikacji domyślnie ustawiają tę końcówkę na 0.

Parametry specyficzne dla rodziny

Niektóre parametry znajdują się w podklasie konfiguracji rodziny, a nie w klasie podstawowej, dlatego istnieją tylko dla tej rodziny i nie mają flagi CLI.

RodzinaParametrDziałanie
YOLOv9, YOLOv9-E2E, YOLOv9-P2copy_pastePrawdopodobieństwo augmentacji instancji copy-paste, tylko dla task="segment"
YOLOv9, YOLOv9-E2E, YOLOv9-P2copy_paste_mode"flip" ponownie używa tej samej odbitej próbki, a "mixup" pobiera drugą próbkę
YOLOv9, YOLOv9-E2E, YOLOv9-P2rot90Prawdopodobieństwo losowego obrotu o 90 stopni
YOLOv9, YOLOv9-E2E, YOLOv9-P2max_labelsLimit danych referencyjnych na obraz w transformacjach trenowania, domyślnie 300
RF-DETRcopy_paste, copy_paste_modeCopy-paste dla task="segment", tylko tryb "flip"
RF-DETR, D-FINE, ECcrop_resize_probPrawdopodobieństwo losowego wycinania ze zmianą rozmiaru
EC, YOLO-NASbrightness_contrast_prob, affine_probPrawdopodobieństwa zaburzenia jasności i kontrastu oraz transformacji afinicznej uwzględniającej punkty kluczowe w ścieżce pozy

max_labels jest jedynym parametrem, który powoduje utratę danych. Ramki powyżej limitu są odrzucane z jednorazowym ostrzeżeniem zamiast błędu, dlatego dla gęstych obrazów, takich jak fotografia lotnicza, trzeba go zwiększyć. Pamięć przypisywania etykiet zależy od najgęstszego obrazu w batchu, a nie od limitu.

Mozaika i MixUp są wyłączone podczas trenowania obróconych ramek niezależnie od parametrów, ponieważ augmentacja uwzględniająca narożniki obróconych ramek nie jest zaimplementowana.

  • Hiperparametry opisują no_aug_epochs jako argument harmonogramu oraz pozostałe argumenty train().
  • Zbiory danych opisują formaty etykiet używane przez te transformacje.

Zweryfikowano z LibreYOLO v1.6.0.