基于BLIP-2的看图问答原理及实现

大型语言模型 (LLM) 最近获得了很大的关注,出现了许多流行的模型,如 GPT、OPT、BLOOM 等。 这些模型擅长学习自然语言,非常适合构建聊天机器人、编码助手、决策助手或翻译系统。 然而,他们缺乏其他模式的知识—例如,他们无法处理图像、音频或视频。 这就是 BLIP 的用武之地,通过视觉理解来增强LLM的自然语言能力。

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

本质上,你可以向 BLIP 模型提供图像和文本对来执行各种任务,例如视觉问答 (VQA)、图像字幕或图像文本检索。

然而,用 BLIP 构建产品可能并不简单:你需要正确的模型服务框架和数据序列化库。 在 Jina AI,我们始终相信多模态 AI,因此我们为此目的优化了 Jina 和 DocArray。 为 BLIP-2 提供服务是这两个项目的典型用例。

让我们看看它是如何工作的!

1、BLIP-2

BLIP-2是论文BLIP-2:Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models中提出的视觉语言模型。

它利用冻结的预训练图像编码器和 LLM,通过在它们之间训练轻量级 12 层 Transformer 编码器,在各种视觉语言任务上实现最先进的性能。
在这里插入图片描述

2、Jina 和 DocArray

在深入研究代码之前,我们先简要介绍一下 Jina 和 DocArray,并解释一下这两个项目最近发生的情况。

Jina 是一个 MLOps 框架,用于构建和提供多模式 AI 服务,然后在云上扩展和部署它们。 但最近我们一直在重塑 Jina,以更有效地为模型提供服务。 在 3.14 版本中,我们允许用户使用 gRPC 协议将 Executor 作为独立服务提供服务。 在这篇文章中,我们将使用这些新发布的功能来服务于 BLIP-2 模型。

对于数据表示和序列化,Jina 使用 DocArray,这是一个用于非结构化、多模态数据的库。 它针对传输中的数据进行了优化,因为数据可以以多种格式(包括 protobuf)进行序列化。 换句话说,可以使用 DocArray 格式通过线路接收/发送模型输入和输出。

我们还重塑了 DocArray,以更好地适应多模式 AI 用例。 事实上,它正在经历大量重构,目标是通过 DocArray v2 提供灵活且强大的数据格式。

因此,我们将使用当前的 DocArray 和 DocArray v2 的 alpha 版本来表示模型查询和输出(这样做时,你将很快理解我们为什么重构 DocArray!)。

3、使用 DocArray 和 Jina 为 BLIP-2 提供服务

由于 BLIP-2 使用 LLM,因此它配备了不同的开源语言模型(即 flan-t5 和 opt)。 在本博客中,我们将使用 flan-t5-xl。 让我们从安装依赖项开始:

pip install jina torch git+https://github.com/huggingface/transformers pillow

然后,我们可以初始化一个加载模型的 Jina Executor:

from jina import Executor, Deployment, DocumentArray, requests
from transformers import Blip2Processor, Blip2ForConditionalGeneration
import torchclass Blip2Executor(Executor):def __init__(self, **kwargs):super().__init__(**kwargs)self.processor = Blip2Processor.from_pretrained("Salesforce/blip2-flan-t5-xl")self.model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-flan-t5-xl", torch_dtype=torch.float16)self.model.to('cuda')

使用 BLIP-2 执行视觉问答任务非常简单:只需将图像和文本问题输入并生成文本输出即可。

让我们创建一个 Executor Endpoint 方法来启用 VQA 任务:

@requests
def vqa(self, docs: DocumentArray, **kwargs):for doc in docs:doc.load_uri_to_image_tensor()inputs = self.processor(images=doc.tensor, text=doc.tags['prompt'], return_tensors="pt").to('cuda', torch.float16)generated_ids = self.model.generate(**inputs)generated_text = self.processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()doc.tags['response'] = generated_text

DocArray文档可以在张量字段中存储图像,我们可以将提示和文本输出放在标签字段中。

最后,我们可以使用新发布的 Deployment 类为我们的 Executor 提供服务:

with Deployment(uses=Blip2Executor, timeout_ready=-1, port=12345) as dep:dep.block()`
Loading checkpoint shards: 100%|██████████████████████████████████| 2/2 [00:05<00:00,  2.92s/it]
─────────────────────────────── 🎉 Deployment is ready to serve! ───────────────────────────────
╭────────────────────── 🔗 Endpoint ──────────────────────╮
│  ⛓   Protocol                                     GRPC │
│  🏠     Local                            0.0.0.0:12345  │
│  🔒   Private                     192.168.178.31:12345  │
│  🌍    Public  2003:f1f:4a00:85b7:3950:81fa:952f:12345  │
╰─────────────────────────────────────────────────────────╯

现在我们的执行者应该准备好服务了。 只需使用 Jina Client 通过 gRPC 向 Executor 发送请求即可:

在这里插入图片描述

from jina import Client, Document
client = Client(port=12345)docs = client.post(on='/', inputs=[Document(uri='<http://images.cocodataset.org/val2017/000000039769.jpg>',tags={'prompt': 'Question: How many cats are there? Answer:'})]
)
print(docs[0].tags['response'])
two

正如我们所看到的,BLIP-2 正确地回答了这个问题。 但这个答案的包装有点……笨拙。 虽然 DocArray 提供了标签和块等动态字段的灵活性,但这也带来了一些缺点:没有显式模式、奇怪的语法以及用于输入和输出的相同模式。

这就是我们在 DocArray v2 中重构内容的原因!

4、DocArray v2 :更好的语法

DocArray v2 背后的主要思想是用户可以使用类型提示定义输入和输出模式。 这意味着你在这些模式中定义所需的字段,而不是尝试将数据放入固定模式文档中。

这是 DocArray v1 表示数据的方式。 表示多模式数据意味着向文档添加更多块(子文档)。
在这里插入图片描述

现在,在 DocArray v2 中,模式不再将所有内容都转储到标签和块字段中,而是更加灵活和具有代表性。 你可以根据需要添加任意数量的字段,并确保严格输入数据验证:
在这里插入图片描述

这提供了两全其美的优点。 它使用户可以灵活地定义自己的模式,同时提供显式类型以实现更好的数据验证和转换。

Jina 提供了对 DocArray v2 的早期支持,并允许你在执行器端点中使用模式作为类型注释来定义服务的输入/输出格式。

让我们看看它是如何工作的。 首先从 v2 开发分支安装 DocArray:

pip install "git+https://github.com/docarray/docarray@feat-rewrite-v2#egg=docarray[common,torch,image]"

然后我们将通过指定输入和输出模式来重写执行器:

  • 输入模式包括图像和文本提示字段。
  • 输出架构仅包含一个文本字段(生成的响应)。
from jina import Executor, requests
from transformers import Blip2Processor, Blip2ForConditionalGeneration
import torchfrom docarray import BaseDocument, DocumentArray
from docarray.typing import ImageUrlclass ImagePrompt(BaseDocument):img: ImageUrlprompt: strclass Response(BaseDocument):answer: strclass Blip2Executor(Executor):def __init__(self, **kwargs):super().__init__(**kwargs)self.processor = Blip2Processor.from_pretrained("Salesforce/blip2-flan-t5-xl")self.model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-flan-t5-xl", torch_dtype=torch.float16)self.model.to('cuda')@requestsdef vqa(self, docs: DocumentArray[ImagePrompt], **kwargs) -> DocumentArray[Response]:response_docs = DocumentArray[Response]()for doc in docs:inputs = self.processor(images=doc.img.load(), text=doc.prompt, return_tensors="pt").to('cuda', torch.float16)generated_ids = self.model.generate(**inputs)generated_text = self.processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()response_docs.append(Response(answer=generated_text))return response_docs

现在,让我们为 Executor 提供服务并向其提交请求:

from jina import Deploymentwith Deployment(uses=Blip2Executor) as dep:docs = dep.post(on='/bar', inputs=ImagePrompt(img='<http://images.cocodataset.org/val2017/000000039769.jpg>',prompt='Question: how many cats are there ? Answer:'), return_type=DocumentArray[Response])print(docs[0].answer)
two

5、结束语

Jina 可让你构建基于 gRPC 的多模式 AI 服务。 它允许你以 Python 方式定义端点和请求/响应模式,从而消除了构建 gRPC 服务的复杂性。

DocArray 可让你高效地表示和序列化多模式数据。 为此,它提供了预定义的多模式数据类型和内置的 protobuf 序列化。

因此,Jina 和 DocArray 凭借高效的网络和序列化、Pythonic API 和富有表现力的数据类型等支柱,为构建多模态AI 服务提供了顶级的技术栈。


原文链接:基于BLIP-2的视觉问答 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/78272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GIS地图服务数据可视化

GIS地图服务数据可视化 OSM&#xff08;Open Street Map&#xff0c;开放街道地图&#xff09;Bing地图&#xff08;必应地图&#xff09;Google地图&#xff08;谷歌地图&#xff09; 地图服务数据可视化是根据调用的地图服务请求Web服务器端的地图数据&#xff0c;实现地图数…

python自学

自学第一步 第一个简单的基础&#xff0c;向世界说你好 启动python 开始 print是打印输出的意思&#xff0c;就是输出引号内的内容。 标点符号必须要是英文的&#xff0c;因为他只认识英文的标点符号。 exit&#xff08;&#xff09;推出python。 我们创建一个文本文档&…

Nginx参数配置详细说明【全局、http块、server块、events块】【已亲测】

Nginx重点参数配置说明 本文包含Nginx参数配置说明全局块、http块、server块、events块共计30多个参数配置与解释&#xff0c;其中常见参数包含配置错误出现的错误日志&#xff0c;能让你更快的解决问题。 该文的所有参数大部分经过单独测试&#xff0c;错误都是自己收集出来的…

如何将安防视频监控系统/视频云存储EasyCVR平台推流到公网直播间?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

基于PyTorch使用LSTM实现新闻文本分类任务

本文参考 PyTorch深度学习项目实战100例 https://weibaohang.blog.csdn.net/article/details/127154284?spm1001.2014.3001.5501 文章目录 本文参考任务介绍做数据的导入 环境介绍导入必要的包介绍torchnet和keras做数据的导入给必要的参数命名加载文本数据数据前处理模型训…

防火墙概述及实战

目录 前言 一、概述 &#xff08;一&#xff09;、防火墙分类 &#xff08;二&#xff09;、防火墙性能 &#xff08;三&#xff09;、iptables &#xff08;四&#xff09;、iptables中表的概念 二、iptables规则匹配条件分类 &#xff08;一&#xff09;、基本匹配条…

sklearn中的数据集使用

导库 from sklearn.datasets import load_iris 实现 # 加载数据集 iris load_iris() print(f查看数据集&#xff1a;{iris}) print(f查看数据集的特征&#xff1a;{iris.feature_names}) print(f查看数据集的标签&#xff1a;{iris.target_names}) print(f查看数据集的描述…

看板管理:以可视化方式确定任务优先级

确定工作的优先级是我们今天都要面对的挑战。若处理不当&#xff0c;我们就可能试图一心多用&#xff0c;从而严重损害工作效率。 使用看板方法来设定工作优先级是一种非常直观、快速的方法。 确定工作优先级的看板方法 看板工作流程管理方法的核心在于工作可视化。工作被划…

Elasticsearch:什么是生成式人工智能?

生成式人工智能定义 给学生的解释&#xff08;基本&#xff09;&#xff1a; 生成式人工智能是一种可以创造新的原创内容的技术&#xff0c;例如艺术、音乐、软件代码和写作。 当用户输入提示时&#xff0c;人工智能会根据从互联网上现有示例中学到的知识生成响应&#xff0c;…

记录vite下使用require报错和解决办法

前情提要 我们现在项目用的是vite4react18开发的项目、但是最近公司有个睿智的人让我把webpack中的bpmn组件迁移过来、结果就出现问题啦&#xff1a;因为webpack是commonjs规范、但是vite不是、好像是es吧、可想而知各种报错 废话不多说啦 直接上代码&#xff1a; 注释是之前c…

【Spring】手动实现Spring底层机制-问题的引出

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理手动实现Spring底层机制-问题的引出 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1…

工厂设计模式

github&#xff1a;GitHub - QiuliangLee/pattern: 设计模式 概念 根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式&#xff0c;根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。 简单工厂模式、工厂方法模式和抽象工厂模式有何区别&#xff1f; - 知…

一点整理

&#xff08;1&#xff09; 美国在2010年以后开始流行数字化转型的。 在2010年以前&#xff0c; 2006年社交网络FB “YOU”&#xff1a;在2004-2006 Web2.0热之前&#xff0c;企业是无法直接触达到每个消费者的2006年Amazon电子商务&#xff1a;这个是我瞎凑的&#xff0c;但因…

运算放大器学习笔记

目录 一、基本定理二、基本定义三、负反馈电路四、同向放大电路五、反向放大电路六、差分放大电路 一、基本定理 【电路示意图】 开环放大公式 VOAvo(V-V-) 开环放大倍数&#xff08;增益&#xff09;非常大&#xff0c;105 或 106 输入阻抗超级大&#xff08;可以理解为电…

八股文学习一(存储)

一. 存储 行式存储的原理与特点 对于 OLAP 场景&#xff0c;大多都是对一整行记录进行增删改查操作的&#xff0c;那么行式存储采用以行的行式在磁盘上存储数据就是一个不错的选择。 当查询基于需求字段查询和返回结果时&#xff0c;由于这些字段都埋藏在各行数据中&#xf…

Uniapp学习之从零开始写一个简单的小程序demo(新建页面,通过导航切换页面,发送请求)

先把官网文档摆在这&#xff0c;后面会用到的 [uniapp官网文档]: https://uniapp.dcloud.net.cn/vernacular.html# 一、开发工具准备 1-1 安装HBuilder 按照官方推荐&#xff0c;先装一个HBuilder 下载地址&#xff1a; https://www.dcloud.io/hbuilderx.html1-2 安装微信开…

chrome插件:一个基于webpack + react的chrome 插件项目模板

项目结构 $ tree -L 1 . ├── README.md ├── node_modules # npm依赖 ├── package.json # 详细依赖 ├── pnpm-lock.yaml ├── public # 里边包含dist&#xff0c;安装的时候安装这个目录即可 ├── src …

postgre 12.11单实例安装文档

一 下载 访问https://www.postgresql.org/download/&#xff0c;点击左侧的‘source进行下载&#xff0c;一般选择bz2的安装包。 二 安装 这里安装12.11版本的postgre&#xff0c;数据目录路径为/data/server/pgdata&#xff0c;端口为5432. 2.1 安装依赖包 #安装 yum in…

C++信息学奥赛1171:大整数的因子

该程序是一个寻找能够整除输入数字的最小正整数的程序。下面是代码的逻辑解析&#xff1a; #include <iostream> #include <string> #include <cstring>using namespace std;int main() {string n; // 定义一个字符串变量nint fale 0; // 用于标记是否能…

企业形象片宣传片策划要从哪里展开

企业形象片宣传片是一种有效的营销工具&#xff0c;能够向潜在客户传达企业的核心价值观、品牌形象和产品服务。对于企业来说&#xff0c;一个成功的宣传片可以增加品牌知名度&#xff0c;提高销售额&#xff0c;并建立与客户的良好关系。然而&#xff0c;要想策划一部成功的企…