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().
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,)# 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=15Tre 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, mosaicQuattro 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.
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}")from libreyolo.data.augment.spec import ignored_aug_params print(sorted(ignored_aug_params("rfdetr")))Riassunto per pipeline, per i parametri di base:
| Parametro | Stile YOLOX | YOLO-NAS | Stile DETR | Classificazione |
|---|---|---|---|---|
mosaic_prob | used | ignored | ignored | ignored |
mixup_prob | gated by mosaic | used | ignored | ignored |
hsv_prob | used | used | ignored | ignored |
flip_prob | used | used | used | used |
flipud | used | used | ignored | used |
degrees | gated by mosaic | used | ignored | ignored |
translate | gated by mosaic | used | ignored | ignored |
shear | gated by mosaic | used | ignored | ignored |
perspective | gated by mosaic | used | ignored | ignored |
mosaic_scale | gated by mosaic | used | ignored | ignored |
mixup_scale | gated by mosaic | used | ignored | ignored |
no_aug_epochs | used | used | used | used |
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,degreesetranslate, ma solo pertask="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.
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.
| Famiglia | Parametro | Effetto |
|---|---|---|
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | copy_paste | Probabilità di augmentation copy-paste sulle istanze, solo task="segment" |
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | copy_paste_mode | "flip" riusa lo stesso campione specchiato, "mixup" preleva un secondo campione |
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | rot90 | Probabilità di rotazione casuale di 90 gradi |
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | max_labels | Limite di ground truth per immagine nelle trasformazioni di addestramento, default 300 |
| RF-DETR | copy_paste, copy_paste_mode | Copy-paste per task="segment", solo modalità "flip" |
| RF-DETR, D-FINE, EC | crop_resize_prob | Probabilità di crop-resize casuale |
| EC, YOLO-NAS | brightness_contrast_prob, affine_prob | Probabilità 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.
Correlati
- Iperparametri per
no_aug_epochscome argomento dello schedule e per il resto ditrain(). - Dataset per i formati di etichette che queste trasformazioni accettano in ingresso.