视觉语言模型(VLM)学习笔记
目录
应用场景举例
VLM 的总体架构包括:
深度解析:图像编码器的实现
图像编码器:视觉 Transformer
注意力机制
视觉-语言投影器
综合实现
训练及注意事项
总结
应用场景举例
- 基于文本的图像生成或编辑:你输入 “生成一张有红色花朵和蓝色蝴蝶的草地图片”,VLM 会根据文字中的物体、颜色等信息,尝试生成符合要求的图像。
- 图像字幕生成
- 新闻媒体领域:新闻网站或媒体机构在发布新闻图片时,使用 VLM 算法自动生成字幕来描述图片内容。例如,在体育新闻中,一张运动员冲刺的照片,VLM 可以生成 “运动员某某某在比赛最后冲刺阶段奋力奔跑,表情专注且充满斗志” 这样的字幕,帮助读者更快地理解图片所传达的新闻事件。
- 无障碍访问场景:对于视障人士,当他们使用辅助设备访问包含图片的网页或电子书籍时,VLM 算法生成的字幕可以通过语音合成软件读出来,让视障人士也能 “理解” 图片的内容,比如在电子教材中,为生物学课本里的细胞结构图片生成详细的字幕,方便视障学生学习。
- 视觉问答系统(VQA)
- 当你问 “图片中的人在做什么”,VLM 会分析图片中人物的动作姿态等视觉信息,然后回答 “这个人正在读书” 之类的内容。
- 智能客服领域:电商平台上,顾客询问商品图片中的细节,如 “这个背包的口袋有多大?” 或 “这款手机的摄像头是在背面的哪个位置?”。VLM 驱动的视觉问答系统可以分析商品图片,回答顾客的问题,提高顾客的购物体验,减少因信息不明确导致的退货等情况。
- 教育领域的智能辅导:在学习地理知识时,学生可以向系统提问,如 “这张地图上标记的河流流经哪些城市?”,VLM 结合地图图像和地理知识数据库来回答问题,辅助学生学习。
- 基于文本的图像生成或编辑
- 广告创意领域:广告设计师想要快速得到一个创意概念的图像草图。比如,输入 “生成一张年轻人在户外音乐节上狂欢,天空中有五彩灯光的图像”,VLM 可以生成一个初步的图像,设计师可以以此为基础进行进一步的细化和完善,大大提高创意生成的速度。
- 游戏开发前期:游戏策划人员可以利用 VLM 根据文字描述生成游戏场景概念图,如 “生成一个充满魔法气息的森林,中间有一个神秘的古老城堡,周围有发光的小精灵”,帮助团队成员快速建立视觉概念,确定游戏风格和场景布局。
- 图像检索与分类
- 电商平台的商品搜索:消费者在电商平台搜索 “带有碎花图案的连衣裙”,VLM 算法可以理解连衣裙图片中的图案内容,对商品图片进行分类检索,找到符合要求的商品,提高搜索的精准度,让消费者更快地找到心仪的商品。
- 医学影像诊断辅助:在医院的影像数据库中,通过 VLM 算法可以根据疾病特征的文字描述(如 “肺部有结节状阴影的 CT 影像”)对大量的影像进行分类筛选,辅助医生更快地找到可能存在问题的影像,提高诊断效率。
- 视频内容理解与处理
- 视频内容审核:在视频分享平台,VLM 可以分析视频每一帧的内容,对于含有暴力、色情、侵权等违规内容的视频进行识别。例如,识别视频中是否出现了未经授权的品牌标志或侵犯知识产权的画面,及时发现并处理违规视频。
- 视频自动剪辑与摘要生成:对于长视频,如会议记录视频或教育讲座视频,VLM 可以理解视频内容,自动提取关键帧并生成文字摘要,还可以根据主题将视频剪辑成较短的片段。比如,将一个学术讲座视频根据不同的知识点分割成多个小片段,并为每个片段生成标题。
以下内容转自:https://zhuanlan.zhihu.com/p/7661963936
VLM 的总体架构包括:
- 图像编码器(Image Encoder):用于从图像中提取视觉特征。本文将从 CLIP 中使用的原始视觉 Transformer。
- 视觉-语言投影器(Vision-Language Projector):由于图像嵌入的形状与解码器使用的文本嵌入不同,所以需要对图像编码器提取的图像特征进行投影,匹配文本嵌入空间,使图像特征成为解码器的视觉标记(visual tokens)。这可以通过单层或多层感知机(MLP)实现,本文将使用 MLP。
- 分词器和嵌入层(Tokenizer + Embedding Layer):分词器将输入文本转换为一系列标记 ID,这些标记经过嵌入层,每个标记 ID 被映射为一个密集向量。
- 位置编码(Positional Encoding):帮助模型理解标记之间的序列关系,对于理解上下文至关重要。
- 共享嵌入空间(Shared Embedding Space):将文本嵌入与来自位置编码的嵌入进行拼接(concatenate),然后传递给解码器。
- 解码器(Decoder-only Language Model):负责最终的文本生成。
上图是来自CLIP 论文的方法示意图,主要介绍文本和图片进行投影
综上,我们使用图像编码器从图像中提取特征,获得图像嵌入,通过视觉-语言投影器将图像嵌入投影到文本嵌入空间,与文本嵌入拼接后,传递给自回归解码器生成文本。
VLM 的关键在于视觉和文本信息的融合,具体步骤如下:
- 通过编码器提取图像特征(图像嵌入)。
- 将这些嵌入投影以匹配文本的维度。
- 将投影后的特征与文本嵌入拼接。
- 将组合的表示输入解码器生成文本。
深度解析:图像编码器的实现
图像编码器:视觉 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 不仅加深了我们对视觉和语言模型内部机制的理解,还为进一步的研究和应用奠定了基础。随着该领域的迅速发展,新的架构设计、预训练策略和微调技术不断涌现。我们鼓励读者基于本文的实现,探索更先进的模型和方法,如采用替代的视觉编码器、更复杂的投影机制和高效的训练技术,以推动视觉语言模型的创新和实际应用。
相关文章:
视觉语言模型(VLM)学习笔记
目录 应用场景举例 VLM 的总体架构包括: 深度解析:图像编码器的实现 图像编码器:视觉 Transformer 注意力机制 视觉-语言投影器 综合实现 训练及注意事项 总结 应用场景举例 基于文本的图像生成或编辑:你输入 “生成一张…...
学习笔记:黑马程序员JavaWeb开发教程(2024.11.29)
10.5 案例-部门管理-新增 如何接收来自前端的数据: 接收到json数据之后,利用RequestBody注解,将前端响应回来的json格式的数据封装到实体类中 对代码中Controller层的优化 发现路径中都有/depts,可以将每个方法对应请求路径中的…...
文档加密怎么做才安全?
公司的文档包含很多机密文件,这些文件不仅关乎公司的核心竞争力,还涉及到客户隐私、商业策略等敏感信息。因此,文档的保管和传递一直是我们工作的重中之重。 为了确保机密文件的安全,公司需要制定了一系列严格的保密措施。从文件的…...
使用Setup Factory将C#的程序打包成安装包
一、软件下载 https://download.csdn.net/download/qq_65356682/90042701 可以直接下载 二、软件使用 打开 1、创建一个新的项目 2、设置如下信息,也可以不设置,最好填非空的、 产品名就是你安装成功后生成文件的名称 3、如下文件夹路径就是你C#中ex…...
解决 java -jar 报错:xxx.jar 中没有主清单属性
问题复现 在使用 java -jar xxx.jar 命令运行 Java 应用程序时,遇到了以下错误: xxx.jar 中没有主清单属性这个错误表示 JAR 文件缺少必要的启动信息,Java 虚拟机无法找到应用程序的入口点。本文将介绍该错误的原因以及如何通过修改 pom.xm…...
Java HashSet 介绍
怀旧网个人博客网站地址:怀旧网,博客详情:Java HashSet 介绍 哈希值介绍 创建一个实体类 public class Student {private String name;private int age;public Student(String name, int age) {this.name name;this.age age;} }使用测试…...
2024年几款免费的AI对话工具介绍
目前几款免费的AI对话工具介绍 文章目录 目前几款免费的AI对话工具介绍一、前言二、AI对话工具介绍1、讯飞星火认知大模型2、百度文心一言3、通义千问4、豆包5、百川大模型6、智谱清言7、月子暗面-KIMI下面是国外的 AI 对话工具: 8、Replika8、Cleverbot9、Coze 三、…...
Gazebo构建模型(含GNSS、IMU、LiDAR、Camera传感器)
将GNSS、IMU、LiDAR、Camera传感器和机器人的base分别放在不同的文件中。这样可以提高模型的可维护性和模块化。下面是一个示例,展示如何将这些部分分别放在不同的.xacro文件中,然后通过导入的方式组合在一起。 1. 创建基础文件:my_robot.xa…...
#Js篇: 链式判断运算符 ?.和Null判断运算符 ??和逻辑赋值运算符||= = ??=
链式判断运算符 ?. ?.运算符,直接在链式调用的时候判断,左侧的对象是否为null或undefined。如果是的,就不再往下运算,而是返回undefined。 链判断运算符?.有三种写法。 obj?.prop // 对象属性是否存在 obj?.[expr] // 同上…...
IDEA敲Web前端快捷键
1.html基础格式 英文符号TAB键 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, mini…...
【Vue3】【Naive UI】<NDropdown>标签
【Vue3】【Naive UI】 标签 基本设置自定义渲染交互事件其他属性 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】<n-button> 标签 【VUE3】【Naive UI】<a> 标签 【VUE3】【Naive UI】<…...
技术总结(四十一)
一、MySQL 索引概述 索引的概念:索引就好比一本书的目录,它能帮助 MySQL 快速定位到表中的数据行,而不用全表扫描。通过创建合适的索引,可以大大提高查询的效率。例如,在一个存储了大量员工信息的表中,如果…...
Android布局
一、线性布局 属性:orientation vertical horizontal layout_weight【水平均分,width"0dp"】 layout_height layout_width 小动物连连看 1<?xml version"1.0" encoding"utf-8"?>2<LinearLayout xmlns:and…...
k8s集成skywalking
如果能科学上网的话,安装应该不难,如果有问题可以给我留言 本篇文章我将给大家介绍“分布式链路追踪”的内容,对于目前大部分采用微服务架构的公司来说,分布式链路追踪都是必备的,无论它是传统微服务体系亦或是新一代…...
如何写一份优质技术文档
作者简介: 本文作者拥有区块链创新专利30,是元宇宙标准化工作组成员、香港web3标准工作组成员,参与编写《数据资产确权与交易安全评价标准》、《链接元宇宙:应用与实践》、《香港Web3.0标准化白皮书》等标准,下面提供…...
LeetCode:206.反转链表
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:206.反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例…...
详解高斯消元
详解高斯消元 好东西,可以求所有一次方程组的解。 \color {red} 好东西,可以求所有一次方程组的解。 好东西,可以求所有一次方程组的解。 前置知识 一般消元法的公理: 两方程互换,解不变; 一方程乘以非零数 k k k,解不变; 一方程乘以数 k k k加上另一方程,解不变。 …...
Maven - 优雅的管理多模块应用的统一版本号
文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...
国际网络安全趋势
1. 亲近拥抱人工智能自动化。 随着安全协调、人工智能自动化和响应(SOAR)的日益普及,人工智能自动化开始成为现实并将继续扩展到其他安全行动领域。寻求将人工智能自动化整合到原有的工具中,通过将威胁情报整合在一起,将其转换为可用格式并主…...
基于米尔全志T527开发板的FacenetPytorch人脸识别方案
本篇测评由优秀测评者“小火苗”提供。 本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志 T527开发板)的FacenetPytorch人脸识别方案测试。 一、facenet_pytorch算法实现人脸识别 深度神经网络 1.简介 Facenet-PyTorch 是一个基于 PyTorch 框架实…...
Altium Designer脚本工具定制
原理图设计自动化 ➡️Altium原理图检查工具 ➡️元器件参数集导入导出 ➡️原理图符号自动创建 ➡️原理图高级查找 ➡️原理图库文档高级查找 ➡️原理图文档对比 ➡️原理图库文档对比 PCB设计自动化 ➡️各种各样的PCB线圈自动创建 ➡️PCB文档导出成SVG格式文档…...
贝锐自研智慧网关系统OrayOS升级,适配Banana PI开发板BPI-R3 Mini
为了满足多元化的应用场景,贝锐与Banana PI携手合作,贝锐自研新一代云智慧网关系统OrayOS不仅已成功适配BPI-R3,还进一步扩展至BPI-R3 Mini,提供了更丰富的选择。在全球工业物联网、视频监控管理以及企业级办公存储等领域…...
搭建环境-PHP简介及环境搭建教程
搭建环境-PHP简介及环境搭建教程 前言 在现代Web开发中,PHP是一种广泛使用的服务器端脚本语言,它以简洁、高效和跨平台的特性受到开发者的青睐。无论是小型网站还是大型企业应用,PHP都能提供强大的支持。本文将为您详细介绍PHP的基本概念、特点,以及如何搭建PHP开发环境。…...
Maven 配置
参考学习: eclipse(或myeclipse)通过maven配置连接neo4j_eclipse 链接 neo4j-CSDN博客 爆肝十小时—我终于用Java连上Neo4j数据库 - 知乎 全站最全Maven下载安装配置教学(2024更新...全版本)建议收藏...赠送IDEA配置Ma…...
js常见函数实现
文章目录 一、数组Array1、forEach2、filter3、map4、reduce5、find6、findIndex7、includes8、join 二、对象Object1、Object.keys2、深复制 js环境中有很多工具函数,比如es6添加了很多新的属性和方法,这些方法也可以自定义实现,但是官方也提…...
点云3DHarris角点检测算法推导
先回顾2D的Harris角点检测算法推导 自相关矩阵是Harris角点检测算法的核心之一,它通过计算图像局部区域的梯度信息来描述该区域的特征。在推导Harris角点检测算法中的自相关矩阵时,我们首先需要了解自相关矩阵的基本思想和数学背景。 参考 1. 能量函数…...
mysql-binlog的三种模式
MySQL的binlog(二进制日志)有三种主要模式,分别是Statement、Row和Mixed。这三种模式在记录数据库更改的方式上有显著的区别,以下是对这三种模式的详细解释及对比: 一、Statement模式(基于SQL语句的复制&a…...
自动类型推导(auto 和 decltype);右值引用和移动语义
1) 自动类型推导(auto 和 decltype) 自动类型推导(auto) 在C11及以后的版本中,auto关键字被引入用于自动类型推导。这意味着编译器会自动推断变量的类型,基于其初始化的表达式。使用auto可以让代码更加简…...
(Linux 系统)进程控制
目录 一、进程创建 1、fork函数初识 二、进程终止 1、正常终止 2、异常终止 三、进程等待 1、进程等待必要性 2、进程等待的方法: 四、获取子进程status 1、基本概念 2、进程的阻塞等待方式 3、进程的非阻塞等待方式 五、进程程序替换 1、六种替换函数…...
【Nativeshell】flutter的pc跨平台框架学习记录<二> 窗口间通信
首先是初始化: 查看Nativeshell的demo代码 // ignore_for_file: undefined_hidden_name, // not in main import package:flutter/material.dart hide MenuItem; import package:nativeshell/nativeshell.dart;import pages/other_window.dart; import pages/plat…...
优是是什么网站/简阳seo排名优化培训
如何掌握C#的核心技术 感谢网友毛大神制作的图。 引子 前不久看到一个段子,某年宁波交警引进人脸识别技术抓拍行人闯红灯,结果一天下来被发现闯红灯次数最多的是珠海女子董小姐,日闯红灯3000多次。宁波交警连夜研究抓捕方案,最后分…...
做效果图网站有哪些/百度广告客服电话
Office成长课堂 点击左上角蓝字快速关注表格素材下载链接:https://pan.baidu.com/s/1bcuTsgrh0-Ge9vEPXG0Liw 提取码:72ig复制链接至电脑浏览器地址栏打开。案例检查字符串最右边的字符是文本字符,还是数字,如果是数字,…...
游戏软件开发属于什么专业/网站推广优化的公司
这里写自定义目录标题Go学习笔记《The Way to Go》关于格式化1、控制结构(1)if ?else?(2)多函数值返回的错误2、switch结构3、for循环、break、continuego中的函数1、math的常见函数%格式化输出代码例子&am…...
管理咨询师证书含金量/微信seo什么意思
据《法制日报》报道,日前国内第一影视剧视频网站乐视网正式与苹果公司对薄公堂,前者将就苹果在线商店(App Store)非法提供《画皮》等影视剧的盗版行为提起诉讼。据了解,该诉讼行为是因为苹果在线商店未经乐视网授权许可…...
网站建设开发背景/怎么在网络上推广
MySQL简介: 高级MySQL:mysql 内核 sql优化工程师 mysql服务器的优化 各种参数常量设定 查询语句优化 主从复制 软硬件升级 容灾备份 sql编程 完整的mysql优化需要很深的功底 MysqlLinux版的安装(mysql5.5) 1.下载地址 2.检查当前系…...
wordpress一键安装空间/seo关键词找29火星软件
Linux环境下使用JFS文件系统 JFS是IBM公司为linux系统开发的一个日志文件系统。从IBM的实力及它对Linux的态度来看,JFS应该是未来日志文件系统中最具实力的一个文件系统。JFS提供了基于日志的字节级文件系统,该文件系统是为面向事务的高性能系统而开发的…...