使用 Upstash Vector 和 Huggingface 模型、数据集和 Spaces 实现无服务器图像相似度
在这篇文章中,我们将指导您如何在无服务器环境中,使用 Upstash Vector 和 Huggingface 生态系统无缝地创建人脸相似度系统。借助这个强大的技术栈,您可以消除对后端、前端、数据库和托管实现和管理的复杂性的担忧。相反,您可以专注于机器学习,而我们将处理向量数据库的复杂性。
本周,领先的无服务器数据平台 Upstash 发布了其最新产品——Vector。使用 Upstash Vector,您可以根据指定的距离度量轻松存储和检索最相似的向量。在此处免费试用!有关 Upstash Vector 的更多信息,请浏览我们的博客。
演示
您可以在此处访问我们的演示。

数据集和模型
为了这项工作,我们选择了 人脸老化数据集,并结合了 Google 的 Vision Transformer (VIT) 模型,这两个都通过 Huggingface 提供。您可以随意探索其他数据集或模型,因为 Upstash Vector 可以与任何机器学习任务无缝集成,作为多功能的向量数据库。
Upstash Vector 不仅限于人脸相似度。您可以随意在各种应用程序中尝试不同的模态或模型。例如,您可以构建应用程序来查找相似的
- 诗歌
- 诗人
- 歌曲
- 绘画
- 声音
您可以使用 Upstash Vector 完成各种机器学习任务,并在广泛的内容类型中发现相似性。
生成向量嵌入并存储到 Upstash
利用我们的 VIT 模型,我们将通过模型的嵌入层为图像生成压缩表示。本质上,我们将 500x500x3 的图像压缩成长度为 768 的向量。这些嵌入(向量)将存储在 Upstash Vector 中。随后,我们将在索引中使用余弦相似度度量来查询相似向量,旨在识别可比较的人脸。在我们的系统中,假设嵌入的相似度(通过余弦相似度测量)越高,人脸之间的相似度就越大。
创建嵌入

查找相似嵌入

让我们安装必要的软件包。
pip install transformers datasets upstash-vector gradio tqdm -q
现在是时候通过 transformer 库初始化模型了。我们将使用 Google 预训练的 VIT 模型。
from transformers import AutoFeatureExtractor, AutoModel
model_ckpt = "google/vit-base-patch16-224-in21k"
extractor = AutoFeatureExtractor.from_pretrained(model_ckpt)
model = AutoModel.from_pretrained(model_ckpt)
hidden_dim = model.config.hidden_size
让我们下载数据集。为了节省时间,您可以选择较小的版本,因为较大的 16GB 数据集下载时间明显更长。
from datasets import load_dataset
#dataset = load_dataset("BounharAbdelaziz/Face-Aging-Dataset") #40k image
dataset = load_dataset("HengJi/human_faces") # 100 image
我们将创建 Index 对象以访问 Upstash Vector 中的索引。您可以在此处创建索引并获取 URL 和 TOKEN。如果您想了解更多关于客户端 API 的信息,可以查看 upstash_vector 的快速入门。我们还提供了 TypeScript 和 Go 客户端。
from upstash_vector import Index
index = Index(
url=[YOUR VECTOR URL],
token=[YOUR VECTOR TOKEN],
)
现在是时候生成嵌入并将其存储在 Upstash Vector 中了。为了优化效率并最小化延迟开销,我们将在索引上采用分批 upsert(更新/插入)方法。该过程涉及在 CPU 上逐个嵌入图像,请注意,这是一项资源密集型操作。在 Intel i5-6600 系统上,该操作耗时约 3 小时,使用了 16GB RAM。为了加快推理速度,您可以使用 GPU。如果您有兴趣了解更多信息,请参阅这篇博客以获取详细说明。
在这个工作流中,提取器对图像进行预处理,然后将处理后的输入馈送到模型中。随后,我们从输出中提取嵌入并批量将其 upsert 到索引中。
from tqdm import tqdm
batch_size = 100
embed_list = [None] * batch_size
dataset_size = len(dataset["train"])
for step in tqdm(range(dataset_size//batch_size)):
for i in range(batch_size):
id = step * batch_size + i
image = dataset["train"][id]["image"]
inputs = extractor(images=image, return_tensors="pt")
outputs = model(**inputs)
embedding = outputs.last_hidden_state[0][0]
embed_list[i] = (f"{id}", embedding)
index.upsert(embed_list)
使用 Gradio 和 Huggingface Spaces 构建人脸相似度应用程序
您可以使用 Gradio 轻松创建您的机器学习演示,并通过自托管或 Huggingface Spaces 轻松共享。您无需担心构建后端或前端。
演示代码非常简单;我们利用 upstash-vector 中的非阻塞 AsyncIndex 来处理并发请求。此外,我们通过调用 await index.query(...)
查询最相似的向量,并使用 Gallery 组件进行展示。有关 Gradio 的更深入知识,请参阅其快速入门指南。要亲身体验 Spaces 上的实际操作,请访问演示。
import gradio as gr
from upstash_vector import AsyncIndex
from transformers import AutoFeatureExtractor, AutoModel
from datasets import load_dataset
index = AsyncIndex(
url=[YOUR VECTOR URL],
token=[YOUR VECTOR TOKEN],
)
model_ckpt = "google/vit-base-patch16-224-in21k"
extractor = AutoFeatureExtractor.from_pretrained(model_ckpt)
model = AutoModel.from_pretrained(model_ckpt)
hidden_dim = model.config.hidden_size
dataset = load_dataset("BounharAbdelaziz/Face-Aging-Dataset")
with gr.Blocks() as demo:
gr.Markdown(
"""
# Find Your Twins
Upload your face and find the most similar people from [Face Aging Dataset](https://huggingface.co/datasets/BounharAbdelaziz/Face-Aging-Dataset) using Google's [VIT](https://huggingface.co/google/vit-base-patch16-224-in21k) model.
"""
)
with gr.Tab("Basic"):
with gr.Row():
with gr.Column(scale=1):
input_image = gr.Image(type="pil")
with gr.Column(scale=2):
output_image = gr.Gallery()
@input_image.change(inputs=input_image, outputs=output_image)
async def find_similar_faces(image):
if image is None:
return None
inputs = extractor(images=image, return_tensors="pt")
outputs = model(**inputs)
embed = outputs.last_hidden_state[0][0]
result = await index.query(vector=embed.tolist(), top_k=1000)
return [dataset["train"][int(vector.id)]["image"] for vector in result[:4]]
if __name__ == "__main__":
demo.launch()
结论
总而言之
- 利用 VIT 模型,我们为数据集中的图像生成了嵌入,并成功将其存储到我们的向量索引中。
- 通过 Gradio,我们制作了一个演示,允许用户嵌入给定的人脸图像,并在数据集中发现最相似的人脸。
我们邀请您探索不同的用例,尝试这些工具,并着手创建您自己的个性化相似度系统。这些技术的多功能性为创新和探索开辟了无限可能。