复制页面 图像特征提取 图像特征提取是指在给定图像的情况下提取具有语义意义的特征的任务。这有许多应用场景,包括图像相似度计算和图像检索。此外,大多数计算机视觉模型都可以用于图像特征提取,只需移除任务特定的头部(如图像分类、目标检测等)即可获得特征。这些特征在更高层面上非常有用:例如边缘检测、角点检测等。根据模型的深度,它们还可能包含关于现实世界的信息(例如猫长什么样)。因此,这些输出可用于在特定数据集上训练新的分类器。
在本指南中,您将
学习如何基于 image-feature-extraction 流水线(pipeline)构建一个简单的图像相似度系统。 使用纯模型推理(bare model inference)完成相同的任务。 使用 image-feature-extraction 流水线计算图像相似度 我们有两张猫坐在渔网上的图像,其中一张是生成的。
已复制 from PIL import Image
import requests
img_urls = ["https://hugging-face.cn/datasets/huggingface/documentation-images/resolve/main/cats.png", "https://hugging-face.cn/datasets/huggingface/documentation-images/resolve/main/cats.jpeg"]
image_real = Image.open(requests.get(img_urls[0], stream=True).raw).convert("RGB")
image_gen = Image.open(requests.get(img_urls[1], stream=True).raw).convert("RGB") 让我们看看流水线如何运行。首先,初始化流水线。如果您没有向其传递任何模型,流水线将自动使用 google/vit-base-patch16-224 进行初始化。如果您想要计算相似度,请将 pool 设置为 True。
已复制 import torch
from transformers import pipeline
from accelerate import Accelerator
# automatically detects the underlying device type (CUDA, CPU, XPU, MPS, etc.)
device = Accelerator().device
pipe = pipeline(task="image-feature-extraction", model="google/vit-base-patch16-384", device=device, pool=True) 要使用 pipe 进行推理,请将两张图像都传递给它。
已复制 outputs = pipe([image_real, image_gen]) 输出包含这两张图像的池化嵌入(pooled embeddings)。
已复制 # get the length of a single output
print(len(outputs[0][0]))
# show outputs
print(outputs)
# 768
# [[[-0.03909236937761307, 0.43381670117378235, -0.06913255900144577, 为了获得相似度得分,我们需要将它们传递给相似度函数。
已复制 from torch.nn.functional import cosine_similarity
similarity_score = cosine_similarity(torch.Tensor(outputs[0]),
torch.Tensor(outputs[1]), dim=1)
print(similarity_score)
# tensor([0.6043]) 如果您想在池化之前获取最后的隐藏状态(last hidden states),请不要为 pool 参数传递任何值,因为其默认设置为 False。这些隐藏状态对于基于模型特征训练新的分类器或模型非常有用。
已复制 pipe = pipeline(task="image-feature-extraction", model="google/vit-base-patch16-224", device=device)
outputs = pipe(image_real) 由于输出未经过池化,我们获得的是最后隐藏状态,其中第一维是批次大小(batch size),最后两维是嵌入形状(embedding shape)。
已复制 import numpy as np
print(np.array(outputs).shape)
# (1, 197, 768) 使用 AutoModel 获取特征和相似度 我们也可以使用 transformers 的 AutoModel 类来获取特征。AutoModel 加载任何不带任务特定头部的 transformers 模型,我们可以利用这一点来获取特征。
已复制 from transformers import AutoImageProcessor, AutoModel
processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224")
model = AutoModel.from_pretrained("google/vit-base-patch16-224").to(device) 让我们写一个简单的推理函数。我们将首先把输入传递给 processor,然后将其输出传递给 model。
已复制 def infer(image):
inputs = processor(image, return_tensors="pt").to(device)
outputs = model(**inputs)
return outputs.pooler_output 我们可以直接将图像传递给此函数并获得嵌入。
已复制 embed_real = infer(image_real)
embed_gen = infer(image_gen) 我们可以再次通过这些嵌入计算相似度。
已复制 from torch.nn.functional import cosine_similarity
similarity_score = cosine_similarity(embed_real, embed_gen, dim=1)
print(similarity_score)
# tensor([0.6061], device='cuda:0', grad_fn=