基于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。 我们创建一个文本文档&…

SpringBoot+MySQL+Vue前后端分离的宠物领养救助管理系统(附论文)

文章目录 项目介绍主要功能截图:后台:登录个人中心宠物用品管理宠物领养管理用户管理用户领养管理宠物挂失管理论坛管理系统管理订单管理前台首页宠物挂失论坛信息宠物资讯部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创

前端面试的话术集锦第 6 篇:高频考点(事件机制 跨域 存储机制 浏览器缓存等)

这是记录前端面试的话术集锦第六篇博文——高频考点(事件机制 & 跨域 & 存储机制 & 浏览器缓存等),我会不断更新该博文。❗❗❗ 1. ⼿写 call、apply 及 bind 函数 ⾸先从以下⼏点来考虑如何实现这⼏个函数: 不传⼊第⼀个参数,那么上下⽂默认为window 改变了…

Java 复习笔记 - 常用API 下

文章目录 一&#xff0c;JDK7以前时间相关类&#xff08;一&#xff09;Date 时间&#xff08;二&#xff09;SimpleDateFormat 格式化时间&#xff08;三&#xff09;Calendar 日历 二&#xff0c;JDK8新增时间相关类&#xff08;一&#xff09;时区、时间和格式化&#xff08…

Layui + Flask 使用(01)

Layui 是一套开源免费的 Web UI 组件库,采用自身轻量级模块化规范,遵循原生态的 HTML/CSS/JavaScript 开发模式,极易上手,拿来即用,非常适合网页界面的快速构建。在使用了很久之后,也发现了一些问题。 先说优点: layui 采用的是原生的 HTML/CSS/JavaScript 技术开发,上…

R-YOLOv7-tiny检测浸水玉米胚乳裂纹

Detecting endosperm cracks in soaked maize using μCT technology and R-YOLOv7-tiny 1、模型1.1 C3_TR module(自己提出修改)1.2 CoT block注意力1.3 GhostConv模块2、模型整体流程图3、实验采用r - yolov7微模型和μCT技术对浸水玉米胚乳裂纹进行了检测。提出的ryolov7微…

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

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

iOS开发 蓝牙功能

iOS开发蓝牙功能主要分扫描中心和外设设备 Central: 中心设备,发起蓝牙连接的设备(一般指手机)Peripheral: 外设,被蓝牙连接的设备(一般是运动手环/蓝牙模块)Service:服务,每个设备会提供服务,一个设备有很多服务Characteristic:特征,每个服务中包含很多个特征,这些特征的权限…

付费进群搭建二维码

如今&#xff0c;在互联网时代&#xff0c;群组聊天已经成为人们高效沟通和合作的重要方式。然而&#xff0c;对于一些专业团队或机构来说&#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;、基本匹配条…

echarts常用参数详解汇总(饼图,柱形图,折线图)持续更新中

常用配置&#xff1a; X/Y轴线的基础设置《通用》 细微的差距只能去官网查看了&#xff0c;基本一致 这里只是做了个汇总方便查看 xAxis/yAxis: {show:false, // 不显示坐标轴线、坐标轴刻度线和坐标轴上的文字axisTick:{// 不显示坐标轴刻度线show:false, alignWithLabel: tru…

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;从而严重损害工作效率。 使用看板方法来设定工作优先级是一种非常直观、快速的方法。 确定工作优先级的看板方法 看板工作流程管理方法的核心在于工作可视化。工作被划…

linux学习总结

shell 1.在文本环境下&#xff0c;shell作为命令解释器&#xff0c;建立了用户和操作系统之间的接口。当用户键入一个命令时&#xff0c;shell将对该命令进行解释&#xff0c;并调用相应的程序。2.Linux下有多个shell&#xff0c;最常用的3个shell: bash tcsh zsh3.shell …

hive3升级

文章目录 一、hive2升级到hive3步骤1.备份hive2元数据库2.导入到hive3对应的hive元数据表3.更新hive_metastore数据表信息3.1需要新增的表3.2需要更新字段的表3.3需要更改数据的表 4.hive3上集群需要的操作4.1更改元数据对应的库名4.2重启HiveMetaStore对应服务 二、hive3新特性…

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

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

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

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