Ultralytics YOLO27:

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 поддерживает три режима промптинга; выбранный режим определяет, какой чекпойнт загружать и как выглядят метки классов. Выбери строку, соответствующую данным, которые ты можешь предоставить во время инференса.

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 Architecture

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 на LVIS#

Результаты zero-shot на LVIS minival при размере 640 пикселей из статьи Ultralytics YOLO26.

Текстовые и визуальные промпты#

Каждая ячейка с точностью и количеством параметров имеет формат текстовый промпт / визуальный промпт; FLOPs указаны один раз. Количество параметров и FLOPs относятся к конфигурации обнаружения, оцениваемой в статье. Точность — это показатель Non-E2E из статьи, единственный протокол, приведённый для каждой модели в сравнении; сквозная голова YOLOE-26 уступает ему не более чем на 1,1 AP для текстовых промптов и на 2,6 AP для визуальных промптов.

МодельmAP50-95mAPrmAPcmAPfпараметры
(M)
FLOPs
(B)
YOLOE-26n24.7 / 21.920.5 / 17.624.1 / 22.326.1 / 22.43.9 / 3.16.1
YOLOE-26s30.8 / 28.623.9 / 25.129.6 / 27.833.0 / 29.910.7 / 11.021.9
YOLOE-26m35.4 / 33.931.1 / 33.434.7 / 34.036.9 / 33.821.3 / 25.170.6
YOLOE-26l37.8 / 36.335.1 / 37.637.6 / 36.238.5 / 36.125.5 / 29.389.0
YOLOE-26x40.6 / 38.537.4 / 35.340.9 / 38.841.0 / 38.855.2 / 65.2197.7
YOLOE-11s27.5 / 26.321.4 / 22.526.8 / 27.129.3 / 26.410.7 / 10.922.7
YOLOE-11m33.0 / 31.426.9 / 27.132.5 / 31.934.5 / 31.721.0 / 24.870.4
YOLOE-11l35.2 / 33.729.1 / 28.135.0 / 34.636.5 / 33.826.0 / 29.889.5
YOLOE-v8s27.9 / 26.222.3 / 21.327.8 / 27.729.0 / 25.712.3 / 12.629.8
YOLOE-v8m32.6 / 31.026.9 / 27.031.9 / 31.734.4 / 31.126.4 / 28.480.7
YOLOE-v8l35.9 / 34.233.2 / 33.234.8 / 34.637.3 / 34.143.5 / 47.3167.6

Без промпта#

Чекпойнты без промпта отвечают, используя встроенный словарь, без предоставленного промпта. Каждая ячейка с точностью имеет формат end-to-end / Non-E2E — это два протокола, по которым в статье оценивается YOLOE-26; на странице YOLO26 приводится столбец Non-E2E.

МодельmAP50-95mAPrmAPcmAPfпараметры
(M)
FLOPs
(B)
YOLOE-26n-pf16.6 / 17.715.7 / 15.815.3 / 16.417.9 / 19.22.35.3
YOLOE-26s-pf21.4 / 22.616.2 / 20.220.1 / 20.923.5 / 24.59.020.8
YOLOE-26m-pf25.7 / 26.426.7 / 24.524.0 / 25.026.9 / 27.919.468.4
YOLOE-26l-pf27.2 / 28.026.3 / 25.725.7 / 26.828.7 / 29.523.686.8
YOLOE-26x-pf29.9 / 31.127.5 / 28.929.1 / 30.731.1 / 31.753.1194.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().

Повторное использование embedding-представлений промптов
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 возвращают маски, и каждая из трёх моделей отвечает на свой вопрос:

YOLOESAM 3YOLO-World
ПредназначениеДетекция и сегментация именованных классов в реальном времениСегментация концептов и трекинг с поддержкой промптовДетекция с открытым словарём в реальном времени
МаскиДа, с чекпойнтами *-seg.ptДаНет, только BBox
Визуальные промптыДа (SAVPE)ДаНет
Режим без промптаДа, словарь из 4 585 названийНетНет
Выбирай её, когдаТебе нужна высокая пропускная способность и ты можешь назвать классыТебе нужна максимально качественная сегментация концептов и ты готов потратить вычислительные ресурсыТы уже используешь её — см. примечание о миграции ниже

Переходишь с YOLO-World? API имеет ту же структуру: замени YOLOWorld на YOLOE, загрузи чекпойнт *-seg.pt и оставь вызов set_classes() без изменений. Ты получаешь маски и визуальные промпты; примечание об экспорте замороженных классов относится к обеим моделям.

Варианты использования и приложения#

Детекция с открытым словарём устраняет необходимость повторного обучения для каждого класса, что особенно важно, если целевой список заранее неизвестен:

Распространённый подход объединяет два режима: один раз запусти режим без промпта, чтобы определить присутствующие объекты, затем переключись на текстовые промпты для нужных категорий.

Ограничения#

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=False YOLOE-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Обнаружение609k9621kobjects365_train_segm.json
GQAGrounding621k3681kfinal_mixed_train_no_coco_segm.json
Flickr30kGrounding149k641kfinal_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.

Комментарии