当前位置: 首页 > news >正文

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}%")

运行结果
请添加图片描述

http://www.lryc.cn/news/510867.html

相关文章:

  • Linux 硬盘扩容 分区 挂载
  • 基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案
  • 关于 K8s 的一些基础概念整理-补充【k8s系列之二】
  • FPGA的DMA应用——pcileech
  • 信息安全管理:运行管理checklist
  • Linux系统之stat命令的基本使用
  • 云手机+Facebook:让科技与娱乐完美结合
  • 为什么要在PHY芯片和RJ45网口中间加网络变压器
  • LeetCode 19:删除链表的倒数第N 个结点
  • RT-DETR融合[IJCV2024]LSKNet中的LSKBlock模块
  • C/C++ 数据结构与算法【树和森林】 树和森林 详细解析【日常学习,考研必备】带图+详细代码
  • 新浪微博大数据面试题及参考答案(数据开发和数据分析)
  • OpenHarmony怎么修改DPI密度值?RK3566鸿蒙开发板演示
  • SAP GUI Scripting - 如何判断组件是否存在
  • Go 计算Utf8字符串的长度 不要超过mysql字段的最大长度
  • llamafactory报错:双卡4090GPU,训练qwen2.5:7B、14B时报错GPU显存不足(out of memory),轻松搞定~~~
  • 全局webSocket 单个页面进行监听并移除单页面监听
  • JVM调优实践篇
  • 【JavaEE】Spring Web MVC
  • VSCode 插件开发实战(七):插件支持了哪些事件,以及如何利用和监听这些事件
  • 指针详解之 多层嵌套的关系
  • Animated Drawings:让纸上的角色动起来
  • 技术与教育的结合:高校听课评价系统的设计与实施
  • web移动端项目常用解决方案
  • LabVIEW软件项目设计方案如何制定
  • 数据结构(Java)——链表
  • 变量与数据类型 - 整型、浮点型、字符型等
  • MacOS安装Xcode(非App Store)
  • 运行Zr.Admin项目(后端)
  • Ubuntu24.04最新版本安装详细教程