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