视觉语言模型(VLM)学习笔记

news2024/11/29 23:51:50

目录

应用场景举例

VLM 的总体架构包括:

深度解析:图像编码器的实现

图像编码器:视觉 Transformer

注意力机制

视觉-语言投影器

综合实现

训练及注意事项

总结


应用场景举例

  1. 基于文本的图像生成或编辑:你输入 “生成一张有红色花朵和蓝色蝴蝶的草地图片”,VLM 会根据文字中的物体、颜色等信息,尝试生成符合要求的图像。
  2. 图像字幕生成
    • 新闻媒体领域:新闻网站或媒体机构在发布新闻图片时,使用 VLM 算法自动生成字幕来描述图片内容。例如,在体育新闻中,一张运动员冲刺的照片,VLM 可以生成 “运动员某某某在比赛最后冲刺阶段奋力奔跑,表情专注且充满斗志” 这样的字幕,帮助读者更快地理解图片所传达的新闻事件。
    • 无障碍访问场景:对于视障人士,当他们使用辅助设备访问包含图片的网页或电子书籍时,VLM 算法生成的字幕可以通过语音合成软件读出来,让视障人士也能 “理解” 图片的内容,比如在电子教材中,为生物学课本里的细胞结构图片生成详细的字幕,方便视障学生学习。
  3. 视觉问答系统(VQA)
    • 当你问 “图片中的人在做什么”,VLM 会分析图片中人物的动作姿态等视觉信息,然后回答 “这个人正在读书” 之类的内容。
    • 智能客服领域:电商平台上,顾客询问商品图片中的细节,如 “这个背包的口袋有多大?” 或 “这款手机的摄像头是在背面的哪个位置?”。VLM 驱动的视觉问答系统可以分析商品图片,回答顾客的问题,提高顾客的购物体验,减少因信息不明确导致的退货等情况。
    • 教育领域的智能辅导:在学习地理知识时,学生可以向系统提问,如 “这张地图上标记的河流流经哪些城市?”,VLM 结合地图图像和地理知识数据库来回答问题,辅助学生学习。
  4. 基于文本的图像生成或编辑
    • 广告创意领域:广告设计师想要快速得到一个创意概念的图像草图。比如,输入 “生成一张年轻人在户外音乐节上狂欢,天空中有五彩灯光的图像”,VLM 可以生成一个初步的图像,设计师可以以此为基础进行进一步的细化和完善,大大提高创意生成的速度。
    • 游戏开发前期:游戏策划人员可以利用 VLM 根据文字描述生成游戏场景概念图,如 “生成一个充满魔法气息的森林,中间有一个神秘的古老城堡,周围有发光的小精灵”,帮助团队成员快速建立视觉概念,确定游戏风格和场景布局。
  5. 图像检索与分类
    • 电商平台的商品搜索:消费者在电商平台搜索 “带有碎花图案的连衣裙”,VLM 算法可以理解连衣裙图片中的图案内容,对商品图片进行分类检索,找到符合要求的商品,提高搜索的精准度,让消费者更快地找到心仪的商品。
    • 医学影像诊断辅助:在医院的影像数据库中,通过 VLM 算法可以根据疾病特征的文字描述(如 “肺部有结节状阴影的 CT 影像”)对大量的影像进行分类筛选,辅助医生更快地找到可能存在问题的影像,提高诊断效率。
  6. 视频内容理解与处理
    • 视频内容审核:在视频分享平台,VLM 可以分析视频每一帧的内容,对于含有暴力、色情、侵权等违规内容的视频进行识别。例如,识别视频中是否出现了未经授权的品牌标志或侵犯知识产权的画面,及时发现并处理违规视频。
    • 视频自动剪辑与摘要生成:对于长视频,如会议记录视频或教育讲座视频,VLM 可以理解视频内容,自动提取关键帧并生成文字摘要,还可以根据主题将视频剪辑成较短的片段。比如,将一个学术讲座视频根据不同的知识点分割成多个小片段,并为每个片段生成标题。

以下内容转自:https://zhuanlan.zhihu.com/p/7661963936

VLM 的总体架构包括:

  1. 图像编码器(Image Encoder):用于从图像中提取视觉特征。本文将从 CLIP 中使用的原始视觉 Transformer。
  2. 视觉-语言投影器(Vision-Language Projector):由于图像嵌入的形状与解码器使用的文本嵌入不同,所以需要对图像编码器提取的图像特征进行投影,匹配文本嵌入空间,使图像特征成为解码器的视觉标记(visual tokens)。这可以通过单层或多层感知机(MLP)实现,本文将使用 MLP。
  3. 分词器和嵌入层(Tokenizer + Embedding Layer):分词器将输入文本转换为一系列标记 ID,这些标记经过嵌入层,每个标记 ID 被映射为一个密集向量。
  4. 位置编码(Positional Encoding):帮助模型理解标记之间的序列关系,对于理解上下文至关重要。
  5. 共享嵌入空间(Shared Embedding Space):文本嵌入与来自位置编码的嵌入进行拼接(concatenate),然后传递给解码器。
  6. 解码器(Decoder-only Language Model):负责最终的文本生成。


上图是来自CLIP 论文的方法示意图,主要介绍文本和图片进行投影
综上,我们使用图像编码器从图像中提取特征,获得图像嵌入,通过视觉-语言投影器将图像嵌入投影到文本嵌入空间,与文本嵌入拼接后,传递给自回归解码器生成文本。
VLM 的关键在于视觉和文本信息的融合,具体步骤如下:

  1. 通过编码器提取图像特征(图像嵌入)。
  2. 将这些嵌入投影以匹配文本的维度。
  3. 将投影后的特征与文本嵌入拼接。
  4. 将组合的表示输入解码器生成文本。

深度解析:图像编码器的实现

图像编码器:视觉 Transformer

为将图像转换为密集表示(图像嵌入),我们将图像分割为小块(patches),因为 Transformer 架构最初是为处理词序列设计的。

为从零开始实现视觉 Transformer,我们需要创建一个 PatchEmbeddings 类,接受图像并创建一系列小块。该过程对于使 Transformer 架构能够有效地处理视觉数据至关重要,特别是在后续的注意力机制中。实现如下:

class PatchEmbeddings(nn.Module):  
 def __init__(self, img_size=96, patch_size=16, hidden_dim=512):  
        super().__init__()  
        self.img_size = img_size  
        self.patch_size = patch_size  
        self.num_patches = (img_size // patch_size) ** 2  
 
 # 无重叠卷积用于提取小块  
        self.conv = nn.Conv2d(  
            in_channels=3,  
            out_channels=hidden_dim,  
            kernel_size=patch_size,  
            stride=patch_size  
        )  
 
 # 使用 Xavier/Glorot 初始化权重  
        nn.init.xavier_uniform_(self.conv.weight)  
 if self.conv.bias is not None:  
            nn.init.zeros_(self.conv.bias)  
 def forward(self, X):  
 """  
        参数:  
            X: 输入张量,形状为 [B, 3, H, W]  
        返回:  
            小块嵌入,形状为 [B, num_patches, hidden_dim]  
        """ 
 if X.size(2) != self.img_size or X.size(3) != self.img_size:  
 raise ValueError(f"输入图像尺寸必须为 {self.img_size}x{self.img_size}")  
 
        X = self.conv(X)  # [B, hidden_dim, H/patch_size, W/patch_size]  
        X = X.flatten(2)  # [B, hidden_dim, num_patches]  
        X = X.transpose(1, 2)  # [B, num_patches, hidden_dim]  
 return X

在上述代码中,输入图像通过卷积层被分解为 (img_size // patch_size) 2** 个小块,并投影为具有通道维度为 512 的向量(在 PyTorch 实现中,三维张量的形状通常为 [B, T, C])。

注意力机制

视觉编码器和语言解码器的核心都是注意力机制。关键区别在于解码器使用因果(掩码)注意力,而编码器使用双向注意力。以下是对单个注意力头的实现:

class Head(nn.Module):  
 def __init__(self, n_embd, head_size, dropout=0.1, is_decoder=False):  
        super().__init__()  
        self.key = nn.Linear(n_embd, head_size, bias=False)  
        self.query = nn.Linear(n_embd, head_size, bias=False)  
        self.value = nn.Linear(n_embd, head_size, bias=False)  
        self.dropout = nn.Dropout(dropout)  
        self.is_decoder = is_decoder  
 
 def forward(self, x):  
        B, T, C = x.shape  
        k = self.key(x)  
        q = self.query(x)  
        v = self.value(x)  
 
        wei = q @ k.transpose(-2, -1) * (C ** -0.5)  
 
 if self.is_decoder:  
            tril = torch.tril(torch.ones(T, T, dtype=torch.bool, device=x.device))  
            wei = wei.masked_fill(tril == 0, float('-inf'))  
 
        wei = F.softmax(wei, dim=-1)  
        wei = self.dropout(wei)  
        out = wei @ v  
 return out

视觉-语言投影器

投影器模块在对齐视觉和文本表示中起关键作用。我们将其实现为一个多层感知机(MLP):

class MultiModalProjector(nn.Module):  
 def __init__(self, n_embd, image_embed_dim, dropout=0.1):  
        super().__init__()  
        self.net = nn.Sequential(  
            nn.Linear(image_embed_dim, 4 * image_embed_dim),  
            nn.GELU(),  
            nn.Linear(4 * image_embed_dim, n_embd),  
            nn.Dropout(dropout)  
        )  
 
 def forward(self, x):  
 return self.net(x)

综合实现

最终的 VLM 类将所有组件整合在一起:

class VisionLanguageModel(nn.Module):  
 def __init__(self, n_embd, image_embed_dim, vocab_size, n_layer,   
                 img_size, patch_size, num_heads, num_blks,   
                 emb_dropout, blk_dropout):  
        super().__init__()  
        num_hiddens = image_embed_dim  
 assert num_hiddens % num_heads == 0  
 
        self.vision_encoder = ViT(  
            img_size, patch_size, num_hiddens, num_heads,   
            num_blks, emb_dropout, blk_dropout  
        )  
 
        self.decoder = DecoderLanguageModel(  
            n_embd, image_embed_dim, vocab_size, num_heads,   
            n_layer, use_images=True  
        )  
 
 def forward(self, img_array, idx, targets=None):  
        image_embeds = self.vision_encoder(img_array)  
 
 if image_embeds.nelement() == 0 or image_embeds.shape[1] == 0:  
 raise ValueError("ViT 模型输出为空张量")  
 
 if targets is not None:  
            logits, loss = self.decoder(idx, image_embeds, targets)  
 return logits, loss  
 else:  
            logits = self.decoder(idx, image_embeds)  
 return logits

训练及注意事项

在训练 VLM 时,需要考虑以下重要因素:

预训练策略:现代 VLM 通常使用预训练的组件:

  • 视觉编码器:来自 CLIP 或 SigLIP
  • 语言解码器:来自 Llama 或 GPT 等模型
  • 投影器模块:初始阶段仅训练此模块
    训练阶段:
  • 阶段 1:在冻结的编码器和解码器下预训练,仅更新投影器
  • 阶段 2:微调投影器和解码器以适应特定任务
  • 可选阶段 3:通过指令微调提升任务性能
    数据需求:
  • 大规模的图像-文本对用于预训练
  • 任务特定的数据用于微调
  • 高质量的指令数据用于指令微调

总结

通过从零开始实现视觉语言模型(VLM),我们深入探讨了视觉和语言处理在现代人工智能系统中的融合方式。本文详细解析了 VLM 的核心组件,包括图像编码器、视觉-语言投影器、分词器、位置编码和解码器等模块。我们强调了多模态融合的关键步骤,以及在实现过程中需要注意的训练策略和数据需求。

构建 VLM 不仅加深了我们对视觉和语言模型内部机制的理解,还为进一步的研究和应用奠定了基础。随着该领域的迅速发展,新的架构设计、预训练策略和微调技术不断涌现。我们鼓励读者基于本文的实现,探索更先进的模型和方法,如采用替代的视觉编码器、更复杂的投影机制和高效的训练技术,以推动视觉语言模型的创新和实际应用。

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

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

相关文章

[AutoSar]BSW_Diagnostic_007 BootLoader 跳转及APP OR boot response 实现

目录 关键词平台说明背景一、Process Jump to Bootloader二、相关函数和配置2.1 Dcm_GetProgConditions()2.2 Dcm_SetProgConditions() 三、如何实现在APP 还是BOOT 中对10 02服务响应3.1 配置3.2 code 四、报文五、小结 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagno…

如何启用本机GPU硬件加速猿大师播放器网页同时播放多路RTSP H.265 1080P高清摄像头RTSP视频流?

目前市面上主流播放RTSP视频流的方式是用服务器转码方案,这种方案的好处是兼容性更强,可以用于不同的平台,比如:Windows、Linux或者手机端,但是缺点也很明显:延迟高、播放高清或者同时播放多路视频视频容易…

设置ip和代理DNS的WindowsBat脚本怎么写?

今天分享一个我们在工作时,常见的在Windows中通过批处理脚本(.bat 文件)来设置IP地址、代理以及DNS 相关配置的示例,大家可以根据实际需求进行修改调整。 一、设置静态IP地址脚本示例 以下脚本用于设置本地连接(你可…

深度学习-49-AI应用实战之基于HyperLPR的车牌识别

文章目录 1 车牌识别系统1.1 识别原理1.1.1 车牌定位1.1.2 字符识别2 实例应用2.1 安装hyperlpr32.2 识别结果2.3 可视化显示2.4 结合streamlit3 附录3.1 PIL.Image转换成OpenCV格式3.2 OpenCV转换成PIL.Image格式3.3 st.image嵌入图像内容3.4 参考附录1 车牌识别系统 车牌识别…

基于深度学习的手势识别算法

基于深度学习的手势识别算法 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。 手部姿态估计是从图像或视频帧集中找到手…

【Linux】-操作系统

🔑🔑博客主页:阿客不是客 🍓🍓系列专栏:深入代码世界,了解掌握 Linux 欢迎来到泊舟小课堂 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 ​​ 一、冯•诺依曼架构&#xff…

2024最新python使用yt-dlp

2024最新python使用yt-dlp下载YT视频 1.获取yt的cookie1)google浏览器下载Get cookies.txt LOCALLY插件2)导出cookie 2.yt-dlp下载[yt-dlp的GitHub地址](https://github.com/yt-dlp/yt-dlp?tabreadme-ov-file)1)使用Pycharm(2024.3)进行代码…

Mybatis集成篇(一)

Spring 框架集成Mybatis 目前主流Spring框架体系中,可以集成很多第三方框架,方便开发者利用Spring框架机制使用第三方框架的功能。就例如本篇Spring集成Mybatis 简单集成案例: Config配置: Configuration MapperScan(basePack…

C51相关实验

C51相关实验 LED (P2 / 0~7)蜂鸣器 (P2^5)数码管 (P0 0~7 段 ,P2 2~4 位)独立按键 (P3^1 P3^0 P3^2 P3^3)直流电机 (J47 5v 01~04)综合实验矩阵按键 (P1组 0~7)LED点阵 LED (P2 / 0~7) //功能:1.让开发板的LED全亮,2,…

C++语法·叭

阁下何不乘风起,扶摇直上九万里。 qi fei 目录 内存管理 分区介绍 1.栈区: 2.内存映射段: 3.堆: 4.数据段: 5.代码段: 补充: C内存管理(简略回忆) C内存…

数据库期末复习题库

1. Mysql日志功能有哪些? 记录日常操作和错误信息,以便了解Mysql数据库的运行情况,日常操作,错误信息和进行相关的优化。 2. 数据库有哪些备份方法 完全备份:全部都备份一遍表备份:只提取数据库中的数据&#xff0…

矩阵重新排列——rot90函数

通过 r o t 90 rot90 rot90函数可以将矩阵进行旋转 用法: r o t 90 ( a , k ) rot90(a,k) rot90(a,k)将矩阵 a a a按逆时针方向旋转 k 9 0 ∘ k\times90^\circ k90∘

挑战用React封装100个组件【001】

项目地址 https://github.com/hismeyy/react-component-100 组件描述 组件适用于需要展示图文信息的场景,比如产品介绍、用户卡片或任何带有标题、描述和可选图片的内容展示 样式展示 代码展示 InfoCard.tsx import ./InfoCard.cssinterface InfoCardProps {ti…

联通云服务器部署老项目tomcat记录

1.先在服务器上安装mysql和tomcat 2.tomcat修改端口 3.在联通云运控平台配置tomcat访问端口(相当于向外部提供可访问端口) 4.将tomcat项目放在服务器tomcat的webapps里面 5.在mysql里创建项目数据库,运行sql创建表和导入数据 6.在配置文…

Python 删除Word中的表格

在处理Word文档时,我们经常会遇到需要删除表格的情况。无论是为了简化文档结构,还是为了更新内容,删除表格都是一个常见的操作。但是通过手动删除不仅耗时,而且容易出错,本文将介绍如何使用Python通过编程删除Word中的…

讯飞语音转写WebApi 【JS语言】

讯飞语音转写 API 文档 文档地址:https://www.xfyun.cn/doc/asr/ifasr_new/API.html 看到没有 js 版本的 demo(音频流模式),所以就搞了一个分享出来 在 React Native 运行环境下测试有效。 1、生成 signa import axios from a…

c++基础开发环境vscode+mingw-w64

c开发需要的基础有两个:编译环境,开发环境。 最简单的编译环境可以用gcc,cl,clongllvm; 开发环境最简单直接用文本编辑器就可以。 但是实际开发都会用ide来做,现代的ide即有开发环境可以写代码,自动补全&am…

DBA面试题-1

面临失业,整理一下面试题,找下家继续搬砖 主要参考:https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1, 整形 tinyint,smallint,medumint,int,bigint;分别占用1字节、2字节、3字节…

LSTM卫星轨道预测(一)

一.多文件预测 代码详细解析 1. 文件读取与数据处理 功能 从 .sp3 文件中读取卫星轨迹数据。提取包括 Satellite_ID, X, Y, Z 等字段的信息。计算派生特征(如速度和加速度),便于后续建模使用。 主要函数:extract_sp3_data(fil…

如何通过智能生成PPT,让演示文稿更高效、更精彩?

在快节奏的工作和生活中,我们总是追求更高效、更精准的解决方案。而在准备演示文稿时,PPT的制作往往成为许多人头疼的问题。如何让这项工作变得轻松且富有创意?答案或许就在于“AI生成PPT”这一智能工具的广泛应用。我们就来聊聊如何通过这些…