Roboflow集成
了解如何将Supabase与Roboflow集成,这是一个用于运行微调模型和基础视觉模型的工具。
在本指南中,我们将通过两个示例演示如何使用 Roboflow Inference 来运行微调模型和基础模型。我们将使用目标检测模型和 CLIP 进行推理并保存预测结果。
项目设置
我们来创建一个新的Postgres数据库。在Supabase中创建新项目非常简单:
- 在Supabase仪表板中创建新项目。
- 输入项目详细信息。请记住将密码妥善保存。
不到一分钟,您的数据库就可以使用了。
查找凭证:
您可以在仪表板上找到项目凭证:
- 数据库连接字符串:直接连接和连接池连接详细信息,包括连接字符串和参数。
- 数据库密码:如果您忘记密码,可以在此处重置数据库密码。
- API凭证:您的无服务器API URL以及
anon
/service_role
密钥。
保存计算机视觉预测结果
当您训练好视觉模型后,需要为应用程序创建业务逻辑。在许多情况下,您需要将推理结果保存到文件中。
以下步骤将展示如何在本地运行视觉模型并将预测结果保存到 Supabase。
准备工作:设置模型
开始之前,您需要一个基于您数据训练的目标检测模型。
您可以通过 Roboflow 训练模型,利用从数据管理、标注到部署的端到端工具,或者 上传自定义模型权重 进行部署。
所有模型都提供无限可扩展的 API 供您查询模型,并且可以在本地运行。
本指南中,我们将使用一个演示用的 石头剪刀布 模型。
第一步:安装并启动 Roboflow Inference
您将使用 Roboflow Inference(一个计算机视觉推理服务器)在本地部署模型。
要安装并启动 Roboflow Inference,首先需要在您的机器上安装 Docker。
然后运行:
1pip install inference inference-cli inference-sdk && inference server start
推理服务器将在 http://localhost:9001
地址可用。
第二步:在图像上运行推理
您可以在图像和视频上运行推理。让我们在图像上运行推理。
创建一个新的Python文件并添加以下代码:
12345678910111213from 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)
在上面的代码中,请替换:
- 将图像URL替换为您要运行推理的图像名称
- 将
ROBOFLOW_API_KEY
替换为您的Roboflow API密钥。了解如何获取您的Roboflow API密钥 - 将
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,请在脚本中添加以下代码:
12345678910import 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()
您可以使用以下代码查询预测结果:
123456result = supabase.table('predictions') \ .select("predictions") \ .filter("filename", "eq", image) \ .execute()print(result)
以下是示例结果:
1data=[{'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文件并添加以下代码:
1234567891011121314151617181920212223242526272829303132import 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嵌入向量,并将结果打印到控制台。
请替换以下内容:
IMAGE_DIR
为您想要进行推理的图像所在目录ROBOFLOW_API_KEY
为您的Roboflow API密钥。了解如何获取Roboflow API密钥
您也可以通过将SERVER_URL
设置为https://infer.roboflow.com
来在云端计算CLIP嵌入向量。
第三步:在Supabase中存储嵌入向量
您可以使用Supabase的vecs
Python包将图像嵌入向量存储在Supabase中:
首先安装vecs
:
1pip install vecs
然后添加以下代码来创建索引:
12345import vecsDB_CONNECTION = "postgresql://postgres:[password]@[host]:[port]/[database]"vx = vecs.create_client(DB_CONNECTION)
12345678910111213141516171819# 创建一个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 仪表板的 项目设置 > 数据库设置
中获取这些信息。
然后您可以使用以下代码查询您的嵌入向量:
1234567891011121314151617infer_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