YOLO-World 模型
YOLO-World 模型引入了一种先进的、实时的基于 Ultralytics YOLOv8 的开放词汇检测任务方法。此创新技术能够根据描述性文本检测图像中的任何对象。通过在保持竞争性能的同时显着降低计算需求,YOLO-World 成为众多基于视觉的应用程序的多功能工具。
观看: YOLO World 在自定义数据集上的训练工作流程
概述
YOLO-World 解决了传统开放词汇检测模型面临的挑战,这些模型通常依赖于繁琐的 Transformer 模型,需要大量的计算资源。这些模型对预定义对象类别的依赖也限制了它们在动态场景中的实用性。YOLO-World 通过开放词汇检测功能重振了 YOLOv8 框架,采用视觉-语言建模 并在大型数据集上进行预训练,从而擅长以无与伦比的效率识别零样本场景中的各种对象。
主要功能
-
实时解决方案: YOLO-World 利用 CNN 的计算速度,提供快速的开放词汇检测解决方案,满足需要即时结果的行业需求。
-
效率和性能: YOLO-World 大幅削减了计算和资源需求,同时又不牺牲性能,为像 SAM 这样的模型提供了一个强大的替代方案,但计算成本仅为其一小部分,从而实现了实时应用。
-
使用离线词汇表进行推理: YOLO-World 引入了一种“提示然后检测”策略,采用离线词汇表以进一步提高效率。这种方法可以使用预先计算的自定义提示(包括标题或类别)被编码并存储为离线词汇嵌入,从而简化检测过程。
-
由 YOLOv8 提供支持:YOLO-World 构建于 Ultralytics YOLOv8 之上,利用实时对象检测的最新进展,以无与伦比的准确性和速度促进开放词汇检测。
-
卓越的基准性能: 在标准基准测试中,YOLO-World 在速度和效率方面优于现有的开放词汇检测器,包括 MDETR 和 GLIP 系列,展示了 YOLOv8 在单个 NVIDIA V100 GPU 上的卓越性能。
-
多功能应用: YOLO-World 的创新方法为众多视觉任务开启了新的可能性,与现有方法相比,速度提高了几个数量级。
可用模型、支持的任务和操作模式
本节详细介绍了可用的模型及其特定的预训练权重、它们支持的任务以及它们与各种操作模式(如推理、验证、训练和导出)的兼容性,✅表示支持的模式,❌表示不支持的模式。
注意
所有的YOLOv8-World权重都已直接从官方YOLO-World仓库迁移,突显了他们的卓越贡献。
模型类型 | 预训练权重 | 支持的任务 | 推理 | 验证 | 训练 | 导出 |
---|---|---|---|---|---|---|
YOLOv8s-world | yolov8s-world.pt | 目标检测 | ✅ | ✅ | ✅ | ❌ |
YOLOv8s-worldv2 | yolov8s-worldv2.pt | 目标检测 | ✅ | ✅ | ✅ | ✅ |
YOLOv8m-world | yolov8m-world.pt | 目标检测 | ✅ | ✅ | ✅ | ❌ |
YOLOv8m-worldv2 | yolov8m-worldv2.pt | 目标检测 | ✅ | ✅ | ✅ | ✅ |
YOLOv8l-world | yolov8l-world.pt | 目标检测 | ✅ | ✅ | ✅ | ❌ |
YOLOv8l-worldv2 | yolov8l-worldv2.pt | 目标检测 | ✅ | ✅ | ✅ | ✅ |
YOLOv8x-world | yolov8x-world.pt | 目标检测 | ✅ | ✅ | ✅ | ❌ |
YOLOv8x-worldv2 | yolov8x-worldv2.pt | 目标检测 | ✅ | ✅ | ✅ | ✅ |
COCO 数据集上的零样本迁移
性能
模型类型 | mAP | mAP50 | mAP75 |
---|---|---|---|
yolov8s-world | 37.4 | 52.0 | 40.6 |
yolov8s-worldv2 | 37.7 | 52.2 | 41.0 |
yolov8m-world | 42.0 | 57.0 | 45.6 |
yolov8m-worldv2 | 43.0 | 58.4 | 46.8 |
yolov8l-world | 45.7 | 61.3 | 49.8 |
yolov8l-worldv2 | 45.8 | 61.3 | 49.8 |
yolov8x-world | 47.0 | 63.0 | 51.2 |
yolov8x-worldv2 | 47.1 | 62.8 | 51.4 |
使用示例
YOLO-World 模型易于集成到您的 python 应用程序中。Ultralytics 提供了用户友好的 python API 和 CLI 命令,以简化开发。
训练用法
提示
我们强烈建议使用 yolov8-worldv2
模型进行自定义训练,因为它支持确定性训练,并且易于导出为其他格式,例如 onnx/tensorrt。
对象检测 使用以下方法非常简单 train
method,如下所示:
示例
PyTorch pretrained *.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 YOLOv8n model on the 'bus.jpg' image
results = model("path/to/bus.jpg")
# Load a pretrained YOLOv8s-worldv2 model and train it on the COCO8 example dataset for 100 epochs
yolo train model=yolov8s-worldv2.yaml data=coco8.yaml epochs=100 imgsz=640
预测用法
使用以下方法可以轻松实现对象检测 predict
method,如下所示:
示例
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()
# Perform object detection using a YOLO-World model
yolo predict model=yolov8s-world.pt source=path/to/image.jpg imgsz=640
此代码片段演示了加载预训练模型并在图像上运行预测的简易性。
验证用法
在数据集上进行模型验证的流程如下:
示例
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")
# Validate a YOLO-World model on the COCO8 dataset with a specified image size
yolo val model=yolov8s-world.pt data=coco8.yaml imgsz=640
跟踪用法
使用 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")
# Track with a YOLO-World model on the video with a specified image size
yolo track model=yolov8s-world.pt imgsz=640 source="path/to/video.mp4"
注意
Ultralytics 提供的 YOLO-World 模型预先配置了 COCO 数据集类别作为其离线词汇表的一部分,从而提高了立即应用的效率。此集成允许 YOLOv8-World 模型直接识别和预测 COCO 数据集中定义的 80 个标准类别,而无需额外的设置或自定义。
设置提示词
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()
您还可以在设置自定义类别后保存模型。通过这样做,您可以创建一个专门用于您的特定用例的 YOLO-World 模型版本。此过程会将您的自定义类定义直接嵌入到模型文件中,使模型可以与您指定的类一起使用,而无需进一步调整。请按照以下步骤保存和加载您的自定义 YOLOv8 模型:
示例
首先加载一个 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 更易于访问并适用于更广泛的实际应用。
从头开始重现官方结果(实验性)
准备数据集
- 训练数据
数据集 | 类型 | 示例 | 边界框 | 标注文件 |
---|---|---|---|---|
Objects365v1 | 检测 | 609k | 9621k | objects365_train.json |
GQA | 定位 | 621k | 3681k | final_mixed_train_no_coco.json |
Flickr30k | 定位 | 149k | 641k | final_flickr_separateGT_train.json |
- 验证数据
数据集 | 类型 | 标注文件 |
---|---|---|
LVIS minival | 检测 | minival.txt |
从头开始启动训练
注意
WorldTrainerFromScratch
经过高度定制,允许同时在检测数据集和 grounding 数据集上训练 yolo-world 模型。更多详情请查看 ultralytics.model.yolo.world.train_world.py.
示例
from ultralytics import YOLOWorld
from ultralytics.models.yolo.world.train_world import WorldTrainerFromScratch
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"]),
)
model = YOLOWorld("yolov8s-worldv2.yaml")
model.train(data=data, batch=128, epochs=100, trainer=WorldTrainerFromScratch)
引用与致谢
我们感谢 腾讯 AILab 计算机视觉中心 在 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 模型是什么?它是如何工作的?
YOLO-World 模型是一种基于 Ultralytics YOLOv8 框架的先进的实时对象检测方法。它通过识别图像中基于描述性文本的对象,在开放词汇检测任务中表现出色。通过使用视觉语言建模和大型数据集上的预训练,YOLO-World 以显着降低的计算需求实现了高效率和性能,使其成为各个行业中实时应用的理想选择。
YOLO-World 如何处理带有自定义提示的推理?
YOLO-World 支持“prompt-then-detect”策略,该策略利用离线词汇来提高效率。自定义 prompt(如标题或特定对象类别)经过预编码并存储为离线词汇嵌入。这种方法简化了检测过程,无需重新训练。您可以在模型中动态设置这些 prompt,以根据具体的检测任务进行定制,如下所示:
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-world | yolov8s-world.pt | 目标检测 | ✅ | ✅ | ✅ | ❌ |
YOLOv8s-worldv2 | yolov8s-worldv2.pt | 目标检测 | ✅ | ✅ | ✅ | ✅ |
YOLOv8m-world | yolov8m-world.pt | 目标检测 | ✅ | ✅ | ✅ | ❌ |
YOLOv8m-worldv2 | yolov8m-worldv2.pt | 目标检测 | ✅ | ✅ | ✅ | ✅ |
YOLOv8l-world | yolov8l-world.pt | 目标检测 | ✅ | ✅ | ✅ | ❌ |
YOLOv8l-worldv2 | yolov8l-worldv2.pt | 目标检测 | ✅ | ✅ | ✅ | ✅ |
YOLOv8x-world | yolov8x-world.pt | 目标检测 | ✅ | ✅ | ✅ | ❌ |
YOLOv8x-worldv2 | yolov8x-worldv2.pt | 目标检测 | ✅ | ✅ | ✅ | ✅ |
如何从头开始重现 YOLO-World 的官方结果?
要从头开始重现官方结果,您需要准备数据集并使用提供的代码启动训练。训练过程包括创建数据字典并运行 train
带有自定义训练器的 method:
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)