社区计算机视觉课程文档

多模态目标检测 (OWL-ViT)

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始

多模态目标检测 (OWL-ViT)

简介

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

OWL-ViT:增强功能和能力

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

目标检测的微调

OWL-ViT 的创新之处在于其用于目标检测的微调阶段。在这里,OWL-VIT 没有采用 CLIP 中使用的令牌池化和最终投影层,而是对每个输出令牌进行线性投影,以获得每个对象的图像嵌入。这些嵌入随后用于分类,而框坐标则通过小型 MLP 从令牌表示中导出。这种方法使 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 示例 此示例展示了 OWL-ViT 的一个简单用例,我们指定了数据集中可能存在的对象,例如猫,以及更抽象的对象,例如猫尾巴,后者很可能不在任何目标检测数据集中。这显示了 OWL-ViT 在开放词汇目标检测中的强大功能。

欢迎使用代码尝试更复杂的示例或这个 Gradio 应用

结论

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

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

< > 在 GitHub 上更新