首页 > 其他分享 >DashVector + ModelScope 玩转多模态检索

DashVector + ModelScope 玩转多模态检索

时间:2024-05-17 14:07:56浏览次数:16  
标签:DashVector dashvector text image modelscope ModelScope 玩转 import 向量

本教程演示如何使用向量检索服务(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 io


def 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 client
    client = 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 = 10
    TOTAL_DATA_NUM = len(ds)
    print(f"Start indexing muge validation data, total data size: {TOTAL_DATA_NUM}, batch size:{BATCH_COUNT}")
    idx = 0
    while 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_COUNT
    print("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 io


def str2image(image_str):
    image_bytes = base64.b64decode(image_str)
    return Image.open(io.BytesIO(image_bytes))


def multi_modal_search(input_text):
    # 初始化 DashVector client
    client = 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_list


if __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

标签:DashVector,dashvector,text,image,modelscope,ModelScope,玩转,import,向量
From: https://www.cnblogs.com/DashVector/p/18197679

相关文章

  • DashVector x 通义千问大模型:打造基于专属知识的问答服务
    本教程演示如何使用向量检索服务(DashVector),结合LLM大模型等能力,来打造基于垂直领域专属知识等问答服务。其中LLM大模型能力,以及文本向量生成等能力,这里基于灵积模型服务上的通义千问API以及EmbeddingAPI来接入。背景及实现思路大语言模型(LLM)作为自然语言处理领域的核心技术,具......
  • 玩转云端 | 数据库管理“大师”来了!
    数字时代,数据成为重要的生产要素。随着企业数据量的爆发式增长,管理和维护庞大的数据集合变得愈发复杂。数据库中存储了企业的核心数据资产,一款安全高效的数据库管理工具必不可少。天翼云数据管理服务(AOne-DMS),不仅能让你的数据库管理工作变得轻松简单,还能保障数据安全无忧! 数据安......
  • 一键部署,玩转AI!天翼云Llama 3大模型学习机来了!
    近日,Meta公司发布了其最新研发成果——开源大模型Llama3,共包含Llama38B和Llama370B两种规格,参数量级分别为80亿与700亿,并表示这是目前同体量下性能最好的开源模型。相较于前代产品Llama2,Llama3在预训练数据上扩大了整整7倍(达到15Ttokens),并且在数据质量与训练方式上也进行......
  • 玩转创想三维 K1 系列主板之二:编译 MCU 固件,恢复裁剪组件
    前言原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎交流指正。文章如有更新请访问DFRobot社区及cnblogs博客园,前者内容较全,后者排版及阅读体验更佳。本文是摸索创想三维K1系列软硬件系统的一些内容分享。最近创想三维的工作人员联系了我,希望接下来能加快网卡直连......
  • IT小能手秘籍:看工单与任务单如何携手玩转服务管理
    在ITSM这摊事儿里,我们有两种手段来管理IT小哥们忙活的那些维护工作,一种叫工单(Ticket),另一种则是任务单(Task)。这哥俩到底有啥不同,又怎么互相帮衬着呢?工单嘛,基本上是从客户或者用户那边来的,他们用这个来告诉咱们需要啥服务啊,遇到了啥故障啊,或者得解决个啥难题。就像是客户和咱IT服务......
  • 玩转AI,笔记本电脑安装属于自己的Llama 3 8B大模型和对话客户端
    2024年4月18日,Meta开源了Llama3大模型,把AI的门槛降低到了最低,这是人工智能领域的一个重要飞跃。我们个人也可以部署大模型了,这简直就是给个人开发者发了个大红包!Llama3模型有不同的参数版本,本文主要分享我在个人笔记本电脑是部署8B参数过程和编写客户端,让我们大家......
  • Linux nginx 玩转日志模块
    log_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_fo......
  • 小白也能轻松玩转 Windows
    ......
  • Kubernetes源码二次开发系列(一到三),玩转高阶K8s开发
    Kubernetes源码二次开发通常涉及以下步骤:环境准备:安装和配置Go环境,确保Go版本与Kubernetes项目兼容。获取源码:从GitHub克隆Kubernetes仓库到本地。设置工作环境:通过make命令设置编译环境。修改源码:根据需求修改Kubernetes源码。编译:使用makeall编译所有组......
  • 玩转云端 | 拥有HBlock这项“存储盘活绝技”,数据中心也能“热辣瘦身”!
    夏天马上就要到了,“瘦身”不光是特定人群的需求,也是数据中心的需求。构建轻量化、低碳化、高性价比的新型数据中心,更有效地支撑经济社会数字化转型,已成为业界主流趋势。如何让数据中心“热辣瘦身”?轻量级存储集群控制器——天翼云存储资源盘活系统HBlock必不可少! “HBlock健身......