YOLO-World 是腾讯AI实验室开发的一种零样本对象检测模型,它允许用户在不训练或微调模型的情况下,通过文本提示来识别图像中感兴趣的对象。这种模型采用了“提示后检测”的新范式,消除了其他零样本模型如Grounding DINO所需的即时文本编码,从而提高了模型的潜在速度。根据YOLO-World的论文,该模型的小版本在V100 GPU上可达到74.1 FPS的速度。
在本指南中,将展示如何使用YOLO-World进行对象检测。将使用Roboflow InferencePython包,它允许在自有硬件上部署广泛的计算机视觉模型。
准备了一个交互式的Colab笔记本,可以在阅读本指南的同时使用它。
要使用YOLO-World检测对象,将执行以下步骤:
将使用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"
话虽如此,可以在本指南中使用任何想要的图像。
YOLO-World有三个版本:小型(S)、中型(M)和大型(L)。这些版本可通过以下模型ID获得:
在本指南中,将使用大型模型。虽然速度较慢,但此模型将使在任务上获得最佳性能。
接下来,需要加载模型并设置想要识别的类别。与其他零样本对象检测模型在推理时要求文本提示不同,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在视频上运行推理。