当前位置: 首页 > article >正文

Clip 模型实现文搜图

Clip 模型是一种多模态,Clip 中包含了图片和文字的信息,通过 TextEncoder 和 ImageEncoder 将结果进行相似度匹配,这个很像 RAG 系统中 Embedding。通过 ClipModel 可是实现文找图的功能。
在这里插入图片描述

代码实现

代码来自官方示例,https://modelscope.cn/models/iic/multi-modal_clip-vit-large-patch14_336_zh

# require modelscope>=0.3.7,目前默认已经超过,您检查一下即可
# 按照更新镜像的方法处理或者下面的方法
# pip install --upgrade modelscope -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
# 需要单独安装decord,安装方法:pip install decord
import torch
from modelscope.utils.constant import Tasks
from modelscope.pipelines import pipeline
from modelscope.preprocessors.image import load_image

pipeline = pipeline(task=Tasks.multi_modal_embedding,
    model='damo/multi-modal_clip-vit-large-patch14_336_zh', model_revision='v1.0.1')
input_img = load_image('https://clip-cn-beijing.oss-cn-beijing.aliyuncs.com/pokemon.jpeg') # 支持皮卡丘示例图片路径/本地图片 返回PIL.Image
input_texts = ["杰尼龟", "妙蛙种子", "小火龙", "皮卡丘"]

# 支持一张图片(PIL.Image)或多张图片(List[PIL.Image])输入,输出归一化特征向量
img_embedding = pipeline.forward({'img': input_img})['img_embedding'] # 2D Tensor, [图片数, 特征维度]

# 支持一条文本(str)或多条文本(List[str])输入,输出归一化特征向量
text_embedding = pipeline.forward({'text': input_texts})['text_embedding'] # 2D Tensor, [文本数, 特征维度]

# 计算图文相似度
with torch.no_grad():
    # 计算内积得到logit,考虑模型temperature
    logits_per_image = (img_embedding / pipeline.model.temperature) @ text_embedding.t()
    # 根据logit计算概率分布
    probs = logits_per_image.softmax(dim=-1).cpu().numpy()

print("图文匹配概率:", probs)

在这里插入图片描述
在这里插入图片描述

例子比较简单,如果想做一个文字搜图的功能,需要将图片的 Embedding 保存下来,搜索将文字转为向量并同数据库中的向量进行比对。上面的例子中,有两行代码比较重要,文字转向量和图片转向量。

# 支持一张图片(PIL.Image)或多张图片(List[PIL.Image])输入,输出归一化特征向量
img_embedding = pipeline.forward({'img': input_img})['img_embedding'] # 2D Tensor, [图片数, 特征维度]

# 支持一条文本(str)或多条文本(List[str])输入,输出归一化特征向量
text_embedding = pipeline.forward({'text': input_texts})['text_embedding'] # 2D Tensor, [文本数, 特征维度]

总结

图向量最好保存在向量数据库中,搜索时借助向量数据库的能力进行快速匹配查找。使用 LlamaIndex 或者 Langchain 进行集成,可以方便的集成多种向量数据库。


http://www.kler.cn/news/360878.html

相关文章:

  • web网页QQ登录
  • 【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应
  • rpm 命令
  • Java项目-基于springboot框架的逍遥大药房管理系统项目实战(附源码+文档)
  • 上海市计算机学会竞赛平台2024年10月月赛丙组游戏闯关
  • Qt-Git
  • 总结一下 Promise,怎么使用,如何手写 promise
  • 文件处理新纪元:微信小程序的‘快递员’与‘整理师’
  • |动漫爬取|001_djangodjango基于Spark的国漫推荐系统的设计与实现2024_tpd6q1o4
  • 【java】抽象类和接口(了解,进阶,到全部掌握)
  • 羟基-聚乙二醇-羧基 HO-PEG-COOH的应用MW:3400 CAS:39828-93-8 纳米技术
  • 好用的文件加密软件有哪些?2024年国内外10款文件加密软件推荐
  • elk部署安装
  • redis过期提醒
  • Scrapy | 通过模拟登录功能认识cookies参数及start_requests函数实现发送POST请求
  • 中小型医院网站:Spring Boot技术栈
  • 列表的高级操作与推导式
  • Java 面试场景题
  • 多分支语句
  • liunx线程