以文搜图是跨模态图文检索的一部分,那么什么是跨模态图文检索?说的通俗易懂,就是实现文字和图片两种不同格式数据之间的互相搜索,通过文字描述找到最符合的图片,或者搜寻最适合图片的文字描述。不同于通过标签将文本和图片关联起来,跨模态模型能够从语义或内容含义的角度匹配不同类型的数据,这种检索方式更接近人为判断,更加“人工智能”。
如今最热门的跨模态文本图片模型莫过于 CLIP,推荐一些原理详解和基于 CLIP 搭建文本图片搜索系统的教程:从零到一,教你搭建「以文搜图」搜索服务(一)_Zilliz Planet的博客-CSDN博客_以文搜图 和 从零到一,教你搭建「CLIP 以文搜图」搜索服务(二):5 分钟实现原型_Zilliz Planet的博客-CSDN博客。我这里就不进行赘述了,接下来主要介绍大家很关心的一个问题:是否有预训练好的多语言 CLIP 模型?更直白一些,能用中文搜图片吗?
先上代码:towhee.models.clip
1. 安装 towhee.models
$ git clone https://github.com/towhee-io/towhee.git
$ cd towhee
$ python setup.py install --models
如果直接安装 pypi 包(`pip install towhee.models`),只有 0.7.4 以上版本才支持多语言 CLIP,之前版本仅支持英文文本。
无需自己处理代码,端到端的使用方法可以参考 Towhee Hub。更多的 CLIP 相关应用和工具正在开发途中。
2. 创建模型:
from towhee.models import clip
model = clip.create_model(model_name='clip_vit_b32', pretrained=True)
首先根据模型名称创建模型并加载预训练模型,如果想要加载自己的权重或者客制化模型,可以将pretrained设为False 并直接传入非默认的模型参数值。
3. 图片编码:
import torch
dummy_img = torch.rand(1, 3, 224, 224)
img_features = model.encode_image(dummy_img)
这里使用虚拟的图片数据,该数据表示一张3通道、长宽均为224的图片。真实场景中,允许多张图片的输入(第一维),但需要将图片经过处理,转换成3通道、长宽均为224的数据 (3,224,224)。因此输入的数据应该是尺寸为(n,3,224,224)torch tensor,其中 n 表示图片个数。
4. 文本编码:
# Multilingual only for supported models
text_chinese = ['测试']
text_features = model.encode_text(text, multilingual=True)
当模型支持多语言时,比如我们这里使用的 clip_vit_b32 支持多语言文本输入,那么我们可以在推理文本特征时,将 multilingual 参数设为 True。
5. 相似度判断:
img = torch.rand(1, 3, 224, 224)
text = ['测试文字1', '测试文字2']
logits_per_img, logits_per_text = model(img, text, multilingual=True)
模型也可以直接返回输入的文本和图片之间的相似度,这里的数值越高则表示越相似。
正如文中所提,更多模型和工具还在改进和开发中,欢迎关注和提建议