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

在向量数据中存储多模态数据,通过文字搜索图片,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 多模态测试下来,效果还是不错,但是目前只支持英文。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

课设--学生成绩管理系统(一)

欢迎来到 Papicatch的博客 文章目录 🍉技术核心 🍉引言 🍈标识 🍈背景 🍈项目概述 🍈 文档概述 🍉可行性分析的前提 🍈项目的要求 🍈项目的目标 🍈…

Java入门4: 泛型和集合

Java入门4: 泛型和集合 MangoGO 芒狗狗 目录 4 泛型和集合4.1 泛型4.2 Collection4.3 List4.4 ArrayList4.5 Map4.6 HashMap4.7 Set 和 HashSet4.8 Collections参考代码4 泛型和集合 Java 使用集合来组织和管理对象,本节我们重点讲解泛型和集合。主要介绍 Collection、List、A…

C#医院体检系统源码 PEIS源码 系统核心功能、特点、类型、设备对接-PACS放射科设备对接:DR、CT、MRI、钼靶。

C#医院体检系统源码 PEIS源码 系统核心功能、特点、类型、设备对接-PACS放射科设备对接:DR、CT、MRI、钼靶。 体检系统是为体检中心、医院体检科等体检机构专门开发的全流程管理系统。该系统通过软件实现检测仪器数据的自动提取,内置多级医生工作台,旨在…

远程连接服务器的工具?

远程连接服务器工具是现代工作环境中不可或缺的工具之一。它允许用户通过网络远程访问和控制远程服务器,为用户提供了更加便捷和高效的工作方式。无论是远程办公、远程维护还是云计算,远程连接服务器工具都发挥着重要的作用。 在众多远程连接服务器工具…

LabVIEW RT在非NI硬件上的应用与分析

LabVIEW RT(实时操作系统)可运行在非NI(National Instruments)硬件上,如研华工控机,但需要满足特定硬件要求。本文从硬件要求、开发和运行差异、可靠性、稳定性、优势和成本等多角度详细分析在非NI硬件上运…

【Mac】Luminar Neo for mac(图像编辑软件)软件介绍及同类型软件比较

Luminar Neo软件介绍 Luminar Neo 是一款由 Skylum 开发的功能强大的照片编辑软件,专为摄影师和摄影爱好者设计。它适用于 Mac 和 Windows 平台,提供了一系列先进的编辑工具和功能,使用户能够轻松提升和优化他们的照片。以下是 Luminar Neo …

沸点 | LDBC与SIGMOD联合研讨,推动图数据库创新与标准化

当地时间6月9日,国际基准官方平台关联数据基准委员会(LDBC,Linked Data Benchmark Council)与SIGMOD 2024(是全球最具国际影响力的数据管理、数据处理和数据存储领域的学术顶会之一,ACM SIGMOD/Big Data in…

非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载百度网盘

redis下载安装以及基本使用 下载地址 链接:百度网盘 请输入提取码 提取码:0410 一个名对应一个数值 内存级 在内存里进行操作 准备启动 我们现在就有一个redis客户端的服务器了 我们再启动一个cmd 操作redis数据库 redis里面的基本数据类型有五种 …

用Canvas绘制2D平面近大远小的马路斑马线

用Canvas绘制2D平面近大远小的马路斑马线 设置canvas和上下文: 首先,你需要创建一个元素,并获取其2D渲染上下文。 绘制斑马线: 使用fillRect或strokeRect方法绘制斑马线。你可以通过循环和计算来绘制多条具有不同宽度和间隔的…

LeetCode20.有效的括号

题目描述 分析 我们刚上来的思路可能是:找出这三种括号的个数 如果都是偶数 说明匹配 但是这里还有一个顺序问题 比如 " )( "这样是不匹配的! 所以这种思路不可取! 我们想 如果遇到左括号,把他读到一个顺序表中&#…

等级考试3-2021年3月题

作业&#xff1a; #include <iostream> using namespace std; int chonghe(int,int,int,int); int main(){int a[1000],b[1000];int n,ma0;cin>>n;for(int i0;i<n;i){cin>>a[i]>>b[i];}for(int i0;i<n;i){for(int ji1;j<n;j){mamax(ma,chongh…

Python酷库之旅-比翼双飞情侣库(10)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …

4.8.2 利用Spark SQL计算总分与平均分

姓名语文数学英语物理化学陈燕文8998807665张晓峰9078928456李太白8793677892洪小琳9867879076 1. 准备数据 创建本地成绩文件&#xff1a;scores.txt&#xff0c;包含学生成绩数据。上传到 HDFS&#xff1a; 创建目录&#xff1a;hdfs dfs -mkdir -p /scoresumavg/input上传文…

板凳------56.Linux/Unix 系统编程手册(下) -- SOCKET 介绍

56.1.概述 socket 是一种IPC方法&#xff0c;允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据。 UNIX 允许位于同一主机系统上的应用程序之间通信 Internet domain IPv4 and IPV6 // socket 通信方式 1.各个应用程序创建一个socket&#xff0c;socket是…

块级元素与行内元素详解

在网页设计与开发中&#xff0c;元素根据其在页面布局中的表现可分为两大类&#xff1a;块级元素&#xff08;Block-level Elements&#xff09;和行内元素&#xff08;Inline Elements&#xff09;。理解它们的特性和使用规则对于构建结构清晰、布局合理的网页至关重要。 块级…

【因果推断python】38_预测模型1

目录 工业界中的机器学习 之前的部分涵盖了因果推理的核心。那里的技术是众所周知和成熟的。他们经受住了时间的考验。第一部分建立了我们可以依赖的坚实基础。用更专业的术语来说&#xff0c;第一部分侧重于定义什么是因果推理&#xff0c;哪些偏差会阻止相关性成为因果关系&…

高考分数线一分一段统计汇总——使用SQL窗口函数

高考分数线一分一段统计汇总——使用SQL窗口函数 select 总分数&#xff0c; 一分一段人数&#xff0c; sum(一分一段人数) over( order by 总分数 desc) as 累计排名 from( select 总分数&#xff0c; count(考生号) as 一分一段人数 from &#xff08; select 考生号…

网络编程(四)

一、使用wireshark抓包分析协议头 &#xff08;一&#xff09;wireshark常用的过滤语句 tcp.port <想要查看的端口号> ip.src <想要查看的源IP地址> ip.dest <想要查看的目的IP地址> ip.addr <想要查看的IP地址>&#xff08;二&#xff09;抓包分…

【Java】解决Java报错:InterruptedException in Multi-threaded Applications

文章目录 引言一、InterruptedException的定义与概述1. 什么是InterruptedException&#xff1f;2. InterruptedException的常见触发场景3. 示例代码 二、解决方案1. 正确处理InterruptedException2. 合理使用中断机制3. 使用更高层次的并发工具 三、最佳实践1. 避免吞掉Interr…

如何使用alias永久别名(linux篇)

一、alias的使用 alias主要作用是起一个别名的用处 它又分两种形式&#xff1a; ① 临时别名 ② 永久别名 1.第一种&#xff08;临时别名&#xff09;&#xff1a; C:\Users\62452>ssh root192.168.0.102 root192.168.0.102s password: Last login: Sat Jun 15 16:30:12 20…