Ver como markdown

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().

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
# 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=15

Trê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, mosaic

Quatro 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.

Ler a tabela de suporte de uma família
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}")
Só os ignorados
from libreyolo.data.augment.spec import ignored_aug_params print(sorted(ignored_aug_params("rfdetr")))

Resumido por pipeline, para os parâmetros base:

ParâmetroEstilo YOLOXYOLO-NASEstilo DETRClassificação
mosaic_probusedignoredignoredignored
mixup_probcondicionado pelo mosaicousedignoredignored
hsv_probusedusedignoredignored
flip_probusedusedusedused
flipudusedusedignoredused
degreescondicionado pelo mosaicousedignoredignored
translatecondicionado pelo mosaicousedignoredignored
shearcondicionado pelo mosaicousedignoredignored
perspectivecondicionado pelo mosaicousedignoredignored
mosaic_scalecondicionado pelo mosaicousedignoredignored
mixup_scalecondicionado pelo mosaicousedignoredignored
no_aug_epochsusedusedusedused

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, degrees e translate, mas só para task="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.

Pacote de classificação
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íliaParâmetroEfeito
YOLOv9, YOLOv9-E2E, YOLOv9-P2copy_pasteProbabilidade do data augmentation de instâncias copy-paste, só para task="segment"
YOLOv9, YOLOv9-E2E, YOLOv9-P2copy_paste_mode"flip" reaproveita a mesma amostra espelhada, "mixup" puxa uma segunda amostra
YOLOv9, YOLOv9-E2E, YOLOv9-P2rot90Probabilidade de rotação aleatória de 90 graus
YOLOv9, YOLOv9-E2E, YOLOv9-P2max_labelsLimite de ground truth por imagem nas transformações de treinamento, 300 por padrão
RF-DETRcopy_paste, copy_paste_modeCopy-paste para task="segment", só no modo "flip"
RF-DETR, D-FINE, ECcrop_resize_probProbabilidade de recorte e redimensionamento aleatórios
EC, YOLO-NASbrightness_contrast_prob, affine_probProbabilidades 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.

  • Hiperparâmetros para no_aug_epochs como argumento do schedule e o resto de train().
  • Datasets para os formatos de label que essas transformações consomem.

Verificado com o LibreYOLO v1.6.0.