论文:CLIP(Contrastive Language-Image Pretraining)

Learning Transferable Visual Models From Natural Language Supervision

训练阶段

模型架构分为两部分,图像编码器和文本编码器,图像编码器可以是比如 resnet50,然后文本编码器可以是 transformer。

训练数据是网络社交媒体上搜集的图像文本对。在训练阶段,对于一个batch 的数据,首先通过文本编码器和图像编码器,得到文本和图像的特征,接着将所有的文本和图像特征分别计算内积,就能得到一个矩阵,然后从图像的角度看,行方向就是一个分类器,从文本角度看,列方向也是一个分类器。最终,我们得到了一个batch中的文本和图像的匹配关系。

目标函数

最大化同一对图像和文本特征的内积,也就是矩阵对角线上的元素,而最小化与不相关特征的内积,即最小化非对角线上的元素。

测试阶段

在测试阶段,直接将训练好的CLIP用于其他数据集而不需要finetune。和训练阶段类似,首先将需要分类的图像经过编码器得到特征,然后对于目标任务数据集的每一个标签,或者你自己定义的标签,都构造一段对应的文本,如上图中的 dog 会改造成 “A photo of a dog”,以此类推。

然后经过编码器得到文本和图像特征,接着将文本特征与图像特征做内积,内积最大对应的标签就是图像的分类结果。这就完成了目标任务上的 zero-shot 分类。

测试例子:识别杯子的二分类任务

import os
import clip
import torch
from torchvision.datasets import CIFAR100
from PIL import Image

#这是放图片的路径
img_pah = 'C:\\Users\\31\\Desktop\\cup1.jpeg'
#这是对于图片的描述
classes = ['man', 'woman']

#加载模型
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load('ViT-B/32', device)


#准备输入集
image = Image.open(img_pah)
image_input = preprocess(image).unsqueeze(0).to(device)
text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in classes]).to(device) #生成文字描述

#特征编码
with torch.no_grad():
    image_features = model.encode_image(image_input)
    text_features = model.encode_text(text_inputs)

#选取参数最高的标签
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1) #对图像描述和图像特征  
values, indices = similarity[0].topk(1)

#输出结果
print("\nTop predictions:\n")
print('classes:{} score:{:.2f}'.format(classes[indices.item()], values.item()))

CLIP不是真正意义上的zero-shot?

在400M个文本图像配对的训练中,模型肯定看到了大量打着相关文本标签的图像,而且图像的应用范围比ImageNet要广得多——这也是为什么方法能够在一些高级场景(如clipart)轻松超越ImageNet预训练模型。(源自CLIP模型的使用和训练-利用CLIP实现zero-shot的分类任务_clip训练-CSDN博客)

换句话说:由于局部大量带标签的数据(图片和文本),模型其实通过训练通过有监督的手段其实已经掌握了识别大部分类别的能力。比如说上面的代码例子,他能够识别这张图片是不是杯子,而我不用提供任何带标签的例子给它,主要还是因为模型在训练的时候那400M的数据里面带了有标签的杯子数据,所以才说这不是真正意义上的zero-shot

又一个回答:

学术界认为只要不能测试集的数据刻意去进行训练就认为是零样本学习,即使训练集庞大的语料库可能包含与测试集类似的数据。

这也是为什么说现在很多模型的这个零样本能力你看着很强,这其实可能有一个很大原因,就是因为模型足够大,见过的数据足够多,它就背的东西就越多,它背的东西越多,它是有可能正好就撞到你这个测试集上去了。确实是有这样的一个情况,但是我会觉得其实这种情况没有那么多,你不能觉得这些都是模型碰巧背出来的深度学习模型的。这个泛化能力还是比较强的。..像他们这么高的指标,其实就算再换一些数据集,你就算比如说造一些在互联网上从未有过的一些图片,它其实依然还是可以泛化的不错的。

多模太与交叉注意力应用

对同一特征点1从不同角度去拍,在我们拿到这些不同视觉的特征后,就可以知道如何从第一个位置到第二个位置,再到第三个位置

多模太与交叉注意力应用-CSDN博客 

参考资料

文章论文

https://arxiv.org/pdf/2103.00020.pdf

代码地址

GitHub - openai/CLIP: CLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image

参考文章

CLIP模型的使用和训练-利用CLIP实现zero-shot的分类任务_clip训练-CSDN博客

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

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

相关文章

2024上半年软考中级《电子商务设计师》报名考试全攻略

​2024年软考电子商务设计师考试报名时间节点: 报名时间:上半年3月18日到4月15日,下半年8月19日到9月15日(各地区报名时间不同,具体日期见官方通告) 准考证打印时间:上半年5月20日起&#xff…

二维数组的传递和返回

指针和二维数组 指针存储的是内存单元的地址,当使用引用运算符 *,或者变址运算符 [ ] 时才能将指针所指向的内存单元中的值取出。 指针有两个关键属性: 1.它存储的是内存地址 2.它存储的是什么类型变量的内存地址,这一点非常…

【Ubuntu】原生Ubuntu-dock 栏 安装与卸载

1.查看是否安装 Ubuntu-dock(新版本的Ubuntu自带Ubuntu-dock version> 18.04) gnome-extensions list 2.安装Ubuntu-dock sudo apt install gnome-shell-extension-ubuntu-dock 3.重启,一定要重启!!!…

蓝桥杯真题讲解:填充(贪心)

蓝桥杯真题讲解&#xff1a;填充&#xff08;贪心&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;填充&#xff08;贪心&#xff09; 二、正解代码 //填充&#xff1a;贪心 #include<bits/stdc.h> #define endl \n #define deb(x) c…

Spring Boot Configuration Processor使用

一、功能介绍 spring-boot-configuration-processor的作用就是将自己的配置你自己创建的配置类生成元数据信息&#xff0c;这样就能在你自己的配置文件中显示出来非常的方便。在META-INF目录下生成spring-configuration-metadata.json文件&#xff0c;从而告诉spring这个jar包…

2024年春招程序员个人简历范本(精选5篇|附模板)

HR浏览一份简历也就25秒左右,如果你连「好简历」都没有,怎么能找到好工作呢? 如果你不懂得如何在简历上展示自己,或者觉得怎么改简历都不出彩,那请你一定仔细读完。 Java开发工程师简历范本> 性别 男 年龄 24 学历 本科 张三 专业 计算机科学与技术 毕业院校 …

10 个高质量 AI 助手工具站点,你值得拥有的哦

以下 10 个 AI 助手工具站点&#xff0c;博主已全部验证&#xff0c;小伙伴们可放心使用的哈 说明&#xff1a; 博主倾向使用 1、2、3 这三款&#xff0c;尤其是 1 小程序真的很方便&#xff0c;手机就能操作&#xff0c;你懂的 文章目录 0. sora1. 微信小程序&#xff1a;AI 写…

聚道云软件连接器3月新增应用/产品更新合集

3月更新概要 新增应用&#xff1a; 应用1&#xff1a;华为云welink 应用2&#xff1a;易宝支付 应用3&#xff1a;励销云CRM 应用4&#xff1a;分贝通 应用5&#xff1a;灵当CRM 新增&更新功能 1、【流程】中增加流程树状管理 新增应用 应用1&#xff1a;华为云wel…

【C语言】【时间复杂度】Leetcode 153. 寻找旋转排序数组中的最小值

文章目录 题目时间复杂度概念时间复杂度的计算 解题思路代码呈现 题目 链接: link 时间复杂度 概念 时间复杂度是一种函数&#xff0c;定量地描述了该算法运行的时间。既然是一种函数&#xff0c;就涉及到自变量与因变量。因变量代表是时间复杂的规模&#xff0c;自变量是…

【Python】科研代码学习:二 dataclass,pipeline

【Python】科研代码学习&#xff1a;二 dataclass&#xff0c;pipeline 前言dataclasspipeline 前言 后文需要学习一下 transformers 库&#xff0c;必要时会介绍其他相关的重要库和方法。主要是从源代码、别人的技术文档学习&#xff0c;会更快些。 dataclass Python中的数…

AHU 汇编 实验五

实验名称&#xff1a;实验五 分支与循环程序设计 二、实验内容&#xff1a;从键盘输入一个四位的16进制数&#xff08;其中字母为大写&#xff09;&#xff0c;将其转化为二进制数提示输出。 实验过程&#xff1a; 源代码: data segmentbuff1 db Please input a number(H):$b…

CSS 02

1.复合选择器 &#xff08;1.1&#xff09;后代选择器 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

C++实现引用计数(二)

实现引用计数 引言实现集成开发环境项目结构实现代码运行结果 注意 引言 C中经常使用智能指针来管理内存。对于共享指针shared_ptr的原理&#xff1a;每当有一个指针指向这块内存&#xff0c;引用计数的值加一&#xff0c;每当一个指针不再指向这块内存&#xff0c;引用计数的…

CircuitBreaker断路器(服务熔断,服务降级)

分布式系统面临的问题: 复杂分布式体系结构中的应用程序有数十个依赖关系&#xff0c;每个依赖关系在某些时候将不可避免地失败。 1.服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C&#xff0c;微服务B和微服务C又调用其它的微服务&#xff…

【代码随想录】【二叉树】day18:二叉树的左下角的值,路径总和、构造二叉树

1二叉树左下角的值 左下角的值&#xff1a;最后一层最左侧的节点的值 递归 from collections import deque class TreeNode:def __init__(self,val,leftNone,rightNone):self.val valself.left leftself.right rightclass solution:def leftBottomNode(self,root):self.m…

计算机网络-第4章 网络层(1)

主要内容&#xff1a;网络层提供的两种服务&#xff1a;虚电路和数据报&#xff08;前者不用&#xff09;、ip协议、网际控制报文协议ICMP、路由选择协议&#xff08;内部网关和外部网关&#xff09;、IPv6,IP多播&#xff0c;虚拟专用网、网络地址转换NAT&#xff0c;多协议标…

C++作业day1

2> 试编程 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include <string.h>using namespace std;int main() {string str;cout << "请输…

文档版面分析数据集整理

版面分析数据集 这里整理了常用版面分析数据集&#xff0c;持续更新中&#xff1a; publaynet数据集CDLA数据集TableBank数据集D4LA 数据集DocLayNet文档布局分割数据集M6Doc数据集 版面分析数据集多为目标检测数据集&#xff0c;除了开源数据&#xff0c;用户还可使用合成工…

应用方案丨 D55125ADA A型漏电保护芯片

一、应用领域 新能源充电桩&#xff08;充电枪&#xff09;、智能空开&#xff08;智能微断开关&#xff09;等工业产品&#xff0c;以及电热水器、电烤箱、电烤炉等小家电产品。 二、功能介绍 D55125ADA 是一款高性能 CMOS 漏电保护器专用电路。芯片内部包含稳压电源、放大电…

【CSP试题回顾】201609-3-炉石传说

CSP-201609-3-炉石传说 解题思路 1.类和结构定义 Servant&#xff1a;定义了随从的结构&#xff0c;包含攻击力&#xff08;attack&#xff09;和生命值&#xff08;health&#xff09;。 MyPlayer&#xff1a;定义了玩家的类&#xff0c;包含玩家英雄的生命值&#xff08;h…