Ultralytics YOLO27:

YOLOE:实时开放词汇检测与分割#

Ultralytics YOLOE(实时看见一切)是一种开放词汇检测和实例分割模型:它不使用训练时固定的类别列表,而是在推理时接受你想要的类别,可以是文本提示、视觉示例,或内置的 4,585 个名称词汇表。YOLOE 基于 Ultralytics YOLO 架构——YOLOv8、YOLO11YOLO26——并受到 YOLO-World 的启发,以接近封闭集 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参考图像上的示例框通用的 object0object1、…你无法用文字描述目标:例如特定部件、徽标或缺陷
无提示词*-seg-pf.pt无需提供任何内容内置 4,585 个名称词汇表中的名称你正在进行目录整理或探索,事先不知道要查找什么
两个常见问题
  • 视觉提示不会携带你的标签。 visual_prompts 中的类别 ID 只是将示例归组;模型会将它们报告为 object0object1 等。你需要自行将它们映射回自己的名称。
  • 无提示词检查点会拒绝 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() 时,会通过 pip(提供分词器)从 GitHub 安装 ultralytics/CLIP,并将 TorchScript 文本编码器下载到当前工作目录。YOLOE-26 会获取 mobileclip2_b.ts,大小约为 254 MB;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 结构——用于提取特征的卷积骨干网络、用于多尺度融合的颈部网络,以及用于预测类别和边界框的无锚点解耦头——并针对每种提示模式增加了一个模块:

  • **可重参数化区域-文本对齐(RepRTA)**通过一个小型辅助网络细化来自 CLIP 的文本嵌入。该网络每次 set_classes() 调用运行一次,并在导出时被折叠,因此不会产生逐帧开销。每次前向传递都会运行的是将已存储的提示嵌入与区域特征进行比较;有关大型提示集带来的开销,请参阅限制
  • **语义激活视觉提示编码器(SAVPE)**从示例框中编码语义特征和激活特征,使模型关注外观相似的对象。对于难以命名的目标(例如徽标或特定部件),这是其单样本路径。
  • **惰性区域提示对比(LRPC)**将区域嵌入与内置的 4,585 个名称词汇表进行匹配,因此无提示词检查点无需外部提示或文本编码器即可识别对象。

实例分割来自检测头上的掩码分支,与 YOLOv8-Seg 相同,并且每个预测都会在 results[0].masks 上携带一个掩码。模型导出后,开放世界模块会被重新参数化为标准 YOLO 头,因此导出的文件运行的是常规检测/分割流程。

可用模型#

下面的每个检查点都是实例分割模型,并支持 valpredictexporttrack。文本或视觉提示请加载 *-seg.pt 文件,无提示词推理请加载 *-seg-pf.pt 文件;二者不可互换,请参阅选择提示模式。只有 *-seg.pt 文件支持 train;无提示词检查点由经过训练的文本提示模型生成,请参阅从头训练官方模型

YOLOE 在 LVIS 上的性能#

来自 Ultralytics YOLO26 论文LVIS minival 上 640 像素的零样本结果。

文本和视觉提示#

每个精度和参数单元格均按 文本提示/视觉提示 读取;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

无提示词#

无提示词检查点在未提供提示的情况下,根据其内置词汇表进行回答。每个精度单元格均按 端到端/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 模型在 mAP50-95 上的表现,在每个对应规模上都领先于 YOLOE-11 和 YOLOE-v8 的对应模型,同时参数量和 FLOPs 低于 v8 系列。在相同数据划分上,论文报告 YOLO-Worldv2 在 S、M 和 L 规模上的结果分别为 24.4、32.4 和 35.5;基于 Transformer 的检测器 GLIP-T、GDINO-T 和 DetCLIP-T 分别为 26.0、27.4 和 34.4,每个模型都包含 155M 至 232M 个参数。原始 YOLOE 论文还为其引入的 v8 规模模型增加了两个结果。在 LVIS 上,YOLOE-v8s 以三分之一的训练成本和 1.4 倍的推理速度,超过 YOLO-Worldv2-S 3.5 AP。迁移到 COCO 后,YOLOE-v8l 相比封闭集 YOLOv8-L 提升了 0.6 box AP0.4 mask AP,同时训练时间减少近 4 倍

论文统计数据与发布的检查点

YOLO26 论文评估的是检测配置。发布的权重是分割检查点,并包含掩码分支、SAVPE 和文本投影层,因此加载后的 yoloe-26l-seg.pt 报告为 35.4 M 和 142.0 B,而不是上方的 25.5 M 和 89.0 B。在两种情况下,FLOPs 数值都不包括区域-文本相似度计算,因此即使表格中的数值不变,实际成本也会随着提示集规模增长;请参阅限制

使用示例#

下面的每个 YOLOE 示例都通过 Python API 运行。文本提示预测、验证、导出、跟踪和普通训练也可以通过 CLI 运行;微调配方和视觉提示会将 trainer 或 predictor 类作为参数传入,而这只有 Python API 支持。

训练用法#

你可以在自己的 YOLO 数据集上微调任何已发布的 *-seg.pt 检查点。这基本遵循标准 YOLO 训练流程;区别在于传入哪个 trainer。YOLOEPESegTrainer 会将你的类别名称融合到检测头中,并从该状态开始微调,这正适用于你自己的标签;默认 trainer 不会针对你的类别名称进行训练。



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 数组,以及一个包含类别 ID 的 cls 数组,每个框对应一个 ID。这些 ID 只是临时分组,并非标签——必须从 0 开始连续编号,结果会以 object0object1、……返回,而不是使用你自行选择的名称。

示例框可以位于你要进行预测的图像上:

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 传入的独立参考图像上,此时 bboxescls 描述的是参考图像中的对象,而不是目标图像中的对象:

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 可选择其他帧。

sourcerefer_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 会通过普通的检测/分割路径进行预测,导出方式也与其他模型相同。它新增的能力是在推理时更改类别列表,而无需重新训练;代价是零样本精度远低于使用你自己的类别训练的模型。
  • 与早期 YOLOE 系列比较。 YOLOE-26 继承了 YOLO26 的无 NMS 端到端检测头,覆盖五种规模(n/s/m/l/x),而早期版本只有三种(s/m/l),并且在性能中每个对应规模都处于领先。
  • 与基于 Transformer 的开放词汇检测器比较。 GLIP 和 OWL-ViT 在推理时运行视觉语言 Transformer。YOLOE 只对提示进行一次编码,然后在卷积检测头内部将其与区域特征进行比较。

最接近的替代方案都接受文本提示,但只有 YOLOE 和 SAM 3 返回掩码,而且三者回答的是不同问题:

YOLOESAM 3YOLO-World
适用场景命名类别的实时检测与分割概念分割与可提示跟踪实时开放词汇检测
掩码是,使用 *-seg.pt 检查点否,仅返回框
视觉提示是(SAVPE)
无提示模式是,包含 4,585 个名称的词汇表
选择它的情况你需要高吞吐量,并且可以指定类别名称你需要最强的概念分割能力,并且可以承担计算开销你已经在使用它——请参阅下方的迁移说明

从 YOLO-World 迁移? API 结构相同:将 YOLOWorld 替换为 YOLOE,加载 *-seg.pt 检查点,并保持你的 set_classes() 调用不变。你将获得掩码和视觉提示;关于冻结类别的导出说明同样适用于两者。

使用场景与应用#

开放词汇检测无需按类别重复训练,这在目标列表事先未知的场景中尤为重要:

  • 开放世界检测 — 适用于机器人技术安防系统,能够处理训练时没有人列举过的对象。
  • 从示例进行单样本检测 — 视觉提示可以根据单个参考框识别特定零件、徽标或缺陷,适用于工业检测
  • 长尾目录整理 — 内置的 4,585 个名称词汇表足够广泛,可用于生物多样性监测零售库存盘点。
  • 数据集引导构建 — 在人工审核前,先用框和掩码为图像预标注,然后根据结果训练快速的闭集模型。
  • 任意目标分割 — 已发布的 *-seg.pt 检查点会为每个预测返回一个掩码,因此医学影像卫星分析无需第二个模型即可获得像素级精确输出。

一种常见模式是结合两种方式:先运行一次无提示模式,发现当前存在的对象,然后切换到文本提示,处理重要的类别。

限制#

YOLOE 牺牲了一定精度,以换取在推理时更改类别的能力。在采用它之前,以下影响值得了解:

  • 零样本精度远低于使用你的类别训练的模型。 在 LVIS minival 上,提示式检查点的 mAP 大约处于 22-40 区间;使用你自己的数据训练的闭集 YOLO 在这些类别上的表现会更好。应使用 YOLOE 覆盖无法训练的类别,而不是用它取代训练。
  • 稀有类别是薄弱环节。 性能中的 mAPr 列专门报告 LVIS 稀有类别上的精度,在文本提示模式下,每一行都低于常见类别和高频类别对应的列。当目标不常见时,应查看这一指标,而不是只看醒目的 mAP。
  • 提示描述的是外观,而不是关系。 检测通过将区域特征与提示嵌入进行比较来工作,因此依赖状态、上下文或比较关系的提示——“损坏的”“最左边的”“正在被携带的那个”——没有可靠的匹配依据。最好使用接近日常类别名称的措辞。
  • 大型提示集会增加延迟。 提示嵌入只计算一次,但每次前向传播都要将其与区域特征进行比较。在 CPU 上使用 yoloe-26s-seg.pt 测量时,从 80 个类别增加到 1,203 个类别,前向传播耗时约增加 19%;使用完整的 4,585 个名称词汇表时,约增加 89%。报告的 FLOPs 完全不会变化,因为区域与文本之间的相似度计算不计入其中,因此性能配置文件不会对此发出警告。
  • 在设置提示前,类别名称只是占位符。 新加载的 *-seg.pt 检查点会以数字名称("0""1"、……)报告 nc=80,因此请先调用 set_classes(),再读取标签。无提示检查点已经预先填充完整词汇表。

部署说明#

  • 硬件。 推理需要配备 4-8 GB VRAM 的 NVIDIA GPU;ns 规模可以在 Jetson 等边缘 GPU 上运行,也可以在降低分辨率的 CPU 上运行。微调需要一块 GPU。
  • **NMS 默认是类别无关的。**YOLOE 使用 agnostic_nms=True 进行预测。默认情况下,这会抑制不同类别之间得分较低的重叠边界框,而不仅仅是同一类别内,从而防止当一个对象匹配多个类别时出现重复。使用 nms=False 时,YOLOE-26 不应用 IoU 抑制;无关模式只保留每个锚框表现最好的单个类别,而不是让一个锚框发出多个类别标签。传递 agnostic_nms=False 以进行覆盖。
  • 批处理。 批量推理可以直接使用,同一次调用中每张图像的视觉提示也可以不同。

从头训练官方模型#

大多数读者不需要进行此操作。它会复现基于 Objects365、GQA 和 Flickr30k 发布的开放词汇检查点——在 8× RTX 4090 上使用约 140 万个训练样本——与使用你自己的数据进行微调无关,后者已在上方的训练用法中介绍。

警告

所有继承 YOLOETrainer 的训练器都会拒绝 compile=True,包括默认的 YOLOESegTrainer 以及下面所有从头训练的训练器。请传入 compile=False(默认值)。上文使用的两个微调训练器 YOLOEPESegTrainerYOLOEPETrainer 不受此限制。

训练需要分割标注。你可以下载下面的处理后文件,也可以使用官方团队提供的脚本自行生成,脚本由 SAM 2.1 提供支持。验证使用 LVIS minival

数据集类型样本数框数处理后的分割标注
Objects365v1检测609k9621kobjects365_train_segm.json
GQA视觉定位621k3681kfinal_mixed_train_no_coco_segm.json
Flickr30k定位149k641kfinal_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。完整的 v8 规模模型训练方案见 上游 YOLOE 仓库

完成的无提示训练会使用get_vocabset_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

get_vocab 返回由模型的 end2end 标志所选择的分支,并且 set_vocab 会对该单个分支进行重新参数化。发布的 YOLOE-26 文件转而为每个分支携带一个词汇表,这正是让 nms 在它们之间进行选择的原因;通过获取文本提示模型的另一个副本中的第二个词汇表来复现这一点。YOLOE-11 和 YOLOE-v8 只有一个分支,因此它们可以直接使用上面的调用。

one2one_model = YOLOE("runs/segment/train/weights/best.pt")  # get_vocab fuses the head it reads, so load a second copy
one2one_model.model.end2end = True  # read the NMS-free branch

model.set_vocab(vocab, names, one2one_vocab=one2one_model.get_vocab(names))

引用和致谢#

如果 YOLOE 对你的研究或项目有所贡献,请引用由清华大学Ao Wang、Lihao Liu、Hui Chen、Zijia Lin、Jungong Han 和 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 仓库访问。

常见问题#

  • Ultralytics YOLOE 增加了 YOLO-World 不具备的两项能力:视觉提示,即用示例框替代类别名称;以及无提示检查点,无需任何提示即可根据内置的 4,585 个名称词汇表进行响应。已发布的 *-seg.pt 检查点的每个预测还会携带一个实例分割掩码。在精度方面,原始 YOLOE 论文显示,在 LVIS 上 YOLOE-v8s 比 YOLO-Worldv2-S 高 3.5 AP,训练成本仅为其三分之一,推理速度则达到 1.4 倍。迁移只需修改一行代码——请参阅 YOLOE 的比较

  • Ultralytics YOLOE 支持三种提示模式。文本提示是在 *-seg.pt 检查点上以字符串形式提供类别名称,通常应优先选择这种方式。视觉提示是在参考图像上提供一个或多个示例框,适用于难以用语言描述的目标。无提示推理使用独立的 *-seg-pf.pt 检查点,根据内置的 4,585 个名称词汇表进行响应,无需提供任何内容。文本提示和视觉提示共用相同的检查点;无提示模式使用不同的文件,并拒绝 set_classes()。完整对比请参阅选择提示模式

  • yoloe-26s-seg.pt 开始:YOLOE-26 系列在每个对应规模上都领先于 YOLOE-11 和 YOLOE-v8,并且 s 规模是在 LVIS minival 上 mAP 超过 30 的最小规模。当稀有类别的精度比延迟更重要时,升级到 mlx——应比较性能中的 mAPr 列。只有在边缘部署时才降级到 n。如果你想使用内置词汇表而不是自己的类别名称,请改为加载相同规模的 *-seg-pf.pt 文件。

  • object0object1 这样的标签表示预测来自视觉提示:示例框被分组为临时编号类别,而不是携带你的名称。你在 visual_prompts["cls"] 中传入的类别 ID 仅用于分组。模型会按照你分配的 ID 顺序,将其报告为 object0object1 等,因此请在结果中将它们映射回你自己的标签。如果希望输出中显示你的名称,请改用文本提示。

  • 无提示检查点(*-seg-pf.pt)通过自身的内置词汇表解析类别,并使用 AssertionError: Prompt-free model does not support setting classes. Please try with Text/Visual prompt models. 拒绝外部提示。需要使用自己的类别列表时,请加载 *-seg.pt 检查点。请参阅选择提示模式

  • 首次使用文本提示时,Ultralytics YOLOE 会从 GitHub 安装 ultralytics/CLIP,并使用 pip 将 TorchScript 文本编码器下载到当前工作目录——YOLOE-26 约需 254 MB;每个模型系列对应的确切资源请参阅安装与要求。视觉提示和无提示检查点都不需要这些内容。要避免在目标机器上下载,请先设置提示并使用 save_prompt_embeddings() 保存,或者在类别已配置好的情况下导出模型。

  • 不可以——YOLOE 会在导出时将提示指定的类别写入权重,因此已加载的导出模型会拒绝 set_classes()visual_prompts=。请从原始 .pt 检查点重新导出,并配置新提示。导出的文件行为类似标准 YOLO 模型,也可以使用 YOLO()YOLOE() 加载。

  • 当你需要实时吞吐量并且可以指定类别时,使用 YOLOE;当概念分割质量比速度更重要时,使用 SAM 3。两者都接受视觉示例,但只有 YOLOE 具有无提示模式。完整对比请参阅YOLOE 的比较

评论