CLIP:连接文本与图像, 从自然语言监督中学习可迁移的视觉模型
CLIP:连接文本与图像, 从自然语言监督中学习可迁移的视觉模型
flyfish
Learning Transferable Visual Models From Natural Language Supervision
https://github.com/OpenAI/CLIP
摘要
CLIP Contrastive Language-Image Pre-Training
Contrastive:对比
ViT-B-32.pt 模型大小 354M
目前最先进的计算机视觉系统经过训练后,可对一组预先确定的固定对象类别进行预测。这种受限的监督形式限制了它们的通用性和可用性,因为要明确任何其他视觉概念都需要额外的带标注数据。直接从有关图像的原始文本中学习是一种很有前景的替代方法,它利用了范围更广的监督来源。
我们证明了预测哪条字幕与哪张图像匹配这一简单的预训练任务,是一种高效且可扩展的方式,能基于从互联网收集的4亿(图像、文本)配对数据集从头开始学习最先进的图像表征。经过预训练后,可利用自然语言来引用已学习到的视觉概念(或描述新的概念),从而实现模型向下游任务的零次迁移。
我们通过在30多个不同的现有计算机视觉数据集上进行基准测试,对该方法的性能展开研究,这些数据集涵盖了诸如光学字符识别(OCR)、视频中的动作识别、地理定位以及多种细粒度对象分类等任务。该模型能较为出色地迁移到大多数任务中,而且往往能与完全监督的基准模型相媲美,且无需针对特定数据集进行训练。
我们在https://github.com/OpenAI/CLIP上发布了我们的代码以及预训练模型的权重。
对比语言-图像预训练(CLIP)是一种基于各种(图像、文本)配对数据进行训练的神经网络。它可以依据自然语言指令,在给定图像的情况下预测出最相关的文本片段,且无需针对该项任务直接进行优化,这与GPT-2和GPT-3的零次学习能力类似。我们发现,CLIP在不使用ImageNet中原本128万个带标签示例的情况下,其“零次学习”性能可与原始的ResNet50相媲美,克服了计算机视觉领域的几个重大挑战。
CLIP对图像编码器和文本编码器进行预训练,以预测在我们的数据集中哪些图像与哪些文本是配对的。然后,我们利用这种特性将CLIP转变为零次分类器。我们把数据集中的所有类别都转变成诸如“一张狗的照片”这样的字幕,并预测出CLIP认为与给定图像最匹配的字幕所属类别。
CLIP旨在缓解计算机视觉标准深度学习方法中的若干主要问题:
昂贵的数据集:深度学习需要大量数据,而视觉模型传统上是基于人工标注的数据集进行训练的,构建这些数据集成本高昂,且仅能为有限数量的预先确定的视觉概念提供监督。ImageNet数据集是这一领域规模最大的成果之一,需要超过2.5万名工作人员为2.2万个对象类别标注1400万张图像。相比之下,CLIP从互联网上已公开可用的文本 - 图像对中学习。此前的诸多研究已经广泛探讨了减少对昂贵的大型标注数据集的需求这一问题,尤其是自监督学习、对比方法、自训练方法以及生成式建模等相关研究。
局限性:一个ImageNet模型擅长预测ImageNet的1000个类别,但它“开箱即用”时也就只能做这些了。如果我们想要执行其他任何任务,机器学习从业者就需要构建一个新的数据集,添加一个输出头,并对模型进行微调。与之相反,CLIP能够在无需额外训练样本的情况下,适用于执行各种各样的视觉分类任务。要将CLIP应用于一项新任务,我们只需向CLIP的文本编码器“告知”该任务中视觉概念的名称,它就会输出一个基于CLIP视觉表征的线性分类器。这个分类器的准确率往往能与完全监督模型相媲美。
import os
import clip
import torch
from torchvision.datasets import CIFAR100
from PIL import Image
# Load the model
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load('ViT-B/32', device)# Download the dataset
cifar100 = CIFAR100(root=os.path.expanduser("~/.cache"), download=True, train=False)# Prepare the inputs
image, class_id = cifar100[363]
image_input = preprocess(image).unsqueeze(0).to(device)
text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in cifar100.classes]).to(device)# 用于保存原始图片到本地
save_path = 'saved_image.png'
if not os.path.exists(save_path):# Since 'image' is already a PIL Image, we can save it directly.image.save(save_path)print(f"Image saved to: {os.path.abspath(save_path)}")# Calculate features
with torch.no_grad():image_features = model.encode_image(image_input)text_features = model.encode_text(text_inputs)# Pick the top 5 most similar labels for the image
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(5)# Print the result
print("\nTop predictions:\n")
for value, index in zip(values, indices):print(f"{cifar100.classes[index]:>16s}: {100 * value.item():.2f}%")
运行结果

相关文章:
CLIP:连接文本与图像, 从自然语言监督中学习可迁移的视觉模型
CLIP:连接文本与图像, 从自然语言监督中学习可迁移的视觉模型 flyfish Learning Transferable Visual Models From Natural Language Supervision https://github.com/OpenAI/CLIP 摘要 CLIP Contrastive Language-Image Pre-Training Contrastive&…...
Linux 硬盘扩容 分区 挂载
Linux 硬盘扩容 分区 & 挂载 1. 添加分区 1.1. 查看新添加的硬盘 fdisk -l假设当前未挂载的盘符是/dev/sdb,后文中所有操作都按挂载/dev/sdb 操作 1.2. 分区管理 小硬盘 fdisk /dev/sdb大硬盘(2TB以上) gdisk /dev/sdb1.3. 编辑分…...
基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案
前言 其实这个需求很简单,但是这个需求又是项目中必不可少的,尤其对于性能调优这块,但是使用哪种方式更加方便呢,这就是本篇博文需要讨论的重点 系统时间 可以通过 System.currentTimeMillis() 或 System.nanoTime() 来实现。 …...
关于 K8s 的一些基础概念整理-补充【k8s系列之二】
〇、前言 本文继续整理下 K8s 的一些基础概念,作为前一篇概念汇总的补充。 前一篇博文链接:关于 K8s 的一些基础概念整理【k8s系列之一】_集群 master节点 控制节点 宿主机-CSDN博客 一、详情 1.1 Label Label 在 k8s 中是一个非常核心的概念…...
FPGA的DMA应用——pcileech
硬件通过pcie总线,访存本机的内存,并进行修改,可以进行很多操作。 学习视频:乱讲DMA及TLP 1-pcileech项目简介和自定义模块介绍_哔哩哔哩_bilibili vivado2024.1的下载文章链接和地址:AMD-Xilinx Vivado™ 2024.1 现…...
信息安全管理:运行管理checklist
运行管理checklist内容包括日常操作与维护管理、变更管理、备份与故障恢复、应急与业务连续性管理等内容。 一、日常操作与维护管理 ▼▼制度与流程 是否建立日常运行操作制度与流程?包括网络、主机、应用等方面的操作制度与流程? 是否明确相关部门和人…...
Linux系统之stat命令的基本使用
Linux系统之stat命令的基本使用 一、stat命令 介绍二、stat命令帮助2.1 查询帮助信息2.2 stat命令的帮助解释 三、stat命令的基本使用3.1 查询文件信息3.2 查看文件系统状态3.3 使用格式化输出3.4 以简洁形式打印信息 四、注意事项 一、stat命令 介绍 stat 命令用于显示文件或文…...
云手机+Facebook:让科技与娱乐完美结合
移动互联网时代,Facebook作为全球最大的社交媒体平台之一,早已成为企业、品牌和组织竞相角逐的营销阵地。而云手机的出现,则为Facebook营销注入了新的活力,其独特的优势让营销活动更加高效、精准且灵活。本文将深入探讨云手机在Fa…...
为什么要在PHY芯片和RJ45网口中间加网络变压器
在PHY芯片和RJ45网口之间加入网络变压器是出于以下几个重要的考虑: 1. 电气隔离:网络变压器提供了电气隔离功能,有效阻断了PHY芯片与RJ45之间直流分量的直接连接。这样可以防止可能的电源冲突,降低系统故障的风险,并保…...
LeetCode 19:删除链表的倒数第N 个结点
题目: 地址:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 方法一: 方法二: 代码: package com.zy.leetcode.LeetCode_19;/*** Author: zy* Date: 2024-12-25-13:01* Description: 删除链表…...
RT-DETR融合[IJCV2024]LSKNet中的LSKBlock模块
RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《Large Selective Kernel Network for Remote Sensing Object Detection》 一、 模块介绍 论文链接:https://arxiv.org/pdf/2303.09030 代码链接:https:…...
C/C++ 数据结构与算法【树和森林】 树和森林 详细解析【日常学习,考研必备】带图+详细代码
一、树的存储结构 1)双亲表示法实现: 定义结构数组存放树的结点,每个结点含两个域: 数据域:存放结点本身信息。双亲域:指示本结点的双亲结点在数组中的位置。 特点:找双亲简单,找孩子难 C语…...
新浪微博大数据面试题及参考答案(数据开发和数据分析)
介绍一下你所掌握的计算机网络和操作系统相关知识 计算机网络:计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。我掌握了网络协议…...
OpenHarmony怎么修改DPI密度值?RK3566鸿蒙开发板演示
本文介绍在开源鸿蒙OpenHarmony系统下,修改DPI密度值的方法,触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,Laval鸿蒙社区推荐开发板,已适配全新开源鸿蒙OpenHarmony5.0 Release系统,适…...
SAP GUI Scripting - 如何判断组件是否存在
总体来说,SAP Scripting 与 BDC 类似,因为是屏幕录制,就可能碰到不同的情况,比如每个录入的数据不同,可能出现一个对话框,或者出现一个状态栏消息。这种任何有变化的情况,在 Scripting 中没有考…...
Go 计算Utf8字符串的长度 不要超过mysql字段的最大长度
背景: 我有一个mysql的字段,是utf8格式的,但有时候前端传的字符串会超长,为此我需要在后端接口,先判断是否超长,如果超长,则报错提示前端。 代码: // 计算utf8下,字符串…...
llamafactory报错:双卡4090GPU,训练qwen2.5:7B、14B时报错GPU显存不足(out of memory),轻松搞定~~~
实际问题场景: 使用llamafactory进行微调qwen2.5 7B和14B的大模型时,会出现out of memory的报错。尝试使用降低batch_size(原本是2,现在降到1)的方式,可以让qwen2.5:7B跑起来,但时不时会不稳定…...
全局webSocket 单个页面进行监听并移除单页面监听
之前全局封装的 webSocket 在某些特定的页面中使用会直接去调用 webSocket 的 onMessage 方法 已进入页面就会调,如果退出页面移除整个监听的话全局监听就会被移除 这是修改后的 全局封装 let token uni.getStorageSync(token) const HEARTBEAT_INTERVAL 1 *…...
JVM调优实践篇
理论篇 1多功能养鱼塘-JVM内存 大鱼塘O(可分配内存): JVM可以调度使用的总的内存数,这个数量受操作系统进程寻址范围、系统虚拟内存总数、系统物理内存总数、其他系统运行所占用的内存资源等因素的制约。 小池塘A&a…...
【JavaEE】Spring Web MVC
目录 一、Spring Web MVC简介 1.1 MVC简介1.2 Spring MVC1.3 RequestMapping注解1.3.1 使用1.3.2 RequestMapping的请求设置 1.3.2.1 方法11.3.2.2 方法2 二、Postman介绍 2.1 创建请求2.2 界面如下:2.3 传参介绍 一、Spring Web MVC简介 官方文档介绍ÿ…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
