MiniGPT-4(地址:https://github.com/Vision-CAIR/MiniGPT-4)在最近掀起了一个热潮,展示了与GPT-4类似的能力。 在具体实现上,用两个阶段来训练MiniGPT-4,根据项目的描述: 预训练阶段:使用4个A100在10个小时内训练了大约500万对对齐的图像-文本,经过该阶段之后,Vicuna能够理解图像,但V该模型的生成能力受到了严重影响。 为了解决这个问题并提高可用性,该项目提出了一种新的方法,通过模型本身和ChatGPT一起创建高质量的图像-文本对。在此基础上,创建了一个小型(共3500对)但高质量的数据集。 微调阶段:在对话模板中对这个数据集进行训练,以显著提高其生成的可靠性和整体可用性,并用一台A100只需要7分钟左右。 ![]() 也就是说,其中依赖于两个基础模型,分别对应于文本模型和视觉模型,在该模型中,文本模型使用Vicuna,视觉模型使用BLIP-2,总体将BLIP-2的冷冻视觉编码器与冷冻LLM Vicuna对齐,只使用一个投影层。 而对于Vicuna,目前已经有很多文章论述,本文主要介绍BLIP-2的原理、其代表的几个图文对是训练数据集,并介绍如何利用huggingface的transformers模块,实现BLIP-2的调用,供大家一起参考。 一、BLIP2模型基本原理概述BLIP2是一种通用的、计算效率高的视觉-语言预训练方法,通过对图像部分和文字部分分别编码,然后再深度交互,利用了冻结的预训练图像编码器和LLM,在许多评测数据集上表现优于Flamingo、BEIT-3等网络。 在具体思想上,BLIP-2通过一个轻量级的查询Transformer弥补了模态之间的差距,分两个阶段进行预训练。第一阶段从冻结图像编码器引导视觉语言表示学习。第二阶段将视觉从冻结的语言模型引导到语言生成学习。 以上图为例: 左图表示了Q-Former和BLIP-2的第一阶段视觉-语言表征学习目标的模型架构,共同优化三个目标,这些目标强制查询(一组可学习的嵌入)以提取与文本最相关的视觉表征; 在右图中,每个目标通过自我注意屏蔽策略,以控制查询与文本的互动。 下图展示了BLIP-2的第二阶段从视觉到语言的生成性预训练的阶段: 其中: 上图表示引导一个基于解码器的LLM(如OPT); 下图表示引导基于编码器-解码器的LLM(如FlanT5),全连接层从Q-Former的输出维度适应所选LLM的输入维度。 在应用阶段,利用这个模型,你可以一键生成对图像的描述,或者询问图像中的信息,与模型进行对话等,下面是项目和论文的地址: 项目地址:https://github.com/salesforce/LAVIS/tree/main/projects/blip2 论文地址:https:///abs/2301.12597 论文地址:https:///pdf/2102.08981v2.pdf 二、主流图文对训练数据集1、CC数据集 CC12M (Conceptual 12M) 是一个图像文本对的数据集,专门用于视觉和语言预训练。数据集包含 1200 万个图像文本对。与 CC3M 相比,对于 multiple downstream task 该数据集在长尾视觉识别方面表现更佳。 具体例子: 文:"an empty chair sitting in front of a window", 图: 文:"the woman is taking a picture in the mirror" 图:
2、LAION数据集 多模态语言-视觉模型通常是数亿个图文对(image-text pair)上训练出来的,比如CLIP、DALL-E。 对于绝大部分研究者而言,要收集这样一个级别的数据集还是有相当难度的,这也是LAION团队收集并开源LAION-400M的原因,LAION-400M是用CLIP进行过滤的,所以理论上这个数据集质量会高于CLIP团队所用的400million的数据。 LAION-400M不仅给了大数量的图文对,还用CLIP把数据都推理了一遍,并且保存了embedding和kNN索引,可以对这个大数据集高效索引。 此外,还包括LAION 5B这一更大规模的数据版本,由 5,85B CLIP 过滤的图像-文本对组成。2,3B 包含英语,2,2B 样本来自 100 多种其他语言,1B 样本包含无法检测特定语言分配的文本(例如名称)。 LAION-5发布为3个子集: 1)LAION-2B-en:包含23.2亿英文-图像对; 2)LAION-2B-multi:包含2236亿个来自100多种其他语言的图像-文本对。其中前5种语言分别是俄语(10.6%)、法语(7.4%)、德语(6.6%)、西班牙语(6.6%)和汉语(6.3%); 3)LAION-2B-nolang:包含12.7亿个语言无法被清楚检测到的图像-文本对; 项目链接:htttps://laion.ai/blog/laion-400-open-dataset/ 论文标题:LAION-400M: Open Dataset of CLIP-Filtered 400 Million Image-Text Pairs 论文链接:https:///abs/2111.02114 文:the tiki ball logo is displayed on this apron 图: ![]() 文:the brain coffee mug" 图: ![]()
三、基于huggingface实现BLIP-2调用1、模型下载 目前HF上开源出来的BLIP-2有好几个模型,这里选择Salesforce/blip2-opt-6.7b作为例子进行介绍,我们进入该项目的地址:
把文件列表里的所有文件全都下载下来,放在一个目录里。因为文件比较大,所以不建议直接联网下载到hf的默认缓存区,可以像我这样下载到自定义的地址,在加载模型的时候手动指定目录即可。 ![]() 如果你迫不及待地想要体验一下在线版,可以直接进入space,直接在线操作:https:///spaces/Salesforce/BLIP2 2、运行环境 运行BLIP-2,需要最新版本的transformers模块,截至目前,已经发布的transformers的最高版本是4.26.1,我尝试使用这个版本,发现仍然没有BLIP2相关的模型,所以到git上找到开发中的版本4.27-dev。 截至目前(2023-02-16),进入git上官方transformers,你看到的transformers版本即为4.27的开发版,如果当你体验这个项目的时候,正式版已经更新,就可以跳过这一步,直接通过pip安装4.27及以上的版本:
如果安装失败了,说明它还没有上线,那你需要手动安装。 通过git clone或者download zip,下载官方transformers,然后解压它,并且激活你的使用的python环境, 直接执行python setup.py,即可完成安装。此时进入你相应地python环境,就可以成功地引用BLIP-2相关的模块了。 3、模型应用 首先import所需的模块:
然后是建模,除了模型之外,有一个processor,起到类似tokenizer的作用,既可以对文本进行tokenize,也可以将图像划分为patch: 其中这个路径是上文中介绍的下载的模型所存放的路径
我们随便读取一张图片,这里我用了一张之前我自己用disco-diffusion生成的一张图片(原本准备给自己写的小说做配图的)。
![]() 对于image caption,我们只需要对图像进行操作,因为文本部分完全是由模型生成的:
可以看到生成的描述是比较贴切的。 然后来问它一个问题,比起caption,只需要对prompt进行tokenize:
虽说它回答成了’a tree’,但是树的类型应该是对了。 总结本文主要介绍了BLIP-2的原理、其代表的几个图文对是训练数据集,并介绍如何利用huggingface的transformers模块,实现BLIP-2的调用。 对于其内部的具体原理以及开源实现,大家可以研究源代码以增进自己的理解。 参考文献1、https://blog.csdn.net/weixin_44826203/article/details/129063403 2、https:///docs/transformers/main/en/model_doc/blip-2#transformers.Blip2ForConditionalGeneration.forward.example
|
|