用多模态来做图文匹配

一、背景

在大模型应用场景中,多模态学习是一个重要的研究方向,它涉及到将不同模态的信息(如文本、图像、音频等)进行有效整合,以提高模型的理解和表达能力。图文匹配识别作为多模态学习中的一个关键问题,要求模型能够理解图像内容并将其与相应的文本描述进行匹配。

二、任务要求、数据说明

给了许多的图片、文本,要求参赛者进行两两匹配

训练集中图片、文本有给对应的匹配关系,如下

测试集就没有了,只给了训练集的text、image两部分信息,需要选手自己把这些算出来

三、思路

先把训练集用你选用的模型给finetune一遍最好,要是嫌麻烦不训练也行,因为现在的很多模型在这方面已经做得很好了。然后调clip模型,因为这个模型在图文上都支持的非常好,而且在同一空间下,计算万emb后,可以直接用余弦相似度来进行一一匹配

四、代码

1、加载数据

path = "/mnt/workspace/dataset/test_candidate_image.csv"
test_candidate_image = pd.read_csv(path)
print(test_candidate_image.head())
print(len(test_candidate_image))
images = list(test_candidate_image['image_name'])
print(len(images))
print(images[:10])

path = "/mnt/workspace/dataset/test_candidate_text.csv"
test_candidate_text = pd.read_csv(path)
print(test_candidate_text.head())
print(len(test_candidate_text))
titles = list(test_candidate_text['text'])
print(len(titles), titles[:10])
title_index = list(test_candidate_text['idx'])
print(len(title_index), title_index[:10])

2、计算两两相似度

import sys
import glob
from PIL import Image
sys.path.append('..')
from similarities import ImageHashSimilarity, SiftSimilarity, ClipSimilarity

m = ClipSimilarity(model_name_or_path="/mnt/workspace/OFA-Sys/chinese-clip-vit-base-patch16")
print("m=",m)

print("=======================imgaes begin=======================")
image_fps = ['/mnt/workspace/dataset/images/'+i for i in images]  
print(len(image_fps), image_fps[:4])
imgs = [Image.open(i) for i in image_fps]
print(len(imgs), imgs[:4])
print("=======================imgaes end=======================")

print("=======================titles end=======================")
print(len(titles), titles[:4])
print("=======================titles end=======================")
sim_scores = m.similarity(titles, imgs)

3、计算每个title最匹配的img

#### 下面这个是title作为第一个参数传进去
res = []
for i in range(len(title_index)):
    title_index_one = title_index[i]
    max_index = max(enumerate(sim_scores[i]), key=lambda x: x[1])[0]  
    image_path_one = image_fps[max_index].split("/")[-1]
    # print('title_index_one=',title_index_one, "image_path_one=",image_path_one, 'title=',titles[i])
    res.append([title_index_one,image_path_one])
    if(i % 1000 == 0):
    # if(i == 10):
        print('i=',i)
        # break
print("len(res)=",len(res), ' res[:4]=', res[:4])

res_df = pd.DataFrame(res, columns=['idx','image_name'])
res_df.to_csv('./res_df_title_ok_english.csv', index=False, encoding='utf-8')

** 更多在公众号:大模型软硬件

### 多模态图文检索技术概述 多模态向量检索技术旨在通过融合多种数据形式来提升信息检索的效果。跨模态学习方法致力于在不同模态间建立联系,例如图像和文本之间的关联[^1]。 #### 实现方法 为了实现高效的多模态图文检索,通常采用两种主流的技术路径: 1. **Visual Semantic Embeddings (VSE)** VSE模型专注于构建视觉内容(如图片)与语义描述(如文字标签或句子)间的映射关系。该过程涉及训练神经网络以最小化同一对象的不同表示形式间的距离,从而使得相似的对象即使来自不同的媒体类型也能被紧密地嵌入到同一个高维空间中。 2. **Multimodal Transformers** 基于Transformer架构的多模态模型能够处理更复杂的交互模式,并且可以在单个框架内联合编码多个输入源的信息。这类模型不仅限于简单的特征拼接,而是通过对齐机制让各个模态之间相互补充并增强理解能力。 对于具体的操作层面而言,在准备将图文数据送入预训练的语言模型之前,需要解决的一个核心问题是:如何有效地将非结构化的图形资料转化为适合机器解读的形式——即所谓的embeddings。一种常见的法是对原始图像执行目标检测操作,提取出若干感兴趣区域(region boxes),再利用卷积神经网络(CNNs)对其进行编码,最终获得一组固定长度的数值向量作为代表性的特征表达[^2]。 ```python import torch from transformers import BertTokenizer, BertModel tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') def encode_image(image_path): # 使用预先训练好的CNN获取图像embedding pass # 此处省略具体的CNN实现细节 text_input = tokenizer("A picture of a cat", return_tensors="pt") image_embedding = encode_image("path_to_cat_image.jpg") with torch.no_grad(): text_output = model(**text_input)[0] # 合并文本和图像的embedding进行后续处理... ``` #### 应用场景 多模态图文检索的应用范围广泛,涵盖了以下几个重要领域: - **电子商务平台的商品推荐** - **社交媒体中的个性化广告投放** - **医疗影像辅助诊断系统** - **智能搜索引擎优化** 这些应用依赖于强大的算法支持,能够在海量异构数据库中快速定位最匹配的结果集,进而提供更加精准的服务体验给终端用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值