Используй аугментацию осознанно
Проверяй каждую аугментацию с учётом камеры в целевой среде, создай обоснованный профиль, обучи модель с ним и проверь результат на обучающих батчах.
Представь сортировочную линию, где отделяют красные капсулы от оранжевых, а модель обучают со стандартным изменением оттенка. В каждой эпохе модель видит красные капсулы, окрашенные в оранжевый, и усваивает, что цвет не важен, хотя именно это ей и нужно было выучить. Аугментация повышает устойчивость модели, только если каждое преобразование может действительно возникнуть при съёмке целевой камерой. В этом уроке ты узнаешь, как определить, какие преобразования оставить.
Практические занятия
Что даёт аугментация#

Аугментация данных преобразует обучающие изображения на лету, поэтому в каждой эпохе модель видит немного изменённую версию каждого изображения. При грамотном применении она повышает устойчивость к изменениям освещения, масштаба и ориентации, а также уменьшает переобучение, поскольку модель не может запоминать постоянно меняющиеся изображения. При неправильном применении аугментация учит модель распознавать физически невозможные сцены и скрывает недостатки датасета, которые нужно устранить.
Посмотри на панель оттенка выше: красная ара становится жёлтой. Для задачи «ара или не ара» это безвредно, но разрушительно, если именно цвет отличает друг от друга два твоих класса.
Важные параметры по умолчанию#
Ниже приведены значения по умолчанию в Ultralytics 8.4; в справочнике по параметрам аугментации перечислены все аргументы:
| Аргумент | По умолчанию | Назначение | Когда менять |
|---|---|---|---|
hsv_h | 0.015 | Изменение оттенка | Задай 0, если класс определяется цветом |
hsv_s / hsv_v | 0.7 / 0.4 | Изменение насыщенности и яркости | Уменьши значения при фиксированном и контролируемом освещении |
degrees | 0.0 | Случайный поворот (± градусов) | Увеличь значение, если объекты могут быть под любым углом |
translate / scale | 0.1 / 0.5 | Смещение и масштабирование | Уменьши значения, если обрезка может удалить части, определяющие класс |
fliplr | 0.5 | Вероятность отражения по горизонтали | Задай 0, если важны левая и правая стороны, как, например, в тексте |
flipud | 0.0 | Вероятность отражения по вертикали | Увеличь значение для съёмки сверху, аэрофотосъёмки или изображений под микроскопом |
mosaic | 1.0 | Объединяет четыре изображения в одно | Редко; см. close_mosaic |
close_mosaic | 10 | Отключает мозаику на последних N эпохах | Уменьши значение для очень коротких запусков |
mixup / cutmix | 0.0 / 0.0 | Смешивает два изображения или накладывает фрагмент одного на другое | Попробуй на небольших датасетах после получения базового результата |
copy_paste | 0.0 | Переносит экземпляры объектов между изображениями | Датасеты для сегментации, семантической сегментации и OBB с редкими классами |
Исключение — датасеты глубины: mosaic, mixup, cutmix и copy_paste создавали бы некорректные парные карты глубины, поэтому загрузчик данных глубины автоматически устанавливает для них значение 0.
Проверка с учётом условий развёртывания#
Для каждого включённого преобразования нужно ответить на один вопрос, а затем на второй:
| Преобразование | Реалистично? | Вердикт |
|---|---|---|
| Изменение яркости на ±30% для уличной камеры | Да: время суток | Оставить |
| Отражение по горизонтали для камеры наблюдения | Да: люди ходят в обоих направлениях | Оставить |
| Отражение по вертикали для камеры на стене | Нет: пол всегда внизу | Отключить |
| Вертикальное отражение для камеры над конвейером | Да: в кадре нет понятия «верх» | Включить |
| Поворот на 90° для стационарной дорожной камеры | Нет: камера никогда не поворачивается | Отключить |
| Сдвиг оттенка, если красные и зелёные детали относятся к разным классам | Нет: это уничтожает информативный сигнал | Отключить |

Перевёрнутый ара — подходящее обучающее изображение для дрона, направленного строго вниз, и бесполезное — для камеры, прикреплённой к стене. Преобразования, которые не проходят эту проверку, создают отрицательный обучающий сигнал: модель учится распознавать изображения, которых никогда не увидит, и тратит на это ресурсы, предназначенные для тех изображений, которые увидит.
Пример профиля#
Камера над конвейером сортирует детали, классы которых различаются только цветом. Сдвиг оттенка нужно отключить, а вертикальные отражения и небольшие повороты становятся реалистичными. Запусти обучение, как показано, на демонстрационном наборе COCO8; подставь YAML-файл своих данных и укажи реальное число эпох:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(
data="coco8.yaml",
epochs=1,
imgsz=320,
hsv_h=0.0, # цвет задаёт класс: сохраняй исходные оттенки
flipud=0.5, # вид сверху: в кадре нет понятия «вверх»
degrees=10.0, # детали располагаются под любым небольшим углом
)Открой train_batch0.jpg в папке запуска и проверь три вещи: после преобразования рамки остаются точными, признаки, определяющие класс (цвет, форма, текст), сохраняются, а изображения не выглядят физически невозможными. Ослабь любое преобразование, которое нарушает одно из этих условий. В материале Обучи свою первую модель рассматривается сам процесс обучения.
Mosaic и close_mosaic#

Mosaic объединяет четыре изображения в одно и включена по умолчанию. Для детекции это самая эффективная аугментация: каждое обучающее изображение содержит несколько сцен, масштабов и контекстов объектов. Но изображения Mosaic не похожи на кадры при развёртывании, поэтому close_mosaic=10 отключает её на последние 10 эпох, и модель завершает обучение на реалистичных входных данных. Отключение Mosaic также выключает mixup, cutmix и copy_paste, а отражения, HSV и геометрические преобразования продолжают применяться.
При запусках длительностью не более close_mosaic эпох, включая профиль на одну эпоху выше, мозаичное дополнение отключено уже с первой эпохи. Оценивай мозаичное дополнение по train_batch0.jpg полного запуска, а не по короткому тесту.
Чего не исправить аугментацией#
Аугментация усиливает то, что уже есть. Если в наборе данных нет ночных изображений, никакая настройка не создаст ночь: она создаст более светлые и более тёмные варианты дневных изображений. Если класс распознаётся только при агрессивной аугментации, этого класса недостаточно. Вернись к материалу Собери качественные и репрезентативные данные.
При обучении на небольшом наборе данных с максимальными значениями всех параметров аугментации изображения всё сильнее отличаются от тех, что встретятся при развёртывании модели, и mAP на val часто снижается. Меняй по одному параметру, обосновывая каждое изменение, и сравнивай результат с базовой конфигурацией на том же разбиении.
Если класс определяется небольшой частью объекта, например символом в углу игральной карты, mosaic, translate и scale могут обрезать эту часть, создав обучающее изображение, неотличимое от изображения другого класса. Уменьши эти значения для такого набора данных и проверь результат в train_batch0.jpg.
Показать решение
Дрон обследует порт строго сверху и обнаруживает корабли с помощью ориентированных рамок. С этой точки обзора понятия «верх» нет, корабли направлены в разные стороны, а цвет не определяет класс:
| Аргумент | Выбор | Обоснование |
|---|---|---|
flipud | 0.5 | При виде сверху изображение выглядит одинаково и после вертикального отражения |
degrees | 180 | Корабли встречаются с любым направлением носа |
hsv_h | по умолчанию | Цвет корпуса различается и не служит признаком класса |
mosaic | по умолчанию | На каждом изображении много мелких объектов; Mosaic помогает |
На демонстрационном аэрофотоснимочном наборе DOTA8:
yolo obb train data=dota8.yaml model=yolo26n-obb.pt epochs=1 imgsz=320 flipud=0.5 degrees=180Для стационарной уличной камеры те же два изменения не пройдут проверку для развёртывания: на изображении с камеры, закреплённой на стене, автомобили никогда не бывают перевёрнутыми.