用lavis实现多模态图文共同检索
多模态检索
我们平常常见的多模态检索是,图到文或文到图的检索, 方式如下:
文本和图像之间的视觉-语义相似度
任务1: 使用句子查询图像
任务2:使用图像查询句子
搜索关键字: image-text retrieval图文共同检索,这个不太常见,主要是利用图片和单独的文本的特征没有一起使用的特征进行检索的效果好,所以图文共同检索,思路如下:
图文匹配本质就是要对图像和文本这两个模态的样本分别或联合进行编码得到其语义表示embedding,同时还要有相应的相似性计算方法来计算这些embedding之间相似度。
依赖的框架LAVIS,Facebook的开源框架
LAVIS是一个支持多模态学习的开源库。该库支持多种任务、数据集和模型,并不断更新和扩充。
在支持的任务方面,LAVIS支持以下任务:图像-文本预训练、图像-文本检索、文本-图像检索、视觉问答、图像描述、图像分类、自然语言视觉推理、视觉蕴涵、视觉对话、视频-文本检索、文本-视频检索、视频问答和视频对话。
在支持的数据集方面,LAVIS支持以下数据集:COCO、VisualGenome、SBU ConceptualCaptions、Flickr30k、VQAv2、OKVQA、A-OKVQA、NoCaps、ImageNet、NLVR2、SNLI-VE、VisDial、MSRVTT、DiDeMo和MSVD等。
在支持的模型方面,LAVIS支持多种模型,包括ALBEF、BLIP、CLIP、VGD-GPT和ALPRO等。LAVIS还提供了自定义功能,使用户可以根据自己的需求定制自己的多模态学习模型。
总之,LAVIS是一个非常强大的多模态学习库,为研究者和开发者提供了丰富的任务、数据集和模型选择,可以大大加速多模态学习的研究和应用。
base模型和设计, 我们还设计了使用Lora只微调Qformer即可,使用huggingface的peft插件
使用BLIP2作为base模型,使用BLIP2模型,模型结构是ViT+OPT+Qformer,我们只微调Qformer,大约是5%的参数量,总的参数量是37亿。OPT是多语言模型。损失是arcface损失,优点是不用人工构造样本对。缺点是需要较多的微调,才能使的样本之间的距离拉开。
参考Face Recognition (FR) 面部识别的损失设计方法
https://neptune.ai/blog/how-to-choose-loss-function-for-face-recognition,
learn a good representation of the images rather than classify images among a set of predetermined classes
代码结构
building_index.py 预训练后的模型构建索引
lavis_predict.py 模型预测
lavis/common/lora_utils.py Lora的模型更改
lavis/configs/datasets/coco/mini_cap.yaml #caption的mini数据集
lavis/configs/datasets/cosmetic/defaults_cos.yaml #默认训练数据集
lavis/configs/datasets/cosmetic/mini_cos.yaml #mini数据集
lavis/datasets/builders/caption_builder.py # 加入自己的数据集的builder
lavis/datasets/datasets/comestic_datasets.py # 自己数据集的构造和读取处理
lavis/models/init.py #加入”Blip2Lora”,模型
lavis/models/blip2_models/blip2_lora.py #具体模型
lavis/models/blip2_models/blip2_opt.py #使用BLIP2的模型,OPT是语义模型,视觉模型是ViT
lavis/models/blip2_models/face_head.py #arcface损失
lavis/projects/blip2/eval/cosmetic_ft_eval.yaml 评估的配置
lavis/projects/blip2/train/cosmetic_ft.yaml 微调的配置
lavis/tasks/init.py #加了检索的任务设置
lavis/tasks/base_task.py
lavis/tasks/multimodal_retrieval.py #MultimodalRetrievalTask检索任务的具体代码