Link to this sectionКак выполнить тонкую настройку YOLO на собственном наборе данных#
Тонкая настройка (fine-tuning) адаптирует предобученную модель для распознавания новых классов, начиная с уже изученных весов, а не со случайной инициализации. Вместо обучения «с нуля» в течение сотен эпох, тонкая настройка использует преимущества признаков предобученной модели COCO и позволяет сойтись к результату на пользовательских данных за долю времени.
В этом руководстве рассматривается тонкая настройка YOLO26 на пользовательских наборах данных — от базового использования до продвинутых методов, таких как заморозка слоев (layer freezing) и двухэтапное обучение (two-stage training).
Link to this sectionТонкая настройка против обучения с нуля#
Предобученная модель уже выучила общие визуальные признаки — обнаружение границ, распознавание текстур, понимание форм — на миллионах изображений. Обучение с переносом знаний (transfer learning) посредством тонкой настройки позволяет повторно использовать эти знания и учит модель только тому, как выглядят новые классы, поэтому она сходится быстрее и требует меньше данных. Обучение «с нуля» отбрасывает всё это и заставляет модель учить всё с самого начала, начиная с паттернов на уровне пикселей, что требует значительно больше ресурсов.
| Дообучение | Обучение с нуля | |
|---|---|---|
| Начальные веса | Предобучены на COCO (80 классов) | Случайная инициализация |
| Команда | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Сходимость | Быстрее — бэкбон уже обучен | Медленнее — все слои учатся с нуля |
| Требования к данным | Ниже — предобученные признаки компенсируют нехватку данных | Выше — модель должна выучить все признаки только из набора данных |
| Когда использовать | Пользовательские классы с естественными изображениями | Домены, принципиально отличающиеся от COCO (медицина, спутники, радары) |
Когда файл .pt загружается с помощью YOLO("yolo26n.pt"), предобученные веса сохраняются в модели. Вызов .train(data="custom.yaml") после этого автоматически переносит все совместимые веса в новую архитектуру модели, переинициализирует любые слои, которые не совпадают (например, голову детекции, когда количество классов отличается), и начинает обучение. Никакой ручной загрузки весов, манипуляций со слоями или специального кода для переноса знаний не требуется.
Link to this sectionКак работает перенос предобученных весов#
Когда предобученная модель проходит тонкую настройку на наборе данных с другим количеством классов (например, с 80 классов COCO на 5 пользовательских), Ultralytics выполняет перенос весов с учетом размерностей:
- Бэкбон и нек переносятся полностью — эти слои извлекают общие визуальные признаки, и их размерности не зависят от количества классов.
- Голова детекции переинициализируется частично — выходные слои классификации (
cv3,one2one_cv3) имеют размерности, связанные с количеством классов (80 против 5), поэтому они не могут быть перенесены и инициализируются случайным образом. Слои регрессии боксов (cv2,one2one_cv2) в голове имеют фиксированные размерности независимо от количества классов, поэтому они переносятся как обычно. - Подавляющее большинство весов переносится при изменении количества классов. Например, тонкая настройка YOLO26n с COCO (80 классов) на набор данных из 5 классов переносит 606 из 708 тензоров весов: переинициализируются только слои классификации, зависящие от количества классов, в то время как бэкбон, нек и ветви регрессии боксов остаются нетронутыми.
Для наборов данных с тем же количеством классов, что и у предобученной модели (например, тонкая настройка весов, предобученных на COCO, на другом наборе из 80 классов), переносится 100% весов, включая голову детекции.
Link to this sectionПример базовой тонкой настройки#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)Link to this sectionВыбор размера модели#
У моделей большего размера больше емкость, но также больше параметров для обновления, что может увеличить риск переобучения при нехватке данных. Практичный подход — начать с модели поменьше (YOLO26n или YOLO26s) и масштабироваться вверх, только если метрики валидации вышли на плато. Оптимальный размер модели зависит от сложности задачи, количества классов, разнообразия набора данных и доступного для развертывания оборудования. См. полную страницу модели YOLO26 для получения сведений о доступных размерах и тестах производительности.
Link to this sectionВыбор оптимизатора и скорости обучения (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.
Link to this sectionЗаморозка слоев (Freezing Layers)#
Заморозка предотвращает обновление определенных слоев во время обучения. Это ускоряет процесс и снижает переобучение (overfitting), если набор данных мал по сравнению с емкостью модели.
Параметр freeze принимает либо целое число, либо список. Целое число freeze=10 замораживает первые 10 слоев (индексы 0-9), что охватывает большую часть бэкбона YOLO26. Бэкбон занимает слои 0-10, поэтому freeze=10 оставляет обучаемым финальный блок C2PSA (слой 10); используй freeze=11, чтобы заморозить весь бэкбон. Список может содержать индексы слоев, например freeze=[0, 3, 5] для частичной заморозки бэкбона, или строки с именами модулей, например freeze=["23.cv2", "23.one2one_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 (медицинские изображения, аэрофотосъемка, микроскопия), где бэкбону может потребоваться адаптация, но одновременное обучение всего приводит к нестабильности. Для автоматической разморозки с использованием обратных вызовов (callbacks) см. Заморозка и разморозка бэкбона.
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=custom.yamlперед обучением, чтобы подтвердить, что метки загружаются корректно. - Понизь порог уверенности (confidence threshold): если предсказания есть, но отфильтровываются, попробуй
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 sectionFAQ#
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 или выше) и использование более низкой скорости обучения помогают сохранить предобученные знания. Более подробно см. в разделе Качество предсказаний исходных классов снижается.