DashVector + ModelScope 玩转多模态检索

news/2024/11/19 17:30:33/文章来源:https://www.cnblogs.com/DashVector/p/18197679

本教程演示如何使用向量检索服务(DashVector),结合ModelScope上的中文CLIP多模态检索模型,构建实时的“文本搜图片”的多模态检索能力。作为示例,我们采用多模态牧歌数据集作为图片语料库,用户通过输入文本来跨模态检索最相似的图片。

整体流程

image
主要分为两个阶段:

图片数据Embedding入库。将牧歌数据集通过中文CLIP模型Embedding接口转化为高维向量,然后写入DashVector向量检索服务。

文本Query检索。使用对应的中文CLIP模型获取文本的Embedding向量,然后通过DashVector检索相似图片。

前提准备

1. API-KEY 准备
开通向量检索服务:请参见开通服务。

创建向量检索服务API-KEY:请参见API-KEY管理。

2. 环境准备
本教程使用的是ModelScope最新的CLIP Huge模型(224分辨率),该模型使用大规模中文数据进行训练(~2亿图文对),在中文图文检索和图像、文本的表征提取等场景表现优异。根据模型官网教程,我们提取出相关的环境依赖如下:

说明
需要提前安装 Python3.7 及以上版本,请确保相应的 python 版本。

点击查看代码
# 安装 dashvector 客户端
pip3 install dashvector# 安装 modelscope
# require modelscope>=0.3.7,目前默认已经超过,您检查一下即可
# 按照更新镜像的方法处理或者下面的方法
pip3 install --upgrade modelscope -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
# 需要单独安装decord
# pip3 install decord
# 另外,modelscope 的安装过程会出现其他的依赖,当前版本的依赖列举如下
# pip3 install torch torchvision opencv-python timm librosa fairseq transformers unicodedata2 zhconv rapidfuzz

3. 数据准备
本教程使用多模态牧歌数据集的validation验证集作为入库的图片数据集,可以通过调用ModelScope的数据集接口获取。
`from modelscope.msdatasets import MsDataset

dataset = MsDataset.load("muge", split="validation")`

具体步骤

说明
本教程所涉及的 your-xxx-api-key 以及 your-xxx-cluster-endpoint,均需要替换为您自己的API-KAY及CLUSTER_ENDPOINT后,代码才能正常运行。

1. 图片数据Embedding入库
多模态牧歌数据集的 validation 验证集包含 30588 张多模态场景的图片数据信息,这里我们需要通过CLIP模型提取原始图片的Embedding向量入库,另外为了方便后续的图片展示,我们也将原始图片数据编码后一起入库。代码实例如下:

点击查看代码
import torch
from modelscope.utils.constant import Tasks
from modelscope.pipelines import pipeline
from modelscope.msdatasets import MsDataset
from dashvector import Client, Doc, DashVectorException, DashVectorCode
from PIL import Image
import base64
import iodef image2str(image):image_byte_arr = io.BytesIO()image.save(image_byte_arr, format='PNG')image_bytes = image_byte_arr.getvalue()return base64.b64encode(image_bytes).decode()if __name__ == '__main__':# 初始化 dashvector clientclient = Client(api_key='{your-dashvector-api-key}',endpoint='{your-dashvector-cluster-endpoint}')# 创建集合:指定集合名称和向量维度, CLIP huge 模型产生的向量统一为 1024 维rsp = client.create('muge_embedding', 1024)if not rsp:raise DashVectorException(rsp.code, reason=rsp.message)# 批量生成图片Embedding,并完成向量入库collection = client.get('muge_embedding')pipe = pipeline(task=Tasks.multi_modal_embedding,model='damo/multi-modal_clip-vit-huge-patch14_zh', model_revision='v1.0.0')ds = MsDataset.load("muge", split="validation")BATCH_COUNT = 10TOTAL_DATA_NUM = len(ds)print(f"Start indexing muge validation data, total data size: {TOTAL_DATA_NUM}, batch size:{BATCH_COUNT}")idx = 0while idx < TOTAL_DATA_NUM:batch_range = range(idx, idx + BATCH_COUNT) if idx + BATCH_COUNT <= TOTAL_DATA_NUM else range(idx, TOTAL_DATA_NUM)images = [ds[i]['image'] for i in batch_range]# 中文 CLIP 模型生成图片 Embedding 向量image_embeddings = pipe.forward({'img': images})['img_embedding']image_vectors = image_embeddings.detach().cpu().numpy()collection.insert([Doc(id=str(img_id),vector=img_vec,fields={'png_img': image2str(img)})for img_id, img_vec, img in zip(batch_range, image_vectors, images)])idx += BATCH_COUNTprint("Finish indexing muge validation data")
说明 上述代码里模型默认在 cpu 环境下运行,在 gpu 环境下会视 gpu 性能得到不同程度的性能提升

2. 文本Query检索
完成上述图片数据向量化入库后,我们可以输入文本,通过同样的CLIP Embedding模型获取文本向量,再通过DashVector向量检索服务的检索接口,快速检索相似的图片了,代码示例如下:

点击查看代码
import torch
from modelscope.utils.constant import Tasks
from modelscope.pipelines import pipeline
from modelscope.msdatasets import MsDataset
from dashvector import Client, Doc, DashVectorException
from PIL import Image
import base64
import iodef str2image(image_str):image_bytes = base64.b64decode(image_str)return Image.open(io.BytesIO(image_bytes))def multi_modal_search(input_text):# 初始化 DashVector clientclient = Client(api_key='{your-dashvector-api-key}',endpoint='{your-dashvector-cluster-endpoint}')# 获取上述入库的集合collection = client.get('muge_embedding')# 获取文本 query 的 Embedding 向量pipe = pipeline(task=Tasks.multi_modal_embedding,model='damo/multi-modal_clip-vit-huge-patch14_zh', model_revision='v1.0.0')text_embedding = pipe.forward({'text': input_text})['text_embedding']  # 2D Tensor, [文本数, 特征维度]text_vector = text_embedding.detach().cpu().numpy()[0]# DashVector 向量检索rsp = collection.query(text_vector, topk=3)image_list = list()for doc in rsp:image_str = doc.fields['png_img']image_list.append(str2image(image_str))return image_listif __name__ == '__main__':text_query = "戴眼镜的狗"images = multi_modal_search(text_query)for img in images:# 注意:show() 函数在 Linux 服务器上可能需要安装必要的图像浏览器组件才生效# 建议在支持 jupyter notebook 的服务器上运行该代码img.show()
运行上述代码,输出结果如下:

image


免费体验阿里云高性能向量检索服务:https://www.aliyun.com/product/ai/dashvector
image

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-plus table部分列根据接口返回key展示

实现效果根据刷选年份返回对应年份作为部分列1. 处理接口数据接口返回数据格式需要处理成   处理过程data.message && data.message.forEach((item:any)=>{let obj = {}for(var key in item){if(Number(key)){Object.assign(obj, {[key]: item[key]})}item.data =…

设计模式05----适配器模式

适配器模式: 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许不兼容的接口协同工作。这种模式涉及到一个单独的类,该类负责将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以一起工作。 例如: USB转接口就是适配器,它能够将各种不同类…

基于时间的断路器

1 新建一个微服务模块 我们在cloud-payment-service模块中新增一个controller以提供给其它微服务模块调用。 @RestController public class PayCircuitController {@GetMapping("/pay/circuit/{id}")public String myCircuit(@PathVariable("id") Integer …

计算机体系结构-Booth乘法

本专栏用于记录计算机体系结构学习笔记原理解释 电路实现 以Radix-4 Booth编码为例,Booth乘法的核心是部分积的生成,需要生成\(N/2\)个部分积,每个部分积与\([X]_补\)有关,存在\(-X,-2X,+X,+2X,0\) 这五种可能,其中减去\(X_{补}\)的操作可以认为是按位取反的\(X_{补}\)在末…

使用 JS 实现在浏览器控制台打印图片 console.image()

在前端开发过程中,调试的时候,我门会使用 console.log 等方式查看数据。但对于图片来说,仅靠展示的数据与结构,是无法想象出图片最终呈现的样子的。虽然我们可以把图片数据通过 img 标签展示到页面上,或将图片下载下来进行预览。但这样的调试过程实在是复杂,何不实现一个…

渗透测试快速启动指南-全-

渗透测试快速启动指南(全)原文:Quick Start Guide to Penetration Testing 协议:CC BY-NC-SA 4.0一、NMAP 简介 漏洞评估和渗透测试变得越来越重要,尤其是在最近几年。组织通常拥有存储敏感数据的复杂资产网络。这些资产暴露在来自组织内部和外部的潜在威胁之下。为了全面…

『手撕Vue-CLI』编码规范检查

前言 这篇为什么是编码规范检查呢?因为这是一个很重要的环节,一个好的编码规范可以让代码更加清晰易读,在官方的 VUE-CLI 也是有着很好的编码规范的,所以我也要加入这个环节。 其实不管在哪个项目中,编码规范都是很重要的,像我们平日里的项目开发当中,我们也会使用 ESLi…

字节面试:MySQL什么时候 锁表?如何防止锁表?

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

CF1884D Counting Rhyme 题解

题目链接:CF 或者 洛谷 给个莫反题解,讲讲常规套路 题目要求满足没有 \(a_k \mid a_i 与 a_k \mid a_j\) 的 \((i,j)\) 的对数,显然即不存在 \(a_k \mid \gcd(a_i,a_j)\)。稍微拓展下,如果不存在整除多个数,那么显然不整除它们的 \(\gcd\) 即可,因为它们的公因数即为满足…

ITSM工作台:工程师效率与协同的新天地

在当今快节奏的IT运维领域,ITILDESK工作台脱颖而出,成为专为技术工程师量身打造的全能助手。这款平台不仅仅是一个工具集合体,它是一个精心设计的生态系统,旨在促进工程师的工作效率、团队协作与个人成长,为日常运维工作带来前所未有的便捷与智能。 一站式工作环境:从工…

HTML5中 drag 和 drop api

被拖放元素 -- A,目标元素 -- B。dragstart 事件主体是A,在开始拖放A时触发。 dragend 事件主体是A,在整个拖放操作结束时触发。 drag 事件主体是A,正在拖放A时触发(整个拖拽,drag事件会在被拖拉的节点上持续触发,相隔几百毫秒)。 dragenter 事件主体是B,在A进入某元素…

一些不错的地理题

2022年福建高考与土壤联系最密切的应该是植被 所以AB选项直接排除 然后的话30度的时候为什么大幅上升呢,主要是因为青藏高原 所以通过尺度也可以做这个题 10度的纬度,算是一个中等的尺度,而不应该是土壤植被这种小尺度大题意义类要去找主体、找问题 对你的意义 对我的意义 对…