YOLOE:实时开放词汇检测与分割#
Ultralytics YOLOE(Real-Time Seeing Anything)是一个开放词汇检测与实例分割模型:它不使用在训练时固定的类别列表,而是在推理时接收你想要的类别,形式可以是一个文本提示、一个视觉示例或内置的 4585 个名称的词汇表。它基于 Ultralytics YOLO 架构(包括 YOLOv8、YOLO11 和 YOLO26)构建,并受 YOLO-World 启发,YOLOE 在接近闭集 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 支持三种提示模式,你的选择决定了你要加载哪个检查点(checkpoint)以及你的类别标签是什么样的。请选择与你在推理时能提供的内容相匹配的那一行。

| 模式 | 检查点 | 你提供的内容 | 结果中的类别名称 | 适用场景 |
|---|---|---|---|---|
| 文本提示 | *-seg.pt | 作为字符串的类别名称 | 正是你传入的名称 | 你可以用文字描述目标——这是最常见的选择 |
| 视觉提示 | *-seg.pt | 参考图像上的示例边界框 | 通用 object0、object1 等 | 你无法用文字描述目标:例如某个特定部件、徽标(logo)或缺陷 |
| 无提示 | *-seg-pf.pt | 无 | 来自内置 4585 个名称词汇表的名称 | 你在进行分类编目或探索,并且事先不知道要寻找什么 |
- 视觉提示不会携带你的标签。
visual_prompts中的类别 ID 将示例组合在一起;模型将它们报告为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()调用会通过pip从 GitHub 安装 ultralytics/CLIP(它提供了分词器),并将一个 TorchScript 文本编码器下载到当前工作目录中。YOLOE-26 会拉取mobileclip2_b.ts(约 254 MB);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"若要在推理时完全跳过文本编码器的下载,只需将提示一次性固化(bake)到权重中并重复使用——请参阅重复使用提示嵌入。
架构概述#
YOLOE 保留了标准的 YOLO 结构——用于特征提取的卷积主干网络(backbone)、用于多尺度融合的颈部网络(neck),以及预测类别和边界框的无锚框、解耦头部(anchor-free, decoupled head)——并添加了三个模块,每种提示模式一个:
- **可重参数化区域-文本对齐(RepRTA)**通过一个小型的辅助网络精炼来自 CLIP 的文本嵌入(embeddings)。该网络在每个
set_classes()调用中运行一次,并在导出时被折叠,因此它对每帧的开销为零。在每个前向传播中实际运行的是存储的提示嵌入与区域特征的比较;有关大提示集带来的开销,请参阅限制。 - **语义激活视觉提示编码器(SAVPE)**从示例框中编码语义和激活特征,使模型能够条件化(condition)于外观相似的对象。这是针对难以命名的目标(如徽标或特定部件)的单样本(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 上的性能#
在 640 像素下的 LVIS minival 上的零样本结果,摘自 Ultralytics YOLO26 论文。
文本和视觉提示#
每个准确率和参数单元格读取为文本提示 / 视觉提示;FLOPs 仅给出一次。参数量和 FLOPs 适用于论文评估的检测配置。准确率是论文的 Non-E2E 数值,这是它在比较中针对每个模型报告的唯一协议;在文本提示下,YOLOE-26 的端到端(end-to-end)头最多落后其 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 |
无提示#
无提示检查点使用其内置词汇表进行回答,无需提供提示。每个准确率单元格读取为端到端 / 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 模型在 mAP50-95 的每个匹配尺度上都领先于其 YOLOE-11 和 YOLOE-v8 对应模型,同时在参数量和 FLOPs 上保持在 v8 线以下。在相同的划分上,论文报告 YOLO-Worldv2 为 24.4 (S)、32.4 (M) 和 35.5 (L),基于 Transformer 的检测器 GLIP-T 为 26.0、GDINO-T 为 27.4、DetCLIP-T 为 34.4,每个模型都拥有 1.55 亿到 2.32 亿个参数。最初的 YOLOE 论文为其引入的 v8 尺度模型增加了两个结果。在 LVIS 上,YOLOE-v8s 以三分之一的训练成本和 1.4 倍的推理速度击败了 YOLO-Worldv2-S,优势达 3.5 AP。迁移到 COCO 后,与闭集的 YOLOv8-L 相比,YOLOE-v8l 获得了 0.6 box AP 和 0.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 中运行;微调配方和视觉提示传递了一个训练器或预测器类作为参数,这只有 Python API 接受。
训练使用#
在你的 YOLO 数据集上微调任何发布的 *-seg.pt 检查点。这主要遵循标准的 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 数组和一个类别 ID 的 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)跟踪使用#
提示的类别会直接延续到追踪(tracking)中,因此你可以追踪追踪器从未在训练中见过的对象:
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 返回掩码,并且这三者回答的是不同的问题:
| YOLOE | SAM 3 | YOLO-World | |
|---|---|---|---|
| 专为……构建 | 命名类别的实时检测和分割 | 概念分割与可提示追踪 | 实时开放词汇检测 |
| 掩码 | 可以,使用 *-seg.pt 检查点 | 是 | 不可以,仅限边界框 |
| 视觉提示 | 可以 (SAVPE) | 是 | 否 |
| 免提示模式 | 可以,4,585 个名称的词汇表 | 否 | 否 |
| 在以下情况下选择它: | 你需要吞吐量且能够说出类别名称 | 你需要最强的概念分割且能够消耗计算资源 | 你已经在使用了——请参阅下方的迁移说明 |
从 YOLO-World 过渡? API 的形式是相同的:将 YOLOWorld 替换为 YOLOE,加载 *-seg.pt 检查点,并保持你的 set_classes() 调用不变。你将获得掩码和视觉提示;关于冻结类别的导出说明适用于两者。
用例与应用#
开放词汇检测省去了针对每个类别重新训练的步骤,这在目标列表预先未知的情况下最为重要:
- 开放世界检测 — 能够遇到训练时未枚举的对象的机器人技术和安全系统。
- 从示例进行单样本检测 — 视觉提示从单个参考框中拾取特定的部件、标志或缺陷,这在工业检测中非常有用。
- 长尾编目 — 内置的 4,585 个名称词汇表足够广泛,适合生物多样性监测或零售库存盘点。
- 数据集引导 — 在人工审核之前使用边界框和掩码对图像进行预标注,然后在此结果上训练快速的闭集模型。
- 任意目标的分割 — 发布的
*-seg.pt检查点在每次预测时都会返回一个掩码,因此医学影像和卫星分析无需第二个模型即可获得像素级精确的输出。
一种常见的模式结合了两种模式:先运行一次免提示模式以发现存在的内容,然后针对重要的类别切换到文本提示。
局限性#
YOLOE 以牺牲准确率为代价换取了在推理时更改类别的能力。在你做出决定之前值得了解的后果:
- 零样本准确率远低于在你的类别上训练的模型。 带有提示的检查点在 LVIS minival 上的表现大致落在 22-40 mAP 的区间内;在你自己的数据上训练的闭集 YOLO 在这些类别上会超越它。使用 YOLOE 来覆盖你无法为其训练的类别,而不是用来取代训练。
- 罕见类别是弱点。 Performance 中的 mAPr 列专门报告了 LVIS 罕见类别的准确率,在文本提示下,它在每一行中都低于常见和频繁列。当你的目标不寻常时,请检查它而不是主打的 mAP。
- 提示描述的是外观,而不是关系。 检测的工作原理是将区域特征与提示嵌入进行比较,因此依赖于状态、上下文或比较的提示(例如“受损”、“最左侧”、“正在被搬运的那一个”)没有可靠的句柄来进行匹配。倾向于使用接近日常类别名称的措辞。
- 大型提示集会消耗延迟。 提示嵌入只计算一次,但在每个前向传递中都要与区域特征进行比较。在配备
yoloe-26s-seg.pt的 CPU 上测量时,从 80 个类别增加到 1,203 个类别时,前向传递大约增长 19%,而在达到完整的 4,585 个名称词汇表时大约增长 89%。报告的 FLOPs 完全没有变化,因为未计算区域与文本的相似度,因此配置文件不会向你发出警告。 - 在提示之前,类别名称只是占位符。 刚加载的
*-seg.pt检查点报告的nc=80带有数字名称("0"、"1"等),因此在读取标签之前请调用set_classes()。免提示检查点自带已填充完整的词汇表。
部署说明#
- 硬件。 推理需要配备 4-8 GB VRAM 的 NVIDIA GPU;
n和s规模可在诸如 Jetson 等边缘 GPU 上运行,或在降低分辨率的 CPU 上运行。微调需要单个 GPU。 - 默认情况下,NMS 是与类别无关的。 YOLOE 使用
agnostic_nms=True进行预测。在 YOLOE-11 和 YOLOE-v8 上,这会抑制不同类别之间得分较低的重叠框,而不仅仅是在同一类别内抑制,这可以防止当一个对象匹配多个类别时出现重复。端到端的 YOLOE-26 模型根本不应用 IoU 抑制;在那里,无关模式只为每个锚点保留单个最佳类别,而不是让一个锚点发出多个类别标签。传递agnostic_nms=False以进行覆盖。 - 批处理。 批处理推理可以直接运行,并且在同一调用中,视觉提示可以因图像而异。
从头开始训练官方模型#
大多数读者永远不需要这样做。它从 Objects365、GQA 和 Flickr30k 重现了已发布的开放词汇检查点——在 8× RTX 4090 上大约有 140 万个训练样本——并且与在你自己的数据上进行微调无关,微调已在上面训练用法中介绍。
继承自 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, 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 仓库访问该项目的源代码和其他资源。
常见问题解答#
Ultralytics YOLOE 支持三种提示模式。文本提示是
*-seg.pt检查点上的字符串形式的类别名称,也是通常的选择。视觉提示是参考图像上的一个或多个示例框,用于难以用言语表达的目标。免提示推理使用一个单独的*-seg-pf.pt检查点,在不提供任何内容的情况下从内置的 4,585 个名称词汇表中回答。文本提示和视觉提示共享相同的检查点;免提示是不同的文件,并且会拒绝set_classes()。有关完整的比较,请参阅选择提示模式。从
yoloe-26s-seg.pt开始:YOLOE-26 系列在每个匹配的规模上都领先于 YOLOE-11 和 YOLOE-v8,并且s规模是 LVIS minival 上超过 30 mAP 的最小规模。当罕见类别的准确率比延迟更重要时,请升级到m、l或x——Performance 中的 mAPr 列是要进行比较的列。仅针对边缘部署降级到n。当你想要内置词汇表而不是你自己的类别名称时,请改为加载相同规模的*-seg-pf.pt文件。诸如
object0和object1之类的标签意味着预测来自视觉提示,它将示例框分组为临时的编号类别,而不是携带你的名称。你在visual_prompts["cls"]中传递的类 ID 仅执行该分组。模型按照你分配的 ID 的顺序将它们报告为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 通过
pip从 GitHub 安装 ultralytics/CLIP,并将 TorchScript 文本编码器下载到当前工作目录中——对于 YOLOE-26 约为 254 MB;有关每个模型系列的准确资产,请参阅安装与要求。视觉提示和免提示检查点两者都不需要。为了避免在目标机器上下载,请设置一次提示并通过save_prompt_embeddings()保存它们,或者使用已配置类别的模型进行导出。不能——YOLOE 在导出时将提示的类别烘焙到了权重中,因此加载的导出拒绝
set_classes()和visual_prompts=。请使用配置好的新提示从原始.pt检查点重新导出。导出的文件的行为类似于标准 YOLO 模型,并且可以使用YOLO()以及YOLOE()加载。