+
95
-

向量数据库如何进行图片相似存储查询?

向量数据库如何进行图片相似存储查询?


网友回复

+
15
-

1、首先要解决图片向量化

可以使用用 OpenAI 的 CLIP 模型和 ViT 模型 openai/clip-vit-base-patch32行图片向量化比较相似性,你可以按照以下步骤进行:

准备图片和模型

确保你有需要比较相似性的两张图片。下载并加载 CLIP-ViT 模型,如 openai/clip-vit-base-patch32。

处理图片

将图片调整为模型的输入大小和格式要求。通常 CLIP-ViT 模型的输入大小为 224x224 像素,并且可能需要归一化。

生成图片向量

使用 CLIP-ViT 模型将每张图片转换为其对应的向量表示。这一步骤需要使用模型的编程接口(例如 Python 中的 PyTorch 或 TensorFlow)来计算图片的特征向量。

计算相似性

使用生成的图片向量计算它们之间的相似性。通常可以使用余弦相似度或欧氏距离等指标来衡量向量之间的相似程度。

这些步骤需要一定的编程知识和基础,特别是对模型的调用和图像处理。以下是一个简单的伪代码示例,演示了如何使用 Python 和 PyTorch 来加载 CLIP-ViT 模型并计算两张图片之间的相似性:

import torch
from PIL import Image
from torchvision import transforms
from clip import CLIP

# 加载模型
device = "cuda" if torch.cuda.is_available() else "cpu"
model = CLIP(clip_model='ViT-B/32', jit=False).to(device)
model.eval()
# 图片处理和向量化
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
])

def image_to_vector(image_path):
    image = Image.open(image_path)
    image = transform(image).unsqueeze(0).to(device)
    with torch.no_grad():
        image_features = model.encode_image(image)
    return image_features

# 例子:计算两张图片之间的相似性
image1_path = 'path/to/image1.jpg'
image2_path = 'path/to/image2.jpg'

vector1 = image_to_vector(image1_path)
vector2 = image_to_vector(image2_path)

# 计算余弦相似度
similarity = torch.cosine_similarity(vector1, vector2, dim=-1)
print(f"Similarity between the images: {similarity.item()}")

在这个例子中,image_to_vector 函数加载图片、处理大小和格式,然后使用 CLIP-ViT 模型计算图像的特征向量。最后,使用余弦相似度计算这两个向量的相似性。

2、图片向量插入qdrant向量数据库并搜索

800_auto

client...

点击查看剩余70%

+
15
-

不仅仅是图片,甚至视频、音频都能实现向量语义化检索,图像使用ImageNet-1k的validation数据集作为入库的图片数据集,将原始图片数据Embedding入库https://www.image-net.org/download.php

声音类的使用ESC-50数据集合 https://github.com/karolpiczak/ESC-50

图片embedding入库

import dashscope
from dashscope import MultiModalEmbedding
from dashvector import Client, Doc, DashVectorException

dashscope.api_key = '{your-dashscope-api-key}'

# 由于 ONE-PEACE 模型服务当前只支持 url 形式的图片、音频输入,因此用户需要将数据集提前上传到
# 公共网络存储(例如 oss/s3),并获取对应图片、音频的 url 列表。
# 该文件每行存储数据集单张图片的公共 url,与当前python脚本位于同目录下
IMAGENET1K_URLS_FILE_PATH = "imagenet1k-urls.txt"


def index_image():
    # 初始化 dashvector client
    client = Client(
      api_key='{your-dashvector-api-key}',
      endpoint='{your-dashvector-cluster-endpoint}'
    )

    # 创建集合:指定集合名称和向量维度, ONE-PEACE 模型产生的向量统一为 1536 维
    rsp = client.create('imagenet1k_val_embedding', 1536)
    if not rsp:
        raise DashVectorException(rsp.code, reason=rsp.message)

    # 调用 dashscope ONE-PEACE 模型生成图片 Embedding,并插入 dashvector
    collection = client.get('imagenet1k_val_embedding')
    with open(IMAGENET1K_URLS_FILE_PATH, 'r') as file:
        for i, line in enumerate(file):
            url = line.strip('\n')
            input = [{'image': url}]
            result = MultiModalEmbedding.call(model=MultiModalEmbedding.Models.multimodal_embedding_one_peace_v1,
                                              input=input,
                                              auto_truncation=True)
            if result.status_code != 200:
                print(f"ONE-PEACE failed to generate embedding of {url}, result: {result}")
                continue
            embedding = result.output["embedding"]
            collection.insert(
                Doc(
    ...

点击查看剩余70%

我知道答案,我要回答