Ultralytics YOLO27:
Get Started

YOLO-World 模型#

YOLO-World 模型引入了一种先进的实时Ultralytics YOLOv8 方法,用于开放词汇检测任务。这项创新能够根据描述性文本检测图像中的任意目标。在保持竞争力的同时大幅降低计算需求,使 YOLO-World 成为众多视觉应用中的多用途工具。



观看: YOLO World 在自定义数据集上的训练工作流

YOLO-World 模型架构概览

概述#

YOLO-World 解决了传统开放词汇检测模型面临的挑战:这类模型通常依赖计算开销巨大的 Transformer 模型,需要大量计算资源。这些模型还依赖预定义的目标类别,限制了它们在动态场景中的实用性。YOLO-World 为 YOLOv8 框架加入开放词汇检测能力,采用视觉语言建模,并在大规模数据集上进行预训练,从而以无与伦比的效率,在零样本场景中出色地识别多种目标。

对于还需要实例掩码、视觉提示或无提示模式的开放词汇任务,请参阅 YOLOE,它使用相同的 set_classes() API。

主要功能#

  1. 实时解决方案: YOLO-World 利用 CNN 的计算速度,提供快速的开放词汇检测解决方案,满足需要即时结果的行业需求。

  2. 效率与性能: YOLO-World 在不牺牲性能的前提下,大幅降低计算和资源需求。它是 SAM 等模型的有力替代方案,计算成本仅为其一小部分,足以支持实时应用。

  3. 使用离线词汇表进行推理: YOLO-World 引入了“先提示、后检测”策略,利用离线词汇表进一步提高效率。该方法支持使用预先计算的自定义提示(包括描述文本或类别),将其编码并存储为离线词汇表嵌入,从而简化检测流程。

  4. 由 YOLOv8 提供支持: YOLO-World 基于 Ultralytics YOLOv8 构建,利用实时目标检测的最新进展,以出色的精度和速度支持开放词汇检测。

  5. 基准测试表现出色: 在标准基准测试中,YOLO-World 在速度和效率方面超越了包括 MDETR 和 GLIP 系列在内的现有开放词汇检测器,展现了 YOLOv8 在单张 NVIDIA V100 GPU 上的卓越能力。

  6. 应用广泛: YOLO-World 的创新方法为众多视觉任务带来了新的可能性,相较于现有方法,速度提升了数个数量级。

可用模型、支持的任务和运行模式#

本节详细介绍了可用模型及其对应的预训练权重、支持的任务,以及与各种运行模式的兼容性,包括推理、验证、训练和导出;✅ 表示支持,❌ 表示不支持。

注意

所有 YOLOv8-World 权重都直接从官方 YOLO-World 仓库迁移而来,体现了该仓库的卓越贡献。

模型类型预训练权重支持的任务训练验证推理导出
YOLOv8s-worldyolov8s-world.pt目标检测✅✅✅❌
YOLOv8s-worldv2yolov8s-worldv2.pt目标检测✅✅✅✅
YOLOv8m-worldyolov8m-world.pt目标检测✅✅✅❌
YOLOv8m-worldv2yolov8m-worldv2.pt目标检测✅✅✅✅
YOLOv8l-worldyolov8l-world.pt目标检测✅✅✅❌
YOLOv8l-worldv2yolov8l-worldv2.pt目标检测✅✅✅✅
YOLOv8x-worldyolov8x-world.pt目标检测✅✅✅❌
YOLOv8x-worldv2yolov8x-worldv2.pt目标检测✅✅✅✅

COCO 数据集上的零样本迁移#

性能
模型类型mAPmAP50mAP75
yolov8s-world37.452.040.6
yolov8s-worldv237.752.241.0
yolov8m-world42.057.045.6
yolov8m-worldv243.058.446.8
yolov8l-world45.761.349.8
yolov8l-worldv245.861.349.8
yolov8x-world47.063.051.2
yolov8x-worldv247.162.851.4

使用示例#

YOLO-World 模型可以轻松集成到你的 Python 应用中。Ultralytics 提供易于使用的 Python API 和 CLI 命令,帮助你简化开发流程。



观看: 使用 Ultralytics 的 YOLO-World 模型示例 | 开放词汇、无需提示等 🚀

训练用法#

提示

我们强烈建议使用 yolov8-worldv2 进行自定义训练,因为它支持确定性训练,并且更容易导出为 ONNX 和 TensorRT 等格式。

使用 train 方法进行目标检测非常简单,如下所示:

示例

PyTorch 预训练的 *.pt 模型以及配置 *.yaml 文件都可以传递给 YOLOWorld() 类,从而在 Python 中创建模型实例:

from ultralytics import YOLOWorld

# 加载预训练的 YOLOv8s-worldv2 模型
model = YOLOWorld("yolov8s-worldv2.pt")

# 使用 COCO8 示例数据集训练模型 100 个 epoch
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)

# 使用 YOLO-World 模型对“bus.jpg”图像进行推理
results = model("path/to/bus.jpg")

预测用法#

使用 predict 方法进行目标检测非常简单,如下所示:

示例
from ultralytics import YOLOWorld

# 初始化 YOLO-World 模型
model = YOLOWorld("yolov8s-world.pt")  # 也可以选择 yolov8m/l-world.pt 来使用不同的尺寸

# 使用 YOLOv8s-world 模型对指定图像进行推理
results = model.predict("path/to/image.jpg")

# 显示结果
results[0].show()

此代码片段展示了如何轻松加载预训练模型并对图像进行预测。

验证用法#

在数据集上验证模型的流程如下,非常简单:

示例
from ultralytics import YOLO

# 创建 YOLO-World 模型
model = YOLO("yolov8s-world.pt")  # 也可以选择 yolov8m/l-world.pt 来使用不同的尺寸

# 在 COCO8 示例数据集上进行模型验证
metrics = model.val(data="coco8.yaml")

跟踪用法#

使用 YOLO-World 模型对视频/图像进行目标跟踪的流程如下,非常简单:

示例
from ultralytics import YOLO

# 创建 YOLO-World 模型
model = YOLO("yolov8s-world.pt")  # 也可以选择 yolov8m/l-world.pt 来使用不同的尺寸

# 使用 YOLO-World 模型跟踪视频中的目标
results = model.track(source="path/to/video.mp4")
注意

Ultralytics 提供的 YOLO-World 模型已预先配置了 COCO 数据集类别,并将其作为离线词汇的一部分,从而提升了开箱即用的效率。借助这项集成,YOLOv8-World 模型无需额外设置或自定义,即可直接识别并预测 COCO 数据集中定义的 80 个标准类别。

设置提示词#

YOLO-World 提示词类别名称概览

YOLO-World 框架支持通过自定义提示词动态指定类别,让用户能够根据自身需求调整模型,而无需重新训练。这项功能对于将模型适配到新领域或特定任务尤其有用,这些领域或任务可能原本并不包含在训练数据中。通过设置自定义提示词,用户可以引导模型重点关注感兴趣的对象,从而提升检测结果的相关性和准确率。

例如,如果你的应用只需要检测“person”和“bus”对象,就可以直接指定这些类别:

示例
from ultralytics import YOLO

# 初始化 YOLO-World 模型
model = YOLO("yolov8s-world.pt")  # 也可以选择 yolov8m/l-world.pt

# 定义自定义类别
model.set_classes(["person", "bus"])

# 对图像中的指定类别执行预测
results = model.predict("path/to/image.jpg")

# 显示结果
results[0].show()
背景类别

一些用户发现,在背景类别中添加一个空字符串 "",可以在某些场景下提升检测性能。这种效果似乎取决于具体场景,其确切机制尚未完全明确:

model.set_classes(["person", "bus", ""])

空字符串会在 model.names 中保留为独立类别,包括在你保存的任何模型中,因此对应的检测结果会返回空标签。在预测时传入 classes=[0, 1],即可只保留实际类别。

设置自定义类别后,你也可以保存模型。这样可以创建一个专门针对特定用例的 YOLO-World 模型版本。此过程会将自定义类别定义直接嵌入模型文件,使模型无需进一步调整即可使用指定类别。按照以下步骤保存并加载自定义 YOLO-World 模型:

示例

首先,加载 YOLO-World 模型,为其设置自定义类别并保存:

from ultralytics import YOLO

# 初始化 YOLO-World 模型
model = YOLO("yolov8s-world.pt")  # 也可以选择 yolov8m/l-world.pt

# 定义自定义类别
model.set_classes(["person", "bus"])

# 保存带有已定义离线词汇的模型
model.save("custom_yolov8s.pt")

保存后,custom_yolov8s.pt 模型的表现与其他预训练 YOLOv8 模型相同,但有一个关键区别:它现在经过优化,只检测你定义的类别。这种自定义可以显著提升模型在特定应用场景中的检测性能和效率。

from ultralytics import YOLO

# 加载你的自定义模型
model = YOLO("custom_yolov8s.pt")

# 运行推理以检测你的自定义类别
results = model.predict("path/to/image.jpg")

# 显示结果
results[0].show()

保存自定义词汇的优势#

  • 效率:通过聚焦相关对象简化检测流程,减少计算开销并加快推理速度。
  • 灵活性:无需大量重新训练或收集数据,即可轻松将模型适配到新的或小众的检测任务。
  • 简便性:无需在运行时反复指定自定义类别,从而简化部署;模型可以直接使用其内嵌词汇。
  • 性能:通过让模型将注意力和资源集中于识别已定义的对象,提升指定类别的检测准确率。

这种方法为针对特定任务定制先进的目标检测模型提供了强大途径,让先进 AI 更易于使用,并适用于更广泛的实际应用。

从头开始复现官方结果(实验性)#

准备数据集#

  • 训练数据
  • 验证数据
数据集类型标注文件
LVIS minival检测minival.txt

从头开始启动训练#

注意

WorldTrainerFromScratch 经过高度定制,可同时使用检测数据集和 grounding 数据集训练 yolo-world 模型。更多详情请参阅 ultralytics.models.yolo.world.train_world.py。

示例
from ultralytics import YOLOWorld
from ultralytics.models.yolo.world.train_world import WorldTrainerFromScratch

# 选项 1:使用 Python 字典
data = {
    "train": {
        "yolo_data": ["Objects365.yaml"],
        "grounding_data": [
            {
                "img_path": "flickr30k/images",
                "json_file": "flickr30k/final_flickr_separateGT_train.json",
            },
            {
                "img_path": "GQA/images",
                "json_file": "GQA/final_mixed_train_no_coco.json",
            },
        ],
    },
    "val": {"yolo_data": ["lvis.yaml"]},
}

# 选项 2:使用 YAML 文件 (yolo_world_data.yaml)
# 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 = YOLOWorld("yolov8s-worldv2.yaml")
model.train(
    data=data,  # 如果使用 YAML 文件,则设置 data="yolo_world_data.yaml"
    batch=128,
    epochs=100,
    trainer=WorldTrainerFromScratch,
)

引用与致谢#

我们衷心感谢 Tencent AILab Computer Vision Center 在基于 YOLO-World 的实时开放词汇目标检测领域所做的开创性工作:

引用格式
@article{cheng2024yolow,
title={YOLO-World: Real-Time Open-Vocabulary Object Detection},
author={Cheng, Tianheng and Song, Lin and Ge, Yixiao and Liu, Wenyu and Wang, Xinggang and Shan, Ying},
journal={arXiv preprint arXiv:2401.17270},
year={2024}
}

如需进一步了解,YOLO-World 原始论文可在 arXiv 上查阅。你可以通过他们的 GitHub 代码库访问项目源代码和其他资源。我们感谢他们致力于推动该领域的发展,并与社区分享宝贵见解。

常见问题#

  • YOLO-World 模型是一种基于 Ultralytics YOLOv8 框架的先进实时目标检测方法。它擅长开放词汇检测任务,可以根据描述性文本识别图像中的对象。YOLO-World 运用视觉语言建模,并在大型数据集上进行预训练,以显著降低的计算需求实现高效率和高性能,因此非常适合各行各业的实时应用。

  • YOLO-World 支持“先提示、后检测”策略,利用离线词汇提升效率。诸如说明文字或特定对象类别之类的自定义提示词会预先编码,并存储为离线词汇嵌入。这种方法无需重新训练即可简化检测流程。你可以在模型中动态设置这些提示词,使模型适配特定检测任务,如下所示:

    from ultralytics import YOLOWorld
    
    # 初始化 YOLO-World 模型
    model = YOLOWorld("yolov8s-world.pt")
    
    # 定义自定义类别
    model.set_classes(["person", "bus"])
    
    # 对图像执行预测
    results = model.predict("path/to/image.jpg")
    
    # 显示结果
    results[0].show()
  • 与传统的开放词汇检测模型相比,YOLO-World 具有以下优势:

    • 实时性能:它利用 CNN 的计算速度,实现快速、高效的检测。
    • 高效率和低资源需求:YOLO-World 在保持高性能的同时,大幅降低计算和资源需求。
    • 可自定义提示词:该模型支持动态设置提示词,用户无需重新训练即可指定自定义检测类别。
    • 基准测试表现出色:在标准基准测试中,无论速度还是效率,它都优于 MDETR 和 GLIP 等其他开放词汇检测器。
  • 通过提供的 Python API 或 CLI 命令,使用自己的数据集训练 YOLO-World 模型非常简单。下面介绍如何使用 Python 开始训练:

    from ultralytics import YOLOWorld
    
    # 加载预训练的 YOLOv8s-worldv2 模型
    model = YOLOWorld("yolov8s-worldv2.pt")
    
    # 在 COCO8 数据集上训练模型 100 个 epoch
    results = model.train(data="coco8.yaml", epochs=100, imgsz=640)

    或者使用 CLI:

    yolo train model=yolov8s-worldv2.pt data=coco8.yaml epochs=100 imgsz=640
  • Ultralytics 提供多个预训练 YOLO-World 模型,支持各种任务和运行模式:

    模型类型预训练权重支持的任务训练验证推理导出
    YOLOv8s-worldyolov8s-world.pt目标检测✅✅✅❌
    YOLOv8s-worldv2yolov8s-worldv2.pt目标检测✅✅✅✅
    YOLOv8m-worldyolov8m-world.pt目标检测✅✅✅❌
    YOLOv8m-worldv2yolov8m-worldv2.pt目标检测✅✅✅✅
    YOLOv8l-worldyolov8l-world.pt目标检测✅✅✅❌
    YOLOv8l-worldv2yolov8l-worldv2.pt目标检测✅✅✅✅
    YOLOv8x-worldyolov8x-world.pt目标检测✅✅✅❌
    YOLOv8x-worldv2yolov8x-worldv2.pt目标检测✅✅✅✅
  • 要从头复现官方结果,你需要准备数据集,并使用提供的代码启动训练。训练过程包括创建数据字典,并使用自定义训练器运行 train 方法:

    from ultralytics import YOLOWorld
    from ultralytics.models.yolo.world.train_world import WorldTrainerFromScratch
    
    data = {
        "train": {
            "yolo_data": ["Objects365.yaml"],
            "grounding_data": [
                {
                    "img_path": "flickr30k/images",
                    "json_file": "flickr30k/final_flickr_separateGT_train.json",
                },
                {
                    "img_path": "GQA/images",
                    "json_file": "GQA/final_mixed_train_no_coco.json",
                },
            ],
        },
        "val": {"yolo_data": ["lvis.yaml"]},
    }
    
    model = YOLOWorld("yolov8s-worldv2.yaml")
    model.train(data=data, batch=128, epochs=100, trainer=WorldTrainerFromScratch)

评论