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

Предсказание изображения

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

Любое реальное применение детектора — подсчёт товаров на полке, обрезка лиц для размытия, отправка рамок в JSON API — начинается с правильного чтения объекта результата. Ошибись в одной детали, например обратись к названиям классов по индексу с помощью тензора, — и приложение упадёт уже на первом изображении.

Предварительно обученная модель YOLO26 для обнаружения объектов уже распознаёт 80 классов COCO. В этом уроке ты запустишь режим Predict из Python, извлечёшь из результатов все полезные поля и узнаешь, какой аргумент менять, если модель пропускает объекты, обнаруживает дубликаты или не замечает мелкие объекты. Позже тот же объект результатов будет возвращаться и для твоей собственной обученной модели.

Результат

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

Ускоренное прохождение
Если ты уже освоился, вот краткая версия.
  1. Загрузи модель один раз: model = YOLO('yolo26n.pt'); затем запусти её: result = model(source)[0].

  2. Организуй цикл по result.boxes; преобразуй данные с помощью int(box.cls), float(box.conf), box.xyxy[0].tolist().

  3. Сопоставь индексы классов с названиями с помощью result.names[int(box.cls)].

  4. Настраивай conf, iou, imgsz и classes для каждого вызова.

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

Предсказывай и выводи каждый обнаруженный объект#

Обнаружение объектов Ultralytics YOLO на набережной: рамки с подписями и оценками уверенности вокруг людей, велосипедов, собаки и автомобилей

Вызов модели для источника запускает режим Predict и возвращает список, содержащий по одному объекту Results на каждое изображение. Если изображение одно, обратись к results[0].

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")

result = results[0]
for box in result.boxes:
    name = result.names[int(box.cls)]
    conf = float(box.conf)
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    print(f"{name:>8} {conf:.2f}  ({x1:.0f}, {y1:.0f}) -> ({x2:.0f}, {y2:.0f})")

result.save("bus_annotated.jpg")

Реальный вывод predict.py после обычной строки журнала:

     bus 0.88  (0, 230) -> (803, 751)
  person 0.87  (49, 398) -> (240, 902)
  person 0.86  (223, 405) -> (345, 861)
  person 0.85  (670, 395) -> (810, 880)
  person 0.65  (0, 553) -> (60, 871)

Как его прочитать:

  • bus 0.88: название класса и уверенность. Рамки отсортированы по уверенности, от наибольшей к наименьшей.
  • (0, 230) -> (803, 751): координаты верхнего левого и нижнего правого углов в пикселях исходного изображения размером 810×1080, начало координат — в левом верхнем углу. Эти координаты можно напрямую использовать для обрезки или отрисовки.
  • person 0.65 при (0, 553): у пятого человека, частично скрытого за левым краем изображения, оценка ниже. Частично видимые объекты обычно получают более низкую оценку.

result.save() записывает изображение с аннотациями; result.show() открывает его в окне.

Что содержится в результате#

Для каждой задачи возвращается объект одного типа — Results; меняются только заполненные поля. Полный список полей приведён в руководстве по использованию Python.

АтрибутСодержимое
boxesОбнаруженные объекты: координаты в пикселях xyxy, нормализованные координаты центра в формате xywhn, conf, cls и id при отслеживании объектов
masks, keypoints, obb, probsРезультаты моделей сегментации, оценки позы, OBB и классификации (None для модели обнаружения объектов)
namesСловарь, сопоставляющий индексы классов с названиями классов
orig_img, orig_shapeВходное изображение в виде массива NumPy и его высота × ширина
speedВремя предварительной обработки, инференса и постобработки в мс
path, save_dirИсточник входных данных и место записи результатов

Для обнаружения объектов тебе в основном понадобится boxes — рамки. result.summary() возвращает те же обнаруженные объекты в виде списка обычных словарей, готового для JSON API.

Настрой предсказание#

Значения по умолчанию подходят для большинства изображений. Если результат тебя не устраивает, меняй по одному аргументу за раз:

ПроблемаАргументПо умолчаниюЧто изменить
Пропуски: видимый объект не обведён рамкойconf0.25Уменьши, например 0.1
Ложные срабатывания: рамки вокруг пустых местconf0.25Увеличь, например 0.5
Две рамки вокруг одного объектаiou0.7Уменьши: порог перекрытия (IoU) для объединения дубликатов в NMS
Пропускаются мелкие и удалённые объектыimgsz640Увеличь, например 1280 (округляется до ближайшего числа, кратного 32)
Нужны только некоторые классыclassesвсенапример, classes=[0] для людей
Не то устройствоdeviceавтоматическиcpu, mps или индекс GPU, например 0

Уверенность влияет на результат, а не только на количество обнаруженных объектов. Для одного изображения автобуса:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model("https://ultralytics.com/images/bus.jpg", conf=0.5, classes=[0])  # 4 persons
model("https://ultralytics.com/images/bus.jpg", conf=0.1)  # 5 человек, 1 автобус, 1 знак остановки

При значении conf=0.1 модель также обнаруживает знак остановки, в котором не уверена. Уменьшить conf — самый быстрый способ увидеть, что модель почти обнаружила. Все остальные аргументы перечислены в справочнике по настройкам.

Если предсказание не содержит результатов, действуй по этому алгоритму:

Обработай несколько изображений#

Передай список, папку или шаблон glob, например "photos/*.jpg". По умолчанию Predict использует batch=1; задай batch, чтобы одновременно передать модели несколько изображений: на GPU это значительно быстрее.

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, batch=2):
    print(result.path, len(result.boxes), result.verbose())
image0.jpg 5 4 persons, 1 bus,
image1.jpg 3 2 persons, 1 tie,

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

Индексация имён с помощью тензора

Симптом: KeyError: tensor([5.]). Причина: box.cls и box.conf — тензоры PyTorch, а result.names — словарь с ключами int. Решение: сначала преобразуй их: result.names[int(box.cls)], float(box.conf), box.xyxy[0].tolist().

Загрузка модели при каждом вызове

Симптом: вспомогательная функция, вызывающая YOLO("yolo26n.pt") внутри себя, работает медленно. На процессоре ноутбука повторная загрузка для каждого изображения занимала 71 мс, а с однократно загруженной моделью — 25 мс. Решение: создай модель один раз при запуске и используй её повторно для каждого изображения.

Сотни изображений или любое видео? Обрабатывай их в потоковом режиме

model(list_or_folder) собирает все объекты Results в памяти перед возвратом. Для больших папок и любых видео передай stream=True и используй цикл: результаты поступают по одному. В видеоуроке это подробно разбирается.

Попробовать

Напиши top3.py: один раз загрузи yolo26n.pt, запусти её на bus.jpg, zidane.jpg и одной собственной фотографии. Выведи количество обнаруженных объектов для каждого изображения и названия трёх классов с наибольшей уверенностью. Затем повторно обработай изображение с наименьшим числом обнаруженных объектов, указав conf=0.1, и опиши одним предложением, что появилось.

Критерии готовности
Урок считается завершённым, если выполнены все условия ниже.
  • Твой скрипт выводит количество обнаруженных объектов и три класса с наибольшей уверенностью для каждого изображения, без KeyError.

  • Ты сравнил одно изображение при значениях conf=0.25 и conf=0.1 и отметил, что изменилось.

  • Ты знаешь, какой аргумент изменить при пропусках, появлении дублирующихся рамок и пропуске мелких объектов.

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

model = YOLO("yolo26n.pt")  # load once
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]

for result in model(images, verbose=False):
    top3 = sorted(result.summary(), key=lambda d: d["confidence"], reverse=True)[:3]
    print(f"{result.path}: {len(result.boxes)} detections")
    for d in top3:
        print(f"  {d['name']:>8} {d['confidence']:.2f}")
image0.jpg: 5 detections
       bus 0.90
    person 0.85
    person 0.85
image1.jpg: 3 detections
    person 0.89
    person 0.79
       tie 0.59

summary() уже возвращает обычные названия и числа с плавающей точкой, поэтому преобразовывать тензоры не нужно. Значения уверенности немного отличаются от predict.py, поскольку изображения в списке приводятся к одной общей форме с помощью дополнения. При значении conf=0.1 bus.jpg добавляет знак остановки.

Что дальше

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

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