Skip to main content

Как выполнить дообучение (fine-tune) YOLO на собственном наборе данных

Дообучение (fine-tuning) адаптирует предобученную модель к распознаванию новых классов, начиная с уже изученных весов вместо случайной инициализации. Вместо обучения с нуля в течение сотен эпох, дообучение использует преимущества предобученных COCO признаков и сходится на твоих данных гораздо быстрее.

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

Дообучение против обучения с нуля

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

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

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

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

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

  1. Бэкбон и нек переносятся полностью — эти слои извлекают общие визуальные признаки, и их форма не зависит от количества классов.
  2. Детекторная голова частично переинициализируется — слои вывода классификации (cv3, one2one_cv3) имеют формы, привязанные к количеству классов (80 против 5), поэтому они не переносятся и инициализируются случайно. Слои регрессии боксов (cv2, one2one_cv2) в голове имеют фиксированную форму независимо от количества классов, поэтому они переносятся нормально.
  3. Подавляющее большинство весов переносится при изменении количества классов. Только специфические для классификации слои в детекторной голове переинициализируются — бэкбон, нек и ветви регрессии боксов остаются нетронутыми.

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

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

Пример
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)

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

Более крупные модели имеют больше возможностей, но также больше параметров для обновления, что может увеличить риск переобучения при ограниченных тренировочных данных. Начинать с меньшей модели (YOLO26n или YOLO26s) и масштабироваться вверх, только если метрики валидации перестают расти — это практичный подход. Оптимальный размер модели зависит от сложности задачи, количества классов, разнообразия данных и аппаратного обеспечения, доступного для развертывания. Смотри полный странице модели YOLO26 для ознакомления с доступными размерами и эталонными показателями производительности.

Выбор оптимизатора и скорости обучения (Learning Rate)

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

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

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

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

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

Заморозка слоев

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

Метод freeze параметр принимает либо целое число, либо список. Целое число freeze=10 замораживает первые 10 слоев (с 0 по 9, что соответствует бэкбону в YOLO26). Список может содержать индексы слоев, такие как freeze=[0, 3, 5] для частичной заморозки бэкбона, или строки с именами модулей, например freeze=["23.cv2"] для детального контроля над конкретными ветвями внутри слоя.

Пример
model.train(data="custom.yaml", epochs=50, freeze=10)

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

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

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

Ключевые гиперпараметры для дообучения

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

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

Полный список параметров обучения смотри в справочнике конфигурации обучения.

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

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

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

Двухэтапное дообучение
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, lr0=0.001, name="stage2", exist_ok=True)

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

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

  • Недостаточно данных для обучения: обучение на очень малом количестве примеров — самая частая причина: модель не может учиться или обобщать на основе слишком малого объема данных. Убедись, что у тебя достаточно разнообразных примеров для каждого класса, прежде чем искать другие причины.
  • Проверь пути к набору данных: некорректные пути в data.yaml беззвучно создают ноль меток. Запусти yolo detect val model=yolo26n.pt data=your_data.yaml перед обучением, чтобы убедиться, что метки загружаются корректно.
  • Понизь порог уверенности: если предсказания существуют, но отфильтровываются, попробуй conf=0.1 во время инференса.
  • Проверь количество классов: убедись, что nc в data.yaml соответствует фактическому количеству классов в файлах меток.

mAP валидации рано выходит на плато

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

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

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

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

FAQ

Сколько изображений мне нужно для дообучения YOLO?

Фиксированного минимума нет — результаты зависят от сложности задачи, количества классов и того, насколько домен похож на COCO. Более разнообразные изображения (разное освещение, углы, фон) важнее, чем сырое количество. Начни с того, что у тебя есть, и масштабируй, если метрики валидации недостаточны.

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

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

Почему моя дообученная модель YOLO ничего не детектирует?

Самые частые причины — некорректные пути в data.yaml (что беззвучно дает ноль меток), несоответствие nc в YAML и фактических файлов меток, или слишком высокий порог уверенности. См. Распространенные проблемы для полного списка проверки неполадок.

Какие слои YOLO мне следует заморозить для дообучения?

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

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

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

Комментарии