Data augmentation

L'augmentation si configura con i parametri di TrainConfig, ma ogni famiglia di modelli esegue la propria pipeline di addestramento, e una pipeline che non ha un ramo mosaic ignora mosaic_prob invece di approssimarlo.

Impostare i parametri

I parametri di augmentation sono normali argomenti di 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
# La CLI scrive mosaic_prob come mosaic e mixup_prob come 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

Tre di questi hanno una forma più breve, accettata sia da train() sia dalla CLI: mosaic corrisponde a mosaic_prob, fliplr a flip_prob e, nel rilevamento, mixup corrisponde a mixup_prob. Passare una forma breve e il suo campo con valori diversi solleva un errore. Tutti gli altri parametri si scrivono allo stesso modo in entrambi i casi.

Tre stati, non due

Che un parametro abbia effetto o meno dipende dalla famiglia. La libreria ne tiene una tabella dichiarativa, e ogni voce è uno di tre stati.

used significa che il parametro arriva alla pipeline e modifica i campioni. ignored significa che non arriva mai alla pipeline, quindi impostarlo non fa nulla. gated_by_mosaic significa che si applica solo ai campioni passati dal ramo mosaic, quindi con mosaic_prob=0 non scatta mai anche se è collegato.

Il terzo stato è quello che coglie tutti di sorpresa. In una pipeline in stile YOLOX la trasformazione affine viene applicata sul canvas del mosaic e MixUp fonde un campione mosaic, quindi mosaic_prob=0 disattiva silenziosamente degrees, translate, shear, perspective, mosaic_scale, mixup_prob e mixup_scale tutti insieme. Il trainer registra un avviso specifico per il caso di 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.

La CLI segnala anche i parametri ignorati, elencando solo quelli che hai effettivamente scritto:

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

Quattro forme di pipeline

Le famiglie si raggruppano in quattro pipeline di addestramento, e la pipeline determina quasi tutte le risposte.

La pipeline mosaic in stile YOLOX applica il jitter HSV e i flip per campione, poi esegue l'affine e MixUp dentro il ramo mosaic. Copre YOLOX, YOLOv7, YOLOv9 e le sue varianti E2E e P2, RTMDet, PicoDet, RT-DETR, RT-DETRv2 e FOMO.

La pipeline pass-through in stile DETR non ha né mosaic né trasformazione affine. La sua distorsione fotometrica, lo zoom-out e il crop IoU sono costanti della ricetta e non parametri di configurazione, quindi solo flip_prob e no_aug_epochs sono attivi. Copre D-FINE, Dome-DETR, DEIM, DEIMv2, RT-DETRv4, EC e, con una variazione, RF-DETR.

La pipeline ImageFolder di classificazione ha i propri controlli di augmentation. flip_prob controlla i ribaltamenti orizzontali e vale 0.5 di default; fliplr è il suo alias.

YOLO-NAS è una forma a sé: nessun mosaic, una trasformazione affine per campione sempre attiva e MixUp applicato in modo indipendente invece che gated. Il suo valore di mosaic_scale è riusato come intervallo di scala dell'affine.

SegFormer, LingBot-Vision e NAFNet eseguono ciascuno una pipeline specifica per il task, la cui casualità è fissata nella famiglia invece di essere configurabile. Per SegFormer e LingBot-Vision i parametri attivi sono gli attributi di classe semantic_scale_jitter e semantic_hsv_prob, non mosaic_scale e hsv_prob. Il crop e i flip di NAFNet sono operazioni accoppiate su input e target con probabilità fissa a 0.5.

Quale famiglia rispetta quale parametro

La tabella qui sotto è la spec distribuita in libreyolo/data/augment/spec.py, che i test della libreria stessa confrontano con il funzionamento reale delle pipeline. Leggila lì invece di dedurla dall'architettura.

Leggere la tabella di supporto di una famiglia
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}")
Solo quelli ignorati
from libreyolo.data.augment.spec import ignored_aug_params print(sorted(ignored_aug_params("rfdetr")))

Riassunto per pipeline, per i parametri di base:

ParametroStile YOLOXYOLO-NASStile DETRClassificazione
mosaic_probusedignoredignoredignored
mixup_probgated by mosaicusedignoredignored
hsv_probusedusedignoredignored
flip_probusedusedusedused
flipudusedusedignoredused
degreesgated by mosaicusedignoredignored
translategated by mosaicusedignoredignored
sheargated by mosaicusedignoredignored
perspectivegated by mosaicusedignoredignored
mosaic_scalegated by mosaicusedignoredignored
mixup_scalegated by mosaicusedignoredignored
no_aug_epochsusedusedusedused

Eccezioni all'interno di quelle colonne, tutte restrittive:

  • RTMDet, PicoDet, RT-DETR, RT-DETRv2 e FOMO non hanno il flip verticale, quindi flipud è ignorato. Anche il wrapper mosaic di FOMO è costruito senza prospettiva.
  • La pipeline nativa di RF-DETR non ha il jitter HSV, quindi hsv_prob è ignorato in aggiunta alla colonna in stile DETR.
  • EC rispetta hsv_prob, degrees e translate, ma solo per task="pose", la cui trasformazione, che tiene conto dei keypoint, li legge. I suoi percorsi detect e segment usano ricette fotometriche fisse.
  • DINOv2 segue la colonna in stile DETR per i suoi task detect e semantic e aggiunge il pacchetto di classificazione per task="classify".

no_aug_epochs è used ovunque, ma non significa la stessa cosa ovunque. Sulle pipeline mosaic disattiva mosaic e MixUp per le epoche finali. Sulle pipeline in stile DETR ferma le augmentation fotometriche, di zoom-out e di crop e dà forma alla coda dello schedule. Sulle pipeline di classificazione disattiva auto-augmentation, erasing, MixUp e CutMix; ritagli e ribaltamenti restano attivi.

perspective aggiunge una deformazione proiettiva sopra a rotazione, scala, shear e traslazione. Ogni angolo del canvas si sposta verso l'interno di una quantità casuale fino a min(perspective * 100, 0.2) volte metà lato del canvas, per asse, quindi perspective=0.001 sposta un angolo al massimo del 5 percento del lato a qualsiasi risoluzione, e ogni valore da 0.002 in su raggiunge lo stesso massimo. Il valore predefinito 0 mantiene la deformazione affine, e un valore negativo solleva ValueError quando viene deformato il primo campione. YOLOv9 e le sue varianti E2E e P2, YOLOX, YOLOv7, YOLO-NAS, PP-YOLOE, RTMDet, PicoDet, RT-DETR e RT-DETRv2 la applicano.

Il MixUp nella pipeline mosaic di YOLOv9, attraverso cui si addestrano YOLOv9 e le sue varianti, YOLOv7, RT-DETR e RT-DETRv2, estrae il rapporto di miscelazione da Beta(1, 1), uniforme su [0, 1]. Il wrapper mosaic di YOLOX, usato da YOLOX, RTMDet e PicoDet, miscela a un valore fisso di 0.5.

Il pacchetto di classificazione

Quattro parametri guidano la pipeline di classificazione e nient'altro. Le famiglie di rilevamento li ignorano tutti e quattro.

Pacchetto di classificazione
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 accetta "randaugment", "autoaugment", "augmix" o None. erasing è la probabilità di RandomErasing. mixup e cutmix sono probabilità per batch che producono soft label; al massimo una viene applicata per batch, MixUp per prima, quindi le due si sommano e la somma non dovrebbe superare 1.

Tutti e quattro sono disattivati di default, quindi l'addestramento di classificazione non cambia se non lo chiedi.

train() e la CLI instradano mixup in base al task: la classificazione usa la combinazione di batch, mentre il rilevamento usa mixup_prob.

scale=0.5 indica un intervallo di area del ritaglio casuale pari a (0.5, 1.0); una coppia esplicita imposta entrambi i limiti. crop_pct=None conserva il rapporto di ridimensionamento di valutazione della famiglia; una modifica influenza la valutazione durante addestramento/validazione, mentre l'esportazione mantiene il preprocessing nativo della famiglia.

La CLI espone auto_augment, erasing, cutmix, fliplr e flipud. Nella classificazione mixup indica la combinazione di batch e vale 0.0 di default. I ribaltamenti orizzontali hanno probabilità predefinita 0.5 e quelli verticali 0.0. mixup + cutmix non deve superare 1.

no_aug_epochs disattiva auto-augmentation, erasing, MixUp e CutMix per le epoche finali, mantenendo ritagli e ribaltamenti. Le ricette di classificazione impostano questa coda a 0 di default.

Parametri specifici per famiglia

Alcuni parametri risiedono nella sottoclasse di configurazione di una famiglia invece che nella classe base, quindi esistono solo per quella famiglia e non hanno un flag sulla CLI.

FamigliaParametroEffetto
YOLOv9, YOLOv9-E2E, YOLOv9-P2copy_pasteProbabilità di augmentation copy-paste sulle istanze, solo task="segment"
YOLOv9, YOLOv9-E2E, YOLOv9-P2copy_paste_mode"flip" riusa lo stesso campione specchiato, "mixup" preleva un secondo campione
YOLOv9, YOLOv9-E2E, YOLOv9-P2rot90Probabilità di rotazione casuale di 90 gradi
YOLOv9, YOLOv9-E2E, YOLOv9-P2max_labelsLimite di ground truth per immagine nelle trasformazioni di addestramento, default 300
RF-DETRcopy_paste, copy_paste_modeCopy-paste per task="segment", solo modalità "flip"
RF-DETR, D-FINE, ECcrop_resize_probProbabilità di crop-resize casuale
EC, YOLO-NASbrightness_contrast_prob, affine_probProbabilità di jitter sul percorso pose e di affine che tiene conto dei keypoint

max_labels è quello che perde dati. I box oltre il limite vengono scartati con un avviso unico invece che con un errore, quindi con immagini dense come la fotografia aerea va alzato. La memoria dell'assegnazione delle etichette segue l'immagine più densa del batch, non il limite.

Mosaic e MixUp sono disattivati per l'addestramento con box orientati indipendentemente dai parametri, perché l'augmentation che tiene conto degli angoli per i box ruotati non è implementata.

  • Iperparametri per no_aug_epochs come argomento dello schedule e per il resto di train().
  • Dataset per i formati di etichette che queste trasformazioni accettano in ingresso.

Verificato con LibreYOLO v1.6.0.