Посмотреть как Markdown

Аугментации

Аугментация настраивается параметрами TrainConfig, но каждое семейство моделей выполняет свой обучающий пайплайн, и пайплайн, в котором нет ветки мозаики, игнорирует mosaic_prob, а не приближает его.

Настройка параметров

Параметры аугментации — обычные аргументы 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
# В CLI mosaic_prob пишется как mosaic, а mixup_prob — как 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

У двух из них написание в CLI короче: mosaic соответствует mosaic_prob, а mixupmixup_prob. Все остальные параметры пишутся одинаково в обоих местах.

Три состояния, а не два

Делает ли параметр хоть что-нибудь, зависит от семейства. В библиотеке это описано декларативной таблицей, и каждая запись в ней — одно из трёх состояний.

used значит, что параметр доходит до пайплайна и меняет сэмплы. ignored значит, что до пайплайна он не доходит, поэтому задавать его бесполезно. gated_by_mosaic значит, что он применяется только к сэмплам, прошедшим ветку мозаики, поэтому при mosaic_prob=0 он не срабатывает никогда, хотя и подключён.

Третье состояние — то самое, которое всех удивляет. В пайплайне в стиле YOLOX аффинное преобразование выполняется на холсте мозаики, а MixUp подмешивает мозаичный сэмпл, поэтому mosaic_prob=0 молча отключает сразу degrees, translate, shear, perspective, mosaic_scale, mixup_prob и mixup_scale. Для случая с MixUp трейнер отдельно пишет предупреждение в лог:

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

CLI предупреждает и об игнорируемых параметрах, перечисляя только те, которые вы задали сами:

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

Четыре формы пайплайна

Семейства группируются в четыре обучающих пайплайна, и почти все ответы определяются пайплайном.

Мозаичный пайплайн в стиле YOLOX применяет HSV-джиттер и отражения к каждому сэмплу, а аффинное преобразование и MixUp выполняет внутри ветки мозаики. К нему относятся YOLOX, YOLOv7, YOLOv9 и его варианты E2E и P2, RTMDet, PicoDet, RT-DETR, RT-DETRv2 и FOMO.

Сквозной пайплайн в стиле DETR — без мозаики и без аффинного преобразования. Фотометрическое искажение, zoom-out и обрезка по IoU заданы в нём константами рецепта, а не параметрами конфигурации, поэтому реально работают только flip_prob и no_aug_epochs. К нему относятся D-FINE, Dome-DETR, DEIM, DEIMv2, RT-DETRv4, EC и, с одним отличием, RF-DETR.

Пайплайн классификации на ImageFolder игнорирует все параметры детекции. Его горизонтальное отражение зафиксировано на 0.5, и flip_prob до него не доходит. Вместо этого у него есть свой набор параметров, описанный ниже.

YOLO-NAS — отдельная форма: мозаики нет вовсе, аффинное преобразование для каждого сэмпла включено всегда, а MixUp применяется независимо, не привязан к мозаике. Его значение mosaic_scale переиспользуется как диапазон масштаба для аффинного преобразования.

У SegFormer и NAFNet каждый свой пайплайн под конкретную задачу, и случайность в нём зашита в семействе, а не настраивается. У SegFormer работают атрибуты класса semantic_scale_jitter и semantic_hsv_prob, а не mosaic_scale и hsv_prob. Обрезка и отражения в NAFNet — связанные операции над входом и целью с фиксированной вероятностью 0.5.

Какое семейство учитывает какой параметр

Таблица ниже — поставляемая с библиотекой спецификация из libreyolo/data/augment/spec.py, которую собственные тесты библиотеки сверяют с реальной обвязкой пайплайнов. Читайте её оттуда, а не выводите из архитектуры.

Чтение таблицы поддержки для семейства
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")))

Сводка по пайплайнам, для базовых параметров:

ПараметрВ стиле YOLOXYOLO-NASВ стиле DETRКлассификация
mosaic_probusedignoredignoredignored
mixup_probпривязан к мозаикеusedignoredignored
hsv_probusedusedignoredignored
flip_probusedusedusedignored
flipudusedusedignoredignored
degreesпривязан к мозаикеusedignoredignored
translateпривязан к мозаикеusedignoredignored
shearпривязан к мозаикеusedignoredignored
perspectiveпривязан к мозаикеusedignoredignored
mosaic_scaleпривязан к мозаикеusedignoredignored
mixup_scaleпривязан к мозаикеusedignoredignored
no_aug_epochsusedusedusedused

Исключения внутри этих столбцов, все — в сторону сужения:

  • У RTMDet, PicoDet, RT-DETR, RT-DETRv2 и FOMO нет вертикального отражения, поэтому flipud игнорируется. Обёртка мозаики в FOMO вдобавок собрана без perspective.
  • В нативном пайплайне RF-DETR нет HSV-джиттера, поэтому hsv_prob игнорируется дополнительно к столбцу в стиле DETR.
  • EC учитывает hsv_prob, degrees и translate, но только для task="pose" — их читает преобразование с учётом ключевых точек. В путях detect и segment применяются фиксированные фотометрические рецепты.
  • DINOv2 следует столбцу в стиле DETR для задач detect и semantic, а для task="classify" добавляет набор для классификации.

no_aug_epochs везде имеет статус used, но смысл у него везде разный. В мозаичных пайплайнах он отключает мозаику и MixUp на последних эпохах. В пайплайнах в стиле DETR он останавливает фотометрические аугментации, zoom-out и обрезку и формирует хвост расписания. В пайплайнах классификации и семантики он формирует только хвост.

Набор для классификации

Четыре параметра управляют пайплайном классификации и больше ничем. Семейства детекции игнорируют все четыре.

Набор для классификации
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 принимает "randaugment", "autoaugment", "augmix" или None. erasing — вероятность RandomErasing. mixup и cutmix — вероятности на уровне батча, дающие мягкие метки; за батч срабатывает не больше одной, сначала MixUp, поэтому они складываются и в сумме не должны превышать 1.

Все четыре по умолчанию выключены, поэтому обучение классификации не меняется, пока вы сами этого не попросите.

Одно совпадение имён стоит проговорить прямо: в CLI mixup — алиас для mixup_prob из детекции. У поля mixup из классификации собственного написания в CLI нет, и добраться до него можно только через model.train(mixup=...) в Python.

Параметры, специфичные для семейства

Некоторые параметры живут в подклассе конфига семейства, а не в базовом классе, поэтому они существуют только для этого семейства и флага в CLI у них нет.

СемействоПараметрЭффект
YOLOv9, YOLOv9-E2E, YOLOv9-P2copy_pasteВероятность copy-paste-аугментации экземпляров, только task="segment"
YOLOv9, YOLOv9-E2E, YOLOv9-P2copy_paste_mode"flip" переиспользует тот же сэмпл в отражении, "mixup" берёт второй сэмпл
YOLOv9, YOLOv9-E2E, YOLOv9-P2rot90Вероятность случайного поворота на 90 градусов
YOLOv9max_labelsОграничение на число объектов эталонной разметки на изображение в обучающих преобразованиях, по умолчанию 100
RF-DETRcopy_paste, copy_paste_modeCopy-paste для task="segment", только в режиме "flip"
RF-DETR, D-FINE, ECcrop_resize_probВероятность случайной обрезки с изменением размера
EC, YOLO-NASbrightness_contrast_prob, affine_probВероятности джиттера в пути pose и аффинного преобразования с учётом ключевых точек

max_labels — тот самый параметр, который молча теряет данные. Рамки сверх ограничения отбрасываются без ошибки, поэтому для плотных изображений вроде аэрофотосъёмки его нужно поднимать.

Мозаика и MixUp отключаются при обучении с повёрнутыми рамками независимо от параметров, потому что аугментация с учётом углов для повёрнутых рамок не реализована.

Смотрите также

  • Гиперпараметры — про no_aug_epochs как аргумент расписания и про остальной train().
  • Датасеты — про форматы разметки, которые эти преобразования принимают.

Проверено с LibreYOLO v1.5.0.