AI 与向量

Roboflow集成

了解如何将Supabase与Roboflow集成,这是一个用于运行微调模型和基础视觉模型的工具。


在本指南中,我们将通过两个示例演示如何使用 Roboflow Inference 来运行微调模型和基础模型。我们将使用目标检测模型和 CLIP 进行推理并保存预测结果。

项目设置

我们来创建一个新的Postgres数据库。在Supabase中创建新项目非常简单:

  1. 在Supabase仪表板中创建新项目
  2. 输入项目详细信息。请记住将密码妥善保存。

不到一分钟,您的数据库就可以使用了。

查找凭证

您可以在仪表板上找到项目凭证:

  • 数据库连接字符串:直接连接和连接池连接详细信息,包括连接字符串和参数。
  • 数据库密码:如果您忘记密码,可以在此处重置数据库密码。
  • API凭证:您的无服务器API URL以及anon / service_role密钥。

保存计算机视觉预测结果

当您训练好视觉模型后,需要为应用程序创建业务逻辑。在许多情况下,您需要将推理结果保存到文件中。

以下步骤将展示如何在本地运行视觉模型并将预测结果保存到 Supabase。

准备工作:设置模型

开始之前,您需要一个基于您数据训练的目标检测模型。

您可以通过 Roboflow 训练模型,利用从数据管理、标注到部署的端到端工具,或者 上传自定义模型权重 进行部署。

所有模型都提供无限可扩展的 API 供您查询模型,并且可以在本地运行。

本指南中,我们将使用一个演示用的 石头剪刀布 模型。

第一步:安装并启动 Roboflow Inference

您将使用 Roboflow Inference(一个计算机视觉推理服务器)在本地部署模型。

要安装并启动 Roboflow Inference,首先需要在您的机器上安装 Docker。

然后运行:

1
pip install inference inference-cli inference-sdk && inference server start

推理服务器将在 http://localhost:9001 地址可用。

第二步:在图像上运行推理

您可以在图像和视频上运行推理。让我们在图像上运行推理。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
from inference_sdk import InferenceHTTPClientimage = "example.jpg"MODEL_ID = "rock-paper-scissors-sxsw/11"client = InferenceHTTPClient( api_url="http://localhost:9001", api_key="ROBOFLOW_API_KEY")with client.use_model(MODEL_ID): predictions = client.infer(image)print(predictions)

在上面的代码中,请替换:

  1. 将图像URL替换为您要运行推理的图像名称
  2. ROBOFLOW_API_KEY替换为您的Roboflow API密钥。了解如何获取您的Roboflow API密钥
  3. MODEL_ID替换为您的Roboflow模型ID。了解如何获取您的模型ID

当您运行上述代码时,预测结果列表将被打印到控制台:

1
{'time': 0.05402109300121083, 'image': {'width': 640, 'height': 480}, 'predictions': [{'x': 312.5, 'y': 392.0, 'width': 255.0, 'height': 110.0, 'confidence': 0.8620790839195251, 'class': 'Paper', 'class_id': 0}]}

第三步:将结果保存到 Supabase

要将结果保存到 Supabase,请在脚本中添加以下代码:

1
2
3
4
5
6
7
8
9
10
import osfrom supabase import create_client, Clienturl: str = os.environ.get("SUPABASE_URL")key: str = os.environ.get("SUPABASE_KEY")supabase: Client = create_client(url, key)result = supabase.table('predictions') \ .insert({"filename": image, "predictions": predictions}) \ .execute()

您可以使用以下代码查询预测结果:

1
2
3
4
5
6
result = supabase.table('predictions') \ .select("predictions") \ .filter("filename", "eq", image) \ .execute()print(result)

以下是示例结果:

1
data=[{'predictions': {'time': 0.08492901099998562, 'image': {'width': 640, 'height': 480}, 'predictions': [{'x': 312.5, 'y': 392.0, 'width': 255.0, 'height': 110.0, 'confidence': 0.8620790839195251, 'class': 'Paper', 'class_id': 0}]}}, {'predictions': {'time': 0.08818970100037404, 'image': {'width': 640, 'height': 480}, 'predictions': [{'x': 312.5, 'y': 392.0, 'width': 255.0, 'height': 110.0, 'confidence': 0.8620790839195251, 'class': 'Paper', 'class_id': 0}]}}] count=None

计算并保存 CLIP 嵌入向量

您可以使用 Supabase 的向量数据库功能来存储和查询 CLIP 嵌入向量。

Roboflow Inference 提供了一个 HTTP 接口,您可以通过该接口使用 CLIP 计算图像和文本的嵌入向量。

第一步:安装并启动 Roboflow Inference

请参考上文第一步:安装并启动 Roboflow Inference来安装和启动 Roboflow Inference。

第二步:在图像上运行CLIP

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import cv2import supervision as svimport requestsimport base64import osIMAGE_DIR = "images/train/images/"API_KEY = ""SERVER_URL = "http://localhost:9001"results = []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'] results.append({ "filename": image, "embeddings": embeddings })

这段代码会计算目录中每张图像的CLIP嵌入向量,并将结果打印到控制台。

请替换以下内容:

  1. IMAGE_DIR 为您想要进行推理的图像所在目录
  2. ROBOFLOW_API_KEY 为您的Roboflow API密钥。了解如何获取Roboflow API密钥

您也可以通过将SERVER_URL设置为https://infer.roboflow.com来在云端计算CLIP嵌入向量。

第三步:在Supabase中存储嵌入向量

您可以使用Supabase的vecs Python包将图像嵌入向量存储在Supabase中:

首先安装vecs

1
pip install vecs

然后添加以下代码来创建索引:

1
2
3
4
5
import vecsDB_CONNECTION = "postgresql://postgres:[password]@[host]:[port]/[database]"vx = vecs.create_client(DB_CONNECTION)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建一个3维的向量集合images = vx.get_or_create_collection(name="image_vectors", dimension=512)for result in results: image = result["filename"] embeddings = result["embeddings"][0] # 向集合中插入向量 images.upsert( records=[ ( image, embeddings, {} # 元数据 ) ] )images.create_index()

DB_CONNECTION 替换为您的数据库认证信息。您可以从 Supabase 仪表板的 项目设置 > 数据库设置 中获取这些信息。

然后您可以使用以下代码查询您的嵌入向量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
infer_clip_payload = { "text": "cat",}res = requests.post( f"{SERVER_URL}/clip/embed_text?api_key={API_KEY}", json=infer_clip_payload,)embeddings = res.json()['embeddings']result = images.query( data=embeddings[0], limit=1)print(result[0])

相关资源

1