Предсказание изображения
Запусти предварительно обученную модель YOLO26 из Python, извлеки из результатов классы, уверенности и координаты рамок в пикселях, а также настрой аргументы, которые помогают устранить большинство пропусков.
Любое реальное применение детектора — подсчёт товаров на полке, обрезка лиц для размытия, отправка рамок в JSON API — начинается с правильного чтения объекта результата. Ошибись в одной детали, например обратись к названиям классов по индексу с помощью тензора, — и приложение упадёт уже на первом изображении.
Предварительно обученная модель YOLO26 для обнаружения объектов уже распознаёт 80 классов COCO. В этом уроке ты запустишь режим Predict из Python, извлечёшь из результатов все полезные поля и узнаешь, какой аргумент менять, если модель пропускает объекты, обнаруживает дубликаты или не замечает мелкие объекты. Позже тот же объект результатов будет возвращаться и для твоей собственной обученной модели.
Практические занятия
Предсказывай и выводи каждый обнаруженный объект#

Вызов модели для источника запускает режим 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.
Настрой предсказание#
Значения по умолчанию подходят для большинства изображений. Если результат тебя не устраивает, меняй по одному аргументу за раз:
| Проблема | Аргумент | По умолчанию | Что изменить |
|---|---|---|---|
| Пропуски: видимый объект не обведён рамкой | conf | 0.25 | Уменьши, например 0.1 |
| Ложные срабатывания: рамки вокруг пустых мест | conf | 0.25 | Увеличь, например 0.5 |
| Две рамки вокруг одного объекта | iou | 0.7 | Уменьши: порог перекрытия (IoU) для объединения дубликатов в NMS |
| Пропускаются мелкие и удалённые объекты | imgsz | 640 | Увеличь, например 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 и используй цикл: результаты поступают по одному. В видеоуроке это подробно разбирается.
Показать решение
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.59summary() уже возвращает обычные названия и числа с плавающей точкой, поэтому преобразовывать тензоры не нужно. Значения уверенности немного отличаются от predict.py, поскольку изображения в списке приводятся к одной общей форме с помощью дополнения. При значении conf=0.1 bus.jpg добавляет знак остановки.