Посмотреть как 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

У трёх из них есть более короткие написания, которые одинаково принимают train() и CLI: mosaic соответствует mosaic_prob, fliplr соответствует flip_prob, а в детекции mixup соответствует mixup_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 samplesand 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 имеет собственные параметры аугментации. flip_prob управляет горизонтальными отражениями и по умолчанию равен 0.5; fliplr служит его псевдонимом.

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

У SegFormer, LingBot-Vision и NAFNet каждый свой пайплайн под конкретную задачу, и случайность в нём зашита в семействе, а не настраивается. У SegFormer и LingBot-Vision работают атрибуты класса 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_probusedusedusedused
flipudusedusedignoredused
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 и обрезку и формирует хвост расписания. В пайплайнах классификации он отключает автоаугментацию, стирание, MixUp и CutMix; обрезка и отражения сохраняются.

perspective добавляет проективное искажение поверх поворота, масштаба, сдвига и переноса. Каждый угол холста сдвигается внутрь на случайную величину до min(perspective * 100, 0.2) половины стороны холста по каждой оси, поэтому perspective=0.001 сдвигает угол не более чем на 5 процентов стороны при любом разрешении, а каждое значение от 0.002 и выше достигает одного и того же максимума. Значение по умолчанию 0 оставляет искажение аффинным, а отрицательное значение вызывает ValueError, когда искажается первый образец. Его применяют YOLOv9 и его варианты E2E и P2, YOLOX, YOLOv7, YOLO-NAS, PP-YOLOE, RTMDet, PicoDet, RT-DETR и RT-DETRv2.

MixUp в пайплайне mosaic YOLOv9, через который обучаются YOLOv9 и его варианты, YOLOv7, RT-DETR и RT-DETRv2, берёт коэффициент смешивания из Beta(1, 1), равномерно на [0, 1]. Обёртка mosaic YOLOX, которую используют YOLOX, RTMDet и PicoDet, смешивает с фиксированным 0.5.

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

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

Набор для классификации
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.

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

train() и CLI направляют mixup по задаче: классификация использует смешивание батчей, а детекция использует mixup_prob.

scale=0.5 означает случайную площадь обрезки в диапазоне (0.5, 1.0); явная пара задаёт обе границы. crop_pct=None сохраняет коэффициент изменения размера семейства для оценки; переопределение влияет на оценку при обучении и валидации, а экспорт сохраняет нативную предобработку семейства.

CLI предоставляет auto_augment, erasing, cutmix, fliplr и flipud. Для классификации mixup означает смешивание батчей и по умолчанию равен 0.0. Горизонтальные отражения по умолчанию имеют вероятность 0.5, вертикальные 0.0. mixup + cutmix не должно превышать 1.

no_aug_epochs отключает автоаугментацию, стирание, MixUp и CutMix в последних эпохах, сохраняя обрезку и отражения. В рецептах классификации этот период по умолчанию равен 0.

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

Некоторые параметры живут в подклассе конфига семейства, а не в базовом классе, поэтому они существуют только для этого семейства и флага в 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 градусов
YOLOv9, YOLOv9-E2E, YOLOv9-P2max_labelsОграничение на число объектов эталонной разметки на изображение в обучающих преобразованиях, по умолчанию 300
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.6.0.