使用Pinecone和Roboflow进行图像嵌入与检索

在现代人工智能应用中,向量数据库如Pinecone,被广泛用于存储文本和图像嵌入,以便在检索增强型生成(RAG)流程中使用。通过向量数据库,可以确定哪些信息候选可以作为上下文包含在大型语言模型(LLM)或大型多模态模型(LMM)的提示中。

本指南将展示如何使用Roboflow Inference计算并加载图像嵌入到Pinecone中。Roboflow Inference是一个快速、可扩展的工具,可以运行包括CLIP在内的最新视觉模型。CLIP模型可以用来计算图像嵌入。完成本指南后,将能够:

  • 使用Roboflow Inference计算CLIP嵌入。
  • 将图像嵌入加载到Pinecone中。
  • 使用嵌入和Pinecone运行向量搜索。

让开始吧!

Pinecone是什么?

Pinecone是一个向量数据库,可以在其中存储数据和嵌入。可以存储来自OpenAI的文本嵌入模型、OpenAI的CLIP模型、Hugging Face模型等的嵌入。Pinecone提供了多种语言的SDK,包括Python,这些SDK提供了与Pinecone向量数据库交互的本地语言方式。

步骤 #1: 安装Roboflow Inference

将使用RoboflowInference来计算CLIP嵌入。Roboflow Inference是一个开源解决方案,用于大规模运行视觉模型。可以使用Inference来运行微调的对象检测、分类和分割模型,以及基础模型,如Segment Anything和CLIP。

可以在自己的设备上使用Inference,也可以通过Roboflow API使用。对于本指南,将在自己的设备上使用Inference,这适合于有计算资源来运行CLIP嵌入计算的情况。还将展示如何使用Roboflow CLIP API,它使用与在自己机器上运行的Inference相同的接口。

首先,安装Docker。参考,了解如何在想要运行Inference的设备上安装Docker。

接下来,安装Roboflow Inference CLI。这个工具可以让用一个命令启动Inference服务器。可以使用以下命令安装Inference CLI:

pip install inference-cli

启动一个推理服务器:

inference server start

此命令将在启动一个Inference服务器。将在下一步中使用这个服务器来计算CLIP嵌入。

步骤 #2: 设置Pinecone数据库

将为一个图像文件夹创建一个搜索引擎。对于本指南,将使用来自COCO 128数据集的图像,该数据集包含各种不同的图像。数据集包含飞机、斑马和西兰花等对象。

可以从下载数据集作为ZIP文件,或者使用自己的图像文件夹。

在能够设置Pinecone向量数据库之前,需要安装Pinecone Python SDK,将使用它与Pinecone交互。可以使用以下命令进行安装:

pip install pinecone-client

接下来,创建一个新的Python文件,并添加以下代码:

from pinecone import Pinecone, PodSpec import os pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"]) pc.create_index( name='images', dimension=512, metric="cosine", spec=PodSpec(environment="gcp-starter", pod_type="starter") )

创建一个Pinecone账户。创建账户后,从Pinecone控制台的“API密钥”页面检索API密钥和环境。不需要在Pinecone仪表板中创建索引,因为代码片段将执行此操作。

将YOUR_API_KEY替换为Pinecone API密钥,将YOUR_ENVIRONMENT替换为Pinecone API密钥页面上的环境值。

此代码将创建一个名为“images”的索引,将在此索引上工作。

接下来,创建一个新的Python文件,并添加以下代码:

from pinecone import Pinecone import base64 import requests import os import uuid pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"]) index = pc.Index("images") IMAGE_DIR = "images/train/images/" API_KEY = os.environ.get("ROBOFLOW_API_KEY") SERVER_URL = "http://localhost:9001" vectors = [] for i, image in enumerate(os.listdir(IMAGE_DIR)): print(f"Processing image {image}") infer_clip_payload = { "image": { "type": "base64", "value": base64.b64encode(open(IMAGE_DIR + image, "rb").read()).decode("utf-8"), }, } res = requests.post( f"{SERVER_URL}/clip/embed_image?api_key={API_KEY}", json=infer_clip_payload, ) embeddings = res.json()['embeddings'] print(res.status_code) vectors.append({"id": str(uuid.uuid4()), "values": embeddings[0], "metadata": {"filename": image}}) index.upsert(vectors=vectors)

在上面的代码中,遍历名为“images/train/images/”的文件夹中的所有图像,并使用RoboflowInference为每个图像计算CLIP嵌入。如果想使用托管的Roboflow CLIP API来计算CLIP向量,可以通过将API_URL值替换为https://infer.roboflow.com来实现。

将所有向量保存在名为“images”的向量数据库中。运行上述代码以创建数据库,并为数据集中的每个图像摄取嵌入。

步骤 #3: 运行搜索查询

计算完所有图像嵌入后,现在可以运行搜索查询了。

要查询Pinecone索引,需要一个查询的文本嵌入。可以使用RoboflowInference或托管的Roboflow CLIP API来计算文本嵌入。然后,可以通过Pinecone检索与计算的文本嵌入最相似的图像嵌入

让搜索“bus”。

infer_clip_payload = { "text": "bus" } res = requests.post( f"{SERVER_URL}/clip/embed_text?api_key={API_KEY}", json=infer_clip_payload, ) embeddings = res.json()['embeddings'] results = index.query( vector=embeddings[0], top_k=1, include_metadata=True ) print(results["matches"][0]["metadata"]["filename"])

此代码将为查询“broccoli”计算一个CLIP文本嵌入。这个嵌入被用作Pinecone中的搜索查询。检索与文本嵌入最接近的顶部图像。以下是结果:

000000000471_jpg.rf.faa1965b86263f4b92754c0495695c7e.jpg

注意:文件位于之前定义的IMAGE_DIR中。

让打开结果:

代码已成功返回了一张公共汽车的图像作为顶部结果,这表明搜索系统有效。

Pinecone是一个向量数据库,可以在其中存储数据和嵌入,例如使用CLIP计算的嵌入。可以在Pinecone中存储图像和文本嵌入。然后,可以查询向量数据库,以找到与给定查询向量最相似的结果向量。通过利用Pinecone中实现的快速语义搜索界面,搜索可以快速进行。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485