CLIP系列:CLIP:沟通文本和图像的桥梁

news2024/9/22 15:28:54

image.png

CLIP沟通文本和图像的桥梁。
SOTA的视觉任务模型需要固定的监督数据对,比如049EB466.png-大象,049ECC72.png-兔子。这种方式在特定数据集上能够拥有很好的性能,但是在其他未知类别上的性能就会急剧下降。这种监督形式限制了模型的通用性,因为需要额外的数据来重新训练模型。一个识别04A07E39.png04A09AD9.png的模型并不能识别04A0B72B.png04A0CE6C.png
传统的图像任务都是使用one-hot编码进行,每一类都有其独特的数字标签,比如背景为0,04A2A34C.png是1,04A2B84B.png是2,计算机只需要将像素分类成0,1,2。CLIP则是直接从图像的文本描述中进行学习,“a photo of rabbit”,“a photo of elephant”。只需要为每一幅图提供一些文本描述,即可进行CLIP的模型预训练。在一个数百万的大型数据集上进行预训练后,CLIP能取得十分惊艳的泛化性能,以适应任何下游任务,识别、分割、追踪等等。

Background

在NLP中,text-to-text 的预训练方法已经十分成熟,使得大型的预训练模型能够 zero-shot 迁移到下游任务中,也就是现在最热门的 GPT 系列。GPT 的成功也引起了思考,是否可以通过 text-to-image 的方法来预训练大型视觉模型?早在 2016 年就有人尝试用 CNN 模型来预测图像的标题和短语,并证明这种训练方式可以提高模型的 zero-shot 的迁移能力。但这种方式的性能仍会低于标准视觉模型,其中原因之一是**数据集规模。(毕竟大力出奇迹,力大砖飞)。**ChatGPT 已经证明,超大数据集能提高性能和泛化能力。因此 CLIP 选择在一个大规模的自然语言监督的视觉数据集上进行训练。

Highlights

  1. A sufficiently large dataset

    MS-COCO、YFCC100M 是目前常用于视觉训练的大型数据集。CLIP 在这些数据集中进行过滤,大致得到了 15million 的图像数据,与 ImageNet 相当。
    此外,还爬取了互联网中的图像数据,包括 400 million 个图像对,并尽可能让类别平衡。

  2. An efficient pre-training method

    一个足够大型的数据集能让猪飞起来,那么一个足够好的方法就能让猪变成歼-20。
    CLIP最开始使用类似于VirTex的方法,使用CNN来识别图像特征,使用Transformer来处理文本特征,并直接预测图像标题,结果可想而知,猪还是猪,只不过飞的高一点。直接预测标题存在一定困难,并且难以扩展和效率低下。
    解决方法就是预测一个整体文本与哪一个图像配对,而不是确切的单词。也就是一句话是一个整体,而不是单词的排列组合。毕竟“一张狗的图像”、“一只狗一样的动物的图像”和“一只动物是狗的图像”在某些意义上是一样的,模型到底怎么理解这句话呢,这增加了复杂度。那么要是把这些文本作为整体,那Transformer模型从中提取特征,这几句话就变成整体的一类“狗”。想要实现这一功能就需要设计一个精妙的模型和损失函数。
    image.png
    给定一个批次的N个图像对(image,txet),那么CLIP就需要预测N×N个配对可能。CLIP从image encoder和text encoder中分别学习到图像表示(image embdding)和文本表示(text embedding),并计算两者的cosine similarity,以最小化cosine similarity损失。(这里称为对比学习)

# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer 
# I[n, h, w, c] - minibatch of aligned images 
# T[n, l] - minibatch of aligned texts 
# W_i[d_i, d_e] - learned proj of image to embed 
# W_t[d_t, d_e] - learned proj of text to embed 
# t - learned temperature parameter

# extract feature representations of each modality 
I_f = image_encoder(I) #[n, d_i] 图像表示
T_f = text_encoder(T) #[n, d_t]	文本表示

# joint multimodal embedding [n, d_e] 
I_e = l2_normalize(np.dot(I_f, W_i), axis=1) # 将图像表示嵌入到特征空间
T_e = l2_normalize(np.dot(T_f, W_t), axis=1) # 将文本表示嵌入到特征空间  以计算两者的相似度

# scaled pairwise cosine similarities [n, n] 
logits = np.dot(I_e, T_e.T) * np.exp(t)    # 计算图像和文本表示的余弦相似度

# symmetric loss function 
labels = np.arange(n)  # 有N个图像-文本对;每一张图像、文本都有1个label, 一共N张图像、N个文本。
loss_i = cross_entropy_loss(logits, labels, axis=0) # 计算图像的交叉熵损失
loss_t = cross_entropy_loss(logits, labels, axis=1)  # 计算文本的交叉熵损失
loss = (loss_i + loss_t)/2 # 将两者损失平衡。这一流程称为对比学习。
  1. Choose and scale a model

对于image encoder:CLIP考虑并使用了两个经典模型:ResNet50和Vit,并做了一些修改。

  • ResNet50:使用了antialiased rect-2 blur pooling来代替原始的pooling函数;使用attention pooling mechanism来代替global average pooling layer,其中QKV中的Q为global average-pooling的输出。
  • Vit:在Vit的Transformer中,改变了Layer Norm的位置。(Vit的论文图片中LayerNorm和代码中的位置貌似有争议,未求证)。

对于text encoder:则选择了Transformer。在文本编码器中使用了mask self-attention。

在模型规模的选择上,CLIP在image endcoder模型深度和宽度上进行同时扩展;在text encoder上则只缩放宽度。

  1. prompt engineering

提示工程同样重要,CLIP将文本规范化后,能够得到好几个点的提升。
比如“a photo of xxx, a type of xxx";
image.png

Methods

image.png

Discussion

  1. ViT的计算效率高于CLIP ResNet。在足够大的数据集上进行训练时,Vision Transformer会比CNN更快。

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

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

相关文章

linux配置静态路由

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言硬件&操作系统一、静态路由是什么?二、开始配置1.netplan2.NetworkManager1.CLI2.Desktop 三、开始测试总结 前言 最近有一个需求,…

C++数据结构X篇_23_快速排序(最快、不稳定的排序)

文章参考十大经典排序算法-快速排序算法详解进行整理补充。快速排序是最快的排序方法。 排序思路:分治法-挖坑填数:大问题分解为各个小问题,对小问题求解,使得大问题得以解决 文章目录 1. 什么是快速排序1.1 概念1.2 算法原理1.3 …

淘宝商品链接获取淘宝商品评论数据(用 Python实现淘宝商品评论信息抓取)

在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取淘宝多网站上的商品详情页面评论内容。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#…

android10.0(Q)编译安卓内核(pixel 2)

下载内核源码 1.查看内核版本 首先需要看一下内核的版本,可以在手机中看到内核版本 2.下载该内核版本对应的源码 cd ~/mount/project/androidq git clone https://aosp.tuna.tsinghua.edu.cn/android/kernel/msm.git cd msm git checkout 4fecde07e68d执行结果如…

Python之作业(三)

Python之作业(三) 练习题 给出3个整数,使用if语句判断大小,并升序输出有一个列表lst [1,4,9,16,2,5,10,15],生成一个新列表,要求新列表元素是lst相邻2项的和随机生成100个产品ID,ID格式如下 顺序的数字6…

SD-WAN跨境网络专线|跨境访问无忧!让海外SaaS平台与视频会议更稳定轻松的解决方案

在现如今全球化的时代,企业都有布局全球或是有潜力的国家,在海外开分公司必不可少,那与海外合作伙伴进行沟通与合作已经成为企业的常态。但是,访问海外的SaaS平台和进行视频会议时,我们经常会遇到网络不稳定、速度慢的…

m1 安装 cocoapods

其实最终解决问题很简单,麻烦的是如果找到解决问题的答案。 网上的答案一大堆,但不一定适合你的电脑,就好像天下的女人到处有,但不一定都适合你,一定要亲自试验一下才知道结果。 前提条件: 命令行工具&am…

Dunham‘s sports EDI需求分析

Dunhams Sports,成立于1937年,是美国领先的运动用品零售商之一。公司总部位于密歇根州,致力于提供广泛的体育用品和户外装备。Dunhams Sports的使命是为顾客提供最优质的运动体验,他们以卓越的服务和品质,赢得了无数荣…

【访问控制】—>《熟练使用ACL进行上网行为管理》

✍ 标准和高级ACL功能介绍; ✍ 思科和华为ACL功能有什么区别? ✍ 现网中ACL都有哪些使用场景? -- ACL - 访问控制列表 - 控制: 能通/不能通 -- ACL - 结合功能 list - 简化版本的行为管理 -- 插件性质的功能 --…

echarts 仪表盘统计图

<!--仪表盘统计图--><div class"ybptx" ref"btryzb"></div>mounted(){this.getBtData();}getBtData() {let chart this.$echarts.init(this.$refs.btryzb);let data_czzf this.cznlzhpj.czzfs;let option {series: [{name: 内层数据刻…

水表能实时监测哪些参数?

你是否曾经想过&#xff0c;你家的水表是如何工作的?它不仅能够记录你的用水量&#xff0c;还能实时监测一些重要的参数&#xff0c;比如水压、水温、水质等。这些参数对于保证用水安全和节约用水资源都有着重要的作用。接下来&#xff0c;小编就来为大家详细的介绍下水表能实…

java中的数据源

为什么要使用数据源 jdbc是什么 JDBC 就是使用Java语言操作关系型数据库的一套API&#xff0c;我们开发的同一套Java代码是无法操作不同的关系型数据库&#xff0c;因为每一个关系型数据库的底层实现细节都不一样。如果这样&#xff0c;问题就很大了&#xff0c;在公司中可以在…

虚拟机Ubuntu - 环境配置

文章目录 安装虚拟机安装必要工具修改IP地址修改主机名安装Java方法一&#xff1a;apt 安装方法二&#xff1a;使用PPA仓库&#xff08;适用于Ubuntu 18.04以上版本&#xff09; 远程连接另一台宿主机的虚拟机方法一&#xff1a;NAT连接方法二&#xff1a;桥连接&#xff08;推…

selenium判断元素可点击、可见、可选

1、判断元素是否可以点击 判断元素是否可以点击&#xff0c;WebElement对象调用is_enabled() is_enabled()方法返回一个布尔值&#xff0c;若可点击返回&#xff1a;True。若不可点击则返回&#xff1a;False from selenium import webdriver import time from selenium.web…

LeetCode 热题 100 - 第1题:两数之和

LeetCode 热题 100 - 第1题:两数之和 原题题目理解普通的解题思路---遍历查找进阶的解题思路---哈希查找 原题 给定一个整数数组 nums和一个整数目标值target&#xff0c;请你在该数组中找出 和为目标值 target的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种…

Docker 镜像常用命令总结

目录 1. Docker镜像相关命令(重点掌握) 1.1 docker pull 镜像名称 [:tag] 拉取镜像 1.2 docker search 镜向名称 (查询某个镜像) 1.3 docker images 列出当前主机上所有镜像 1.4 docker rmi 镜像ID 删除镜像 1.5 docker system df 查看所有镜像容器所占空间 2. Docker …

每日一练——快速合并2个有序数组

每日一练来喽~~~ 今天up主为大家分享一个&#xff0c;快速合并2个有序数组的法子&#xff0c;注意听哟&#xff01; 题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数…

2、TB6600驱动器介绍【51单片机控制步进电机-TB6600系列】

摘要&#xff1a;本节介绍TB6600驱动器界面及关键参数设置 一、驱动器功能界面 二、关键参数 输入电压&#xff1a;DC9-42V 输出电流&#xff1a;0.5-4A 最大功耗&#xff1a;160W 细分设置&#xff1a;1,2/A,2/B,4,8,16,32 工作温度&#xff1a;-10~45C 信号口驱动电流&…

用ST-LINK 出现连接失败【已解决】

出现的问题&#xff1a;not connect to target! 13:33:39 : Can not connect to target! Please select "Connect Under Reset" mode from Target->Settings menu and try again. If youre trying to connect to a low frequ…

【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;谈谈CopyOnWriteArrayLi…