欢迎来到零样本目标识别技术的奇妙世界!本文将详细介绍OWL-ViT模型及其在目标检测领域的创新应用。将一起探索实际代码示例,发现这种灵活技术的可能性。
传统的目标检测模型如同挑食的食客——它们只识别它们被训练过的对象。然而,零样本目标检测打破了这些限制。它就像是一位烹饪专家,能够识别任何菜肴,甚至是他们从未见过的。这种创新的核心是开放词汇目标检测与视觉变换器(OWL-ViT)范式。这种创新的方法结合了特定物品分类和定位组件,以及对比语言-图像预训练(CLIP)的力量。结果是一个不需要针对特定物品类别进行调整的模型,能够根据自由文本查询识别对象。
让开始搭建环境。首先,需要安装必要的库:
pip install -q transformers # 在终端运行此命令
安装完成后,准备探索使用OWL-ViT的三种主要方法:文本提示目标检测和图像引导目标检测。让通过动手示例深入了解这些方法。
想象一下,指着一张图片问:“能在这张照片中找到火箭吗?”这基本上就是用文本提示目标检测所做的。让看看它在行动中的样子:
from transformers import pipeline
import skimage
import numpy as np
from PIL import Image, ImageDraw
# 初始化pipeline
checkpoint = "google/owlv2-base-patch16-ensemble"
detector = pipeline(model=checkpoint, task="zero-shot-object-detection")
# 加载图片(使用经典的宇航员图片)
image = skimage.data.astronaut()
image = Image.fromarray(np.uint8(image)).convert("RGB")
# 执行检测
predictions = detector(
image,
candidate_labels=["human face", "rocket", "nasa badge", "star-spangled banner"],
)
# 可视化结果
draw = ImageDraw.Draw(image)
for prediction in predictions:
box = prediction["box"]
label = prediction["label"]
score = prediction["score"]
xmin, ymin, xmax, ymax = box.values()
draw.rectangle((xmin, ymin, xmax, ymax), outline="red", width=1)
draw.text((xmin, ymin), f"{label}: {round(score,2)}", fill="white")
image.show()
在这里,指示模型在图片中搜索特定的东西。就像是一个高级版的“看见”游戏!除了识别这些物品外,模型还为提供了每次检测的置信度估计。
import requests
# 加载目标和查询图片
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image_target = Image.open(requests.get(url, stream=True).raw)
query_url = "http://images.cocodataset.org/val2017/000000524280.jpg"
query_image = Image.open(requests.get(query_url, stream=True).raw)
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 2)
ax[0].imshow(image_target)
ax[1].imshow(query_image)
# 准备输入
inputs = processor(images=image_target, query_images=query_image, return_tensors="pt")
# 执行图像引导检测
with torch.no_grad():
outputs = model.image_guided_detection(**inputs)
target_sizes = torch.tensor([image_target.size[::-1]])
results = processor.post_process_image_guided_detection(outputs=outputs, target_sizes=target_sizes)[0]
# 可视化结果
draw = ImageDraw.Draw(image_target)
for box, score in zip(results["boxes"], results["scores"]):
xmin, ymin, xmax, ymax = box.tolist()
draw.rectangle((xmin, ymin, xmax, ymax), outline="white", width=4)
image_target.show()