Link to this sectionКак выполнить дообучение YOLO на собственном наборе данных#
Дообучение адаптирует предобученную модель для распознавания новых классов, начиная с изученных весов, а не со случайной инициализации. Вместо обучения с нуля на протяжении сотен эпох, дообучение использует возможности предобученной модели COCO и сходится на пользовательских данных за долю времени.
Это руководство охватывает дообучение YOLO26 на пользовательских наборах данных, от базового использования до продвинутых методов, таких как заморозка слоев и двухэтапное обучение.
Link to this sectionДообучение против обучения с нуля#
Предобученная модель уже изучила общие визуальные признаки — обнаружение границ, распознавание текстур, понимание форм — на миллионах изображений. Transfer learning посредством дообучения повторно использует эти знания и только обучает модель тому, как выглядят новые классы, поэтому она сходится быстрее и требует меньше данных. Обучение с нуля отбрасывает всё это и заставляет модель изучать всё с нуля, начиная с попиксельных паттернов, что требует значительно больше ресурсов.
| Дообучение | Обучение с нуля | |
|---|---|---|
| Начальные веса | Предобучены на COCO (80 классов) | Случайная инициализация |
| Команда | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Сходимость | Быстрее — бэкбон уже обучен | Медленнее — все слои обучаются с нуля |
| Требования к данным | Ниже — предобученные признаки компенсируют нехватку данных | Выше — модель должна изучить все признаки только на основе набора данных |
| Когда использовать | Пользовательские классы с естественными изображениями | Домены, принципиально отличающиеся от COCO (медицина, спутниковые снимки, радары) |
Когда файл .pt загружается с помощью YOLO("yolo26n.pt"), предобученные веса сохраняются в модели. Вызов .train(data="custom.yaml") после этого автоматически переносит все совместимые веса в новую архитектуру модели, переинициализирует любые несовпадающие слои (например, детектирующую голову при другом количестве классов) и начинает обучение. Никакой ручной загрузки весов, манипуляций со слоями или специального кода для transfer learning не требуется.
Link to this sectionКак работает перенос предобученных весов#
Когда предобученная модель дообучается на наборе данных с другим количеством классов (например, с 80 классов COCO на 5 пользовательских), Ultralytics выполняет перенос весов с учетом формы:
- Бэкбон и шея переносятся полностью — эти слои извлекают общие визуальные признаки, и их формы не зависят от количества классов.
- Детектирующая голова переинициализируется частично — выходные слои классификации (
cv3,one2one_cv3) имеют формы, привязанные к количеству классов (80 против 5), поэтому они не могут быть перенесены и инициализируются случайно. Слои регрессии ограничивающих рамок (BBox) (cv2,one2one_cv2) в голове имеют фиксированные формы независимо от количества классов, поэтому они переносятся нормально. - Подавляющее большинство весов переносится при изменении количества классов. Переинициализируются только специфичные для классификации слои в детектирующей голове — бэкбон, шея и ветви регрессии BBox остаются нетронутыми.
Для наборов данных с тем же количеством классов, что и у предобученной модели (например, дообучение весов, предобученных на COCO, на другом наборе из 80 классов), переносится 100% весов, включая детектирующую голову.
Link to this sectionПример базового дообучения#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)Link to this sectionВыбор размера модели#
Модели большего размера обладают большей емкостью, но и большим количеством параметров для обновления, что может увеличить риск переобучения, когда обучающих данных недостаточно. Практичный подход — начать с модели меньшего размера (YOLO26n или YOLO26s) и увеличивать её только в том случае, если показатели валидации выходят на плато. Оптимальный размер модели зависит от сложности задачи, количества классов, разнообразия набора данных и оборудования, доступного для развертывания. Полный список доступных размеров и показателей производительности смотри на странице модели YOLO26.
Link to this sectionВыбор оптимизатора и скорости обучения#
Настройка по умолчанию 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.
Link to this sectionЗаморозка слоев#
Заморозка предотвращает обновление определенных слоев во время обучения. Это ускоряет процесс и уменьшает overfitting, когда набор данных мал относительно емкости модели.
Параметр 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 на валидации является практическим способом найти лучшие настройки для конкретного набора данных.
Link to this sectionКлючевые гиперпараметры для дообучения#
Дообучение обычно требует меньше корректировок гиперпараметров, чем обучение с нуля. Наиболее важные параметры:
epochs: Дообучение сходится быстрее, чем обучение с нуля. Начни с умеренного значения и используйpatienceдля ранней остановки, когда показатели валидации выходят на плато.patience: Значение 100 по умолчанию предназначено для длительных циклов обучения. Снижение этого значения до 10-20 позволит не тратить время на прогоны, которые уже сошлись.warmup_epochs: Стандартный прогрев (3 эпохи) постепенно увеличивает скорость обучения с нуля, что предотвращает повреждение предобученных признаков в ранних итерациях из-за больших обновлений градиента. Рекомендуется сохранить значение по умолчанию даже для дообучения.
Полный список параметров обучения см. в справочнике конфигурации обучения.
Link to this sectionДвухэтапное дообучение#
Двухэтапное дообучение разделяет процесс на две фазы. Первый этап замораживает бэкбон и обучает только шею и голову, позволяя детектирующим слоям адаптироваться к новым классам, не нарушая предобученные признаки. Второй этап размораживает все слои и обучает полную модель с более низкой скоростью обучения, чтобы донастроить бэкбон под целевой домен.
Этот подход особенно полезен, когда целевой домен значительно отличается от COCO (медицинские изображения, аэрофотосъемка, микроскопия), где бэкбону может потребоваться адаптация, но обучение всего сразу вызывает нестабильность. Для автоматической разморозки с использованием колбэков см. Заморозка и разморозка бэкбона.
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)Link to this sectionЧастые ошибки#
Link to this sectionМодель не выдает предсказаний#
- Недостаточно данных для обучения: обучение на очень малом количестве образцов — самая частая причина; модель не может выучить или обобщить данные. Убедись, что на каждый класс приходится достаточно разнообразных примеров, прежде чем исследовать другие причины.
- Проверь пути к набору данных: некорректные пути в
data.yamlприводят к тому, что метки не считываются. Запустиyolo detect val model=yolo26n.pt data=your_data.yamlперед обучением, чтобы подтвердить, что метки загружаются корректно. - Снизь порог достоверности: если предсказания есть, но отфильтровываются, попробуй
conf=0.1во время инференса. - Проверь количество классов: убедись, что
ncвdata.yamlсовпадает с фактическим количеством классов в файлах разметки.
Link to this sectionmAP на валидации выходит на плато слишком рано#
- Добавь больше данных: дообучение значительно выигрывает от дополнительных обучающих данных, особенно разнообразных примеров с разными ракурсами, освещением и фонами.
- Проверь баланс классов: недопредставленные классы будут иметь низкий AP. Используй
cls_pwдля применения весов классов, обратно пропорциональных их частоте (начни сcls_pw=0.25для умеренного дисбаланса, увеличивай до1.0при сильном дисбалансе). - Уменьши аугментацию: для очень маленьких наборов данных сильная аугментация может приносить больше вреда, чем пользы. Попробуй
mosaic=0.5илиmosaic=0.0. - Увеличь разрешение: для наборов данных с маленькими объектами попробуй
imgsz=1280, чтобы сохранить детализацию.
Link to this sectionКачество работы на исходных классах падает после дообучения#
Это известно как катастрофическое забывание — модель теряет ранее изученные знания при дообучении исключительно на новых данных. Забывание практически неизбежно без добавления изображений исходного набора данных к новым. Чтобы смягчить это:
- Объедини наборы данных: включай примеры исходных классов наряду с новыми при дообучении. Это единственный надежный способ предотвратить забывание.
- Заморозь бэкбон и шею: заморозка бэкбона и шеи, чтобы обучалась только детектирующая голова, помогает при коротких сессиях дообучения с очень низкой скоростью обучения.
- Обучай меньше эпох: чем дольше модель обучается исключительно на новых данных, тем сильнее усиливается забывание.
Link to this sectionЧасто задаваемые вопросы (FAQ)#
Link to this sectionСколько изображений мне нужно для дообучения YOLO?#
Фиксированного минимума нет — результаты зависят от сложности задачи, количества классов и того, насколько домен близок к COCO. Более разнообразные изображения (разное освещение, углы, фоны) важнее, чем их общее количество. Начни с того, что есть, и масштабируй, если показатели валидации недостаточны.
Link to this sectionКак мне дообучить YOLO26 на пользовательском наборе данных?#
Загрузи предобученный файл .pt и вызови .train() с путем к пользовательскому файлу data.yaml. Ultralytics автоматически обрабатывает перенос весов, переинициализацию детектирующей головы и выбор оптимизатора. См. раздел Базовое дообучение для получения полного примера кода.
Link to this sectionПочему моя дообученная модель YOLO ничего не детектирует?#
Наиболее частые причины: некорректные пути в data.yaml (из-за чего метки не считываются), несовпадение количества nc в YAML и фактических файлов разметки, или слишком высокий порог достоверности. См. Частые ошибки для получения полного чек-листа по устранению неполадок.
Link to this sectionКакие слои YOLO мне стоит заморозить для дообучения?#
Это зависит от размера набора данных и сходства доменов. Для маленьких наборов данных с доменом, близким к COCO, заморозка бэкбона (freeze=10) предотвращает переобучение. Для доменов, сильно отличающихся от COCO, оставление всех слоев незамороженными (freeze=None) позволяет бэкбону адаптироваться. Подробные рекомендации см. в разделе Заморозка слоев.
Link to this sectionКак мне предотвратить катастрофическое забывание при дообучении YOLO на новых классах?#
Включи примеры исходных классов в обучающие данные вместе с новыми. Если это невозможно, заморозка большего количества слоев (freeze=10 или выше) и использование более низкой скорости обучения поможет сохранить предобученные знания. Подробности см. в разделе Качество работы на исходных классах падает.