Meet YOLO26: next-gen vision AI.

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 выполняет перенос весов с учетом размерностей:

  1. Бэкбон и нек переносятся полностью — эти слои извлекают общие визуальные признаки, и их размерности не зависят от количества классов.
  2. Голова детекции переинициализируется частично — выходные слои классификации (cv3, one2one_cv3) имеют размерности, связанные с количеством классов (80 против 5), поэтому они не могут быть перенесены и инициализируются случайным образом. Слои регрессии боксов (cv2, one2one_cv2) в голове имеют фиксированные размерности независимо от количества классов, поэтому они переносятся как обычно.
  3. Подавляющее большинство весов переносится при изменении количества классов. Например, тонкая настройка 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, помогает сохранить предобученные признаки
Автоматический оптимизатор переопределяет ручное значение lr0

Когда выбрано 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Обучается только голова детекции, минимизируя риск переобучения
Домен сильно отличается от COCOfreeze=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 или выше) и использование более низкой скорости обучения помогают сохранить предобученные знания. Более подробно см. в разделе Качество предсказаний исходных классов снижается.

Авторы

Комментарии