科大讯飞AI大赛:大模型图文匹配识别挑战赛 baseline

学术   2024-08-09 14:56   北京  
  • 赛题名称:大模型图文匹配识别挑战赛
  • 赛题类型:计算机视觉、多模态
  • 赛题任务:设计一个能够处理图文匹配任务的模型,测试集上完成图文匹配的操作。

报名链接:https://challenge.xfyun.cn/topic/info?type=graphic-matching&option=ssgy&ch=dw24_AtTCK9

unsetunset赛事背景unsetunset

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

模型需要能够理解图像的视觉信息和文本的语义信息,并将两者进行有效关联。模型需要识别图像和文本之间的语义关系,即使在存在一定程度的语义差异时也能正确匹配。

unsetunset赛事任务unsetunset

参赛者需要使用主办方提供的数据集,该数据集包含大量图像及其对应的文本描述。参赛者需要设计一个能够处理图文匹配任务的模型,可以是传统的机器学习方法,也可以是深度学习模型。最终参赛选手需要在测试集上完成图文匹配的操作。

数据说明

赛题包含两部分,分别为训练集和测试集。训练集拥有完整的图片和文本对应关系。测试集并不包含图文对应关系,需要选手开发算法完成文本(idx)与图片(image_name)的匹配。

  • 训练集图文匹配标注(train.csv)
  • 测试集:无图文对应关系
img
  • 测试集待匹配图片(test_candidate_image.csv)

  • 测试集待匹配文本(test_candidate_text.csv)

unsetunset赛题baselineunsetunset

赛题可以视为一个图文匹配的任务,可以考虑借助 CLIP 模型来完成。CLIP(Contrastive Language-Image Pre-training)模型是由OpenAI在2021年推出的一种多模态预训练神经网络模型,它通过对比学习的方式从未标注的图像和文本数据中进行预训练,从而理解图像和文本之间的语义联系。

  • CLIP模型加载
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from tqdm import tqdm
from PIL import Image
import requests
import torch
from transformers import BertForSequenceClassification, BertConfig, BertTokenizer
from transformers import CLIPProcessor, CLIPModel
import numpy as np


clip_model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")  
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
image = processor(images=Image.open(requests.get(url, stream=True).raw), return_tensors="pt")


  • 文本特征提取
text_text_features = []
for idx in tqdm(range(len(test_candidate_text['text']) // 100 + 1)):
    batch_text = test_candidate_text['text'].iloc[idx*100:(idx+1)*100].values
    if len(batch_text) == 0:
        continue
    text = text_tokenizer(list(batch_text), return_tensors='pt', padding=True)['input_ids']
    with torch.no_grad():
        text_features = text_encoder(text).logits
        text_features = text_features.data.numpy()
        text_text_features.append(text_features)
text_text_features = np.vstack(text_text_features)
  • 图像特征提取
img_img_features = []
for idx in tqdm(range(len(test_candidate_image['image_name']) // 100 + 1)):
    batch_img = test_candidate_image['image_name'].iloc[idx*100:(idx+1)*100].values
    if len(batch_img) == 0:
        continue

    image = processor(images=[Image.open('./dataset/images/' + x) for x in batch_img], return_tensors="pt")
    with torch.no_grad():
        image_features = clip_model.get_image_features(**image)
        image_features = image_features.data.numpy()
        img_img_features.append(image_features)
img_img_features = np.vstack(img_img_features)
  • 图文相似度匹配
text_text_features = normalize(text_text_features)
img_img_features = normalize(img_img_features)
ids = np.dot(text_text_features, img_img_features.T)

image_name = []
for idx in range(len(ids)):
    top1_image = test_candidate_image['image_name'].iloc[ids[idx].argsort()[-1]]
    image_name.append(top1_image)
  • 匹配结果优化

通过线性分配问题的求解器,将相似度矩阵的转置(即1减去原始相似度矩阵)作为成本矩阵,目的是最小化不匹配的惩罚。

import numpy as np
from scipy.optimize import linear_sum_assignment
row_ind, col_ind = linear_sum_assignment(1-ids)
col_ind

完整代码见:

https://github.com/datawhalechina/competition-baseline/tree/master/competition/%E7%A7%91%E5%A4%A7%E8%AE%AF%E9%A3%9EAI%E5%BC%80%E5%8F%91%E8%80%85%E5%A4%A7%E8%B5%9B2024


 学习大模型 & 讨论Kaggle  #


△长按添加竞赛小助手

每天大模型、算法竞赛、干货资讯

与 36000+来自竞赛爱好者一起交流~

Coggle数据科学
Coggle全称Communication For Kaggle,专注数据科学领域竞赛相关资讯分享。
 最新文章