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

本文探讨如何利用CLIP模型扩展其功能,支持同时对多个图片和文本进行精确匹配,通过封装函数和实例展示如何计算图片与关键词的匹配度,并通过实际代码操作演示了应用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于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 帅哥美女

### 检索实验方法与实现方案 #### 数据准备 为了完成检索任务,需要准备好图像文本的数据源。具体来说,可以从一个存储片的件夹 `ImageFolder` 和包含多个文本句子的 CSV 件入手[^1]。 对于 CSV 件中的每一行文本,将其转换为 JSON 格式的结构以便后续处理。JSON 的基本形式如下所示: ```json { "text": "这是一段描述性的字", "text_id": "unique_identifier_001" } ``` 这种格式有助于建立清晰的映射关系,便于后续匹配操作。 --- #### 跨模态特征提取 在实际应用中,通常会借助预训练模型来提取图像文本的语义特征向量。以下是几种常见的技术路径及其特点: 1. **ALBEF 模型** ALBEF 是一种先进的多模态学习框架,在其评价函数中已经验证了可以通过迭代数据加载器获取片并执行跨模态检索的任务。它利用 Transformer 结构联合建模图像文本之间的关联性。 2. **Chinese-CLIP 预训练模型** Chinese-CLIP 提供了一种高效的解决方案用于中环境下的检索问题[^2]。它可以生成高质量的嵌入表示,支持“以”、“以”以及“以”的功能扩展。 3. **Generative Model 改进版** 献提到通过引入生成模型进一步优化传统文本-视觉跨模态检索的效果[^3]。这种方法特别适合于复杂场景下更精准地捕捉细粒度的信息差异。 4. **CNCLIP + Qdrant 方案** 如果希望快速搭建一套完整的系统,则可以直接参考开源项目 `image-text-retrieve` 中给的例子[^4]。该项目基于 CNCLIP 进行特征编码,并结合矢量化索引擎 Qdrant 来加速查询过程。 5. **Dify 工具链集成** Dify 平台提供了另一种灵活的方式来进行大规模在线部署[^5]。特别是当涉及到远程访问或者私有化存储需求时(比如 MinIO),这种方式显得尤为重要。 --- #### 实验流程设计 构建好上述基础组件之后,就可以着手规划具体的实验步骤了。主要包括以下几个方面: - **数据预处理** 将原始素材标准化成统一规格大小的输入样本集合。 - **模型微调** 根据特定领域的需求调整参数配置直至达到理想性能指标为止。 - **评估测试** 使用标准评测体系衡量最终成果质量如何满足预期目标设定。 下面是一个简单的 Python 示例代码片段展示整个工作流概貌: ```python import json from PIL import Image import torch from transformers import CLIPProcessor, CLIPModel # 加载预训练好的 clip 模型实例对象 model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32") processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32") def load_and_process_image(image_path): image = Image.open(image_path).convert('RGB') inputs = processor(images=image, return_tensors="pt", padding=True) outputs = model.get_image_features(**inputs) return outputs.detach().numpy() def process_text(text_json_file): texts = [] ids = [] with open(text_json_file, 'r') as f: data = json.load(f) for item in data: text_input = processor(text=item['text'], return_tensors="pt", padding=True) output = model.get_text_features(**text_input) texts.append(output.detach().numpy()) ids.append(item["text_id"]) return texts, ids if __name__ == "__main__": img_feature = load_and_process_image("/path/to/sample.jpg") txt_features, labels = process_text("/path/to/texts.json") # 计算相似度矩阵... ``` 以上脚本展示了如何分别计算单张照片及批量短句各自的 embedding 向量值,并为进一步分析奠定了坚实的基础。 --- #### 总结说明 综上所述,无论是选用哪种工具栈组合方式开展此项研究活动都各有优劣之处需权衡考量清楚后再决定采取哪条路线最为合适才行哦!
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zoe_ya

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

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

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

打赏作者

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

抵扣说明:

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

余额充值