社区计算机视觉课程文档

多模态对象检测(OWL-ViT)

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

多模态对象检测(OWL-ViT)

简介

对象检测是计算机视觉中的一项关键任务,随着YOLO等模型(原始论文最新代码版本)的出现,取得了显著进展。然而,YOLO等传统模型在检测其训练数据集之外的对象时存在局限性。为了解决这个问题,AI社区已转向开发能够识别更广泛对象的模型,从而催生了类似于CLIP但用于对象检测的模型。

OWL-ViT:增强和功能

OWL-ViT代表了开放词汇对象检测的飞跃。它从类似于CLIP的训练阶段开始,侧重于使用对比损失的视觉和语言编码器。这一基础阶段使模型能够学习视觉和文本数据的共享表示空间。

对象检测的微调

OWL-ViT 的创新之处在于其对象检测的微调阶段。在这里,OWL-ViT 没有使用 CLIP 中使用的 token pooling 和最终投影层,而是对每个输出 token 进行线性投影以获得每个对象的图像嵌入。然后,这些嵌入用于分类,而边界框坐标则通过一个小型 MLP 从 token 表示中导出。这种方法使得 OWL-ViT 能够检测图像中的对象及其空间位置,这是对传统对象检测模型的重大进步。

以下是 OWL-ViT 的预训练和微调阶段图示

OWL-ViT Pre-training and Fine-tuning

开放词汇检测

微调后,OWL-ViT 在开放词汇对象检测方面表现出色。由于视觉和文本编码器共享嵌入空间,它能够识别训练数据集中未明确存在的对象。这一功能使得同时使用图像和文本查询进行对象检测成为可能,从而增强了其多功能性。

用例示例

对于实际应用,通常使用文本作为查询,图像作为上下文。提供的 Python 示例演示了如何使用 transformers 库运行 OWL-ViT 的推理。

import requests
from PIL import Image, ImageDraw
import torch
from transformers import OwlViTProcessor, OwlViTForObjectDetection

processor = OwlViTProcessor.from_pretrained("google/owlvit-base-patch32")
model = OwlViTForObjectDetection.from_pretrained("google/owlvit-base-patch32")

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
texts = [["a photo of a cat", "a photo of a dog", "remote control", "cat tail"]]
inputs = processor(text=texts, images=image, return_tensors="pt")
outputs = model(**inputs)

target_sizes = torch.Tensor([image.size[::-1]])
results = processor.post_process_object_detection(
    outputs=outputs, target_sizes=target_sizes, threshold=0.1
)
i = 0  # Retrieve predictions for the first image for the corresponding text queries
text = texts[i]
boxes, scores, labels = results[i]["boxes"], results[i]["scores"], results[i]["labels"]

# Create a draw object
draw = ImageDraw.Draw(image)

# Draw each bounding box
for box, score, label in zip(boxes, scores, labels):
    box = [round(i, 2) for i in box.tolist()]
    print(
        f"Detected {text[label]} with confidence {round(score.item(), 3)} at location {box}"
    )
    # Draw the bounding box on the image
    draw.rectangle(box, outline="red")

# Display the image
image

图像应如下所示:OWL-ViT Example 此示例展示了 OWL-ViT 的简单用例,其中我们指定了数据集中可能存在的对象,如“猫”,以及更抽象的对象,如“猫尾巴”(这在任何对象检测数据集中很可能都不存在)。这展示了 OWL-ViT 在开放词汇对象检测中的强大功能。

请随意使用此代码尝试更复杂的示例或这个 Gradio 应用程序

总结

OWL-ViT 的对象检测方法代表了 AI 模型理解和与视觉世界互动方式的显著转变。通过将语言理解与视觉感知相结合,它推动了对象检测的边界,从而能够创建更准确、更多功能的模型,识别更广泛的对象。模型能力的这种演变对于需要对视觉场景进行细致理解的应用至关重要,尤其是在动态的真实世界环境中。

有关更多深入信息和技术细节,请参阅 OWL-ViT 论文。您还可以在 Hugging Face 文档中找到有关 OWL-ViT 2 模型的信息。

< > 在 GitHub 上更新