多模态视觉大模型(2): 常用模型介绍(CLIP和LLAVA)

文章目录

    • 1.CLIP 讲解
      • 1.1 clip 预训练过程
      • 1.2 利用clip进行图像分类
      • 1.3 CLIP代码详解
        • 1.3.1 Image Encoder 和 Text Encoder的实现
        • 1.3.2 搭建CLIP模型
        • 1.3.3 准备数据
        • 1.3.4 Loss的定义
      • 1.4 完整代码
    • 2.GLIP 讲解
      • 2.1 GLIP 介绍
      • 2.2 GLIP 网络结构
    • 3.Flamingo
      • 3.1 模型介绍
      • 3.2 Loss 定义
      • 3.2 模型的能力
    • 4. LLAVA模型
      • 4.1 网络结构
      • 4.2 数据的生成
    • 5. 总结

1.CLIP 讲解

1.1 clip 预训练过程

CLIP (Contrastive Language-Image Pre-training)是一种利用对比学习进行语言、图像预训练的模型,它是OpenAI的一项工作,当时他们的工作还是开源的。对比学习思想是:将正样本拉近,将负样本拉远的这一类算法

在这里插入图片描述

  • 输入一张Image以及对这张图像的描述,比如一张dog的图像和 “澳洲小狗Pepper”的描述,我们认为这张image 和这段文本就是一对正样本。相对于可以输入多张图像以及这些图像的文本描述,匹配的文本和图像之间是正样本,不匹配的文本和图像是负样本。对比学习的目标就是拉近正样本之间的距离拉远负样本之间的距离。通过Text Encoder来编码文本的信息,通过Image Encoder来编码图像信息,来最大化正样本之间的相似度,来最小化负样本的相似度。
  • 通过Encoder 会得到多个Text对应的多个Embedding(t_1,t_2,…,t_N)和多张image对应的多个Embedding(I_1,I_2,I_3,…I_N), 对角线上属于同一对pair, 这样通过Loss 来最大化对角线上的相似度,来最小化其他元素之间的相似度,这样网络学习到了同一个目标的图像和文本得到的Embedding就尽可能相同。对应于多模态的三要素:1. 各个模态都有各自的Encoder 2. 对齐策略:通过Loss来约束让同一个样本的文本和Image的Embedding的相似度尽可能大,不同样本间相似度尽可能小的对比学习策略来对齐文本和图像模态。3. LLM模型, 该要素是可选的,对于CLIP模型中肯定是没有包括LLM模型的。
  • CLIP 相对于单模态的对比学习来说,任务肯定是更复杂一些的,通过引入了不同的模态信息比如Text,这样通过对比学习效果肯定是非常不错的。

1.2 利用clip进行图像分类

如何利用预训练得到的clip模型来做图像分类任务呢?这里就和传图的CV模型是不一样的。

  • 对于CV来说通常是拿到预训练的权重,针对下游任务通过接一个任务Head来训练任务头或者Fine-tune整个网络来得到预测输出。

  • CLIP则设计了一种新的方式,它首先从标签label层面入手, 对数据集可能存在的类名,使用prompt模板,比如对于飞机plane这个类,我们将飞机这个类转换为一个文本如A photo of a plane,同理将car类,将它转换为文本A photo of a car

  • 然后将所有类别得到的文本信息,输入预训练好的Text Encoder, 这样对于数据集中的每一个类别都会生成一个向量。这个向量就能代表这一个类别的通用的Embedding。

  • 最后将输入的一张image,它经过Image Encoder会得到对应的图像Embedding,和每个类别所代表的文本Embedding来计算相似度,找到相似度最大的文本标签类别,就认为该图像就是该类别。

  • Clip这种图像分类的Idea是一种非常创新的想法,可以从输入和label之间同时经过网络来约束他们之间的距离,而不是只有输入到预测目标这一单向的路径。这一idea也是Lecun大佬提出world model的概念。

    在这里插入图片描述

总结

clip 这样设计的模型它的最大的能力可以让图像和Text各自的Embedding, 能够在共享的空间下,通过输入一张图像和该图像的描述信息会得到两个相同的Embedding。这样,比如在一个语言大模型中,如果我们想加入图像信息,可以将图像通过编码映射到文本的Embedding中,因为他们之间的Embedding已经对齐了。

这样在训练好clip模型之后,可以直接将Text EncoderImage Encoder拿过来使用,在构建自己的大模型的时候,就不在需要重新训练这两个Encoder了。在后续介绍的多模态大模型比如Flamingo和LLaVA,他们对于图像的编码就直接使用CLIP中训练好的Image Encoder

1.3 CLIP代码详解

在这里插入图片描述

图1 clip 模型结构

CLIP 模型结构其实非常简单,针对两个模态Text和Image,分别通过各自Encoder编码(Text EncoderImage Encoder), 得到经过编码后的高纬向量Embedding, 然后计算相似度,最终使得匹配的image 和Text对的相似度尽可能大,其他没有匹配到的Embedding相似度尽可能小。

1.3.1 Image Encoder 和 Text Encoder的实现
class ViT(nn.Module):
    def __init__(self,output_dim):
        # 使用来自timm的VIT模型
        self.vit = timm.create_model('vit_small_patch16_224',pretrained=True,num_classes =output_dim)
        
    def forward(self,x):
        return self.vit(x)

class TextEncoder(nn.Module):
    def __init__(self):
        super(TextEncoder,self).__init__()
        
        BERT_LOCAL_PATH ='./bert-base-uncased'
        self.model = BertModel.from_pretrained(BERT_LOCAL_PATH)
        self.tokenizer = BertTokenizer.from_pretrained(BERT_LOCAL_PATH)
    
    def forward(self,texts):
        encoded_input = self.tokenizer(texts, return_tensors ='pt',padding= True,truncation =True)
        outputs = self.model(**encoded_input)
        return outputs.last_hidden_state[:,0,:]
  • Image Encoder : 使用的是ViT模型,为了方便起见使用timm工具来搭建,使用的是vit_small_patch16_224版本的模型,也可以使用vit-base版本的。得到编码后的embedding维度为output_dim
  • TextEncoder: 文本编码器使用的是Bert模型,利用transformers工具进行构建。由于是文本,除了模型本身之外,还需要实例化一个tokenizer
  • 文本输入模型前,首先需要经过tokenizer操作,然后将tokenizer后的encoded_input, 输入到TextEncoder
1.3.2 搭建CLIP模型
class CLIP(nn.Module):
    def __init__(self, image_output_dim, text_output_dim):
        super(CLIP, self).__init__

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

远程控制软件优化(1)

远程控制软件优化(1) 第一版存在以下缺点: 1、四大部分中 Robot States 部分过于简陋,不适合放到论文中 2、Lidar BEV 图像显示效果非常差,显示不全且很稀疏 3、视频流传输延时过高,无法实现远程控制 以…

基于OpenMV 双轴机械臂 机器学习

文章目录 一、项目简要二、目标追踪1. 色块识别与最大色块筛选2. PID位置闭环 三、机器学习1. Device12. Device2 四、效果演示 一、项目简要 两套二维云台设备,Device1通过摄像头捕捉目标物块点位进行实时追踪,再将自身点位传到Device2,Dev…

【力扣周赛】第394场周赛

文章目录 1.统计特殊字母的数量2.使矩阵满足条件的最少操作次数 1.统计特殊字母的数量 题目链接 🍎该题涉及的小技巧:🐥 🐧①大写字母和对应的小写字母低5位都是相等的; 🐧②大写字母ASCII二进制第 6 位…

node.js + @elastic/elasticsearch 操作elasticsearch数据库

我这边node.js 使用的是 koa2,elasticsearch是8.11.1版本 官网:https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/getting-started-js.html 一、elastic/elasticsearch 连接 elasticsearch数据库 如果elasticsearch没有设…

win c++使用lua环境配置 5.3.5版本

编译lua 下载lua源码,github仓库 使用vs编译源码,新建一个静态库项目(只会生成lib文件),想要dll的话就新建dll项目(有一个lib文件和dll文件) 把lua源码下面的文件夹都是,复制到vs项目中 lib目录是我手动…

ResNeXt网络结构

一、简介 在ResNet的基础上,对残差结构的block进行了更新。 ResNeXt网络是一种深度神经网络架构,可以视为对ResNet(残差网络)的改进和升级。ResNeXt结合了VGG网络的堆叠相同基础模块的策略以及Inception系列网络中的split-trans…

杰发科技AC7840——CAN通信简介(6)_监听模式

参考:http://t.csdnimg.cn/AFFPC 0. 简介 7840支持4种扩展模式,其中监听模式。 监听模式概念 作用: 这里写的用于诊断,实际上我还没有用到,不太理解为啥可以用作诊断。 我的理解是,在多个总线下,使用监听…

装饰器模式【结构型模式C++】

1.概述 装饰器模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 2.结构 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件(Concre…

苍穹外卖绕过微信支付

经过以下改动可实现: 1、不用微信支付端口 2、弹出支付成功的界面 3、数据库修改支付成功后的数据 #在OrderServiceImpl.java里加入Autowiredprivate OrderService orderService; #在OrderServiceImpl.java里的payment函数做以下改动 #图片里有,红色为原…

时间序列生成数据,TransformerGAN

简介:这个代码可以用于时间序列修复和生成。使用transformer提取单变量或者多变时间窗口的趋势分布情况。然后使用GAN生成分布类似的时间序列。 此外,还实现了基于prompt的数据生成,比如指定生成某个月份的数据、某半个月的数据、某一个星期的…

Qt | 窗口的显示及可见性|标题、透明度、启用/禁用|窗口标志、设置其他属性|获取窗口部件、设置父部件|鼠标光标

​显示事件:QEvent::show,处理函数为 showEvent(QShowEvent*) 隐藏事件:QEvent::hide,处理函数为 hideEvent(QHideEvent* ) 01 QWidget 类中与可见性有关的属性 visible:bool 访问函数: bool isVisible() const; virtual void setVisible(bool visible); 02 QWid…

同事上班这样摸鱼,我坐边上咋看他都在专心写代码啊

我边上有个同事,我坐他边上,但是每天看着他都眉头紧锁,忙的不亦乐乎,但终于有一天,我发现了他上班摸鱼的秘诀。 我劝你千万不要学会这4招,要不就该不好好上班了。 目录 1 上班看电影? 2 上班…

LeetCode - LCR 179.查找总价格为目标值的两个商品

一. 题目链接 LeetCode - LCR 179. 查找总价格为目标值的两个商品 解法(双指针 - 对撞指针): 算法思路: 注意到本题是升序的数组,因此可以用「对撞指针」优化时间复杂度。 算法流程: 初始化left &#…

算法入门ABC

前言 初学算法时真的觉得这东西晦涩难懂,貌似毫无用处!后来的后来,终于渐渐明白搞懂算法背后的核心思想,能让你写出更加优雅的代码。就像一首歌唱的那样:后来,我总算学会了如何去爱,可惜你早已远…

Hotcoin Academy 市场洞察-2024年4月15日-21日

加密货币市场表现 BTC ETF在本周出现净流出,大盘有较大跌幅,BTC一度跌破60000美金,ETH一度跌破2800美金,整体以横盘为主,行情在周末有略微回升趋势。BTC市占率创21年4月来新高,目前市值1.28万亿&#xff0c…

ElasticSearch教程入门到精通——第六部分(基于ELK技术栈elasticsearch 7.x+8.x新特性)

ElasticSearch教程入门到精通——第六部分(基于ELK技术栈elasticsearch 7.x8.x新特性) 1. Elasticsearch优化1.1 硬件选择1.1 分片策略1.1.1 分片策略——合理设置分片数1.1.2 分片策略——推迟分片分配 1.2 路由选择1.2.1 路由选择——不带routing查询1…

哪款洗地机最好用?2024年四大口碑一流品牌推荐

随着人们生活质量的提升,人们的扫地、拖地都可以用智能清洁工具来高效完成,像洗地机它集合了扫地、拖地、自清洁等功能,让我们摆脱了每次打扫卫生就像打仗一样,忙活半小时下来腰酸背痛的窘境。所以越来越多的家庭纷纷开始用洗地机…

84.柱形图中最大的矩阵

二刷终于能过了. 思路解析: 不愧是hard,第一步就很难想, 对于每一个矩阵,我们要想清楚怎么拿到最大矩阵, 对于每个height[i],我们需要找到left和right,left是i左边第一个小于height[i]的,right是右边第一个小于height[i]的,那么他的最大矩阵就是height[i] * (right-left-…

鸿蒙launcher浅析

鸿蒙launcher浅析 鸿蒙launcher源码下载鸿蒙launcher模块launcher和普通的应用ui展示的区别 鸿蒙launcher源码下载 下载地址如下: https://gitee.com/openharmony/applications_launcher 鸿蒙launcher模块 下载页面已经有相关文件结构的介绍了 使用鸿蒙编辑器D…

国外企业使用生成式人工智能实例100

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…
最新文章