От лаборатории к продакшену
Установи Ultralytics, запусти YOLO26 на собственных изображениях, проверь результаты на соответствие спецификации и выбери следующий шаг.
Десять минут с предобученной моделью помогут ответить на вопрос, от которого зависит весь план: подходит ли готовая модель для твоих классов и камеры или нужны собственные данные? Здесь ты установишь Ultralytics, запустишь YOLO26 на реальных изображениях и сверишь результат со спецификацией, которую составил в первом уроке.
Практические занятия
Установка#
pip install ultralytics
yolo checksПервая команда устанавливает пакет Python ultralytics и команду yolo, а также PyTorch, если он ещё не установлен. Команда yolo checks выводит версии Python, PyTorch и CUDA, а также оборудование, которое будет использовать Ultralytics, чтобы ты мог проверить настройку до запуска. Используй новое виртуальное окружение; в кратком руководстве описана настройка conda, Docker и GPU.
Пакет ultralytics устанавливается на Python 3.8 и новее, но для актуальных выпусков PyTorch нужен Python 3.10 или новее. Если у тебя более старая версия среды, сначала создай новое виртуальное окружение с актуальной версией Python.

Симптом: yolo checks показывает CPU на компьютере с GPU NVIDIA, и инференс работает медленно. Причина: сборка PyTorch только для CPU — например, стандартный wheel pip для Windows. Решение: выбери свою ОС, менеджер пакетов и версию CUDA в селекторе PyTorch выше, выполни предложенную команду, затем переустанови ultralytics. На Mac, как на скриншоте, подходит сборка по умолчанию; Ultralytics использует CPU, если не передать device=mps для работы с GPU Apple.
Первое предсказание#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # при первом использовании загружает нано-модель размером около 5 МБ
results = model("https://ultralytics.com/images/bus.jpg", save=True)
for box in results[0].boxes:
print(model.names[int(box.cls)], round(float(box.conf), 2))Обе команды выводят краткую сводку для каждого изображения и сохраняют изображение с аннотациями в runs/detect/predict:
image 1/1 .../bus.jpg: 640x480 4 persons, 1 bus, 19.7ms
Speed: 0.9ms preprocess, 19.7ms inference, 0.4ms postprocess per image at shape (1, 3, 640, 480)
Results saved to runs/detect/predictРазберём вывод по строкам: изображение уменьшено до 640×480 для инференса; модель нашла четырёх людей и автобус; инференс занял около 20 мс на процессоре ноутбука. Строка Speed — твоя первая проверка задержки: сравни её с частотой кадров, указанной во входных данных спецификации. Открой сохранённое изображение: у каждой рамки есть класс, координаты и оценка уверенности, как в уроке по детекции.
Сверь результаты со спецификацией#
| Вопрос | Если да | Если нет |
|---|---|---|
| Есть ли нужные классы среди 80 классов COCO, известных модели? | Создай прототип без обучения | Тебе нужны размеченные данные и дообучение (руководство по дообучению) |
| На твоих изображениях рамки с оценкой выше порога точно указывают на нужные объекты? | Задача и ракурс совпадают | Возможен сдвиг домена: собери данные с собственных камер |
| Соответствует ли тип выходных данных тому, что требуется для принятия решения? | Оставь эту задачу | Смени веса: -seg, -sem, -depth, -pose, -obb или -cls |
| Достаточно ли быстро модель работает на целевом оборудовании для заданной частоты кадров? | Продолжай | Попробуй модель меньшего размера или оптимизированный формат экспорта |
На первый вопрос есть точный ответ: model.names перечисляет все классы, известные предобученной модели. В спецификации для погрузчика person — это класс COCO, а forklift — нет, поэтому никакой порог не заставит предобученную модель находить погрузчик. Именно такой результат чаще всего получают при первом запуске: модель покрывает лишь часть спецификации. Правильный шаг — создать прототип логики принятия решений для доступных классов, пока ты собираешь набор данных для остальных.
Что меняется в продакшене#
Развёрнутая модель сталкивается с условиями, которых не было в её обучающем наборе: новые камеры, сезоны, продукты, форма. Без переобучения точность снижается; регулярное переобучение на данных, полученных в продакшене, помогает её восстановить:

Каждый урок этого курса помогает выстроить такой цикл: спецификация определяет сбой, аудит покрытия показывает, где искать проблему, линтер разметки и руководство помогают эффективно использовать новые данные, а корректные разбиения и метрики позволяют понять, стала ли переобученная модель действительно лучше. С самого начала придерживайся двух правил: сохраняй примеры входных данных и предсказаний, в том числе с низкой уверенностью, и не меняй зафиксированный тестовый набор, чтобы сравнивать все модели на одних и тех же изображениях. В курсе «Наблюдаемость и дрейф» подробно рассматривается мониторинг дрейфа данных.
Что изучать дальше#
| Курс | Проходи, если |
|---|---|
| Создание высокопроизводительных наборов данных YOLO | Твои классы отсутствуют в предобученной модели или твои сцены отличаются от COCO |
| Обучи свою первую модель YOLO | У тебя есть размеченный набор данных, и ты хочешь выполнить дообучение |
| Ultralytics YOLO в продакшене | У тебя есть модель, и тебе нужны экспорт, трекинг и мониторинг |
| Разработка с помощью Ultralytics Platform | Ты хочешь работать с данными, разметкой, обучением и развёртыванием на одной платформе |
Предпочитаешь работать в браузере? Ultralytics Platform поддерживает тот же цикл — загрузка, аннотирование, обучение, развёртывание — без локальной установки:
Показать решение
from pathlib import Path
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# 1. Which classes in your output line does the pretrained model already know?
spec_classes = {"person", "forklift"}
known = set(model.names.values())
print(f"pretrained: {sorted(spec_classes & known)} needs your own data: {sorted(spec_classes - known)}")
# 2. What does it find on your images?
sources = [
"https://ultralytics.com/images/bus.jpg", # replace with your own images
"https://ultralytics.com/images/zidane.jpg",
]
for source, result in zip(sources, model.predict(sources, conf=0.25, save=True, verbose=False)):
names = [result.names[int(c)] for c in result.boxes.cls]
print(f"{Path(source).name}: {len(names)} detections -> {sorted(set(names))}")pretrained: ['person'] needs your own data: ['forklift']
bus.jpg: 5 detections -> ['bus', 'person']
zidane.jpg: 3 detections -> ['person', 'tie']Для спецификации по погрузчикам: person распознаётся, а forklift — нет. Следующий шаг: прямо сейчас создай прототип правила для зоны на людях с предобученной моделью и начни курс «Создание высокопроизводительных наборов данных YOLO», чтобы собрать и разметить изображения погрузчиков с камер склада.