【大模型系列】图文对齐(CLIP/TinyCLIP/GLIP)

1 CLIP(ICML2021,OpenAI)

参考资料:

CLIP(Constrastive Language-Image Pre-training):是openAI在2021年ICML上提出的zero-shot视觉分类预训练模型(CLIP: Learning Transferable Visual Models From Natural Language Supervision),在无微调的情况下能在多个下游任务上取得不错的迁移效果。CLIP有效地借助了自然语言的监督来学习视觉概念。

CLIP方法的特点:

  • 利用互联网上存在的大量公开可用的无标注文本数据集,创建了一个包含4亿对的(图像-文本)的新数据集;
  • 基于成对的图片-文本数据,训练了CLIP模型;
  • 基于Transformer的统一视觉语言基础架构;

1.1 预训练阶段

网络输入的是图像-文字对,即每张图片配有一小句解释性的文字。将文字通过一个编码器(BERT)得到其向量表示,将图片也经过一个编码器(ViT)也得到一个向量表示,再将2个向量通过non-linear的projection head,投影到一个shared的空间,从而计算距离,然后再使用交叉熵计算损失。
在这里插入图片描述
在这里插入图片描述

假设一个batch输入N个图像-文本对:

  • 经过编码器之后,图像的特征向量维度为Nxdi,文本的特征向量维度为Nxdt
  • 两组特征向量分别经过一个非线性的映射空间,得到新的特征表达,维度都是Nxde
  • 映射后的特征矩阵相乘,得到两两之间的距离矩阵NxN
  • 沿着维度0计算交叉熵得到图像的loss,沿着维度1计算交叉熵得到文本的loss,两者的均值就是constrastive loss。

1.2 推理阶段

在这里插入图片描述
给定一张图片和一堆分类标签(如cat、dog等)

  • 利用文本编码器得到类别标签的向量表示
  • 利用图像编码器得到图像的向量表示
  • 分别计算这些标签与图像的余弦相似度,最终相似度高的即为预测分类的结果

1.3 CLIP的下游应用

1.3.1 ViLD:zero-shot目标检测(2022, Google)

  • Paper:https://arxiv.org/pdf/2104.13921.pdf
  • 推理阶段:将基本类别和新增类别转化成文本送入Pre-trained Text Encoder产生text embedding(图中的绿色和蓝色部分),再通过Mask R-CNN产生类别无关的region embeddings。然后将region embeddings和text embeddings进行点积然后再softmax归一化,取最大值的类别作为该区域的预测结果。
    在这里插入图片描述

1.3.2 图像检索Image Retrival

从图像集中选择与文本embedding余弦相似度最高的。

1.3.3 HairCLIP:图像编辑Image Editing(2022,中科大)

文章利用在大规模人脸数据集上预训练的StyleGAN作为的生成器。给定待编辑的真实图像,我们首先使用StyleGAN inversion方法得到其隐编码,然后我们的头发映射器根据隐编码和条件输入(发型条件、发色条件)预测隐编码相应的变化,最后修改后的隐编码将被送入StyleGAN产生对应的头发编辑后的图像。本质上是通过CLIP输出的embedding来指导图像的生成。

2 TinyCLIP(2023, 微软)

2.1 亲和力蒸馏

在这里插入图片描述
损失包含4个部分:

  • Student网络与gt的交叉损失:image-to-text和text-to-image
  • Student与Teacher网络的交叉损失:image-to-text和text-to-image

A I 2 T ( i , j ) = exp ⁡ ( I i ⋅ T j / τ ) ∑ k ∈ B exp ⁡ ( I i ⋅ T k / τ ) A T 2 I ( i , j ) = exp ⁡ ( I i ⋅ T j / τ ) ∑ k ∈ B exp ⁡ ( I k ⋅ T j / τ ) L distill  = L I 2 T + L T 2 I = C E ( A I 2 T s , A I 2 T t ) + C E ( A T 2 I s , A T 2 I t ) . A_{I 2 T}(i, j)=\frac{\exp \left(I_i \cdot T_j / \tau\right)}{\sum_{k \in \mathcal{B}} \exp \left(I_i \cdot T_k / \tau\right)} \\ A_{T 2 I}(i, j)=\frac{\exp \left(I_i \cdot T_j / \tau\right)}{\sum_{k \in \mathcal{B}} \exp \left(I_k \cdot T_j / \tau\right)} \\ \mathcal{L}_{\text {distill }} =\mathcal{L}_{I 2 T}+\mathcal{L}_{T 2 I} =C E\left(A_{I 2 T}^s, A_{I 2 T}^t\right)+C E\left(A_{T 2 I}^s, A_{T 2 I}^t\right) . AI2T(i,j)=kBexp(IiTk/τ)exp(IiTj/τ)AT2I(i,j)=kBexp(IkTj/τ)exp(IiTj/τ)Ldistill =LI2T+LT2I=CE(AI2Ts,AI2Tt)+CE(AT2Is,AT2It).

2.2 权重继承

手动继承: 直接选择网络的前k层;
自动继承: 通过设置可学习mask识别权重重要性。引入一个全局稀疏约束来保证重要参数的数目符合压缩要求。在MHA引入head mask、在FFN引入神经元mask、在embeding层引入embed mask。
在这里插入图片描述

2.3 多段式渐进压缩

当较多的权重被去除后(70%),模型性能会有显著的下降,为了缓解这个问题,本文提出渐进式蒸馏。分成G个阶段进行,每个阶段在前Lm step里做亲和蒸馏和继承训练(根据step更新当前稀疏度p,然后计算亲和力蒸馏损失,然后当前稀疏度p和目标稀疏q计算稀疏损失,然后更新mask和权重),然后将不重要权重移除,Lm后续的训练用亲和训练。
在这里插入图片描述

3 GLIP: grounded language-image pre-training(2022,微软)

主要贡献:GLIP统一了目标检测(Object detection)和定位任务(Grounding),构建了一个统一的训练框架。目标检测任务是给定一张图输出bounding box,定位任务是给定图片和文本,根据文本找出目标。

算法效果:进行zero-shot测试,不管是给定几个类别(apple,person等),还是给定一段话(there are some holes on the road)作为文本编码器的输入,GLIP模型都能从图像中找到对应目标的位置。
在这里插入图片描述

3.1 如何统一两个任务

目标检测与定位任务的目标函数都是由2个部分组成:分类损失和定位损失

L = L c l s + L b o x L = L_{cls} + L_{box} L=Lcls+Lbox

  • 定位损失:直接计算GT与预测框的Loss
  • 分类损失:
    • 目标检测任务:目标的region embedding通过分类头输出logits,再用nms筛选后与gt计算交叉熵;
    • 定位任务:文本编码特征text embedding与目标的region embeding计算相似性,再计算交叉熵;

如何统一:将目标检测object detection任务转化为定位grounding任务

  • 将检测任务的标签在分散后拼接成一句话,从而可以将目标检测任务转化为伪短语定位任务
  • 最后的loss的计算参考grounding任务

3.2 网络结构

在这里插入图片描述

  • 计算得到文本特征和图像特征的相似度后,直接与GT计算对齐损失Alignment loss,定位损失直接与GT框计算;
  • 中间的融合层(Fusion)是为了增加图像和文本之间的交互,让模型在浅层阶段就进行跨模态的学习;
  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将微软用PyTorch实现的GLIP模型转换为ONNX模型,并且要求ONNX模型能够直接加载使用,可以按照以下步骤进行操作: 1. 首先,加载微软用PyTorch实现的GLIP模型。可以根据具体的模型代码进行加载,这里以示例模型为例。 ```python import torch import torchvision.models as models # 加载微软GLIP模型 model = models.glip_model() ``` 2. 然后,定义GLIP模型的输入维度。根据GLIP模型的输入要求进行定义,这里以示例输入维度为(1, 3, 224, 224),表示一张三通道、分辨率为224x224的彩色图像。 ```python dummy_input = torch.randn(1, 3, 224, 224) ``` 3. 接下来,使用`torch.onnx.export()`函数将GLIP模型转换为ONNX格式的模型。在转换过程中,可以选择是否加载模型的权重,这里选择不加载权重。 ```python torch.onnx.export(model, dummy_input, "glip_model.onnx", do_constant_folding=False) ``` 4. 完成上述步骤后,将会生成一个名为"glip_model.onnx"的ONNX模型文件,可以直接加载和使用该模型。 综上所述,将微软用PyTorch实现的GLIP模型转换为ONNX模型并能够直接加载使用的步骤如下所示: ```python import torch import torchvision.models as models # 加载微软GLIP模型 model = models.glip_model() # 定义GLIP模型的输入维度 dummy_input = torch.randn(1, 3, 224, 224) # 将模型转换为ONNX格式但不加载权重 torch.onnx.export(model, dummy_input, "glip_model.onnx", do_constant_folding=False) ``` 通过以上步骤,您可以将微软用PyTorch实现的GLIP模型成功转换为ONNX模型,并能够直接加载和使用该模型。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [模型转换 PyTorch转ONNX 入门](https://blog.csdn.net/qq_41204464/article/details/129073729)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值