当前位置:   article > 正文

「多模态」基于CLIP实现以文精准搜图_根据文本描述检索出相关的图像 clip代码实现

根据文本描述检索出相关的图像 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

利用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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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

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

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

在这里插入图片描述

代码

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/503271
推荐阅读
相关标签
  

闽ICP备14008679号