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