YOLOE: обнаружение и сегментация в реальном времени с открытым словарём#
Ultralytics YOLOE (Real-Time Seeing Anything) — это модель обнаружения с открытым словарём и сегментации экземпляров: вместо списка классов, фиксированного во время обучения, она принимает нужные тебе категории во время инференса — в виде текстового промпта, визуального примера или встроенного словаря из 4 585 названий. Построенная на архитектурах 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 | Ничего | Названия из встроенного словаря из 4 585 названий | Ты каталогизируешь или исследуешь данные и заранее не знаешь, что искать |
- Визуальные промпты не сохраняют твои метки. Идентификаторы классов в
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. Выполни загрузку один раз из каталога, из которого будешь запускать модель, или скопируй файл туда, иначе он будет загружен повторно. - Оба шага требуют доступа к сети, поэтому перед развёртыванием на автономной машине или машине в изолированной сети выполни один прогноз с промптом.
- Для визуальных промптов и чекпойнтов без промпта текстовый энкодер вообще не нужен.
Для чекпойнтов 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 для многоштабного объединения и безанкорную раздельную голову, предсказывающую классы и боксы, — и добавляет три модуля, по одному для каждого режима промптинга:
- Re-parameterizable Region-Text Alignment (RepRTA) уточняет текстовые эмбеддинги из CLIP с помощью небольшой вспомогательной сети. Эта сеть запускается один раз для каждого вызова
set_classes()и сворачивается при экспорте, поэтому не несёт затрат на каждом кадре. На каждом прямом проходе выполняется сравнение сохранённых эмбеддингов промпта с признаками областей; сведения о затратах при большом наборе промптов см. в разделе Ограничения. - Semantic-Activated Visual Prompt Encoder (SAVPE) кодирует семантические признаки и признаки активации из примерного бокса, адаптируя модель к объектам, похожим на него. Это путь one-shot для целей, которые сложно назвать, например логотипа или определённой детали.
- Lazy Region-Prompt Contrast (LRPC) сопоставляет эмбеддинги областей со встроенным словарём из 4 585 названий, поэтому чекпойнты без промпта распознают объекты без внешнего промпта и текстового энкодера.
Сегментация экземпляров выполняется ветвью масок в голове обнаружения, как в 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 из статьи, единственный протокол, приведённый для каждой модели в сравнении; сквозная голова YOLOE-26 уступает ему не более чем на 1,1 AP для текстовых промптов и на 2,6 AP для визуальных промптов.
| Модель | mAP50-95 | mAPr | mAPc | mAPf | параметры (M) | FLOPs (B) |
|---|---|---|---|---|---|---|
| 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 | параметры (M) | FLOPs (B) |
|---|---|---|---|---|---|---|
| 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), а также значения детекторов на основе Transformer: 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; рецепты дообучения и визуальный промптинг передают класс тренера или предиктора в качестве аргумента, что поддерживается только 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)Использование Predict#
Вызов с текстовым промптом показан в разделе Quick Start. Для двух остальных режимов нужен дополнительный аргумент:
Визуальные промпты показывают модели пример вместо его описания. visual_prompts принимает массив bboxes с примерами BBox и массив cls с идентификаторами классов — по одному на каждый BBox. Идентификаторы временно объединяют объекты в группы, а не являются метками: они должны последовательно начинаться с 0, а результаты возвращаются как object0, object1, …, а не под выбранными тобой именами.
Примеры BBox могут находиться на изображении, для которого ты выполняешь предсказание:
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, что удобно, если изображения уже поступают из существующего конвейера. Укажи BBox в собственных пиксельных координатах тензора:
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()Использование Val#
Валидация выполняется как для любой другой модели на датасете сегментации:
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)извлекает визуальное embedding-представление для каждой категории непосредственно из датасета. Добавьrefer_data="coco.yaml", чтобы брать embedding-представления из другого датасета, который должен содержать в точности те же категории. - Без промпта — загрузи чекпойнт
*-seg-pf.ptи передайsingle_cls=True.
Использование экспорта#
Embedding-представления промптов можно сохранить один раз и повторно использовать при создании статических экспортов, например 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)Использование Track#
Классы, заданные промптами, напрямую переходят в режим трекинга, поэтому ты можешь отслеживать объекты, на которых трекер никогда не обучался:
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 наследует от YOLO26 сквозную голову без NMS и охватывает пять масштабов (n/s/m/l/x) вместо трёх у предыдущих моделей (s/m/l), лидируя на каждом сопоставимом масштабе в разделе Performance.
- По сравнению с детекторами с открытым словарём на основе Transformer. GLIP и OWL-ViT запускают vision-language Transformer во время инференса. YOLOE кодирует промпты один раз, а затем сравнивает их с признаками областей внутри свёрточной головы.
Ближайшие альтернативы принимают текстовый промпт, но только YOLOE и SAM 3 возвращают маски, и каждая из трёх моделей отвечает на свой вопрос:
| YOLOE | SAM 3 | YOLO-World | |
|---|---|---|---|
| Предназначение | Детекция и сегментация именованных классов в реальном времени | Сегментация концептов и трекинг с поддержкой промптов | Детекция с открытым словарём в реальном времени |
| Маски | Да, с чекпойнтами *-seg.pt | Да | Нет, только BBox |
| Визуальные промпты | Да (SAVPE) | Да | Нет |
| Режим без промпта | Да, словарь из 4 585 названий | Нет | Нет |
| Выбирай её, когда | Тебе нужна высокая пропускная способность и ты можешь назвать классы | Тебе нужна максимально качественная сегментация концептов и ты готов потратить вычислительные ресурсы | Ты уже используешь её — см. примечание о миграции ниже |
Переходишь с YOLO-World? API имеет ту же структуру: замени YOLOWorld на YOLOE, загрузи чекпойнт *-seg.pt и оставь вызов set_classes() без изменений. Ты получаешь маски и визуальные промпты; примечание об экспорте замороженных классов относится к обеим моделям.
Варианты использования и приложения#
Детекция с открытым словарём устраняет необходимость повторного обучения для каждого класса, что особенно важно, если целевой список заранее неизвестен:
- Детекция в открытом мире — робототехника и системы безопасности, которые сталкиваются с объектами, не перечисленными во время обучения.
- Детекция по одному примеру — визуальные промпты обнаруживают конкретную деталь, логотип или дефект по одному эталонному BBox, что полезно для промышленного контроля.
- Каталогизация длинного хвоста — встроенный словарь из 4 585 названий достаточно широк для мониторинга биоразнообразия или инвентаризации розничных товаров.
- Подготовка датасета — предварительно разметь изображения BBox и масками перед проверкой человеком, а затем обучи на результате быструю модель с закрытым набором классов.
- Сегментация произвольных целей — выпущенные чекпойнты
*-seg.ptвозвращают маску с каждым предсказанием, поэтому медицинская визуализация и анализ спутниковых снимков получают точный на уровне пикселей результат без второй модели.
Распространённый подход объединяет два режима: один раз запусти режим без промпта, чтобы определить присутствующие объекты, затем переключись на текстовые промпты для нужных категорий.
Ограничения#
YOLOE жертвует точностью ради возможности менять классы во время инференса. Вот о каких последствиях стоит знать до начала работы:
- Точность zero-shot значительно ниже, чем у модели, обученной на твоих классах. Чекпойнты с промптами показывают примерно 22–40 mAP на LVIS minival; YOLO с закрытым набором классов, обученная на твоих данных, превзойдёт этот результат на этих классах. Выбирай YOLOE для охвата классов, на которых ты не можешь обучить модель, а не вместо обучения.
- Слабое место — редкие категории. Столбец mAPr в разделе Performance показывает точность именно на редких классах LVIS, и при текстовом промптинге в каждой строке она ниже значений для распространённых и часто встречающихся классов. Если твои цели необычны, ориентируйся на него, а не на общий mAP.
- Промпт описывает внешний вид, а не отношения. Детекция работает за счёт сравнения признаков областей с embedding-представлением промпта, поэтому промпты, зависящие от состояния, контекста или сравнения — «повреждённый», «самый левый», «тот, кого несут», — не дают надёжного признака для сопоставления. Предпочитай формулировки, близкие к обычным названиям категорий.
- Большие наборы промптов увеличивают задержку. Embedding-представления промптов вычисляются один раз, но на каждом прямом проходе сравниваются с признаками областей. По измерениям на CPU с
yoloe-26s-seg.ptвремя прямого прохода увеличивается примерно на 19% при переходе от 80 к 1 203 классам и примерно на 89% для полного словаря из 4 585 названий. Указанное количество FLOPs вообще не меняется, поскольку сходство признаков областей и текста не учитывается, поэтому профиль этого не покажет. - Имена классов остаются заполнителями, пока ты не задашь промпт. Свежезагруженный чекпойнт
*-seg.ptвозвращаетnc=80с числовыми именами ("0","1", …), поэтому перед чтением меток вызовиset_classes(). Чекпойнты без промпта уже содержат полностью заполненный словарь.
Примечания по развёртыванию#
- Оборудование. Для инференса нужен GPU NVIDIA с 4–8 ГБ VRAM; модели масштабов
nиsработают на периферийных GPU, например Jetson, или на CPU при уменьшенном разрешении. Для тонкой настройки нужен один GPU. - NMS по умолчанию является классо-независимым. YOLOE прогнозирует с помощью
agnostic_nms=True. По умолчанию это подавляет пересекающиеся боксы с более низкими оценками для разных классов, а не только в пределах одного класса, что предотвращает дублирование, когда один объект соответствует нескольким категориям. С помощьюnms=FalseYOLOE-26 не применяет подавление IoU; независимый режим сохраняет только один лучший класс для каждого анкера вместо того, чтобы позволять одному анкеру выдавать несколько меток классов. Передайagnostic_nms=False, чтобы переопределить это поведение. - Пакетная обработка. Пакетный инференс работает напрямую, а визуальные промпты могут отличаться для каждого изображения в одном вызове.
Обучение официальных моделей с нуля#
Большинству читателей это не понадобится. Здесь воспроизводятся опубликованные чекпойнты с открытым словарём, обученные на Objects365, GQA и Flickr30k — около 1,4 млн обучающих примеров на 8× RTX 4090; это не связано с тонкой настройкой на собственных данных, которая описана выше в разделе Train Usage.
Каждый тренер, наследующий YOLOETrainer, отклоняет compile=True, включая стандартный YOLOESegTrainer и все представленные ниже тренеры для обучения с нуля. Передай compile=False (значение по умолчанию). Два тренера для тонкой настройки, использованные выше, YOLOEPESegTrainer и YOLOEPETrainer, этого ограничения не имеют.
Для обучения нужны аннотации сегментации. Ты можешь либо скачать обработанные файлы ниже, либо создать собственные с помощью скрипта, предоставленного официальной командой, который использует SAM 2.1. Для валидации используется LVIS minival.
| Датасет | Тип | Примеры | Боксы | Обработанные аннотации сегментации |
|---|---|---|---|---|
| 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, который ты передаёшь вместе с ним и который перечисляет все дочерние элементы головы, кроме 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 и Guiguang Ding из Tsinghua University:
@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.
Часто задаваемые вопросы#
Ultralytics YOLOE добавляет две возможности, которых нет у YOLO-World: визуальные промпты, где BBox с примером заменяет имя класса, и чекпойнты без промпта, которые отвечают на основе встроенного словаря из 4 585 названий без промпта. Каждое предсказание выпущенных чекпойнтов
*-seg.ptтакже содержит маску сегментации экземпляров. По точности оригинальная статья о YOLOE показывает преимущество YOLOE-v8s над YOLO-Worldv2-S в 3,5 AP на LVIS при втрое меньших затратах на обучение и скорости инференса в 1,4 раза выше. Миграция выполняется изменением одной строки — см. раздел Сравнение YOLOE.Ultralytics YOLOE поддерживает три режима промптинга. Текстовый промпт — это имена классов в виде строк для чекпойнта
*-seg.pt, и это обычный выбор. Визуальный промпт — один или несколько BBox с примерами на эталонном изображении для целей, которые сложно описать словами. Инференс без промпта использует отдельный чекпойнт*-seg-pf.pt, который отвечает на основе встроенного словаря из 4 585 названий без каких-либо входных данных. Текстовые и визуальные промпты используют одни и те же чекпойнты; режим без промпта работает с другими файлами и отклоняетset_classes(). Полное сравнение см. в разделе Выбор режима промптинга.Начни с
yoloe-26s-seg.pt: семейство YOLOE-26 опережает YOLOE-11 и YOLOE-v8 на каждом сопоставимом масштабе, а масштабs— наименьший, превышающий 30 mAP на LVIS minival. Перейди наm,lилиx, если точность на редких категориях важнее задержки — сравнивай столбец mAPr в разделе Performance. Переходи наnтолько для развёртывания на периферийных устройствах. Если нужен встроенный словарь, а не собственные имена классов, вместо этого загрузи файл*-seg-pf.ptтого же масштаба.Метки вроде
object0иobject1означают, что предсказание получено с помощью визуального промпта, который объединяет BBox с примерами во временные пронумерованные классы вместо использования твоих имён. Идентификаторы классов, переданные вvisual_prompts["cls"], нужны только для такого объединения. Модель возвращает их какobject0,object1и так далее в порядке назначенных тобой идентификаторов, поэтому сопоставь их со своими метками в результате. Если ты хочешь видеть свои имена в выводе, используй текстовый промпт.Чекпойнты без промпта (
*-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.