Data augmentation
O data augmentation é configurado por parâmetros do TrainConfig, mas cada família de modelos roda seu próprio pipeline de treinamento, e um pipeline que não tem ramo de mosaico ignora mosaic_prob em vez de aproximá-lo.
Definir os parâmetros
Os parâmetros de data augmentation são argumentos comuns de 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,)# A CLI escreve mosaic_prob como mosaic e mixup_prob como 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=15Três deles têm grafias mais curtas, aceitas tanto por train() quanto pela CLI:
mosaic corresponde a mosaic_prob, fliplr a flip_prob e, na detecção,
mixup corresponde a mixup_prob. Passar uma grafia curta e o seu campo com
valores diferentes levanta exceção. Todos os outros parâmetros se escrevem
igual nos dois lugares.
Três estados, não dois
Se um parâmetro tem algum efeito depende da família. A biblioteca mantém uma tabela declarativa disso, e cada entrada é um de três estados.
used significa que o parâmetro chega ao pipeline e altera as amostras.
ignored significa que ele nunca chega ao pipeline, então defini-lo não faz
nada. gated_by_mosaic significa que ele só se aplica às amostras que passaram
pelo ramo do mosaico, então com mosaic_prob=0 ele nunca dispara, mesmo estando
ligado.
Esse terceiro estado é o que pega as pessoas de surpresa. Em um pipeline no
estilo YOLOX a transformação afim roda sobre o canvas do mosaico e o MixUp
mistura uma amostra de mosaico, então mosaic_prob=0 desativa silenciosamente
degrees, translate, shear, perspective, mosaic_scale, mixup_prob e
mixup_scale de uma vez só. O treinador registra um aviso especificamente para o
caso do 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.A CLI também avisa sobre os parâmetros ignorados, listando só os que você realmente digitou:
Warning: RF-DETR ignores these parameters: degrees, mosaicQuatro formatos de pipeline
As famílias se agrupam em quatro pipelines de treinamento, e o pipeline determina quase todas as respostas.
O pipeline de mosaico no estilo YOLOX aplica o jitter HSV e os flips por amostra e depois roda a transformação afim e o MixUp dentro do ramo do mosaico. Ele cobre YOLOX, YOLOv7, YOLOv9 e suas variantes E2E e P2, RTMDet, PicoDet, RT-DETR, RT-DETRv2 e FOMO.
O pipeline de passagem direta no estilo DETR não tem mosaico nem transformação
afim. A distorção fotométrica, o zoom-out e o recorte por IoU dele são constantes
da receita e não parâmetros de configuração, então só flip_prob e
no_aug_epochs ficam ativos. Ele cobre D-FINE, Dome-DETR, DEIM, DEIMv2,
RT-DETRv4, EC e, com uma mudança, RF-DETR.
O pipeline de classificação com ImageFolder tem seus próprios controles de data augmentation. flip_prob controla o espelhamento horizontal e tem padrão 0.5; fliplr é seu alias.
O YOLO-NAS é um formato à parte: nada de mosaico, uma transformação afim por
amostra sempre ligada e o MixUp aplicado de forma independente em vez de
condicionado. O valor de mosaic_scale dele é reaproveitado como faixa de escala
dessa transformação afim.
SegFormer, LingBot-Vision e NAFNet rodam cada um um pipeline específico da
tarefa, cuja aleatoriedade está fixada na família em vez de ser configurável. No
SegFormer e no LingBot-Vision os parâmetros ativos são os atributos de classe
semantic_scale_jitter e semantic_hsv_prob, não mosaic_scale e hsv_prob. O recorte e os flips do
NAFNet são operações acopladas de entrada e alvo com uma probabilidade fixa de
0.5.
Qual família respeita qual parâmetro
A tabela abaixo é a spec que vem em
libreyolo/data/augment/spec.py, verificada contra a ligação real do pipeline
pelos próprios testes da biblioteca. Consulte a spec ali em vez de deduzi-la pela
arquitetura.
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")))Resumido por pipeline, para os parâmetros base:
| Parâmetro | Estilo YOLOX | YOLO-NAS | Estilo DETR | Classificação |
|---|---|---|---|---|
mosaic_prob | used | ignored | ignored | ignored |
mixup_prob | condicionado pelo mosaico | used | ignored | ignored |
hsv_prob | used | used | ignored | ignored |
flip_prob | used | used | used | used |
flipud | used | used | ignored | used |
degrees | condicionado pelo mosaico | used | ignored | ignored |
translate | condicionado pelo mosaico | used | ignored | ignored |
shear | condicionado pelo mosaico | used | ignored | ignored |
perspective | condicionado pelo mosaico | used | ignored | ignored |
mosaic_scale | condicionado pelo mosaico | used | ignored | ignored |
mixup_scale | condicionado pelo mosaico | used | ignored | ignored |
no_aug_epochs | used | used | used | used |
Exceções dentro dessas colunas, todas elas restritivas:
- RTMDet, PicoDet, RT-DETR, RT-DETRv2 e FOMO não têm flip vertical, então
flipudé ignorado. O wrapper de mosaico do FOMO também é construído sem perspectiva. - O pipeline nativo do RF-DETR não tem jitter HSV, então
hsv_probé ignorado além do que diz a coluna do estilo DETR. - O EC respeita
hsv_prob,degreesetranslate, mas só paratask="pose", cuja transformação ciente dos keypoints os lê. Os caminhos de detect e segment dele usam receitas fotométricas fixas. - O DINOv2 segue a coluna do estilo DETR para as tarefas detect e semantic e
acrescenta o pacote de classificação para
task="classify".
no_aug_epochs é used em todo lugar, mas não significa a mesma coisa em todo
lugar. Nos pipelines de mosaico ele desliga o mosaico e o MixUp nas épocas
finais. Nos pipelines no estilo DETR ele interrompe o data augmentation
fotométrico, o zoom-out e o recorte, e molda a cauda do schedule. Nos pipelines de classificação, desativa auto-augmentation, erasing, MixUp e CutMix; recortes e espelhamentos permanecem.
perspective acrescenta um warp projetivo por cima da rotação, da escala, do
cisalhamento e da translação. Cada canto do canvas se move para dentro por uma
quantidade aleatória de até min(perspective * 100, 0.2) vezes metade do lado do
canvas, por eixo, então perspective=0.001 move um canto em no máximo 5 por
cento do lado em qualquer resolução, e todo valor de 0.002 para cima chega ao
mesmo máximo. O padrão 0 mantém o warp afim, e um valor negativo levanta
ValueError quando a primeira amostra é deformada. YOLOv9 e suas variantes E2E e
P2, YOLOX, YOLOv7, YOLO-NAS, PP-YOLOE, RTMDet, PicoDet, RT-DETR e RT-DETRv2 o
aplicam.
O MixUp no pipeline de mosaic do YOLOv9, pelo qual treinam o YOLOv9 e suas variantes, o YOLOv7, o RT-DETR e o RT-DETRv2, sorteia a razão de mistura de Beta(1, 1), uniforme em [0, 1]. O wrapper de mosaic do YOLOX, usado por YOLOX, RTMDet e PicoDet, mistura em um 0.5 fixo.
O pacote de classificação
Quatro parâmetros governam o pipeline de classificação e mais nada. As famílias de detecção ignoram os quatro.
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 aceita "randaugment", "autoaugment", "augmix" ou None.
erasing é a probabilidade do RandomErasing. mixup e cutmix são
probabilidades por batch que produzem rótulos suaves; no máximo um roda por
batch, o MixUp primeiro, então os dois são aditivos e a soma deles não deveria
passar de 1.
Os quatro vêm desligados por padrão, então o treinamento de classificação não muda a menos que você peça.
train() e a CLI direcionam mixup por tarefa: classificação usa mistura de batches, enquanto detecção usa mixup_prob.
scale=0.5 significa uma faixa de área de recorte aleatório de (0.5, 1.0); um par explícito define ambos os limites. crop_pct=None preserva a razão de redimensionamento de avaliação da família; uma substituição afeta a avaliação de treinamento/validação, enquanto a exportação mantém o pré-processamento nativo da família.
A CLI expõe auto_augment, erasing, cutmix, fliplr e flipud. Na classificação, mixup significa mistura de batches e tem padrão 0.0. Espelhamento horizontal tem padrão 0.5 e vertical, 0.0. mixup + cutmix não pode exceder 1.
no_aug_epochs desativa auto-augmentation, erasing, MixUp e CutMix nas épocas finais, mantendo recortes e espelhamentos. As receitas de classificação usam 0 por padrão para esse período final.
Parâmetros específicos de cada família
Alguns parâmetros ficam na subclasse de config de uma família em vez de na classe base, então existem só para aquela família e não têm flag na CLI.
| Família | Parâmetro | Efeito |
|---|---|---|
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | copy_paste | Probabilidade do data augmentation de instâncias copy-paste, só para task="segment" |
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | copy_paste_mode | "flip" reaproveita a mesma amostra espelhada, "mixup" puxa uma segunda amostra |
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | rot90 | Probabilidade de rotação aleatória de 90 graus |
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | max_labels | Limite de ground truth por imagem nas transformações de treinamento, 300 por padrão |
| RF-DETR | copy_paste, copy_paste_mode | Copy-paste para task="segment", só no modo "flip" |
| RF-DETR, D-FINE, EC | crop_resize_prob | Probabilidade de recorte e redimensionamento aleatórios |
| EC, YOLO-NAS | brightness_contrast_prob, affine_prob | Probabilidades do jitter do caminho de pose e da transformação afim ciente dos keypoints |
max_labels é o que perde dados. Os bounding boxes que passam do limite são
descartados com um aviso único em vez de um erro, então imagens densas como as de
fotografia aérea precisam que ele seja aumentado. A memória da atribuição de
labels acompanha a imagem mais densa do batch, não o limite.
O mosaico e o MixUp ficam desativados no treinamento com caixas orientadas independentemente dos parâmetros, porque o data augmentation ciente dos cantos para caixas rotacionadas não está implementado.
Relacionados
- Hiperparâmetros para
no_aug_epochscomo argumento do schedule e o resto detrain(). - Datasets para os formatos de label que essas transformações consomem.