Ultralytics YOLO27:

YOLO-World 模型#

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



Watch: YOLO World training workflow on custom dataset

YOLO-World 模型架构概览

概述#

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

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

主要特性#

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

  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 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 框架支持通过自定义提示动态指定类别,让你能够根据具体需求调整模型,无需重新训练。此功能对于将模型适配到最初不属于训练数据的新领域或特定任务尤其有用。通过设置自定义提示,你可以引导模型关注感兴趣的对象,提升检测结果的相关性和准确率

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

示例
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 更易于应用于更广泛的实际场景。

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

准备数据集#

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

从头开始启动训练#

注意

WorldTrainerFromScratch 经过高度定制,支持同时在检测数据集和定位数据集上训练 yolo-world 模型。有关更多详情,请参阅 ultralytics.models.yolo.world.train_world.py

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

# Option 1: Use Python dictionary
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"]},
}

# 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,
)

引用和致谢#

我们衷心感谢 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
    
    # 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 具有以下优势:

    • 实时性能: 利用 CNN 的计算速度,提供快速、高效的检测。
    • 高效率和低资源需求: YOLO-World 在保持高性能的同时,显著降低计算和资源需求。
    • 可自定义提示: 模型支持动态设置提示,允许你指定自定义检测类别而无需重新训练。
    • 基准测试卓越表现: 在标准基准测试中,其速度和效率均优于 MDETR 和 GLIP 等其他开放词汇检测器。
  • 通过提供的 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.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)

评论