Как выполнить дообучение (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 выполняет перенос весов с учетом формы:
- Бэкбон и нек переносятся полностью — эти слои извлекают общие визуальные признаки, и их форма не зависит от количества классов.
- Детекторная голова частично переинициализируется — слои вывода классификации (
cv3,one2one_cv3) имеют формы, привязанные к количеству классов (80 против 5), поэтому они не переносятся и инициализируются случайно. Слои регрессии боксов (cv2,one2one_cv2) в голове имеют фиксированную форму независимо от количества классов, поэтому они переносятся нормально. - Подавляющее большинство весов переносится при изменении количества классов. Только специфические для классификации слои в детекторной голове переинициализируются — бэкбон, нек и ветви регрессии боксов остаются нетронутыми.
Для наборов данных с тем же количеством классов, что и у предобученной модели (например, дообучение весов, предобученных на 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помогает сохранить предобученные признаки
Когда 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 | Обучается только детекторная голова, минимизируя риск переобучения |
| Домен далек от COCO | freeze=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 или выше) и использование более низкой скорости обучения помогает сохранить предобученные знания. См. Производительность падает на исходных классах для получения более подробной информации.