YOLO-World 模型

YOLO-World 模型引入了一种基于 Ultralytics YOLOv8 的先进实时开放词汇检测方法。这一创新使得基于描述性文本检测图像中的任意物体成为可能。通过在保持竞争性能的同时显著降低计算需求,YOLO-World 成为了适用于众多视觉应用的多功能工具。



Watch: YOLO World training workflow on custom dataset

YOLO-World 模型架构概览

概述

YOLO-World 解决了传统开放词汇检测模型面临的挑战,这些模型通常依赖于需要大量计算资源的繁琐 Transformer 模型。这些模型对预定义对象类别的依赖也限制了它们在动态场景中的实用性。YOLO-World 通过视觉-语言建模和在大规模数据集上的预训练,为 YOLOv8 框架注入了开放词汇检测能力,从而以无与伦比的效率在零样本场景中识别各种物体。

主要特性

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

  2. 效率与性能: YOLO-World 在不牺牲性能的前提下削减了计算和资源需求,提供了一种比 SAM 等模型更强大且计算成本仅为一小部分的替代方案,从而实现了实时应用。

  3. 离线词汇推理: YOLO-World 引入了一种“先提示后检测”的策略,采用离线词汇来进一步提高效率。这种方法允许使用预先计算好的自定义提示(包括标题或类别)进行编码并存储为离线词汇嵌入,从而简化了检测流程。

  4. 由 YOLOv8 提供支持: 基于 Ultralytics YOLOv8,YOLO-World 利用实时目标检测的最新进展,以无与伦比的准确度和速度实现开放词汇检测。

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

  6. 多功能应用: YOLO-World 的创新方法为多种视觉任务开启了新的可能性,其速度比现有方法提高了几个数量级。

可用模型、支持的任务和操作模式

本节详细介绍了可用模型及其特定的预训练权重、它们支持的任务,以及它们与各种操作模式(如 InferenceValidationTrainingExport)的兼容性,其中 ✅ 表示支持模式,❌ 表示不支持模式。

注意

所有 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 APICLI 命令 来简化开发。



Watch: YOLO-World Model Usage examples with Ultralytics | Open Vocab, Prompt-Free & others 🚀

训练使用

提示

我们强烈建议将 yolov8-worldv2 模型用于自定义训练,因为它支持确定性训练,并且易于导出为其他格式,例如 onnx/tensorrt。

目标检测可以通过 train 方法轻松实现,如下所示:

示例

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

from ultralytics import YOLOWorld

# Load a pretrained YOLOv8s-worldv2 model
model = YOLOWorld("yolov8s-worldv2.pt")

# Train the model on the COCO8 example dataset for 100 epochs
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)

# Run inference with the YOLO-World model on the 'bus.jpg' image
results = model("path/to/bus.jpg")

预测用法

目标检测可以通过 predict 方法轻松实现,如下所示:

示例
from ultralytics import YOLOWorld

# Initialize a YOLO-World model
model = YOLOWorld("yolov8s-world.pt")  # or select yolov8m/l-world.pt for different sizes

# Execute inference with the YOLOv8s-world model on the specified image
results = model.predict("path/to/image.jpg")

# Show results
results[0].show()

此代码片段演示了加载预训练模型并在图像上运行预测的简洁性。

验证用法

数据集上的模型验证可以按如下方式简化:

示例
from ultralytics import YOLO

# Create a YOLO-World model
model = YOLO("yolov8s-world.pt")  # or select yolov8m/l-world.pt for different sizes

# Conduct model validation on the COCO8 example dataset
metrics = model.val(data="coco8.yaml")

跟踪用法

在视频/图像上使用 YOLO-World 模型进行 目标跟踪 可以按如下方式简化:

示例
from ultralytics import YOLO

# Create a YOLO-World model
model = YOLO("yolov8s-world.pt")  # or select yolov8m/l-world.pt for different sizes

# Track with a YOLO-World model on a video
results = model.track(source="path/to/video.mp4")
注意

Ultralytics 提供的 YOLO-World 模型已预先配置了 COCO 数据集 类别作为其离线词汇表的一部分,提高了即时应用的效率。这种集成使得 YOLOv8-World 模型无需额外设置或自定义,即可直接识别并预测 COCO 数据集中定义的 80 个标准类别。

设置提示

YOLO-World 提示类名称概览

YOLO-World 框架允许通过自定义提示动态指定类别,使用户无需重新训练即可根据特定需求定制模型。此功能对于使模型适应原始 训练数据 中未包含的新领域或特定任务特别有用。通过设置自定义提示,用户可以有效地引导模型的焦点关注感兴趣的物体,从而提高检测结果的相关性和 准确性

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

示例
from ultralytics import YOLO

# Initialize a YOLO-World model
model = YOLO("yolov8s-world.pt")  # or choose yolov8m/l-world.pt

# Define custom classes
model.set_classes(["person", "bus"])

# Execute prediction for specified categories on an image
results = model.predict("path/to/image.jpg")

# Show results
results[0].show()
背景类

一些用户发现,在某些情况下,将空字符串 "" 作为背景类添加可以提高检测性能。这种行为似乎取决于具体场景,其确切机制尚未完全明确:

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

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

示例

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

from ultralytics import YOLO

# Initialize a YOLO-World model
model = YOLO("yolov8s-world.pt")  # or select yolov8m/l-world.pt

# Define custom classes
model.set_classes(["person", "bus"])

# Save the model with the defined offline vocabulary
model.save("custom_yolov8s.pt")

保存后,custom_yolov8s.pt 模型就像任何其他预训练的 YOLOv8 模型一样运行,但有一个关键区别:它现在经过优化,仅检测你定义的类。这种自定义可以显著提高针对你特定应用场景的检测性能和效率。

from ultralytics import YOLO

# Load your custom model
model = YOLO("custom_yolov8s.pt")

# Run inference to detect your custom classes
results = model.predict("path/to/image.jpg")

# Show results
results[0].show()

使用自定义词汇保存的好处

  • 效率:通过专注于相关对象来简化检测流程,减少计算开销并加快推理速度。
  • 灵活性:允许轻松调整模型以适应新的或利基检测任务,无需大量的重新训练或数据收集。
  • 简洁性:消除了在运行时反复指定自定义类的需要,简化了部署,使模型可以直接使用其嵌入的词汇表。
  • 性能:通过集中模型的注意力和资源来识别定义的物体,增强了对指定类的检测准确性。

这种方法提供了一种强大的手段,可以将最先进的 目标检测 模型定制化用于特定任务,从而使先进的 AI 更易于访问,并能应用于更广泛的实际应用。

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

准备数据集

  • 训练数据
数据集类型样本Boxes标注文件
Objects365v1检测609k9621kobjects365_train.json
GQA接地 (Grounding)621k3681kfinal_mixed_train_no_coco.json
Flickr30k接地 (Grounding)149k641kfinal_flickr_separateGT_train.json
  • 验证数据
数据集类型标注文件
LVIS minival检测minival.txt

从零开始启动训练

注意

WorldTrainerFromScratch 经过高度定制,允许同时在检测数据集和定位数据集上训练 YOLO-World 模型。更多详情请查看 ultralytics.model.yolo.world.train_world.py

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

# Option 1: Use Python dictionary
data = dict(
    train=dict(
        yolo_data=["Objects365.yaml"],
        grounding_data=[
            dict(
                img_path="flickr30k/images",
                json_file="flickr30k/final_flickr_separateGT_train.json",
            ),
            dict(
                img_path="GQA/images",
                json_file="GQA/final_mixed_train_no_coco.json",
            ),
        ],
    ),
    val=dict(yolo_data=["lvis.yaml"]),
)

# Option 2: Use YAML file (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,  # or data="yolo_world_data.yaml" if using YAML file
    batch=128,
    epochs=100,
    trainer=WorldTrainerFromScratch,
)

引文与致谢

我们向 腾讯 AI Lab 计算机视觉中心 在实时开放词汇目标检测方面所做的开创性工作表示感谢,即 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 仓库 访问。我们感谢他们致力于推动该领域的发展,并与社区分享宝贵的见解。

常见问题 (FAQ)

什么是 YOLO-World 模型,它是如何工作的?

YOLO-World 模型是一种基于 Ultralytics YOLOv8 框架的先进实时目标检测方法。它擅长开放词汇检测任务,能够根据描述性文本识别图像中的对象。通过视觉语言建模和在大规模数据集上的预训练,YOLO-World 实现了极高的效率和性能,同时显著降低了计算需求,使其成为各行业实时应用的理想选择。

YOLO-World 如何处理带有自定义提示(prompt)的推理?

YOLO-World 支持“先提示后检测”(prompt-then-detect)策略,利用离线词汇表来提高效率。诸如标题或特定对象类别之类的自定义提示会被预先编码并存储为离线词汇表 嵌入(embeddings)。这种方法简化了检测流程,无需重新训练。你可以动态地在模型中设置这些提示,以针对特定的检测任务进行调整,如下所示:

from ultralytics import YOLOWorld

# Initialize a YOLO-World model
model = YOLOWorld("yolov8s-world.pt")

# Define custom classes
model.set_classes(["person", "bus"])

# Execute prediction on an image
results = model.predict("path/to/image.jpg")

# Show results
results[0].show()

为什么我应该选择 YOLO-World 而不是传统的开放词汇检测模型?

与传统的开放词汇检测模型相比,YOLO-World 具有以下几个优势:

  • 实时性能: 它利用 CNN 的计算速度来提供快速、高效的检测。
  • 效率和低资源需求: YOLO-World 在保持高性能的同时,显著降低了计算和资源需求。
  • 可定制的提示: 该模型支持动态提示设置,允许用户指定自定义检测类别而无需重新训练。
  • 基准测试卓越: 在标准基准测试中,它在速度和效率方面都优于 MDETR 和 GLIP 等其他开放词汇检测器。

如何训练一个针对我数据集的 YOLO-World 模型?

通过提供的 Python API 或 CLI 命令,训练一个针对你数据集的 YOLO-World 模型非常简单。以下是使用 Python 开始训练的方法:

from ultralytics import YOLOWorld

# Load a pretrained YOLOv8s-worldv2 model
model = YOLOWorld("yolov8s-worldv2.pt")

# Train the model on the COCO8 dataset for 100 epochs
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)

或者使用 CLI:

yolo train model=yolov8s-worldv2.yaml data=coco8.yaml epochs=100 imgsz=640

有哪些可用的预训练 YOLO-World 模型及其支持的任务?

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目标检测

如何从零开始复现 YOLO-World 的官方结果?

要从零开始复现官方结果,你需要准备数据集并使用提供的代码启动训练。训练过程包括创建一个数据字典并运行带有自定义训练器的 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)

评论