「多模态」基于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 帅哥美女

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
以文搜图,也称作以图搜文,其实是一种基于图像识别技术的搜索方式。通过对输入的图片进行分析、处理,然后从海量的文本语料库中匹配相应的文字描述相关信息,从而达到实现以图搜文的目的。而Python作为一种广受欢迎的编程语言,也提供了许多图像处理和人工智能相关的开发工具和库,极大地方便了此类应用的开发。 实现以文搜图的过程大体可以分为三部分:图像处理、特征提取和文本匹配。在图像处理模块中,可以利用Python图像处理库Pillow或OpenCV等进行图像的预处理操作。例如,可以将图像进行resize、变形、裁剪等操作,以及进行各种图像特效加工,以避免图片失真或者不符合搜索标准。在特征提取模块,可以利用深度学习中的卷积神经网络提取图片特征,或者使用传统图像处理特征,如SIFT和SURF等,提取具有代表性的特征点。最后,在文本匹配模块中,可以通过Python的自然语言处理工具(如NLTK、TexSoup等)对图像特征提取的结果进行处理,将其与海量的语料库中的文字描述进行比较,从而找最相符的文本结果,即实现以文搜图功能。 总之,Python是一种优秀的编程语言,可以方便地实现图像处理、深度学习、自然语言处理等众多功能模块,这些工具和库的支持使得以文搜图实现变得更加简便和高效。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zoe_ya

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

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

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

打赏作者

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

抵扣说明:

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

余额充值