NLP实践——VQA/Caption生成模型BLIP-2的应用介绍

news/2024/11/14 13:52:10/

NLP实践——VQA/Caption生成模型BLIP-2的应用介绍

  • 1. 简介
  • 2. 模型下载
  • 3. 运行环境
  • 4. 模型应用

1. 简介

今天介绍一个跨模态模型,也是最近比较火的一个工作,叫做BLIP-2。很久很久之前我写过一个简单的image caption项目的介绍,那个模型原理比较简单,就是encode-decode模式,但是项目却不怎么好运行,而现在,随着技术的迭代升级,还有huggingface社区的加持,想实现图文生成变得方便了许多。

BLIP模型是一个对图像部分和文字部分分别编码,然后再深度交互的模型,对于模型的技术细节,本文不做过多的介绍,可以直接阅读论文,总的来说没有什么难以理解的点。

利用这个模型,你可以一键生成对图像的描述,或者询问图像中的信息,与模型进行对话等。

模型结构

下面是项目和论文的地址。

项目地址:https://github.com/salesforce/LAVIS/tree/main/projects/blip2
论文地址:https://arxiv.org/abs/2301.12597

本文将介绍如何利用huggingface的transformers模块,实现BLIP-2的调用。

2. 模型下载

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

https://huggingface.co/Salesforce/blip2-opt-6.7b/tree/main

把文件列表里的所有文件全都下载下来,放在一个目录里。因为文件比较大,所以不建议直接联网下载到hf的默认缓存区,可以像我这样下载到自定义的地址,在加载模型的时候手动指定目录即可。

模型下载
如果你迫不及待地想要体验一下在线版,可以直接进入space,直接在线操作:
https://huggingface.co/spaces/Salesforce/BLIP2

3. 运行环境

运行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

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

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

4. 模型应用

首先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’,但是树的类型应该是对了。

参考文档:https://huggingface.co/docs/transformers/main/en/model_doc/blip-2#transformers.Blip2ForConditionalGeneration.forward.example

以上就是本文的全部内容了,如果你觉得还不错,欢迎点个一键三连加关注,我们下期再见。


http://www.ppmy.cn/news/624434.html

相关文章

Pycharm中运行Allure报错不是内部或外部命令的解决方案

问题现象: Allure已安装并配置好系统环境变量: 1、Allure的下载地址:https://github.com/allure-framework/allure2/releases 2、下载后解压,将解压后的bin路径配置到环境变量中: allure-pytest插件也已安装好&#x…

cola-designer新增控件

cpt-test-text-option.vue <template><el-form label-width"100px" size"mini"><el-form-item label"标题"><el-input v-model"attribute.title"/></el-form-item><el-form-item label"标题颜…

强化学习--实验一倒立摆

强化学习 强化学习--实验一倒立摆 强化学习一、安装库二、实验代码及解释 一、安装库 首先需要安装pygame与gym&#xff0c;直接在命令窗口中运行如下指令即可 pip install pygame pip install gym如果安装不成功&#xff0c;可下载相应的镜像进行安装。 二、实验代码及解释…

现代控制理论课程实验三:一阶倒立摆的LQR控制器设计

现代控制理论课程实验三&#xff1a;一阶倒立摆的LQR控制器设计 一、实验目的二、实验设备与软件三、实验原理3.1、被控对象模型及其线性化3.2、时不变线性连续系统的状态反馈控制与线性二次型最优控制LQR3.3、实验平台的基本原理与使用指南 四、实验内容4.1、MATLAB仿真结果4.…

倒立摆的模糊控制实验(基于matlabsimulink仿真)

倒立摆模糊控制仿真系统设计 本文目录 倒立摆模糊控制仿真系统设计实验1 单级倒立摆的PID模糊控制一、被动对象数学描述与特性分析二、模糊控制器的设计步骤与具体参数选择三、控制系统仿真程序的设计步骤与运行结果四、总结与结论 实验2 单级倒立摆的分段模糊控制一、被动对象…

01-ES6中数组新增的扩展

一、扩展运算符的应用 &#x1f354;ES6通过扩展元素符…&#xff0c;好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 参数序列 console.log(...[1,2,3]) // 1 2 3 console.log(1,...[2,3,4],5) // 1 2 3 4 5 [...document.querySelectorAll(div)] /…

HOT19-螺旋矩阵

leetcode原题链接&#xff1a;螺旋矩阵 题目描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例…

蚂蚁市场教程:电视安装看B站(哔哩哔哩)TV版

哔哩哔哩&#xff0c;简称B站&#xff0c;现为中国年轻世代高度聚集的文化社区和视频平台&#xff0c;站早期是一个ACG&#xff08;动画、漫画、游戏&#xff09;内容创作与分享的视频网站。经过十年多的发展&#xff0c;围绕用户、创作者和内容&#xff0c;构建了一个源源不断…