论文: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博客

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

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

相关文章

GEE:计算一个遥感影像的空像素占比

作者:CSDN @ _养乐多_ 本文将介绍,如何在 Google Earth Engine (GEE) 平台计算一个遥感影像的空像素占比,其中,包含获取研究区内所有像素的总数的代码,以及获取非空像素的总数的代码。 结果如下图所示, 文章目录 一、核心函数1.1 获取研究区内所有像素的总数1.2 获取非…

使用正则表达式判断是否是数字(适用于更复杂的数字格式)

re.match("^-?\d(\.\d)?$", n) is not None 在Python中,re.match()函数用于从字符串的开始位置匹配正则表达式模式。如果匹配成功,它返回一个匹配对象;如果匹配失败,它返回None。 表达式re.match("^-?\d(\.\d…

Leetcode 3075. Maximize Happiness of Selected Children

Leetcode 3075. Maximize Happiness of Selected Children 1. 解题思路2. 代码实现 题目链接:3075. Maximize Happiness of Selected Children 1. 解题思路 这一题只需要想清楚一个点就行了: 正常情况下,对于确定的n次选择,无…

C++模板扩展

目录 1.非类型模板参数 2.模板的特化 1.非类型模板参数 我们知道,模板一般是不指定类型的,具体是什么类型由其他部分的代码的决定。 模板参数分为类型模板参数和非类型模板参数。 类型形参即:出现在模板参数列表中,跟在class或者…

Redis保证数据一致性-延时双删代码实现

Redis和数据库的数据一致性在某些场景下非常重要,如何最大程度保证Reids和数据库之间的数据一致呢? 想必大家第一时间会想到延时双删策略: 在修改数据库之前删除缓存,然后数据库中的数据修改完成后,再过一段时间再删…

APP2:android studio如何使用lombok

一、前言 不知道从哪个版本开始,android studio便无法在plugins中下载lombok了,有人说是内置了,好像有这么回事儿。我主要面临如下两个问题: 使用内置lombok,可以自动生成setter、setter、toString等。但是&#xff0…

mediapipe 实现姿态分析——举手检测

目录 人体姿态检测 效果展示 举手检测 行业应用 代码实现 代码分析 效果展示 代码修改,一只手举起即可 总结 啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦^_^啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦♪(^∇^*)啦啦啦…

踏上Python之旅:从零开始,全面解析Python安装与环境配置的必知必会

在踏入Python编程殿堂之前,首当其冲的任务就是正确安装并配置Python开发环境。本文将引导您掌握Python的安装过程、不同操作系统下的最佳实践,以及如何进行多版本管理和虚拟环境设置,为您的Python开发之路打下坚实基础。 一、Python安装 Windows系统: 访问官网下载: 打开…

休息日的思考与额外题——纯纯暴力day42

文章目录 前言动态规知识点 动规五部曲一、100233. 重新分装苹果二、100247. 幸福值最大化的选择方案总结 前言 一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油! 二刷决定精刷了,于是参加了卡子…

Linux 自动检测进程是否存活,如果挂掉自动拉起

以 jupyter 服务为例 1、检测脚本 vim /home/ailab/bin/check_ailab.sh #!/bin/bashPID$(ps -ef|grep -v grep|grep "jupyter" |awk {print $2})# 检查进程是否存在 if [ -z "$PID" ]; then# 进程不存在,启动进程echo "Jupyter Noteboo…

使用Vue.js开发前端项目

Vue.js是一个非常受欢迎的渐进式JavaScript框架,用于开发强大而互动的前端应用程序。Vue易于上手,同时拥有强大的功能库和灵活的生态系统。在本篇博客中,我将带你了解使用Vue.js开发项目的基本步骤,并提供相应的代码示例。 环境安…

自由职业者如何在Fiverr兼职赚美金

在这个忙碌的时代,大家都渴望在业余时间找到一份兼职,为自己带来额外的收入。然而,很多人常常感到困惑,不知道如何找到一份既赚钱又不耗费太多时间精力的兼职。今天,我想分享一个新的赚钱平台——Fiverr,让…

qt使用QAxObject操作excel程序关闭之后excel进程未被关闭的解决方案

💂 个人主页:pp不会算法^ v ^ 🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 今天突然发现电脑变得很卡,我以为内存占用率过高了一看才50%&…

软件测试 需求

文章目录 1. 需求1.1 什么是需求1.2 为什么要有需求1.3 测试人员眼中的需求1.4 如何深入理解需求 2. 测试用例的概念2.1 什么是测试用例2.2 为什么要有测试用例 3. 软件错误(BUG)的概念4. 开发模型和测试模型4.1 软件的生命周期4.2 瀑布模型(…

【深度学习笔记】6_10 双向循环神经网络bi-rnn

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 6.10 双向循环神经网络 之前介绍的循环神经网络模型都是假设当前时间步是由前面的较早时间步的序列决定的,因此它们都将信…

STM32---IIC通信协议(含源码,小白进)

写在前面:在前面的学习过程中,我们学习了串口通信的USART(通用同步异步收发器),本节我们将继续学习一种串行通信协议——IIC通信协议。之前我使用51单片机也分享过相关的IIC通信的知识,其实本质的知识是相通…

Spring Boot 整合 MongoDB:构建高效的数据驱动应用

Spring Boot 整合 MongoDB:构建高效的数据驱动应用 在现代软件开发中,数据持久化是应用程序不可或缺的一部分。MongoDB,作为一个流行的NoSQL数据库,以其灵活的数据模型和强大的扩展性赢得了众多开发者的青睐。Spring Boot&#x…

LeetCode_Hot100_栈_394字符串解码_Python

1.题目(中等难度) 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b…

去哪里找视频素材?这几个视频素材资源网您看看

朋友们,是不是在抖音短视频的创作过程中感觉自己的视频素材库就像饭后的草莓派,美好但不够充实?别担心,我这就给你们送上几个超级赞的素材网站,保证让你的创作素材库瞬间丰富起来 1,蛙学府 这个网站简直就…

激光SLAM-重定位方案预研

-----------------------------------------------------待更新--------------------------------------