在向量数据库中存储多模态数据,通过文字搜索图片

news2024/10/6 10:34:05

在向量数据中存储多模态数据,通过文字搜索图片,Chroma 支持文字和图片,通过 OpenClip 模型对文字以及图片做 Embedding。本文通过 Chroma 实现一个文字搜索图片的功能。

OpenClip

CLIP(Contrastive Language-Image Pretraining,对比语言-图像预训练)是由OpenAI开发的一种模型,它结合了自然语言处理(NLP)和计算机视觉(CV)来理解和关联文本和视觉数据。CLIP旨在从大量的互联网数据中学习,并能够执行各种任务,例如零样本图像分类、图像到文本搜索和文本到图像搜索,而无需特定任务的数据集。CLIP 有以下特性

  • 对比学习:CLIP使用对比学习方法,模型通过区分匹配和不匹配的图像和文本对进行训练。这意味着它学习将图像与其对应的文本描述对齐,并区分不相关的对。

  • 双分支架构:CLIP包含两个分支:一个用于处理图像,另一个用于处理文本。这些分支通常基于深度学习架构,例如用于图像的Vision Transformers(ViT)或ResNet,用于文本的基于Transformer的模型(如GPT)。

  • 联合嵌入空间:模型将图像和文本投影到共享的嵌入空间中。在训练过程中,它最大化匹配图像-文本对的嵌入相似性,最小化不匹配对的嵌入相似性。

  • 零样本学习:CLIP的一个重要优势是其零样本学习能力。这意味着它可以通过利用类别的文本描述来对在训练中未见过的类别的图像进行分类。

OpenClip 是 Open AI CLIP 的开源实现。

数据准备

本文使用魔搭的数据集 tany0699/dailytags



import os
from datasets import load_dataset
from matplotlib import pyplot as plt
import matplotlib.image as mpimg
from PIL import Image

IMAGE_FOLDER = "images"
N_IMAGES = 20

# For plotting
plot_cols = 5
plot_rows = N_IMAGES // plot_cols
fig, axes = plt.subplots(plot_rows, plot_cols, figsize=(plot_rows*2, plot_cols*2))
axes = axes.flatten()

# Write the images to a folder
dataset_iter = iter(dataset)
os.makedirs(IMAGE_FOLDER, exist_ok=True)
for i in range(N_IMAGES):
    image = Image.open(next(dataset_iter)['image:FILE'])
    
    axes[i].imshow(image)
    axes[i].axis("off")
    image.save(f"images/{i}.jpg")

plt.tight_layout()
plt.show()

在这里插入图片描述

安装依赖

安装 Chroma 和 OpenClip

!pip install chromadb
!pip install open_clip_torch

搜索图片

  1. 启动 Chroma
import chromadb
client = chromadb.Client()
  1. 初始化 Embedding Model
from chromadb.utils.embedding_functions import OpenCLIPEmbeddingFunction
from chromadb.utils.data_loaders import ImageLoader

embedding_function = OpenCLIPEmbeddingFunction()
image_loader = ImageLoader()
  1. 创建 Chroma 集合
collection = client.create_collection(
    name='multimodal_collection', 
    embedding_function=embedding_function, 
    data_loader=image_loader)
  1. 初始化数据
# Get the uris to the images
image_uris = sorted([os.path.join(IMAGE_FOLDER, image_name) for image_name in os.listdir(IMAGE_FOLDER)])
ids = [str(i) for i in range(len(image_uris))]

collection.add(ids=ids, uris=image_uris)
  1. 查询
retrieved = collection.query(query_texts=["bird"], include=['data', 'distances'], n_results=3)
for img in retrieved['data'][0]:
    print(retrieved['distances'])
    plt.imshow(img)
    plt.axis("off")
    plt.show()

在这里插入图片描述

总结

Chroma 多模态测试下来,效果还是不错,但是目前只支持英文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1835898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Eigen中 Row-Major 和 Column-Major 存储顺序的区别

Eigen中 Row-Major 和 Column-Major 存储顺序的区别 flyfish Eigen::RowMajor 是 Eigen 库中用于指定矩阵存储顺序的一种选项 理解 Row-Major 和 Column-Major 存储顺序的区别,绘制一个单一的图来显示内存中的元素访问顺序,在图中用箭头表示访问顺序. import nu…

【无重复字符的最长子串】

无重复字符的最长字串 一、题目二、解决方法1.暴力解法2.滑动窗口哈希 三、总结1.es6 new set()的用法添加元素add()删除元素delete()判断元素是否存在has 2.滑动窗口和双指针的联系和特点 一、题目 二、解决方法 1.暴力解法 解题思路:使用两层循环逐个生成子字符串…

Ardupilot开源代码之ExpressLRS性能实测方法

Ardupilot开源代码之ExpressLRS性能实测方法 1. 源由2. 测试效果3. 测试配置4. 总结5. 参考资料6. 补充 1. 源由 之前一直在讨论ExpressLRS性能的问题,有理论、模拟、实测。 始终缺乏完整的同一次测试的测试数据集,本章节将介绍如何在Ardupilot上进行获…

聆思CSK6大模型+AI交互多模态开源SDK介绍

视觉语音大模型 AI 开发套件( CSK6-MIX )是围绕 CSK6011A 芯片设计的具备丰富语音图像功能与硬件外设的开发板,采用具备丰富组件生态的 Zephyr RTOS作为操作系统,官方提供了十几种开源SDK,包含大模型语音交互、大模型拍照识图、文生图、人脸识…

spark常见问题

写文章只是为了学习总结或者工作内容备忘,不保证及时性和准确性,看到的权当个参考哈! 1. 执行Broadcast大表时,等待超时异常(awaitResult) 现象:org.apache.spark.SparkException: Exception…

设置角色运动的动画

(1) 打开Assets-UnityTechnologies-Animation-Animators,Create-Animation-Controller,命名为JohnLemon (2) 打开JohnLemon,出现下图 (3) 依次将Assets-UnityTechnologies-Animation-Animation中的JohnIdle和JohnWalk拖放到Base Layer窗口中 (4) 右击Idl…

整合JavaSSM框架【超详细】

在整合SSM之前我们首先要知道SSM框架指的是哪些框架? Java的SSM指的是Spring、Spring MVC、MyBatis这三个框架 Spring框架 什么是Spring? Spring是一个支持快速开发Java EE应用程序的框架。它提供了一系列底层容器和基础设施,并可以和大量常…

win11右键小工具

开头要说的 在日常使用场景中,大家如果用的是新的笔记本电脑,应该都是安装的win11系统, 当然win11系统是最被诟病的, 因为有很多人觉得很难操作, 就比如一个小小的解压操作, 在win7和win10上&#xff…

基于DDD的编码实践

分层设计 领域驱动设计(Domain-driven design, DDD) 作为一种复杂软件系统的应对方案,在设计和编码提供了一种新的解决方式,即领域驱动,要求程序员在设计和编码时从领域专家的角度出发来实现架构/代码,做到…

随机产生一些江河上的坐标数据

不久前收到一个需求,说要随机创建约一百个某段江河上的坐标点,用于做一些数据呈现。 我首先是想到用AI直接给我一点数据,没想到给出来的坐标,有许多都落在陆地上,根本不符合我的要求。后来结合AI给出的建议&#xff0…

爬抖音直播间观众数据

打开抖音,稍微看了下买房直播间,突然很好奇是那些用户在观看,想拿下这些用户数据,再通过用户等级、在线观看时长排序,筛选出优质客户。 普及一下抖音用户等级: 抖音用户的提升与用户在直播间消费的金额直接…

打造基于大模型的AI产品

我要飞往印度进行短暂旅行,因此花了一个小时的时间处理在线签证申请流程。完成后,由于我现在知道涉及的内容,我向 ChatGPT 4o 询问了相关问题。这些观点中的大多数都是部分或完全错误的。 NSDT工具推荐: Three.js AI纹理开发包 - …

Linux C编译器从零开发三

AST语法树 BNF抽象 expr equality equality relational ("" relational | "!" relational)* relational add ("<" add | "<" add | ">" add | ">" add)* add mul ("" …

苹果电脑下载vite包错

苹果电脑下载vite包错/Users/lili/.npm/_cacache/index-v5/c5/50/b451703d03b3802b9ee6b7ff2b0bde4de7f26830eb52c904d6911c137cf8包错解决方式 解决方式&#xff1a;sudo chown -R 501:20 "/Users/wangxin/.npm"

2024/6/18(RBAC,查询用户权限,细粒度授权,选课,支付宝生成二维码支付,支付结果查询需要内网穿透)

黑马程序员【学成在线项目】,P141 测试沙箱支付宝_黑马学成在线支付宝沙箱-CSDN博客 需要内网穿透

甘特图如何画以及具体实例详解

甘特图如何画以及具体实例详解 甘特图是一种常见的项目管理工具又称为横道图、条状图(Bar chart)。是每一位项目经理和PMO必须掌握的项目管理工具。甘特图通过条状图来显示项目、进度和其他时间相关的系统进展的内在关系随着时间进展的情况。但是多项目经理和PMO虽然考了各种证…

OSPF开销、协议优先级、定时器(华为)

#交换设备 OSPF开销值 如果没有定义OSPF接口的开销值&#xff0c;OSPF会根据该接口的带宽自动计算其开销值。 计算公式&#xff1a; 接口开销 带宽参考值 / 接口带宽 &#xff08;取整数部分&#xff0c;结果小于1时取1&#xff09;通过改变带宽参考值可以间接改变接口的开…

多模态融合算法分析

多模态融合算法分析 多模态论文多模态融合早期融合晚期融合混合融合模型级融合 对比分析早期融合&#xff08;Feature-level Fusion&#xff09;晚期融合&#xff08;Decision-level Fusion&#xff09;混合融合&#xff08;Hybrid Fusion&#xff09;ML-LSTM&#xff08;Multi…

BC153 [NOIP2010]数字统计

数字统计 一.题目描述二.输入描述&#xff1a;三.输出描述&#xff1a;四.数字范围五.题目思路六.代码实现 一.题目描述 请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。 比如给定范围[2, 22]&#xff0c;数字2在数2中出现了1次&#xff0c;在数12中出现1次…

[机器学习算法]线性回归

1. 理解基本概念 在开始学习线性回归之前&#xff0c;确保理解以下基本概念&#xff1a; 自变量&#xff08;特征&#xff09;&#xff1a;用来预测因变量&#xff08;目标&#xff09;的输入变量。 因变量&#xff08;目标&#xff09;&#xff1a;需要预测的输出变量。 回归…