Перейти к содержанию

Как настроить YOLO пользовательском наборе данных

Тонкая настройка позволяет адаптировать предварительно обученную модель для распознавания новых классов, используя в качестве исходных значений уже выученные веса, а не случайные начальные значения. Вместо обучения с нуля в течение сотен эпох, тонкая настройка использует предварительно обученную COCO и сходится на пользовательских данных за гораздо меньшее время.

В этом руководстве рассматривается настройка модели YOLO26 на пользовательских наборах данных — от базовых принципов использования до таких продвинутых методов, как «замораживание» слоёв и двухэтапное обучение.

Тонкая настройка против обучения с нуля

Предварительно обученная модель уже усвоила общие визуальные особенности — обнаружение краев, распознавание текстур, понимание форм — на основе миллионов изображений. Переносное обучение с помощью тонкой настройки повторно использует эти знания и лишь обучает модель тому, как выглядят новые классы, благодаря чему она быстрее достигает сходимости и требует меньшего объема данных. Обучение с нуля отбрасывает все это и заставляет модель учиться всему с нуля, начиная с паттернов на уровне пикселей, что требует значительно больше ресурсов.

Тонкая настройкаОбучение с нуля
Стартовые весаОбучен на наборе данных COCO 80 классов)Случайная инициализация
КомандаYOLO("yolo26n.pt")YOLO("yolo26n.yaml")
СближениеБыстрее — магистральная сеть уже подготовленаМедленнее — все слои обучаются с нуля
Требования к даннымНижний уровень — предварительно обученные признаки компенсируют недостаток данныхВыше — модель должна обучаться на всех признаках исключительно на основе набора данных
Когда использоватьПользовательские классы с изображениями природыОбласти, принципиально отличающиеся от COCO медицина, спутниковая связь, радиолокация)

Для тонкой настройки не требуется дополнительный код

Когда .pt файл загружен с помощью YOLO("yolo26n.pt"), предварительно обученные веса сохраняются в модели. Вызов .train(data="custom.yaml") После этого все совместимые веса автоматически переносятся в архитектуру новой модели, несовпадающие слои (например, блок распознавания, если количество классов отличается) переинициализируются, и начинается обучение. Ручная загрузка весов, манипуляции со слоями или написание собственного кода для переноса обучения не требуются.

Как работает перенос предварительно обученных весов

Когда предварительно обученная модель подвергается тонкой настройке на наборе данных с другим количеством классов (например, COCO 80 классов COCO на 5 пользовательских классов), Ultralytics перенос весов с учетом формы:

  1. Полная передача информации по «основному» и «шеечному» слоям — эти слои извлекают общие визуальные характеристики, а их формы не зависят от количества классов.
  2. Головка считывания частично переинициализирована - выходные слои классификатора (cv3, one2one_cv3) имеют формы, зависящие от количества классов (80 против 5), поэтому их нельзя переносить, и они инициализируются случайным образом. Слои регрессии с прямоугольниками (cv2, one2one_cv2) в заголовке имеют фиксированную форму независимо от количества классов, поэтому они передаются в обычном режиме.
  3. При изменении количества классов переносится подавляющее большинство весов. Переинициализируются только специфичные для классификации слои в блоке распознавания — ветви основной сети, «шеи» и регрессии «коробки» остаются неизменными.

Для наборов данных, количество классов в которых соответствует количеству классов в предварительно обученной модели (например, при дообучении весов, COCO, на другом наборе данных с 80 классами), переносятся 100 % весов, включая блок обнаружения.

Пример базовой настройки

Пример

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)
yolo detect train model=yolo26n.pt data=path/to/data.yaml epochs=50 imgsz=640

Выбор размера модели

Более крупные модели обладают большей пропускной способностью, но при этом требуют обновления большего количества параметров, что может повысить риск переобучения при ограниченном объеме обучающих данных. Практичным подходом является начало работы с более компактной моделью (YOLO26n или YOLO26s) и переход на более крупную модель только после того, как показатели валидации перестанут расти. Оптимальный размер модели зависит от сложности задачи, количества классов, разнообразия набора данных и аппаратного обеспечения, доступного для развертывания. См. полную страницу модели YOLO26 для ознакомления с доступными размерами и тестами производительности.

Выбор оптимизатора и шага обучения

По умолчанию optimizer=auto Этот параметр выбирает оптимизатор и скорость обучения в зависимости от общего количества итераций обучения:

  • < 10,000 iterations (small datasets or few epochs): AdamW with a low, auto-calculated learning rate
  • > 10 000 итераций (большие наборы данных): MuSGD (гибридныйSGD ) с lr=0,01

Для большинства задач тонкой настройки стандартные настройки работают хорошо без какой-либо ручной настройки. Рекомендуется явно задать настройки оптимизатора в следующих случаях:

  • Тренировка проходит нестабильно (всплески потерь или расхождения): попробуйте optimizer=AdamW, lr0=0.001 для более стабильной сходимости
  • Тонкая настройка большой модели на небольшом наборе данных: более низкая скорость обучения, например lr0=0.001 помогает сохранить предварительно обученные признаки

Автоматический оптимизатор переопределяет ручную настройку lr0

Когда optimizer=auto, функция lr0 и momentum значения игнорируются. Чтобы вручную настроить скорость обучения, явно задайте параметры оптимизатора: optimizer=SGD, lr0=0.005.

Слои замораживания

Замораживание предотвращает обновление определенных слоев во время обучения. Это ускоряет процесс обучения и снижает риск переобучения, когда объем набора данных невелик по сравнению с емкостью модели.

Параметр freeze Параметр принимает либо целое число, либо список. Целое число freeze=10 замораживает первые 10 слоёв (от 0 до 9, что соответствует базовой структуре в YOLO26). Список может содержать индексы слоёв, например freeze=[0, 3, 5] для частичной фиксации магистрали или строки с именами модулей, например freeze=["23.cv2"] для точного управления отдельными ветвями в рамках одного уровня.

Пример

model.train(data="custom.yaml", epochs=50, freeze=10)
model.train(data="custom.yaml", epochs=50, freeze=[0, 1, 2, 3, 4])
# Freeze the box regression branch of the detection head
model.train(data="custom.yaml", epochs=50, freeze=["23.cv2"])

Оптимальная глубина замораживания зависит от того, насколько целевая область похожа на предварительно обученные данные, а также от объема доступных обучающих данных:

СценарийРекомендацияОбоснование
Большой набор данных, схожая областьfreeze=None (по умолчанию)Достаточно данных для адаптации всех слоёв без переобучения
Небольшой набор данных, схожая областьfreeze=10Сохраняет основные характеристики, сокращает количество обучаемых параметров
Очень небольшой набор данныхfreeze=23Обучается только головка обнаружения, что сводит к минимуму риск переобучения
Домен, удаленный от COCOfreeze=NoneОсновные навыки могут не переноситься должным образом и потребуют повторного обучения

Глубину замораживания также можно рассматривать как гиперпараметр — пробовать несколько значений (0, 5, 10) и сравнивать mAP на валидационном наборе данных mAP практичный способ найти оптимальные настройки для конкретного набора данных.

Основные гиперпараметры для тонкой настройки

Тонкая настройка, как правило, требует меньшего количества корректировок гиперпараметров, чем обучение с нуля. Наиболее важными параметрами являются:

  • epochs: Тонкая настройка сходится быстрее, чем обучение с нуля. Начните с умеренного значения и используйте patience прекратить работу на раннем этапе, когда показатели валидации перестают расти.
  • patience: Значение по умолчанию (100) предназначено для длительных циклов обучения. Уменьшение этого значения до 10–20 позволяет избежать потери времени на циклы, которые уже достигли сходимости.
  • warmup_epochs: При использовании разминки по умолчанию (3 эпохи) скорость обучения постепенно увеличивается с нуля, что предотвращает повреждение предварительно обученных характеристик в результате значительных изменений градиента на ранних итерациях. Рекомендуется сохранять настройки по умолчанию даже при тонкой настройке.

Полный список параметров обучения см. в справочнике по настройке обучения.

Двухэтапная точная настройка

Двухэтапная тонкая настройка разделяет обучение на две фазы. На первом этапе «основа» модели фиксируется, а обучение проводится только для «шеи» и «головы», что позволяет слоям распознавания адаптироваться к новым классам без нарушения предварительно обученных характеристик. На втором этапе разблокируются все слои, и модель обучается в полном объеме с более низкой скоростью обучения, чтобы доработать «основу» для целевой области.

Этот подход особенно полезен в тех случаях, когда целевая область значительно отличается от 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)

Распространенные ошибки

Модель не выдает прогнозов

  • Недостаточность обучающих данных: наиболее распространённой причиной является обучение на очень небольшом количестве примеров — модель не может обучиться или обобщить знания на основе слишком малого объёма данных. Прежде чем искать другие причины, убедитесь, что для каждого класса имеется достаточное количество разнообразных примеров.
  • Проверить пути к наборам данных: неверные пути в data.yaml бесшумно создать нулевые метки. Запустить yolo detect val model=yolo26n.pt data=your_data.yaml перед началом обучения, чтобы убедиться, что метки загружаются правильно.
  • Более низкий порог достоверности: если прогнозы есть, но они отфильтровываются, попробуйте conf=0.1 во время инференса.
  • Проверить количество классов: обеспечить nc в data.yaml соответствует фактическому количеству классов в файлах меток.

Уровень mAP быстро mAP

  • Добавьте больше данных: точность модели значительно повышается при использовании дополнительных обучающих данных, особенно разнообразных примеров с различными ракурсами, освещением и фоном.
  • Проверить баланс класса: у недостаточно представленных классов будет низкий AP. Использовать cls_pw чтобы применить взвешивание классов по обратной частоте (начать с cls_pw=0.25 при умеренном дисбалансе увеличьте до 1.0 (при выраженном дисбалансе).
  • Уменьшить увеличение: в случае очень небольших наборов данных чрезмерное расширение данных может принести больше вреда, чем пользы. Попробуйте mosaic=0.5 или mosaic=0.0.
  • Увеличить разрешение: для наборов данных с мелкими объектами попробуйте imgsz=1280 для сохранения деталей.

После тонкой настройки производительность исходных классов снижается

Это явление известно как «катастрофическое забывание» — модель теряет ранее усвоенные знания, если ее обучение проводится исключительно на новых данных. Такое забывание в большинстве случаев неизбежно, если при обучении не использовать изображения из исходного набора данных наряду с новыми данными. Чтобы смягчить эту проблему:

  • Объединение наборов данных: при тонкой настройке включайте примеры из исходных классов наряду с примерами из новых классов. Это единственный надежный способ предотвратить «забывание».
  • Зафиксировать позвоночник и шею: фиксация как позвоночника, так и шеи, при которой обучаются только головки обнаружения, помогает при коротких циклах тонкой настройки с очень низкой скоростью обучения.
  • Сократите количество эпох обучения: чем дольше модель обучается исключительно на новых данных, тем сильнее усиливается эффект забывания.

Часто задаваемые вопросы

Сколько изображений нужно для тонкой настройки YOLO?

Фиксированного минимального значения нет — результаты зависят от сложности задачи, количества классов и степени сходства домена с COCO. Более разнообразные изображения (различные условия освещения, ракурсы, фоны) имеют большее значение, чем простое количество. Начните с того, что у вас есть, и увеличьте объем данных, если показатели валидации окажутся недостаточными.

Как настроить модель YOLO26 на пользовательском наборе данных?

Загрузить предварительно обученную модель .pt файл и вызов .train() с указанием пути к пользовательскому data.yaml. Ultralytics обрабатывает перенос веса, переинициализация головки обнаружения и выбор оптимизатора. См. Основная настройка раздел с полным примером кода.

Почему моя отлаженная YOLO ничего не обнаруживает?

Наиболее распространёнными причинами являются неверные пути в data.yaml (которая без предупреждения генерирует нулевые метки), несоответствие между nc в файлах YAML и в самих файлах меток, либо слишком высокий порог достоверности. См. Распространенные ошибки для просмотра полного списка действий по устранению неполадок.

Какие YOLO следует заморозить для тонкой настройки?

Это зависит от объёма набора данных и степени сходства домена. Для небольших наборов данных, домен которых схож с COCO, фиксация базовой структуры (freeze=10) предотвращает переобучение. Для доменов, значительно отличающихся от COCO, если оставить все слои незамороженными (freeze=None) позволяет магистральной сети адаптироваться. См. Слои замораживания для получения подробных рекомендаций.

Как избежать катастрофического забывания при тонкой настройке YOLO новые классы?

Включите в обучающую выборку примеры из исходных классов наряду с новыми классами. Если это невозможно, зафиксируйте больше слоёв (freeze=10 или выше), а использование более низкой скорости обучения помогает сохранить предварительно обученные знания. См. Производительность оригинальных классов снижается для получения более подробной информации.



📅 Создано 0 дней назад ✏️ Обновлено 0 дней назад
raimbekovm

Комментарии