「多模态」基于CLIP实现以文精准搜图

基于CLIP实现以文精准搜图

前言

在使用CLIP做图文匹配时,发现只能用多个文本语句和一张图片匹配,而我想实现多个图片与文本进行匹配。

思考

在这里插入图片描述
打个断点 用DEBUG看了下 在经过预处理和模型后 logits_per_image以及logits_per_text的

tensor([[25.5625, 20.0938, 19.7500]], device=‘cuda:0’, dtype=torch.float16)

推测这三个float数值分别代表了这三个文本与一张图片的匹配程度,而最后的
probs = logits_per_image.softmax(dim=-1).cpu().numpy()
也只是使用 softmax层进行一些权重、对数等变换处理下变成更规范的格式
再使用仅仅第一个语句与该图片匹配,tensor中数值仍为25.5625
所以验证猜想成立 在经过model(image,text)时就已经确定图文匹配结果。
print出来如下:

logits_per_text:
tensor([[21.0442],
[19.5299],
[26.7914],
[12.4424],
[16.9726]])
logits_per_image:tensor([[21.0442, 19.5299, 26.7914, 12.4424, 16.9726]])

##
将获得图文匹配度封装成函数,并返回匹配度的数值:

def match(str1,sent):
    device = "cuda" if torch.cuda.is_available() else "cpu"
    model, preprocess = clip.load("ViT-B/32", device=device)
    image = preprocess(Image.open(str1)).unsqueeze(0).to(device)
    text = clip.tokenize([sent]).to(device)
    with torch.no_grad():
        image_features = model.encode_image(image)
        text_features = model.encode_text(text)
        logits_per_image, logits_per_text = model(image, text)
        similarity = str(logits_per_image)[9:13]
        res = int(similarity)
        return res

利用for循环,使用字典存放多张图片的绝对路径和图文匹配度
看代码就懂了

	'...............................................'
	sent = input("请输入图片关键词:")
    getPic(sent)
    #获取图片
    path0 ='C:\\Users\\DELL\\Desktop\\CLIP-main\\'+ sent
    similar_key = []
    similar_value = []
    for filename in os.listdir(path0):
        if filename.endswith('jpg') or filename.endswith('png'):
            #  存储图片的文件夹绝对路径
            str1 = path0 +'\\'+filename
            print(str1)
            similar_key.append(str1)
            sim = match(str1,sent)
            #将得到的多张图片匹配你输入的图片关键词
            similar_value.append(sim)
    # 存放图片绝对路径和图文相似度的字典
    similar_dict = dict(zip(similar_key, similar_value))
    print(similar_dict)
    similar_value.sort(reverse=True)
    print(similar_value)
    result = ' '
    # 找到图文相似度最高的那个图片的绝对路径
    for key, value in similar_dict.items():
        if value == similar_value[0]:
            result = key
            break
    img = Image.open(result)
    img.show()

执行玩显示出最匹配你需求的那张图片。

爬虫抓取图片并存储路径的步骤不做介绍。

从头到尾可一键执行的代码打包一起放在资源里。
在这里插入图片描述
用pyqt 做了一个前端
在这里插入图片描述

在这里插入图片描述

代码

完整代码见 github:
yangzi0210
觉得不错就给个star 帅哥美女

### 回答1: 是的,以图搜文和以文搜图都是多模态信息检索,即结合了多种不同的信息模态来进行信息检索。其中,以图搜文使用图像作为查询输入,以文本作为返回结果;以文搜图则相反,使用文本作为查询输入,以图像作为返回结果。这种多模态的信息检索方式可以更加全面、准确地满足用户的信息需求。 ### 回答2: 以图搜文和以文搜图都可以被视为多模态信息检索的一种形式。多模态信息检索是指从多个媒体模态中检索相关信息的过程。在以图搜文中,用户通过提供一张图片来检索与图片相关文本信息。系统会根据图片的内容特征,比如颜色、纹理、形状等,找到与之相似的文本信息。这样的检索方式可以应用于图片搜索引擎、图书馆信息检索等领域。 而以文搜图则是用户通过输入一段文字来检索相关的图片信息。系统会根据文字的关键词、语义等特征来寻找与之相关的图片。这在广告推荐、商品搜索等场景中很常见。用户可以通过输入商品的名称、描述等信息来寻找与之相关的图片。 总之,无论是以图搜文还是以文搜图,都涉及到从一种模态(图像文本)向另一种模态(文本图像)的信息转换或匹配。因此,这两种检索方式都可以被视为多模态信息检索的一种形式。 ### 回答3: 以图搜文和以文搜图都属于多模态信息检索多模态信息检索是指通过多种模态的输入数据(如文本图像、音频等)进行信息检索的技术。以图搜文是指通过输入一张图片,系统能够理解图片的内容并返回相关文本信息;以文搜图是指通过输入一段文本,系统能够理解文本的含义并返回相关的图片信息。 这两种方法都涉及到不同模态数据之间的关联和相互转换。以图搜文通过图像识别和理解技术将图片转化为文本,然后使用文本检索的方法进行检索以文搜图则是通过文本理解和语义分析技术将文本转化为图像相关特征,然后使用图像检索的方法进行检索多模态信息检索技术将不同模态之间的信息融合起来,能够提供更丰富、多样化的检索结果,同时也能够满足用户在特定场景下对于不同模态呈现方式的需求。无论是以图搜文还是以文搜图,都属于多模态信息检索的范畴。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoe_ya

如果你成功申请,可以打赏杯奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值