分享

MiniGPT-4实现原理及其核心BLIP2模型实践:从代表性图文对数据集、BLIP2模型结构到调用实践

 520jefferson 2023-05-03 发布于中国台湾

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"

图:图片

[
    {
        "caption":"an empty chair sitting in front of a window",
        "url":"http://static./2723/4385058960_b0f291553e.jpg"
    },
    {
        "caption":"a house under construction with a building being built",
        "url":"http://static./3074/2965635243_d45c31f5df.jpg"
    },
    {
        "caption":"a little boy that is sitting in a basket",
        "url":"http://static./188/431442759_e0c519a6b2.jpg"
    },
    {
        "caption":"a man in an apron working on crates of fish",
        "url":"http://static./3276/2989279316_9e8e3e8a93.jpg"
    },
    {
        "caption":"a view from a bridge over a river in central park",
        "url":"http://static./2691/4304191133_cbbf8b24c2.jpg"
    },
    {
        "caption":"a pool with a mattress in it and some water",
        "url":"http://static./2736/4383260515_5661ae9eed.jpg"
    },
    {
        "caption":"the woman is taking a picture in the mirror",
        "url":"http://static./2059/1797952657_2a707cee13.jpg"
    },
    {
        "caption":"a tree with a chair in it's middle",
        "url":"http://static./105/306928516_e9be73c42f.jpg"
    }
  ]

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"

图:

图片
[
    {
        "caption":"the tiki ball logo is displayed on this apron",
        "url":"https://image./image-server/v1/products/P1016953357T1186A359PC1026849373PA2537PT17X1Y0S28/views/1,width=300,height=300,appearanceId=359,version=1497265829/z-tiki-bar-adjustable-apron.png"
    },
    {
        "caption":"the view of an aerial pool with palm trees",
        "url":"http://uberflip./mediaproxy?url=http%3A%2F%2Fd22ir9aoo7cbf6.cloudfront.net%2Fwp-content%2Fuploads%2Fsites%2F4%2F2018%2F01%2FAyana1.jpg&size=1&version=1517393441&sig=e3e14f09e2b062e0fd144306d56abda7&default=hubs%2Ftilebg-blogs.jpg"
    },
    {
        "caption":"a sky with clouds women's v - neck",
        "url":"https://render./images/rendered/medium/t-shirt/30/9/images/artworkimages/medium/1/approaching-storm-paxton-mobley.jpg?targetx=0&targety=0&imagewidth=300&imageheight=149&modelwidth=300&modelheight=405"
    },
    {
        "caption":"the brain coffee mug",
        "url":"https://cdn./s/files/1/2438/3835/products/81f09518c9e54023aac721c3fa8d2098_large_df7f80da-25b5-4527-b629-3f027c357e19_394x.jpg?v=1521492395"
    },

三、基于huggingface实现BLIP-2调用

1、模型下载

目前HF上开源出来的BLIP-2有好几个模型,这里选择Salesforce/blip2-opt-6.7b作为例子进行介绍,我们进入该项目的地址:

https:///Salesforce/blip2-opt-6.7b/tree/main

把文件列表里的所有文件全都下载下来,放在一个目录里。因为文件比较大,所以不建议直接联网下载到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及以上的版本:

pip install transformers==4.27

如果安装失败了,说明它还没有上线,那你需要手动安装。

通过git clone或者download zip,下载官方transformers,然后解压它,并且激活你的使用的python环境, 直接执行python setup.py,即可完成安装。此时进入你相应地python环境,就可以成功地引用BLIP-2相关的模块了。

3、模型应用

首先import所需的模块:

import torch
from PIL import Image
from transformers import Blip2Processor, Blip2ForConditionalGeneration

然后是建模,除了模型之外,有一个processor,起到类似tokenizer的作用,既可以对文本进行tokenize,也可以将图像划分为patch:

其中这个路径是上文中介绍的下载的模型所存放的路径

processor = Blip2Processor.from_pretrained("your_path_to/BLIP-2-opt/")
model = Blip2ForConditionalGeneration.from_pretrained("your_path_to/BLIP-2-opt/")

我们随便读取一张图片,这里我用了一张之前我自己用disco-diffusion生成的一张图片(原本准备给自己写的小说做配图的)。

image = Image.open('./my_pic_1.png')
图片

对于image caption,我们只需要对图像进行操作,因为文本部分完全是由模型生成的:

# 注意,由于模型过大,我并没有把它放到GPU上
# 所以相应地在生成inputs的时候,也不要放在GPU上或者使用16精度计算
inputs = processor(images=image, return_tensors="pt"# .to(device, torch.float16)
generated_ids = model.generate(**inputs)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()

print(generated_text)
# 'a rocky cliff with trees and water in the background'

可以看到生成的描述是比较贴切的。

然后来问它一个问题,比起caption,只需要对prompt进行tokenize:

prompt = "Question: What tree is it in the picture? Answer:"
inputs = processor(images=image, text=prompt, return_tensors="pt"#.to(device, torch.float16)
# 注意这个时候的inputs.keys()包括了'pixel_values', 'input_ids', 'attention_mask'
inputs = processor(images=image, text=prompt, return_tensors="pt"#.to(device, torch.float16)
generated_ids = model.generate(**inputs)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()

print(generated_text)
# "It's a pine tree"

虽说它回答成了’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

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP小助手微信(id:ainlp2),备注工作/研究方向+加群目的。

阅读至此了,分享、点赞、在看三选一吧🙏

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多