YOLOE: детектирование и сегментация в реальном времени с открытым словарем#
Ultralytics YOLOE (Real-Time Seeing Anything) — это модель для детекции с открытым словарем и сегментации экземпляров: вместо списка классов, зафиксированного при обучении, она принимает категории, нужные тебе в момент инференса, в виде текстового промпта, визуального примера или встроенного словаря из 4585 наименований. Созданная на базе архитектур Ultralytics YOLO — YOLOv8, YOLO11 и YOLO26 — и вдохновленная YOLO-World, YOLOE достигает передовой zero-shot точности при скорости работы, близкой к закрытым моделям YOLO.
Watch: How to use Ultralytics YOLOE-26 (New) | Open Vocabulary & Real-Time Seeing Anything 🚀
Быстрый старт#
Укажи нужные классы и запускай. YOLOE-26 возвращает боксы и маски сегментации экземпляров для категорий, на которых модель никогда не обучалась.
from ultralytics import YOLOE
model = YOLOE("yoloe-26s-seg.pt")
# "double-decker bus" is not a COCO class; YOLOE resolves it from the words alone
model.set_classes(["double-decker bus", "person"])
results = model.predict("https://ultralytics.com/images/bus.jpg")
results[0].show()Первый вызов set_classes() загружает текстовый энкодер; ознакомься с разделом Установка и требования перед развертыванием на машине без доступа к сети.
Выбор режима промптов#
YOLOE поддерживает три режима промптов, и от выбора зависит, какой чекпоинт ты загружаешь и как выглядят метки классов. Выбери строку, соответствующую тому, что ты можешь предоставить во время инференса.

| Режим | Чекпоинт | Что ты предоставляешь | Имена классов в результатах | Используй, когда |
|---|---|---|---|---|
| Текстовый промпт | *-seg.pt | Имена классов в виде строк | Точно те имена, которые ты передал | Ты можешь описать цель словами — самый обычный выбор |
| Визуальный промпт | *-seg.pt | Примеры боксов на эталонном изображении | Общие object0, object1, … | Ты не можешь выразить цель словами: конкретная деталь, логотип или дефект |
| Без промпта | *-seg-pf.pt | Ничего | Имена из встроенного словаря на 4585 наименований | Ты занимаешься каталогизацией или исследованием и заранее не знаешь, что искать |
- Визуальные промпты не переносят твои метки. Идентификационные номера классов в
visual_promptsобъединяют примеры в группы; модель сообщает о них как оobject0,object1и так далее. Сопоставляй их со своими именами самостоятельно. - Чекпоинты без промптов отклоняют
set_classes(). Вызов этой функции для модели*-seg-pf.ptвызываетAssertionError: Prompt-free model does not support setting classes. Please try with Text/Visual prompt models.. Вместо этого загрузи чекпоинт*-seg.pt, когда тебе понадобятся твои собственные классы.
Установка и требования#
YOLOE поставляется в составе основного пакета Ultralytics:
pip install -U ultralyticsДля текстовых промптов поверх этого требуется текстовый энкодер, который загружается при первом использовании, а не во время установки:
- Первый вызов
set_classes()устанавливает ultralytics/CLIP из GitHub вместе сpip(он предоставляет токенизатор) и скачивает текстовый энкодер TorchScript в текущую рабочую директорию. YOLOE-26 загружаетmobileclip2_b.ts, размером около 254 МБ; YOLOE-11 и YOLOE-v8 загружаютmobileclip_blt.ts. Запусти загрузку один раз из той директории, из которой будешь запускать код, или скопируй файл туда, иначе он будет скачан заново. - Оба шага требуют доступа к сети, поэтому выполни одно предсказание с промптом перед развертыванием на офлайн-машине или машине с изолированной сетью (air-gapped).
- Визуальные промпты и чекпоинты без промптов вообще не требуют текстового энкодера.
Чекпоинты YOLOE-26 требуют ultralytics 8.4.0 или новее; семейства YOLOE-11 и YOLOE-v8 доступны в более ранних релизах. Одно предсказание с текстовым промптом проверяет весь путь целиком — скачивание чекпоинта, установку CLIP, текстовый энкодер, инференс:
yolo predict model=yoloe-26s-seg.pt source="https://ultralytics.com/images/bus.jpg" classes="person"Чтобы полностью пропустить скачивание текстового энкодера во время инференса, зашей промпты в веса один раз и используй их повторно — см. Повторное использование эмбеддингов промптов.
Обзор архитектуры#
YOLOE сохраняет стандартную структуру YOLO — сверточный бэкбон (backbone) для извлечения признаков, нек (neck) для многомасштабного слияния и безакорную, разделенную голову (anchor-free, decoupled head), прогнозирующую классы и боксы, — и добавляет три модуля, по одному на каждый режим промптов:
- Репараметризуемое выравнивание регионов и текста (RepRTA) уточняет текстовые эмбеддинги из CLIP через небольшую вспомогательную сеть. Эта сеть запускается один раз за вызов
set_classes()и сворачивается при экспорте, поэтому она ничего не стоит на один кадр. То, что действительно работает при каждом прямом проходе (forward pass) — это сравнение сохраненных эмбеддингов промптов с признаками регионов; см. раздел Ограничения, чтобы узнать, во сколько это обходится при большом наборе промптов. - Энкодер визуальных промптов с активацией семантики (SAVPE) кодирует семантические признаки и признаки активации из примера бокса, настраивая модель на объекты, которые выглядят похоже. Это путь один-выстрел (one-shot) для целей, которые трудно назвать словами, таких как логотип или конкретная деталь.
- Ленивое сопоставление промптов по регионам (LRPC) сопоставляет эмбеддинги регионов со встроенным словарем на 4585 наименований, поэтому чекпоинты без промптов распознают объекты без внешнего промпта и без текстового энкодера.
Сегментация экземпляров обеспечивается веткой масок на голове детекции, как в YOLOv8-Seg, и каждое предсказание несет маску на results[0].masks. После того как модель экспортирована, модули открытого мира репараметризуются в стандартную голову YOLO, поэтому экспортированный файл выполняет обычный путь детекции/сегментации.
Доступные модели#
Каждый чекпоинт ниже представляет собой модель сегментации экземпляров и поддерживает валидацию (val), предсказание (predict), экспорт (export) и трекинг (track). Загружай файл *-seg.pt для текстовых или визуальных промптов и файл *-seg-pf.pt для инференса без промптов; они не взаимозаменяемы, см. раздел Выбор режима промптов. Только файлы *-seg.pt поддерживают обучение (train); чекпоинт без промптов создается из обученной модели с текстовыми промптами, см. раздел Обучение официальных моделей с нуля.
| Модель | Текстовый / визуальный промпт | Без промпта |
|---|---|---|
| YOLOE-26n | yoloe-26n-seg.pt | yoloe-26n-seg-pf.pt |
| YOLOE-26s | yoloe-26s-seg.pt | yoloe-26s-seg-pf.pt |
| YOLOE-26m | yoloe-26m-seg.pt | yoloe-26m-seg-pf.pt |
| YOLOE-26l | yoloe-26l-seg.pt | yoloe-26l-seg-pf.pt |
| YOLOE-26x | yoloe-26x-seg.pt | yoloe-26x-seg-pf.pt |
| YOLOE-11s | yoloe-11s-seg.pt | yoloe-11s-seg-pf.pt |
| YOLOE-11m | yoloe-11m-seg.pt | yoloe-11m-seg-pf.pt |
| YOLOE-11l | yoloe-11l-seg.pt | yoloe-11l-seg-pf.pt |
| YOLOE-v8s | yoloe-v8s-seg.pt | yoloe-v8s-seg-pf.pt |
| YOLOE-v8m | yoloe-v8m-seg.pt | yoloe-v8m-seg-pf.pt |
| YOLOE-v8l | yoloe-v8l-seg.pt | yoloe-v8l-seg-pf.pt |
Производительность YOLOE на LVIS#
Результаты zero-shot на мини-выборке LVIS (minival) при 640 пикселях из статьи Ultralytics YOLO26.
Текстовые и визуальные промпты#
Каждая ячейка точности и параметров читается как текстовый промпт / визуальный промпт; FLOPs указаны один раз. Параметры и FLOPs приведены для конфигурации детекции, оцениваемой в статье. Точность соответствует показателю Non-E2E из статьи — единственному протоколу, который она сообщает для каждой модели в сравнении; голова end-to-end модели YOLOE-26 отстает от него не более чем на 1.1 AP при текстовых промптах и на 2.6 AP при визуальных промптах.
| Модель | mAP50-95 | mAPr | mAPc | mAPf | параметры (М) | FLOPs (Б) |
|---|---|---|---|---|---|---|
| YOLOE-26n | 24.7 / 21.9 | 20.5 / 17.6 | 24.1 / 22.3 | 26.1 / 22.4 | 3.9 / 3.1 | 6.1 |
| YOLOE-26s | 30.8 / 28.6 | 23.9 / 25.1 | 29.6 / 27.8 | 33.0 / 29.9 | 10.7 / 11.0 | 21.9 |
| YOLOE-26m | 35.4 / 33.9 | 31.1 / 33.4 | 34.7 / 34.0 | 36.9 / 33.8 | 21.3 / 25.1 | 70.6 |
| YOLOE-26l | 37.8 / 36.3 | 35.1 / 37.6 | 37.6 / 36.2 | 38.5 / 36.1 | 25.5 / 29.3 | 89.0 |
| YOLOE-26x | 40.6 / 38.5 | 37.4 / 35.3 | 40.9 / 38.8 | 41.0 / 38.8 | 55.2 / 65.2 | 197.7 |
| YOLOE-11s | 27.5 / 26.3 | 21.4 / 22.5 | 26.8 / 27.1 | 29.3 / 26.4 | 10.7 / 10.9 | 22.7 |
| YOLOE-11m | 33.0 / 31.4 | 26.9 / 27.1 | 32.5 / 31.9 | 34.5 / 31.7 | 21.0 / 24.8 | 70.4 |
| YOLOE-11l | 35.2 / 33.7 | 29.1 / 28.1 | 35.0 / 34.6 | 36.5 / 33.8 | 26.0 / 29.8 | 89.5 |
| YOLOE-v8s | 27.9 / 26.2 | 22.3 / 21.3 | 27.8 / 27.7 | 29.0 / 25.7 | 12.3 / 12.6 | 29.8 |
| YOLOE-v8m | 32.6 / 31.0 | 26.9 / 27.0 | 31.9 / 31.7 | 34.4 / 31.1 | 26.4 / 28.4 | 80.7 |
| YOLOE-v8l | 35.9 / 34.2 | 33.2 / 33.2 | 34.8 / 34.6 | 37.3 / 34.1 | 43.5 / 47.3 | 167.6 |
Без промпта#
Чекпоинты без промптов отвечают на основе своего встроенного словаря без подачи промптов. Каждая ячейка точности читается как end-to-end / Non-E2E — два протокола, по которым статья оценивает YOLOE-26; страница YOLO26 цитирует колонку Non-E2E.
| Модель | mAP50-95 | mAPr | mAPc | mAPf | параметры (М) | FLOPs (Б) |
|---|---|---|---|---|---|---|
| YOLOE-26n-pf | 16.6 / 17.7 | 15.7 / 15.8 | 15.3 / 16.4 | 17.9 / 19.2 | 2.3 | 5.3 |
| YOLOE-26s-pf | 21.4 / 22.6 | 16.2 / 20.2 | 20.1 / 20.9 | 23.5 / 24.5 | 9.0 | 20.8 |
| YOLOE-26m-pf | 25.7 / 26.4 | 26.7 / 24.5 | 24.0 / 25.0 | 26.9 / 27.9 | 19.4 | 68.4 |
| YOLOE-26l-pf | 27.2 / 28.0 | 26.3 / 25.7 | 25.7 / 26.8 | 28.7 / 29.5 | 23.6 | 86.8 |
| YOLOE-26x-pf | 29.9 / 31.1 | 27.5 / 28.9 | 29.1 / 30.7 | 31.1 / 31.7 | 53.1 | 194.4 |
При использовании текстовых и визуальных промптов модели YOLOE-26 опережают свои аналоги YOLOE-11 и YOLOE-v8 на любом соответствующем масштабе по метрике mAP50-95, оставаясь при этом ниже линии v8 по параметрам и FLOPs. На том же сплите в статье приводятся результаты для YOLO-Worldv2: 24.4 (S), 32.4 (M) и 35.5 (L), а для детекторов на основе трансформеров — GLIP-T (26.0), GDINO-T (27.4) и DetCLIP-T (34.4), каждый из которых содержит от 155 до 232 млн параметров. Оригинальная статья YOLOE добавляет два результата для моделей масштаба v8, которые она представила. На датасете LVIS модель YOLOE-v8s превосходит YOLO-Worldv2-S на 3.5 AP при трети затрат на обучение и скорости инференса выше в 1.4 раза. При переносе на COCO модель YOLOE-v8l получает прирост 0.6 box AP и 0.4 mask AP по сравнению с закрытой моделью YOLOv8-L при почти в 4 раза меньшем времени обучения.
В статье по YOLO26 оценивается конфигурация детекции. Выпущенные веса представляют собой чекпоинты сегментации и содержат ветку масок, SAVPE и проекцию текста поверх, поэтому загруженный файл yoloe-26l-seg.pt сообщает о 35.4 М и 142.0 Б вместо 25.5 М и 89.0 Б указанных выше. В обоих случаях показатель FLOPs исключает сходство между регионами и текстом, поэтому реальная стоимость растет с увеличением размера набора промптов, даже если колонка не двигается; см. Ограничения.
Примеры использования#
Каждый пример YOLOE ниже запускается из Python API. Предсказание с текстовым промптом, валидация, экспорт, трекинг и простое обучение также работают из CLI; рецепты дообучения (fine-tuning) и визуальные промпты передают класс тренера или предиктора в качестве аргумента, что поддерживается только в Python API.
Использование для обучения#
Дообучай любой выпущенный чекпоинт *-seg.pt на собственном датасете YOLO. В основном это следует стандартной процедуре обучения YOLO; разница заключается в том, какого тренера ты передаешь. YOLOEPESegTrainer внедряет твои имена классов в голову и выполняет дообучение оттуда, что и требуется для твоих собственных меток; стандартный тренер не производит обучение по твоим именам классов.
Watch: How to Train YOLOE on Car Parts Segmentation Dataset | Open-Vocabulary Model, Prediction & Export 🚀
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer
model = YOLOE("yoloe-26s-seg.pt")
results = model.train(
data="coco128-seg.yaml",
epochs=80,
patience=10,
trainer=YOLOEPESegTrainer, # <- Important: the fine-tuning trainer, not the default
)Каждый выпущенный чекпоинт является моделью сегментации. Чтобы обучить детектор, собри модель из соответствующего файла YAML, загрузи веса сегментации того же масштаба и подставь тренер детекции. Все остальное остается без изменений.
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPETrainer
model = YOLOE("yoloe-26s.yaml").load("yoloe-26s-seg.pt")
results = model.train(data="coco128.yaml", epochs=80, patience=10, trainer=YOLOEPETrainer)Использование для предсказания#
Вызов с текстовым промптом показан в разделе Быстрый старт. Остальным двум режимам требуется по одному дополнительному аргументу:
Визуальные промпты показывают модели пример вместо описания. visual_prompts принимает массив bboxes с примерами боксов и массив cls с идентификаторами классов, по одному на каждый бокс. ID являются временными группировками, а не метками — они должны идти последовательно с 0, и результаты возвращаются как object0, object1, … вместо имен, выбранных тобой.
Примеры боксов могут располагаться на том изображении, для которого ты делаешь предсказание:
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
model = YOLOE("yoloe-26l-seg.pt")
# One example box per target, each with its own class ID
visual_prompts = {
"bboxes": np.array([[221.52, 405.8, 344.98, 857.54], [120, 425, 160, 445]]), # person, glasses
"cls": np.array([0, 1]),
}
results = model.predict(
"ultralytics/assets/bus.jpg",
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
results[0].show()Или на отдельном эталонном изображении, переданном как refer_image, и в этом случае bboxes и cls описывают объекты на этом эталоне, а не в целевом изображении:
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
model = YOLOE("yoloe-26l-seg.pt")
visual_prompts = {"bboxes": np.array([[221.52, 405.8, 344.98, 857.54]]), "cls": np.array([0])} # person
results = model.predict(
"ultralytics/assets/zidane.jpg", # Target image
refer_image="ultralytics/assets/bus.jpg", # Where the example boxes live
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
results[0].show()
# refer_image also sets the classes permanently, so later calls need no prompts at all
results = model("ultralytics/assets/bus.jpg")
model.export(format="onnx") # And the export keeps themКогда source является видео или потоком, первый кадр автоматически становится refer_image, поэтому переданные тобой промпты применяются к этому кадру и переносятся на остальную часть видео. Передай refer_image явно, чтобы выбрать другой кадр.
И source, и refer_image принимают тензоры torch напрямую, что удобно, когда изображения уже поступают из существующего пайплайна. Указывай боксы в собственных пиксельных координатах тензора:
import numpy as np
import torch
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
model = YOLOE("yoloe-11l-seg.pt")
img_tensor = torch.rand(1, 3, 480, 480) # (1, 3, H, W) float tensor in [0, 1]
visual_prompts = {"bboxes": np.array([[10, 10, 50, 50]]), "cls": np.array([0])}
results = model.predict(
img_tensor,
refer_image=img_tensor,
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
imgsz=640,
)Чтобы сделать предсказание для нескольких изображений одновременно, вложи промпты на один уровень глубже: один массив bboxes и один массив cls на каждое исходное изображение, в том же порядке, что и источники.
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
model = YOLOE("yoloe-26l-seg.pt")
visual_prompts = {
"bboxes": [
np.array([[221.52, 405.8, 344.98, 857.54], [120, 425, 160, 445]]), # bus.jpg: person, glasses
np.array([[150, 200, 1150, 700]]), # zidane.jpg: person
],
"cls": [np.array([0, 1]), np.array([0])],
}
results = model.predict(
["ultralytics/assets/bus.jpg", "ultralytics/assets/zidane.jpg"],
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
results[0].show()Использование для валидации#
Валидация запускается так же, как и для любой другой модели на датасете сегментации:
from ultralytics import YOLOE
model = YOLOE("yoloe-26l-seg.pt") # or yoloe-26s/m-seg.pt for other sizes
metrics = model.val(data="coco128-seg.yaml")Два варианта одного и того же вызова охватывают другие режимы промптов:
- Визуальные промпты —
model.val(data="coco128-seg.yaml", load_vp=True)извлекает визуальный эмбеддинг для каждой категории прямо из датасета. Добавьrefer_data="coco.yaml", чтобы взять эмбеддинги из другого датасета, который должен содержать те же самые категории. - Без промпта — загрузи чекпоинт
*-seg-pf.ptи передайsingle_cls=True.
Использование при экспорте#
Эмбеддинги промптов можно сохранить один раз и использовать повторно при создании статических экспортов, таких как ONNX, OpenVINO, TensorRT, CoreML, LiteRT и RKNN. Профиль NPZ загружается исходной моделью PyTorch перед экспортом; он не является дополнительным входным параметром среды выполнения, и экспортированной модели файл NPZ не требуется.
Классы, настроенные с помощью set_classes() (или через refer_image для визуальных промптов), зашиваются в экспортированные веса. После экспорта модель больше не может принимать новые промпты: вызов set_classes() или передача visual_prompts=... в predict() для загруженного экспорта завершится ошибкой. Чтобы изменить детектируемые классы, выполни повторный экспорт из оригинального чекпоинта .pt с настроенными новыми промптами. Экспортированный файл ведет себя как стандартная модель YOLO, а также может быть загружен с помощью YOLO() вместо YOLOE().
from ultralytics import YOLOE
model = YOLOE("yoloe-26n-seg.pt")
model.set_classes(["person", "bus"])
model.save_prompt_embeddings("person-bus.npz")
# The profile is bound to the source checkpoint and can be reused for later exports.
model = YOLOE("yoloe-26n-seg.pt")
model.load_prompt_embeddings("person-bus.npz")
model.export(format="onnx")Тот же профиль промпта также может настраивать модель только для детекции, созданную на основе соответствующей архитектуры YOLOE. Это удаляет ветку масок с сохранением запрошенных классов:
from ultralytics import YOLOE
model = YOLOE("yoloe-26n.yaml").load("yoloe-26n-seg.pt")
model.load_prompt_embeddings("person-bus.npz")
model.export(format="rknn", name="rk3588", quantize=16)Использование для отслеживания#
Промпт-классы напрямую переносятся в трекинг, поэтому ты можешь отслеживать объекты, на которых трекер никогда не обучался:
from ultralytics import YOLOE
model = YOLOE("yoloe-26s-seg.pt")
model.set_classes(["forklift", "pallet"])
# persist=True keeps track IDs stable across frames
for result in model.track("path/to/video.mp4", stream=True, persist=True):
print(result.boxes.id)Сравнение с YOLOE#
YOLOE занимает промежуточное положение между детектором с закрытым словарем и тяжеловесной моделью с открытым словарем. Три сравнения определяют, является ли она правильным выбором:
- Против YOLO с закрытым словарем. После настройки промптов YOLOE выполняет предсказание через обычный путь детекции/сегментации и экспортируется так же, как любая другая модель. Она добавляет возможность менять список классов во время инференса вместо переобучения; платой за это является точность zero-shot, существенно уступающая модели, обученной на твоих собственных классах.
- Против более ранних семейств YOLOE. YOLOE-26 наследует свободную от NMS голову end-to-end из YOLO26, охватывает пять масштабов (n/s/m/l/x) против трех предыдущих (s/m/l) и лидирует на каждом соответствующем масштабе в производительности.
- Против детекторов с открытым словарем на основе трансформеров. GLIP и OWL-ViT запускают визуально-языковой трансформер при инференсе. YOLOE кодирует промпты один раз, а затем сравнивает их с признаками регионов внутри сверточной головы.
Все ближайшие альтернативы принимают текстовый промпт, но только YOLOE и SAM 3 возвращают маски, и эти три модели отвечают на разные вопросы:
| YOLOE | SAM 3 | YOLO-World | |
|---|---|---|---|
| Создано для | Детекция и сегментация именованных классов в реальном времени | Сегментация концептов и трекинг с поддержкой промптов | Детекция в реальном времени с открытым словарем |
| Маски | Да, с чекпоинтами *-seg.pt | Да | Нет, только ограничивающие рамки |
| Визуальные промпты | Да (SAVPE) | Да | Нет |
| Режим без промптов | Да, словарь из 4585 имен | Нет | Нет |
| Выбирай его, когда | Тебе нужна пропускная способность и ты можешь назвать классы | Тебе нужна самая сильная концептуальная сегментация и ты можешь выделить вычислительные ресурсы | Ты уже здесь — см. примечание по миграции ниже |
Переходишь с YOLO-World? API имеет ту же структуру: замени YOLOWorld на YOLOE, загрузи чекпоинт *-seg.pt и оставь вызов set_classes() без изменений. Ты получаешь маски и визуальные промпты; примечание об экспорте в отношении замороженных классов применимо к обоим вариантам.
Варианты использования и приложения#
Детекция с открытым словарем исключает этап переобучения для каждого класса, что критически важно, когда список целей заранее неизвестен:
- Детекция в открытом мире — робототехника и системы безопасности, которые сталкиваются с объектами, не перечисленными при обучении.
- Однократная детекция по примеру — визуальные промпты позволяют находить конкретную деталь, логотип или дефект по единственной опорной рамке, что полезно в промышленном контроле.
- Каталогизация с длинным хвостом — встроенный словарь из 4585 имен достаточно широк для мониторинга биоразнообразия или инвентаризации в ритейле.
- Бутстраппинг датасетов — предварительная разметка изображений рамками и масками перед проверкой человеком, с последующим обучением быстрой модели с фиксированным набором классов на полученном результате.
- Сегментация произвольных объектов — выпущенные чекпоинты
*-seg.ptвозвращают маску с каждым предсказанием, поэтому медицинская визуализация и анализ спутниковых данных выдают результат с точностью до пикселя без второй модели.
Распространенный паттерн объединяет два режима: запустить режим без промптов один раз, чтобы обнаружить присутствующие объекты, а затем переключиться на текстовые промпты для интересующих категорий.
Ограничения#
YOLOE жертвует точностью ради возможности менять классы во время инференса. Последствия, о которых стоит знать перед принятием решения:
- Точность в режиме zero-shot значительно ниже модели, обученной на твоих классах. Чекпоинты с промптами попадают примерно в диапазон 22–40 mAP на мини-выборке LVIS; модель YOLO с фиксированным набором классов, обученная на твоих данных, превзойдет этот результат для этих классов. Выбирай YOLOE для покрытия классов, для которых обучение невозможно, а не для замены обучения.
- Редкие категории — слабое место. Колонка mAPr в разделе Производительность отображает точность конкретно для редких классов LVIS, и при текстовых промптах она оказывается ниже колонок распространенных и частых классов в каждой строке. Проверяй ее, а не общий mAP, если твои цели необычны.
- Промпт описывает внешний вид, а не взаимосвязи. Детекция работает путем сравнения признаков области с эмбеддингом промпта, поэтому промпты, зависящие от состояния, контекста или сравнения («поврежденный», «крайний слева», «тот, который несут»), не имеют надежного основания для сопоставления. Предпочитай формулировки, близкие к повседневным названиям категорий.
- Большие наборы промптов увеличивают задержку. Эмбеддинги промптов вычисляются один раз, но сравниваются с признаками областей на каждом прямом проходе. Измерения на CPU с
yoloe-26s-seg.ptпоказывают, что прямой проход замедляется примерно на 19% при переходе от 80 до 1203 классов и примерно на 89% при использовании полного словаря из 4585 имен. Указываемые значения FLOPs при этом вообще не меняются, так как сходство региона и текста не учитывается, поэтому профилировщик не предупредит тебя. - Имена классов являются заполнителями до задания промпта. Только что загруженный чекпоинт
*-seg.ptвозвращаетnc=80с числовыми именами ("0","1", …), поэтому вызывайset_classes()перед чтением меток. Чекпоинты без промптов поставляются с уже заполненным полным словарем.
Примечания по развертыванию#
- Оборудование. Для инференса требуется GPU от NVIDIA с 4–8 ГБ видеопамяти; масштабы
nиsработают на периферийных GPU, таких как Jetson, или на CPU с пониженным разрешением. Для тонкой настройки требуется один GPU. - NMS по умолчанию не зависит от класса. YOLOE выполняет предсказания с помощью
agnostic_nms=True. В YOLOE-11 и YOLOE-v8 это подавляет перекрывающиеся рамки с более низким скором для разных классов, а не только внутри одного класса, что предотвращает дублирование, когда один объект соответствует нескольким категориям. Модели YOLOE-26 end-to-end вообще не применяют подавление IoU; там агностический режим сохраняет только один лучший класс для каждого анкера вместо того, чтобы позволять одному анкеру выдавать несколько меток классов. Передайagnostic_nms=False, чтобы переопределить это поведение. - Батчинг. Пакетный инференс работает напрямую, и визуальные промпты могут различаться для разных изображений в рамках одного вызова.
Обучение официальных моделей с нуля#
Большинству читателей это никогда не понадобится. Это воспроизводит опубликованные чекпоинты с открытым словарем на основе Objects365, GQA и Flickr30k — около 1,4 млн тренировочных образцов на 8× RTX 4090 — и не связано с дообучением на собственных данных, которое описано в разделе Использование обучения выше.
Каждый обучающий модуль, наследующий YOLOETrainer, отклоняет compile=True, включая стандартный YOLOESegTrainer и все модули обучения с нуля ниже. Передай compile=False (по умолчанию). Два модуля тонкой настройки, использованные выше, YOLOEPESegTrainer и YOLOEPETrainer, не имеют этого ограничения.
Для обучения нужны аннотации сегментов. Либо скачай обработанные файлы ниже, либо сгенерируй свои с помощью скрипта, предоставленного официальной командой, который работает на базе SAM 2.1. Для валидации используется мини-выборка LVIS.
| Датасет | Тип | Образцы | Боксы | Обработанные аннотации сегментов |
|---|---|---|---|---|
| Objects365v1 | Детектирование | 609k | 9621k | objects365_train_segm.json |
| GQA | Grounding | 621k | 3681k | final_mixed_train_no_coco_segm.json |
| Flickr30k | Grounding | 149k | 641k | final_flickr_separateGT_train_segm.json |
Модель с текстовыми промптами обучается первой, а два других режима промптов являются ее уточнениями:
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOESegTrainerFromScratch
data = {
"train": {
"yolo_data": ["Objects365.yaml"],
"grounding_data": [
{
"img_path": "flickr/full_images/",
"json_file": "flickr/annotations/final_flickr_separateGT_train_segm.json",
},
{
"img_path": "mixed_grounding/gqa/images",
"json_file": "mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
},
],
},
"val": {"yolo_data": ["lvis.yaml"]},
}
model = YOLOE("yoloe-26l-seg.yaml")
model.train(
data=data, # or the path to a YAML file holding the same structure
batch=128,
epochs=30,
close_mosaic=2,
optimizer="AdamW",
lr0=2e-3,
warmup_bias_lr=0.0,
weight_decay=0.025,
momentum=0.9,
workers=4,
trainer=YOLOESegTrainerFromScratch,
device="0,1,2,3,4,5,6,7",
)Чекпоинты с визуальными промптами и режимом без промптов создаются на базе этой обученной модели с текстовыми промптами путем обновления по одному модулю. YOLOESegVPTrainer — это рецепт для визуальных промптов, а YOLOEPEFreeTrainer — для режима без промптов, но ни один класс не заморожен сам по себе: выборочное обучение задается списком freeze, который ты передаешь вместе с ним и который указывает каждый дочерний элемент 'head', кроме savpe (соответственно, каждую классификационную башню), а для запуска без промптов дополнительно требуется single_cls=True. В исходном репозитории YOLOE содержатся полные рецепты для моделей масштаба v8.
Завершенный прогон без промптов репараметризуется в чекпоинт, который сообщает свои имена без промпта при инференсе, используя get_vocab и set_vocab:
from ultralytics import YOLOE
# Weights written by the prompt-free run and by the text-prompt run it started from. Each
# rerun creates a new directory (train-2, train-3, ...), so take the paths the runs printed.
model = YOLOE("runs/segment/train-2/weights/best.pt") # prompt-free run, its head is already fused
text_model = YOLOE("runs/segment/train/weights/best.pt") # text-prompt run, its head is still unfused
names = list(YOLOE("yoloe-26l-seg-pf.pt").model.names.values()) # the 4,585-name vocabulary, or your own list
vocab = text_model.get_vocab(names)
model.set_vocab(vocab, names)
model.save("yoloe-26l-seg-pf-custom.pt") # never overwrite the released checkpointЦитирование и благодарности#
Если YOLOE внес вклад в твое исследование или проект, пожалуйста, процитируй оригинальную статью авторов: Ao Wang, Lihao Liu, Hui Chen, Zijia Lin, Jungong Han, and Guiguang Ding из Университета Цинхуа:
@misc{wang2025yoloerealtimeseeing,
title={YOLOE: Real-Time Seeing Anything},
author={Ao Wang and Lihao Liu and Hui Chen and Zijia Lin and Jungong Han and Guiguang Ding},
year={2025},
eprint={2503.07465},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2503.07465},
}Для дальнейшего чтения оригинальная статья по YOLOE доступна на arXiv. Исходный код проекта и дополнительные ресурсы можно найти в их репозитории на GitHub.
FAQ#
Ultralytics YOLOE добавляет две возможности, которых нет у YOLO-World: визуальные промпты, где пример рамки заменяет имя класса, и чекпоинты без промптов, которые отвечают на основе встроенного словаря из 4585 имен вообще без какого-либо промпта. Каждое предсказание из выпущенных чекпоинтов
*-seg.ptтакже содержит маску сегментации инстансов. Что касается точности, оригинальная статья по YOLOE ставит YOLOE-v8s выше YOLO-Worldv2-S на 3.5 AP на LVIS, при трети затрат на обучение и 1.4-кратной скорости инференса. Миграция требует изменения одной строки — см. раздел Сравнение YOLOE.Ultralytics YOLOE поддерживает три режима промптов. Текстовый промпт — это имена классов в виде строк для чекпоинта
*-seg.pt, и это обычный выбор. Визуальный промпт — это один или несколько примеров рамок на опорном изображении для целей, которые трудно описать словами. Инференс без промптов использует отдельный чекпоинт*-seg-pf.pt, который отвечает на основе встроенного словаря из 4585 имен без каких-либо входных данных. Текстовые и визуальные промпты используют одни и те же чекпоинты; версии без промптов — это другие файлы, которые отклоняютset_classes(). Полное сравнение см. в разделе Выбор режима промптов.Начни с
yoloe-26s-seg.pt: семейство YOLOE-26 превосходит YOLOE-11 и YOLOE-v8 в каждом соответствующем масштабе, а масштабsявляется наименьшим среди тех, что превышают 30 mAP на мини-выборке LVIS. Переходи кm,lилиx, когда точность для редких категорий важнее задержки — сравнивать следует колонку mAPr в разделе Производительность. Переходи наnтолько для развертывания на периферийных устройствах. Загружай файл*-seg-pf.ptтого же масштаба, если тебе нужен встроенный словарь, а не твои собственные имена классов.Метки вроде
object0иobject1означают, что предсказание получено из визуального промпта, который группирует примеры рамок во временные пронумерованные классы вместо использования твоих имен. Идентификаторы классов, передаваемые вvisual_prompts["cls"], выполняют только эту группировку. Модель сообщает их какobject0,object1и т.д. в порядке назначенных тобой ID, поэтому сопоставь их обратно со своими метками в результатах. Если тебе нужны твои имена в выводе, используй текстовый промпт.Чекпоинты без промптов (
*-seg-pf.pt) определяют классы через собственный встроенный словарь и отклоняют внешние промпты с помощьюAssertionError: Prompt-free model does not support setting classes. Please try with Text/Visual prompt models.. Загрузи чекпоинт*-seg.pt, если тебе нужен собственный список классов. См. раздел Выбор режима промптов.Первый текстовый промпт заставляет Ultralytics YOLOE установить ultralytics/CLIP из GitHub с помощью
pipи скачать текстовый энкодер TorchScript в текущую рабочую директорию — около 254 МБ для YOLOE-26; точные данные об активах для каждого семейства моделей см. в разделе Установка и требования. Визуальные промпты и чекпоинты без промптов не требуют ни того, ни другого. Чтобы избежать загрузки на целевой машине, задай промпты один раз и сохрани их с помощьюsave_prompt_embeddings()или экспортируй модель с уже настроенными классами.Нет — YOLOE вшивает классы из промпта в веса во время экспорта, поэтому загруженный экспортированный файл отклоняет как
set_classes(), так иvisual_prompts=. Повтори экспорт из исходного чекпоинта.ptс настроенными новыми промптами. Экспортированный файл ведет себя как стандартная модель YOLO и может быть загружен как с помощьюYOLO(), так и с помощьюYOLOE().Используй YOLOE, когда тебе нужна пропускная способность в реальном времени и ты можешь назвать классы, и SAM 3, когда качество сегментации концепта важнее скорости. Обе модели принимают визуальные примеры, но только у YOLOE есть режим без промптов. Полное сравнение приведено в разделе Сравнение YOLOE.