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

Возобновление и итерации

Точно возобнови прерванный запуск, начни новый раунд с best.pt и задай рабочую скорость обучения, а затем сравни запуски рядом.

Реальные проекты состоят из серии запусков обучения. Некоторые прерываются на полпути — из-за закрытого ноутбука, обрыва SSH-соединения или отзыва облачного GPU, — и перезапуск с нуля означает потерю нескольких часов работы. Другие запуски завершаются, и следующий раунд должен опираться на их результаты, а не начинаться заново с COCO.

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

Результат

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

Ускоренное прохождение
Если ты уже освоился, вот краткая версия.
  1. Запуск прервался, но ничего не изменилось? yolo train resume=True model=.../weights/last.pt.

  2. Запуск завершился или ты меняешь данные либо настройки? Начни новый запуск с .../weights/best.pt.

  3. Чтобы задать lr0, также укажи optimizer; при использовании optimizer=auto параметр lr0 игнорируется.

  4. Называй запуски по внесённому изменению, а затем сравнивай их файлы results.csv.

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

Выбери подходящий тип запуска#

Графики обучения Ultralytics Platform показывают динамику потерь и метрик по эпохам для одного запуска

СитуацияТип запускаНачинает с
Отключение электричества, потеря соединения или нехватка памяти посреди запускаВозобновлениеlast.pt вместе с состоянием оптимизатора и расписанием обучения
Запуск завершён; добавлены данные, исправлена разметка или требуется более длительное обучениеДообучение с хороших весовbest.pt в качестве предобученной модели
Добавлены или удалены классы, изменена большая часть разметки или существенно изменился imgszЗапуск с нуляyolo26n.pt

Пример: возобновление прерванного запуска#

resume=True восстанавливает модель, состояние оптимизатора, расписание скорости обучения и счётчик эпох из last.pt, а затем продолжает выполнение исходного плана:

yolo train resume=True model=runs/detect/pills_resume/weights/last.pt

Реальный вывод запуска на 5 эпох, остановленного после второй эпохи:

Resuming training runs/detect/pills_resume/weights/last.pt from epoch 3 to 5 total epochs
        3/5         0G      1.232      2.393   0.005478        206        320: 100% 6/6 4.5s
        4/5         0G      1.345      1.859   0.005833        208        320: 100% 6/6 4.5s
        5/5         0G       1.31      1.625   0.005854        191        320: 100% 6/6 4.4s
3 epochs completed in 0.004 hours.
  • from epoch 3 to 5 total epochs: запуск продолжился точно с момента последней сохранённой эпохи, с первоначальным целевым числом эпох.
  • Ты не передавал data или epochs: все аргументы были взяты из контрольной точки. Некоторые параметры среды выполнения, например batch, device и workers, можно переопределить при возобновлении; остальные игнорируются с предупреждением Resume ignores ....

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

Большинство экспериментов в духе «следующего раунда» — это не возобновление, а новые запуски с последней удачной моделью: обычное переносное обучение в рамках собственного проекта. Задай более низкую скорость обучения, чтобы модель уточняла знания, а не училась заново:

from ultralytics import YOLO

model = YOLO("runs/detect/pills_v1/weights/best.pt")  # начать с весов первого раунда
model.train(
    data="my_dataset/data.yaml",
    epochs=5,
    imgsz=320,
    optimizer="AdamW",  # задать явно: optimizer="auto" игнорирует lr0
    lr0=0.0005,  # ниже, чем автоматически выбранное значение 0.002 в первом раунде
    name="pills_v2_warm",
)

В журнале подтверждается, что настройка применена: optimizer: AdamW(lr=0.0005, momentum=0.937). В руководстве по тонкой настройке описаны заморозка слоёв и двухэтапное обучение; в руководстве по настройке гиперпараметров — поиск по сетке.

Пример: сравнение запусков#

Называй каждый запуск по внесённому изменению — pills_v2_warm, pills_v3_imgsz640, pills_v4_edge_frames, — а не train2 или final. Каждый запуск сохраняет results.csv, поэтому для сравнения хватит нескольких строк:

from pathlib import Path

import pandas as pd

for csv in sorted(Path("runs/detect").glob("*/results.csv")):
    df = pd.read_csv(csv)
    best = df["metrics/mAP50-95(B)"].max()
    print(f"{csv.parent.name:<14} epochs={len(df):<3} best mAP50-95={best:.3f}")
pills_resume   epochs=5   best mAP50-95=0.579
pills_v1       epochs=10  best mAP50-95=0.659
pills_v2_warm  epochs=5   best mAP50-95=0.694

Пять эпох дообучения с хороших весов повысили mAP50-95 с 0.659 до 0.694, тогда как пять эпох с весами COCO (pills_resume) дали лишь 0.579. Дообучение с хороших весов — более быстрый путь к улучшению, если классы и разметка не изменились. После нескольких запусков начинает окупаться система отслеживания экспериментов: Ultralytics Platform (см. Сравнение запусков и выбор лучшего) или интеграции с Comet и Weights & Biases автоматически регистрируют каждый запуск.

Сократи затраты на каждый раунд#

Большинство раундов отвечают на один вопрос, например: «помогли ли новые кадры?». Эти аргументы ускорят получение ответов на этапе экспериментов:

АргументПримерЭффект
fractionfraction=0.5Обучает модель на первой половине обучающих изображений (отсортированных по имени файла)
timetime=0.25Останавливает запуск через 0.25 часа, переопределяя epochs
patiencepatience=10Останавливает запуск, если качество на валидации не улучшалось в течение 10 эпох
imgszimgsz=320Использует вчетверо меньше пикселей, чем размер 640; сравнивай запуски только при одинаковом размере
cachecache=TrueСохраняет декодированные изображения в RAM, чтобы ускорить их загрузку в следующих эпохах

Меняй по одному параметру за раунд и проверь лучший вариант на полном размере перед выпуском. Если понадобится начать с нуля, используй тот же вызов, указав предобученные веса:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # вернуться к весам, предобученным на COCO
model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v3_relabeled")

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

Возобновление завершённого запуска

Симптом: WARNING ⚠️ model '.../last.pt' is not a resumable training checkpoint ... Starting new training instead, за которым следует совершенно новый запуск — на датасете coco8 по умолчанию, если ты не передал data. Причина: resume=True продолжает только запуски, остановленные раньше времени. Решение: останови его и намеренно начни новый запуск с best.pt.

Параметр lr0 молча игнорируется

Симптом: optimizer: 'optimizer=auto' found, ignoring 'lr0=0.0005' and determining best 'optimizer' and 'lr0' automatically... Причина: optimizer=auto по умолчанию выбирает собственную скорость обучения. Решение: явно задай optimizer (например, "AdamW" или "SGD"), если задаёшь lr0, и проверь строку журнала optimizer:.

Повторное использование имён не перезаписывает файлы

Повторный запуск обучения с name="pills_v1" запишет результаты в pills_v1-2, и впоследствии их будет легко перепутать. Используй для каждого запуска новое описательное имя.

Попробовать

Попробуй все три типа запуска. Запусти обучение на 5 эпох под именем pills_resume, останови его после 2-й эпохи (нажми Ctrl+C или используй callback из решения) и возобнови. Обучи pills_v2_warm на лучших весах pills_v1, используя optimizer="AdamW" и lr0=0.0005. Предоставь таблицу compare_runs.py и одно предложение о том, какой запуск ты бы продолжил и почему.

Критерии готовности
Урок считается завершённым, если выполнены все условия ниже.
  • При возобновлении запуска появилось сообщение Resuming training ... from epoch 3, и обучение завершило все 5 эпох.

  • В журнале pills_v2_warm указано AdamW(lr=0.0005, ...), а не сообщение об автоматическом выборе оптимизатора.

  • У тебя есть сравнительная таблица всех запусков с понятными названиями и решение, сформулированное одним предложением.

Показать решение

Если на быстром компьютере сложно поймать момент для Ctrl+C, callback может остановить запуск после 2-й эпохи:

from ultralytics import YOLO

def power_cut(trainer):
    if trainer.epoch == 1:  # Индексация с нуля: остановить после сохранения 2-й эпохи
        raise KeyboardInterrupt

model = YOLO("yolo26n.pt")
model.add_callback("on_model_save", power_cut)
model.train(data="my_dataset/data.yaml", epochs=5, imgsz=320, name="pills_resume")
yolo train resume=True model=runs/detect/pills_resume/weights/last.pt
python round2.py
python compare_runs.py
pills_v2_warm has the best mAP50-95 (0.694 vs 0.659 for pills_v1), with the same
classes and labels, so round three warm-starts from pills_v2_warm/weights/best.pt.
Что дальше

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

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