YOLO-World 零样本模型对象检测指南

YOLO-World 是腾讯AI实验室开发的一种零样本对象检测模型,它允许用户在不训练或微调模型的情况下,通过文本提示来识别图像中感兴趣的对象。这种模型采用了“提示后检测”的新范式,消除了其他零样本模型如Grounding DINO所需的即时文本编码,从而提高了模型的潜在速度。根据YOLO-World的论文,该模型的小版本在V100 GPU上可达到74.1 FPS的速度。

在本指南中,将展示如何使用YOLO-World进行对象检测。将使用Roboflow InferencePython包,它允许在自有硬件上部署广泛的计算机视觉模型。

开始之前

准备了一个交互式的Colab笔记本,可以在阅读本指南的同时使用它。

检测对象与YOLO-World

要使用YOLO-World检测对象,将执行以下步骤:

  • 安装所需的依赖项
  • 导入依赖项并下载示例数据
  • 使用Roboflow Inference运行YOLO-World进行对象检测
  • 使用supervision绘制预测结果

步骤 #1: 安装依赖项

将使用Roboflow Inference来运行YOLO-World,并使用Supervision Python包来管理模型的预测。可以使用以下命令安装这些依赖项:

pip install -q inference-gpu[yolo-world]==0.9.12rc1 pip install -q supervision==0.19.0rc3

首先,需要导入使用YOLO-World所需的依赖项。创建一个新的Python文件,并添加以下代码:

import cv2 import supervision as sv from tqdm import tqdm from inference.models.yolo_world.yolo_world import YOLOWorld

在新的终端中,运行以下命令以下载示例数据。在本指南中,将使用一个人和一只狗的示例,稍后还将使用一个包含巧克力的视频。

wget -P {HOME} -q https://media.roboflow.com/notebooks/examples/dog.jpeg

Python文件中,设置变量以链接到这些数据:

import os HOME = os.getcwd() print(HOME) SOURCE_IMAGE_PATH = f"{HOME}/dog.jpeg"

话虽如此,可以在本指南中使用任何想要的图像。

步骤 #3: 运行模型

YOLO-World有三个版本:小型(S)、中型(M)和大型(L)。这些版本可通过以下模型ID获得:

  • yolo_world/s
  • yolo_world/m
  • yolo_world/l

在本指南中,将使用大型模型。虽然速度较慢,但此模型将使在任务上获得最佳性能。

接下来,需要加载模型并设置想要识别的类别。与其他零样本对象检测模型在推理时要求文本提示不同,YOLO-World要求在推理前设置提示。

model = YOLOWorld(model_id="yolo_world/l") classes = ["person", "backpack", "dog", "eye", "nose", "ear", "tongue"] model.set_classes(classes) image = cv2.imread(SOURCE_IMAGE_PATH) results = model.infer(image) detections = sv.Detections.from_inference(results)

在上述代码片段中,声明了想要识别的对象,将这些类别发送给模型,然后在图像上运行推理。将检测结果加载到一个sv.Detections对象中。这个对象可以与Supervision Python包一起使用,以操作、可视化和组合检测结果。

可视化预测结果

要可视化预测结果,请使用以下代码:

BOUNDING_BOX_ANNOTATOR = sv.BoundingBoxAnnotator(thickness=2) LABEL_ANNOTATOR = sv.LabelAnnotator(text_thickness=2, text_scale=1, text_color=sv.Color.BLACK) annotated_image = image.copy() annotated_image = BOUNDING_BOX_ANNOTATOR.annotate(annotated_image, detections) annotated_image = LABEL_ANNOTATOR.annotate(annotated_image, detections) sv.plot_image(annotated_image, (10, 10))

在此代码中,声明了两个注释器:一个用于绘制边界框,另一个用于绘制标签。然后可视化结果。以下是模型在图像上的检测结果:

模型成功识别了两个类别:人和狗。其他类别被过滤掉了,因为推理中默认的置信度设置为0.5(50%)。YOLO-World即使边界框正确,也经常返回低置信度。

可以通过降低model.infer()函数中使用的置信度来解决这个问题。在下面的代码中,将置信度设置为0.003,然后自定义注释器,以便显示每个类别的置信度:

image = cv2.imread(SOURCE_IMAGE_PATH) results = model.infer(image, confidence=0.003) detections = sv.Detections.from_inference(results) labels = [     f"{classes[class_id]} {confidence:0.3f}"     for class_id, confidence     in zip(detections.class_id, detections.confidence) ] annotated_image = image.copy() annotated_image = BOUNDING_BOX_ANNOTATOR.annotate(annotated_image, detections) annotated_image = LABEL_ANNOTATOR.annotate(annotated_image, detections, labels=labels) sv.plot_image(annotated_image, (10, 10))

以下是结果:

值得注意的是,有几个实例中,相同类别的边界框重叠。可以通过应用非最大抑制(NMS)来解决这个问题,这是一种去除重复或接近重复的边界框的技术。

可以通过在.from_inference()数据加载器的末尾添加.with_num(threshold=-0.1)来应用NMS,如下所示:

image = cv2.imread(SOURCE_IMAGE_PATH) results = model.infer(image, confidence=0.003) detections = sv.Detections.from_inference(results).with_nms(threshold=0.1)

让再次可视化预测结果:

labels = [     f"{classes[class_id]} {confidence:0.3f}"     for class_id, confidence     in zip(detections.class_id, detections.confidence) ] annotated_image = image.copy() annotated_image = BOUNDING_BOX_ANNOTATOR.annotate(annotated_image, detections) annotated_image = LABEL_ANNOTATOR.annotate(annotated_image, detections, labels=labels) sv.plot_image(annotated_image, (10, 10))

以下是结果:

在上面的图像中,背包和舌头类别上的重复边界框已被移除。

YOLO-World是腾讯AI实验室开发的零样本对象检测模型。可以使用Roboflow Inference计算机视觉推理软件在自有硬件上部署YOLO-World。

在本指南中,详细介绍了如何使用YOLO-World进行对象检测。加载了YOLO-World,在图像上运行了推理,然后使用supervision Python包显示了结果。

在附带的笔记本中,还介绍了上述示例以及一个额外的示例,展示了如何使用YOLO-World和supervision在视频上运行推理。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485