Ultralytics YOLO27:

Как дообучить YOLO на пользовательском наборе данных#

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

В этом руководстве описано дообучение YOLO26 на пользовательских наборах данных: от основ до продвинутых техник, таких как заморозка слоёв и двухэтапное обучение.

Дообучение и обучение с нуля#

Предварительно обученная модель уже научилась извлекать общие визуальные признаки — обнаруживать границы, распознавать текстуры и понимать формы — по миллионам изображений. Перенос обучения при дообучении позволяет повторно использовать эти знания и обучает модель только распознавать новые классы, поэтому сходимость наступает быстрее и требуется меньше данных. Обучение с нуля отбрасывает всё это и заставляет модель учиться всему с самого начала, по низкоуровневым признакам пикселей, что требует значительно больше ресурсов. См. руководство по настройке YAML модели, чтобы узнать, чем файлы .yaml, содержащие только архитектуру, отличаются от чекпойнтов.

ДообучениеОбучение с нуля
Начальные весаПредварительное обучение на COCO (80 классов)Случайная инициализация
КомандаYOLO("yolo26n.pt")YOLO("yolo26n.yaml")
СходимостьБыстрее — backbone уже обученМедленнее — все слои учатся с нуля
Требования к даннымНиже — предварительно обученные признаки позволяют обойтись меньшим количеством данныхВыше — модель должна самостоятельно извлечь все признаки из набора данных
Когда использоватьПользовательские классы на обычных изображенияхДомены, принципиально отличающиеся от COCO (медицина, спутниковые снимки, радар)
Для дообучения не нужен дополнительный код

Когда файл .pt загружается с помощью YOLO("yolo26n.pt"), предварительно обученные веса сохраняются в модели. После этого вызов .train(data="custom.yaml") автоматически переносит все совместимые веса в новую архитектуру модели, повторно инициализирует несовпадающие слои (например, detection head, если количество классов отличается) и запускает обучение. Вручную загружать веса, изменять слои или писать собственный код для переноса обучения не требуется.

Как работает перенос предварительно обученных весов#

При дообучении предварительно обученной модели на наборе данных с другим количеством классов (например, при переходе от 80 классов COCO к 5 пользовательским классам) Ultralytics переносит веса с учётом размеров тензоров:

  1. Backbone и neck переносятся полностью — эти слои извлекают общие визуальные признаки, а их размеры не зависят от количества классов.
  2. Detection head переинициализируется частично — размеры выходных классификационных слоёв (cv3, one2one_cv3) зависят от количества классов (80 против 5). Совместимые строки, названия классов которых совпадают, сопоставляются повторно, а несовпавшие строки инициализируются. Слои регрессии рамок (cv2, one2one_cv2) в detection head имеют фиксированные размеры независимо от количества классов, поэтому переносятся обычным образом.
  3. При изменении количества классов переносится подавляющее большинство весов. Например, при дообучении YOLO26n с COCO (80 классов) на наборе данных с 5 классами переносятся 606 из 708 тензоров весов, а также все совместимые строки классификации, сопоставленные по названию.

Если в наборе данных столько же классов, сколько в предварительно обученной модели (например, при дообучении весов, обученных на COCO, на другом наборе данных с 80 классами), переносятся 100% весов, включая detection head.

Перенос классов с альтернативными названиями#

Ultralytics переносит соответствующие строки классификационной головы между наборами данных по названию класса, игнорируя регистр и пробелы в начале и конце. Если эквивалентные классы названы по-разному, переименуй классы исходного чекпойнта в памяти перед загрузкой. Так сохраняются предварительно обученные веса классификации для общих понятий, которые иначе считались бы несовпадающими и инициализировались случайным образом.

В этом примере переноса с Objects365 v2 на COCO переименовываются классы исходной модели в загруженном чекпойнте, а затем train() передаёт их как предварительно обученные веса:

from ultralytics import YOLO

# Исходное название класса Objects365 v2 (в нижнем регистре) -> целевое название класса COCO
ALIASES = {
    "wild bird": "bird",
    "handbag/satchel": "handbag",
    "luggage": "suitcase",
    "bowl/basin": "bowl",
    "orange/tangerine": "orange",
    "monitor/tv": "tv",
    "stuffed toy": "teddy bear",
    "hair dryer": "hair drier",
}

model = YOLO("path/to/yolo26s-objects365.pt")
# Названия классов Objects365 записаны с заглавных букв, поэтому сопоставляй их по названиям в нижнем регистре
model.model.names = {i: ALIASES.get(name.lower(), name) for i, name in model.model.names.items()}
model.train(data="coco.yaml", epochs=100, imgsz=640)

Параметр cls_remap по умолчанию включает перенос по названиям. Во время обучения выводится Remapped N/M cls head rows from pretrained weights by class name, когда копируются совместимые строки; чтобы отключить эту функцию, задай cls_remap=False.

Пример базового дообучения#

Пример
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # загрузи предварительно обученную модель
model.train(data="custom.yaml", epochs=50, imgsz=640)

Выбор размера модели#

У более крупных моделей выше ёмкость, но у них также больше параметров для обновления, что повышает риск переобучения при ограниченном объёме обучающих данных. Практичный подход — начать с небольшой модели (YOLO26n или YOLO26s) и переходить к более крупной, только если метрики валидации перестанут улучшаться. Оптимальный размер модели зависит от сложности задачи, количества классов, разнообразия набора данных и оборудования, доступного для развёртывания. Доступные размеры и результаты тестов производительности см. на странице модели YOLO26.

Выбор оптимизатора и скорости обучения#

Настройка optimizer=auto по умолчанию выбирает оптимизатор и скорость обучения на основе общего количества итераций обучения:

  • 10 000 итераций или меньше (небольшие наборы данных или небольшое количество эпох): AdamW с низкой автоматически рассчитанной скоростью обучения
  • Более 10 000 итераций (большие наборы данных): MuSGD (гибридный оптимизатор Muon+SGD) с lr=0.01

Для большинства задач дообучения настроек по умолчанию достаточно, и вручную менять их не нужно. Укажи оптимизатор явно, если:

  • Обучение нестабильно (скачки функции потерь или её расходимость): попробуй optimizer=AdamW, lr0=0.001 для более стабильной сходимости
  • Ты дообучаешь большую модель на небольшом наборе данных: явное указание оптимизатора с более низкой скоростью обучения, например optimizer=AdamW, lr0=0.001, поможет сохранить предварительно обученные признаки
Автоматический выбор оптимизатора переопределяет lr0

Если задано optimizer=auto, значения lr0 и momentum игнорируются. Чтобы вручную управлять скоростью обучения, укажи оптимизатор явно: optimizer=SGD, lr0=0.005.

Заморозка слоёв#

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

Параметр freeze принимает целое число или список. Целое число freeze=10 замораживает первые 10 слоёв (индексы 0–9), в которые входит большая часть backbone YOLO26. Backbone состоит из слоёв 0–10, поэтому freeze=10 оставляет последний блок C2PSA (слой 10) обучаемым; чтобы заморозить весь backbone, используй freeze=11. В списке можно указать индексы слоёв, например freeze=[0, 3, 5], чтобы частично заморозить backbone, или названия модулей, например freeze=["23.cv2", "23.one2one_cv2"], чтобы точечно управлять отдельными ветвями внутри слоя (в данном случае — обеими ветвями регрессии рамок detection head).

Пример
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=50, freeze=10)

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

СценарийРекомендацияОбоснование
Большой набор данных, похожий доменfreeze=None (по умолчанию)Данных достаточно, чтобы адаптировать все слои без переобучения
Небольшой набор данных, похожий доменfreeze=10Сохраняет признаки backbone и уменьшает количество обучаемых параметров
Очень небольшой набор данныхfreeze=23Обучается только detection head, что сводит к минимуму риск переобучения
Домен сильно отличается от COCOfreeze=NoneПризнаки backbone могут переноситься плохо, поэтому backbone нужно переобучить

Глубину заморозки также можно считать гиперпараметром: попробуй несколько значений (0, 5, 10) и сравни mAP на валидации — это практичный способ подобрать настройки для конкретного набора данных.

Основные гиперпараметры дообучения#

Для дообучения обычно требуется корректировать меньше гиперпараметров, чем для обучения с нуля. Наиболее важны следующие параметры:

  • epochs: дообучение сходится быстрее, чем обучение с нуля. Начни с умеренного значения и используй patience, чтобы остановить обучение, когда метрики валидации перестанут улучшаться.
  • patience: значение по умолчанию — 100 — рассчитано на длительное обучение. Уменьши его до 10–20, чтобы не тратить время на обучение, которое уже сошлось.
  • warmup_epochs: в течение первых эпох warmup постепенно доводит скорость обучения до запланированного значения, поэтому ранние батчи с меньшей вероятностью повредят предварительно обученные признаки. При дообучении оставь это значение ненулевым, но полное значение по умолчанию — 3 эпохи — не обязательно: в ходе эволюционного поиска для официального дообучения YOLO26 на COCO — продолжения обучения на нескольких эпохах с весами Objects365 — для моделей всех размеров оптимальным оказалось около одной эпохи.

Полный список параметров обучения см. в справочнике по конфигурации обучения. Если нужные параметры не поддерживаются — например, скорость обучения для каждого слоя, отсечение градиентов или пользовательские метрики валидации — создай подкласс тренера.

Двухэтапное дообучение#

Двухэтапное дообучение разделяет обучение на две фазы. На первом этапе backbone замораживается, а обучаются только neck и head. Это позволяет слоям детекции адаптироваться к новым классам, не нарушая предварительно обученные признаки. На втором этапе все слои размораживаются, и вся модель обучается с более низкой скоростью обучения, чтобы настроить backbone для целевого домена.

Этот подход особенно полезен, если целевой домен значительно отличается от COCO (медицинские изображения, аэрофотоснимки, микроскопия): backbone может потребовать адаптации, но одновременное обучение всех слоёв приведёт к нестабильности. Чтобы автоматически размораживать слои с помощью callback, см. раздел заморозка и разморозка backbone.

Двухэтапное дообучение
from ultralytics import YOLO

# Этап 1: заморозить backbone, обучать head и neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)

# Этап 2: разморозить все слои, дообучать с более низким lr
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, optimizer="AdamW", lr0=0.001, name="stage2", exist_ok=True)

Распространённые проблемы#

Модель не выдаёт предсказаний#

  • Недостаточно обучающих данных: обучение на очень малом количестве примеров — самая распространённая причина. По слишком малому объёму данных модель не может научиться обобщать. Прежде чем искать другие причины, подготовь достаточное количество разнообразных примеров для каждого класса.

  • Проверь пути к данным: недопустимые пути к изображениям вызывают ошибку набора данных. Отсутствующие или пустые файлы разметки отдельных изображений считаются фоновыми и отмечаются при сканировании; если в обучающем подмножестве нет разметки, возникает ошибка. Перед обучением проверь набор данных:

    yolo detect val model=yolo26n.pt data=custom.yaml
  • Снизь порог уверенности: если предсказания есть, но они отфильтровываются, попробуй conf=0.1 во время инференса.

  • Проверь количество классов: убедись, что значение nc в data.yaml совпадает с фактическим количеством классов в файлах разметки.

mAP на валидации перестаёт расти на раннем этапе#

  • Добавь данные: дообучение значительно выигрывает от увеличения объёма обучающих данных, особенно от разнообразных примеров с разными ракурсами, освещением и фоном.
  • Проверь баланс классов: для классов с недостаточным количеством примеров AP будет низким. Добавь больше примеров или настрой cls_pw на валидационном наборе.
  • Уменьши аугментацию: для очень небольших наборов данных сильная аугментация может навредить. Попробуй mosaic=0.5 или mosaic=0.0.
  • Увеличь разрешение: для наборов данных с мелкими объектами попробуй imgsz=1280, чтобы сохранить детали.

После дообучения качество распознавания исходных классов ухудшается#

Это явление называется катастрофическим забыванием: при дообучении исключительно на новых данных модель теряет ранее полученные знания. Без включения изображений из исходного набора данных вместе с новыми данными избежать забывания практически невозможно. Чтобы уменьшить его:

  • Объедини наборы данных: при дообучении добавь примеры исходных классов вместе с новыми. Это единственный надёжный способ предотвратить забывание.
  • Заморозь backbone и neck: если заморозить backbone и neck, чтобы обучался только detection head, это поможет при коротком дообучении с очень низкой скоростью обучения.
  • Уменьши количество эпох: чем дольше модель обучается только на новых данных, тем сильнее забывание.

Часто задаваемые вопросы#

  • Фиксированного минимума нет: результат зависит от сложности задачи, количества классов и сходства домена с COCO. Разнообразие изображений (разное освещение, ракурсы и фоны) важнее их общего количества. Начни с имеющихся данных и увеличивай их объём, если метрики валидации недостаточны.

  • Загрузи предварительно обученный файл .pt и вызови .train(), указав путь к пользовательскому data.yaml. Ultralytics автоматически выполняет перенос весов, переинициализацию detection head и выбор оптимизатора. Полный пример кода см. в разделе базовое дообучение.

  • Самые распространённые причины — недопустимые пути к изображениям, отсутствующие или пустые файлы разметки, несовпадение nc в YAML с фактическими файлами разметки или слишком высокий порог уверенности. Полный список проверок для устранения неполадок см. в разделе распространённые проблемы.

  • Это зависит от размера датасета и сходства доменов. Для небольших датасетов с доменом, похожим на COCO, заморозка базовой сети (freeze=10) предотвращает переобучение. Для доменов, сильно отличающихся от COCO, разморозка всех слоёв (freeze=None) позволяет базовой сети адаптироваться. Подробные рекомендации см. в разделе Заморозка слоёв.

  • Добавь в обучающие данные примеры исходных классов вместе с новыми. Если это невозможно, заморозка большего числа слоёв (freeze=10 или выше) и использование более низкой скорости обучения помогут сохранить знания, полученные при предобучении. Подробнее см. в разделе Ухудшение качества на исходных классах.

Участники

Комментарии