Ultralytics YOLO27: Встать в лист ожидания.
Get Started
Обучи первую модель YOLO·Обучение·Урок 6/10
Урокначинающий

Обучи свою первую модель

Дообучи YOLO26 на своём датасете одной командой, следи за журналом обучения в реальном времени построчно и найди best.pt и важные графики в папке запуска.

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

В этом уроке ты будешь обучать модель на датасете таблеток, проследишь, как mAP50-95 вырастет с почти нулевого базового значения до 0.66 за десять эпох, и научишься по журналу заранее понимать, идёт ли обучение нормально или зря тратит твоё время.

Результат

Ты умеешь запускать дообучение YOLO26, оценивать по журналу каждой эпохи, идёт ли обучение нормально, и находить чекпойнт и нужные графики в папке запуска.

Ускоренное прохождение
Если ты уже освоился, вот краткая версия.
  1. YOLO('yolo26n.pt').train(data='my_dataset/data.yaml', epochs=10, imgsz=320, name='pills_v1') на CPU.

  2. На GPU используй параметры по умолчанию: epochs=100, imgsz=640.

  3. Нормальный ход обучения: значения потерь снижаются, mAP50-95 растёт, точность и полнота остаются сбалансированными.

  4. Сначала открой train_batch0.jpg; для всего остального используй weights/best.pt.

Практические занятия

Пример: обучение детектора таблеток#

Диалог обучения Ultralytics Platform, вкладка Cloud: параметры модели, датасета, эпох и GPU для запуска обучения в облаке

В диалоге Train New Model на Ultralytics Platform нужно выбрать те же параметры, что и в коде ниже: базовую модель, датасет, количество эпох и размер изображения. Обучение можно запустить на облачных GPU или получить соответствующую команду для локального запуска. С этими параметрами обучение на CPU ноутбука займёт около минуты:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # предобучена на COCO
results = model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v1")
print(results.save_dir)

CLI и Python дают одинаковый результат. epochs=10 и imgsz=320 сокращают время запуска на CPU; при наличии GPU убери оба параметра и используй значения по умолчанию (epochs=100, imgsz=640), поскольку большее число эпох и пикселей почти всегда помогает. Режим Train выполняет за тебя следующий цикл:

Разбери журнал построчно#

Реальный вывод, сокращённый до первых и последних двух эпох:

optimizer: AdamW(lr=0.002, momentum=0.9) with parameter groups ...
Using 92 train, 23 val images for fraction=1.0 at imgsz=320
      Epoch    GPU_mem   box_loss   cls_loss    l1_loss  Instances       Size
       1/10         0G      1.818      3.899   0.008805        206        320: 100% 6/6 3.3s
                   all         23        399      0.957      0.805      0.927      0.548
       2/10         0G      1.434      3.291   0.006285        208        320: 100% 6/6 4.4s
                   all         23        399      0.953      0.911      0.964      0.592
       ...
       9/10         0G      1.121      1.103   0.005143        194        320: 100% 6/6 5.0s
                   all         23        399      0.949      0.957      0.975      0.656
      10/10         0G      1.174      1.125   0.005068        212        320: 100% 6/6 5.1s
                   all         23        399       0.97      0.957      0.977      0.659
10 epochs completed in 0.015 hours.
  • optimizer: AdamW(lr=0.002 ...): оптимизатор и скорость обучения за тебя выбрал параметр optimizer=auto, установленный по умолчанию.
  • Using 92 train, 23 val images: проверь, что эти значения соответствуют твоему датасету. Меньшее число означает, что часть изображений пропущена.
  • GPU_mem 0G: обучение идёт на CPU. На GPU здесь отображалась бы используемая память; 0G на компьютере с GPU означает, что GPU не используется.
  • Первая строка каждой эпохи: три значения потерь на обучающей выборке, количество размеченных объектов в последнем батче (Instances) и размер изображения.
  • Строка all каждой эпохи: точность, полнота, mAP50 и mAP50-95 на валидационной выборке. Именно на неё нужно смотреть.
СтолбецЗначениеНормальная динамика
box_lossНасколько предсказанные рамки отличаются от размеченныхСнижается, затем выходит на плато
cls_lossНасколько ошибочны оценки классовСнижается, затем выходит на плато
l1_lossНепосредственная ошибка координат рамок YOLO26Снижается
P, RТочность и полнота на валидационной выборкеРастут и остаются сбалансированными
mAP50, mAP50-95Качество детекции; mAP50-95 также учитывает точность рамокРастёт, затем выходит на плато

Здесь mAP50-95 вырос с базового значения 0.0002 до 0.548 после одной эпохи и 0.659 после десяти. На четвёртой эпохе точность снизилась до 0.80, а затем восстановилась: результаты отдельных эпох на 23 валидационных изображениях нестабильны, поэтому оценивай общую динамику, а не одну строку. Как принимать решения во время обучения:

  • Потери снижаются, mAP растёт: дай обучению продолжиться.
  • Потери не меняются с первой эпохи: останови обучение сочетанием Ctrl+C и проверь разметку и YAML.
  • Точность намного выше полноты: модель слишком осторожна и пропускает объекты. Полнота намного выше точности: модель обнаруживает объекты там, где их нет.
  • mAP долго не меняется: дополнительные эпохи не помогут; измени данные или imgsz.

Три значения потерь — компоненты функции потерь YOLO26; в руководстве по метрикам производительности подробно объясняется каждая метрика.

Посмотри, что сохранил запуск#

Все файлы сохраняются в runs/detect/pills_v1/:

ФайлНазначение
weights/best.ptЧекпойнт с наилучшей валидационной оценкой за все эпохи; используй его для инференса и экспорта
weights/last.ptПоследний чекпойнт; используется для возобновления прерванного запуска
args.yamlВсе аргументы, использованные при запуске, — для его воспроизведения
results.csv, results.pngПотери и метрики по эпохам в виде данных и графиков
labels.jpgРаспределение классов и гистограммы размеров и положений рамок
train_batch*.jpgАугментированные батчи обучения с отрисованными метками
val_batch*_labels.jpg, val_batch*_pred.jpgЭталонные разметки и предсказания на валидационных изображениях
confusion_matrix*.png, Box*_curve.pngМатрица ошибок, а также кривые точности, полноты, F1 и PR

Прежде всего открой train_batch0.jpg. Если рамки не совпадают с объектами, значит, разметка неверна, и никакое количество эпох это не исправит.

Сначала измени эти аргументы#

АргументПо умолчаниюКогда менять
epochs100Короткие эксперименты на CPU или небольшие датасеты, на которых начинается переобучение (уменьши значение); большие датасеты, на которых качество продолжает улучшаться (увеличь, до 200–300)
imgsz640Небольшие объекты (увеличь до 1024 или 1280) или эксперименты на CPU (уменьши)
batch16Размер батча: уменьши при нехватке памяти или используй -1, чтобы автоматически подобрать размер примерно под 60% памяти GPU
patience100Досрочно останови обучение, если валидационная оценка не улучшалась N эпох, например patience=20
deviceавтоматическиПринудительно выбери cpu, mps, индекс GPU, например 0, или несколько GPU, например [0, 1]
nametrainВсегда давай запускам имена, отражающие внесённые изменения
model.train(data="my_dataset/data.yaml", epochs=200, imgsz=1024, batch=-1, patience=20, name="pills_v1_1024")

Ранняя остановка: ошибка на валидационной выборке достигает минимума, а точность — максимума, хотя ошибка на обучающей выборке продолжает снижаться; это и есть момент для остановки

Значение patience по умолчанию — 100, поэтому запуск на 100 эпох никогда не остановится досрочно. Меньшее значение остановит застопорившийся запуск в момент, указанный кривыми выше; в любом случае сохраняется best.pt.

При использовании нескольких GPU передай список, например device=[0, 1, 2, 3]: Ultralytics сама запускает распределённое обучение с параллельной обработкой данных (DDP), batch задаёт общее число эпох для всех GPU, а при обучении по умолчанию используется смешанная точность (amp=True). Когда возможностей ноутбука станет недостаточно, тот же датасет и те же аргументы можно использовать для обучения на облачных GPU через Ultralytics Platform; подробнее об этом рассказывается в разделе «Обучение, просмотр и дообучение запусков».

Избегай этих ошибок#

Случайное обучение с нуля

Симптом: mAP близка к нулю после многих эпох на небольшом датасете. Причина: модель была загружена из yolo26n.yaml (случайные веса), а не из yolo26n.pt. Решение: всегда начинай с предобученной модели .pt. Обучение с нуля оправдано только для исследований бэкбона или очень больших датасетов.

Недостаточно памяти GPU

Симптом: CUDA out of memory в первой эпохе. Решение: уменьши batch вдвое или задай batch=-1, чтобы AutoBatch выбрал подходящий размер. Уменьшение imgsz тоже помогает, но меняет то, что может увидеть модель.

Развёртывай best.pt, а не last.pt

last.pt — это последняя эпоха, результат которой может быть хуже, чем у более ранней. best.pt — эпоха с лучшим показателем качества на валидации; именно её результат нужно проверять, экспортировать и использовать.

В руководстве по советам для обучения модели описаны остальные аргументы, а в руководстве по настройке гиперпараметров — подбор скорости обучения и генетический оптимизатор. В руководстве по дообучению описана заморозка слоёв.

Попробовать

Обучи yolo26n.pt на my_dataset/data.yaml с параметром epochs=10, imgsz=320, name='pills_v1' (или со значениями по умолчанию на GPU). Подготовь краткий отчёт о запуске: итоговые mAP50 и mAP50-95 рядом с базовыми значениями из предыдущего урока, номер эпохи, после которой mAP50-95 перестал заметно улучшаться, и ответ «да» или «нет» на вопрос, совпадают ли рамки в train_batch0.jpg с таблетками.

Коммит
git add -A && git commit -m "feat(model): trained first pill detector"
Критерии готовности
Урок считается завершённым, если выполнены все условия ниже.
  • Файл runs/detect/pills_v1/weights/best.pt существует.

  • В отчёте указано итоговое значение mAP50-95, заметно превышающее базовый результат предварительно обученной модели.

  • Ты проверил train_batch0.jpg и results.png и отметил, когда mAP вышел на плато.

Показать решение
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v1")
print(results.save_dir)  # runs/detect/pills_v1
Baseline (yolo26n.pt, no pill class): mAP50 0.001, mAP50-95 0.0002
pills_v1 (10 epochs, imgsz 320, CPU, ~1 min): mAP50 0.977, mAP50-95 0.659
Plateau: mAP50-95 gains shrink after epoch 8 (0.649 -> 0.656 -> 0.659)
train_batch0.jpg: yes, boxes sit on the pills

Точные значения немного отличаются в зависимости от оборудования и версии пакета.

Что дальше

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

Войди, чтобы сохранять прогресс