YOLO Vision 2026:

Как дообучить 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). Совместимые строки с совпадающими названиями классов сопоставляются перед инициализацией несовпадающих строк. Слои регрессии BBox (cv2, one2one_cv2) в detection head имеют фиксированные формы независимо от числа классов, поэтому переносятся обычным образом.
  3. Подавляющее большинство весов переносится при изменении числа классов. Например, при дообучении YOLO26n с COCO (80 классов) на датасете с 5 классами переносятся 606 из 708 тензоров весов, а также любые совместимые строки классификации, сопоставленные по названию.

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

Перенос классов с псевдонимами названий#

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

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

from ultralytics import YOLO

# Source Objects365 v2 name (lowercased) -> target COCO name
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 class names are Title-Cased, so match on the lowercased name
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")  # load pretrained model
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) обучаемым; используй freeze=11, чтобы заморозить весь backbone. Список может содержать индексы слоёв, например freeze=[0, 3, 5], для частичной заморозки backbone или строки с названиями модулей, например freeze=["23.cv2", "23.one2one_cv2"], для точного управления отдельными ветвями внутри слоя (здесь — обеими ветвями регрессии BBox в 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 могут переноситься плохо и требуют повторного обучения

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

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

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

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

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

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

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

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

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

# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)

# Stage 2: unfreeze all, fine-tune with lower 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, заморозка backbone (freeze=10) предотвращает переобучение. Для доменов, сильно отличающихся от COCO, разморозка всех слоёв (freeze=None) позволяет backbone адаптироваться. Подробные рекомендации см. в разделе Заморозка слоёв.

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

Участники

Комментарии