【计算机视觉】如何利用 CLIP 做简单的图像分类任务?(含源代码)

这篇具有很好参考价值的文章主要介绍了【计算机视觉】如何利用 CLIP 做简单的图像分类任务?(含源代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

要使用 CLIP 模型进行预测,您可以按照以下步骤进行操作:

一、安装

安装依赖:首先,您需要安装相应的依赖项。您可以使用 Python 包管理器(如 pip )安装 OpenAICLIP 库。

pip install git+https://github.com/openai/CLIP.git

【计算机视觉】如何利用 CLIP 做简单的图像分类任务?(含源代码),计算机视觉,深度学习笔记,计算机视觉,分类,深度学习,CLIP,图像分类

二、代码解读

2.1 代码逐行构建过程

import clip
import torch
from PIL import Image

导入所需的库,包括 clip(用于加载和使用 CLIP 模型)、torchPyTorch 框架)和 PIL(用于图像处理)。

img_pah = '1.png'
classes = ['person', 'not_person']

设置输入图像的路径 img_path 和标签类别列表 classes。在这个示例中,类别列表包含了两个类别:‘person’‘not_person’

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

根据是否可用 GPU,将设备设置为 “cuda”“cpu” 。然后,使用 CLIP 库中的 clip.load() 方法加载预训练的 ViT-B/32 模型,并返回加载的模型 model 和预处理函数 preprocess

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)

打开图像文件并使用预处理函数 preprocess 对图像进行预处理。然后,将预处理后的图像转换为模型所需的格式,并将其移动到设备上(GPUCPU)。对于文本输入,使用类别列表 classes 生成对应的文字描述,并使用 clip.tokenize() 函数对文字描述进行处理。

with torch.no_grad():
    image_features = model.encode_image(image_input)
    text_features = model.encode_text(text_inputs)

在不进行梯度计算的上下文中,使用 CLIP 模型的 encode_image() 方法对图像进行特征编码,得到图像特征 image_features 。同时,使用 encode_text() 方法对文本进行特征编码,得到文本特征 text_features

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)

对图像特征和文本特征进行归一化处理,以便计算它们之间的相似度。然后,使用矩阵乘法计算图像特征和文本特征之间的相似度矩阵。接下来,对相似度矩阵进行 softmax 归一化处理,得到相似度分数。最后,找到相似度分数中最高的值和对应的索引。

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

打印输出结果,显示预测的最高分数和对应的类别标签。

2.2 源代码 + 运行结果

import clip
import torch
from PIL import Image

img_pah = '1.png'
classes = ['person', 'not_person']

# 加载模型
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()))

运行结果为:

Top predictions:

classes:person score:0.81

2.3 细节补充

2.3.1 clip.load()

clip.load() 方法中,可以调用多个预训练的 CLIP 模型。以下是一些常用的 CLIP 模型名称:

  • ViT-B/32: Vision Transformer 模型,基于 ImageNet 预训练的 ViT-B/32
  • RN50: ResNet-50 模型,基于 ImageNet 预训练的 ResNet-50
  • RN101: ResNet-101 模型,基于 ImageNet 预训练的 ResNet-101
  • RN50x4: ResNet-50 模型的扩展版本,使用更大的 batch size 进行训练。
  • RN50x16: ResNet-50 模型的更大版本,使用更大的 batch size 进行训练。

以上列出的是一些常用的预训练模型,但并不是全部可用的模型列表。CLIP 库还提供其他模型和变体,您可以在官方文档中查找完整的模型列表,并根据您的需要选择适合的预训练模型。

请注意,选择不同的预训练模型可能会影响性能和计算资源的要求。较大的模型通常具有更多的参数和更高的计算成本,但可能具有更好的性能。因此,根据您的具体应用场景和可用资源,选择适当的预训练模型进行调用。

2.3.2 preprocess()

preprocessCLIP 库中提供的预处理函数之一,用于对图像进行预处理以符合 CLIP 模型的输入要求。下面是 preprocess 函数的一般步骤和说明:

  • 图像的缩放:首先,图像会被缩放到指定的大小。通常情况下,CLIP 模型要求输入图像的尺寸是正方形的,例如 224x224 像素。所以,在预处理过程中,图像会被调整为适当的尺寸。
  • 像素值归一化:接下来,图像的像素值会被归一化到特定的范围。CLIP 模型通常要求输入图像的像素值在 0 到 1 之间,因此预处理过程中会将像素值归一化到这个范围。
  • 通道的标准化:CLIP 模型对图像通道的顺序和均值标准差要求是固定的。因此,预处理过程中会对图像的通道进行重新排列,并进行标准化。具体来说,通常是将图像的通道顺序从 RGB(红绿蓝)调整为 BGR(蓝绿红),并对每个通道进行均值标准化。
  • 转换为张量:最后,经过预处理的图像会被转换为张量形式,以便于传递给 CLIP 模型进行计算。这通常涉及将图像的维度进行调整,例如从形状为 (H, W, C) 的图像转换为形状为 (C, H, W) 的张量。

总之,preprocess 函数负责将输入的图像进行缩放、归一化和格式转换,以使其符合 CLIP 模型的输入要求。具体的预处理操作可能因 CLIP 模型的不同版本而有所差异,建议参考 CLIP 库的官方文档或源代码以获得更详细的预处理细节。

2.3.3 unsqueeze

PyTorch 中,unsqueeze() 是一个张量的方法,用于在指定的维度上扩展维度。

具体而言,unsqueeze(dim) 的作用是在给定的 dim 维度上增加一个维度。这个操作会使得原始张量的形状发生变化。

以下是 unsqueeze(dim) 的详细解释:

  • 参数 dim:表示要在哪个维度上进行扩展。可以是一个整数或一个元组来指定多个维度。通常, dim 的取值范围是从 0 到 tensor.dim()(即张量的维度数)。
  • 返回值:返回一个新的张量,与原始张量共享数据内存,但形状发生了变化。

示例:

import torch

# 原始张量形状为 (2, 3)
x = torch.tensor([[1, 2, 3], [4, 5, 6]])

# 在维度0上扩展维度,结果形状为 (1, 2, 3)
y = x.unsqueeze(0)

# 在维度1上扩展维度,结果形状为 (2, 1, 3)
z = x.unsqueeze(1)

在上述示例中,原始张量 x 的形状为 (2, 3)。通过调用 unsqueeze() 方法并传递不同的维度参数,我们可以在指定的维度上扩展维度。结果张量 y 在维度0上扩展维度,形状变为 (1, 2, 3);结果张量 z 在维度1上扩展维度,形状变为 (2, 1, 3)。

通过使用 unsqueeze() 方法,我们可以改变张量的形状,以适应不同的计算需求和操作要求。文章来源地址https://www.toymoban.com/news/detail-597876.html

到了这里,关于【计算机视觉】如何利用 CLIP 做简单的图像分类任务?(含源代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机视觉】使用 notebook 展示如何下载和运行 CLIP models,计算图片和文本相似度,实现 zero-shot 图片分类

    项目地址: CLIP(Contrastive Language-Image Pretraining)是由OpenAI开发的一个深度学习模型,用于处理图像和文本之间的联合表示。它的目标是将图像和文本嵌入到一个共享的向量空间中,使得相似的图像和文本在这个空间中距离较近,而不相似的图像和文本距离较远。 CLIP模型的特

    2024年02月08日
    浏览(37)
  • 模型剪枝:如何利用剪枝技术提高计算机视觉模型的准确性

    作者:禅与计算机程序设计艺术 模型剪枝(pruning)是一种技术,它通过删除不重要的权重参数,从而减少神经网络中的参数数量,并保持其准确率,同时降低计算量、占用内存空间。这个过程称之为模型压缩(compression)。 模型剪枝的目的是为了改善神经网络在实际环境下

    2024年02月07日
    浏览(29)
  • 图像识别和计算机视觉:如何应用人工智能技术实现自动化检测和识别

      在数字化时代,图像数据成为了我们日常生活中不可或缺的一部分。然而,随着图像数据的急剧增加,传统的手动处理和分析方法已经无法满足我们的需求。这就引出了图像识别和计算机视觉技术的重要性。本文将介绍人工智能技术在图像识别和计算机视觉领域的应用,以

    2024年02月05日
    浏览(71)
  • 【计算机视觉 | 图像分类】arxiv 计算机视觉关于图像分类的学术速递(6月 29 日论文合集)

    基于多示例学习的全幻灯片图像分类的伪袋混合增强 论文地址: 鉴于十亿像素图像建模的特殊情况,多实例学习(MIL)已成为全幻灯片图像(WSI)分类最重要的框架之一。 在当前实践中,大多数 MIL 网络在训练中经常面临两个不可避免的问题:i)WSI 数据不足,ii)神经网络

    2024年02月11日
    浏览(41)
  • 【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(8 月 30 日论文合集)

    Novis:端到端近在线视频实例分割实例 直到最近,视频实例分割(VIS)社区在以下共同信念下操作:离线方法通常优于逐帧在线处理。然而,最近在线方法的成功质疑这种信念,特别是对于具有挑战性和长视频序列。我们将这项工作理解为对最近观察结果的反驳,并呼吁社区

    2024年02月09日
    浏览(42)
  • 【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 6 日论文合集)

    面向跨域语义分割的提示扩散表示法 虽然最初设计用于图像生成,扩散模型最近已证明提供了优秀的预训练的特征表示语义分割。这一结果引起了兴趣,我们开始探索扩散预训练表示如何推广到新的领域,这是任何表示的关键能力。我们发现,扩散预训练实现了非凡的领域泛

    2024年02月12日
    浏览(37)
  • 计算机视觉——图像视觉显著性检测

    目录 系列文章目录 零、问题描述 一、图像显著性检测 1.定义 2.难点 二、常用评价标准和计算方法 1.综述 2.ROS曲线详述 2.1 混淆矩阵 2.2 ROC曲线简介 2.3 ROC曲线绘制及其判别标准 2.4 ROC曲线补充 三、Fast and Efficient Saliency (FES) 1.算法简介 2.项目导入与解析 3.FES注意预测实践 4.评价

    2024年02月03日
    浏览(43)
  • 【计算机视觉 | 目标检测】OVSeg:Open-Vocabulary Semantic Segmentation with Mask-adapted CLIP论文讲解

    开放词汇语义分割旨在根据文本描述将图像分割成语义区域,这些区域在训练过程中可能没有看到。 最近的两阶段方法首先生成与类别无关的mask proposals,然后利用预训练的视觉语言模型(例如CLIP)对 masked regions 进行分类。我们认为这种模式的性能瓶颈是预训练的CLIP模型,因

    2024年02月09日
    浏览(42)
  • 计算机视觉----图像拼接

     一.简介 图像拼接(Image Stitching)是一种利用实景图像组成全景空间的技术,它将多幅图像拼接成一幅大尺度图像或360度全景图,接可以看做是场景重建的一种特殊情况,其中图像仅通过平面单应性进行关联。图像拼接在运动检测和跟踪,增强现实,分辨率增强,视频压缩和图

    2024年02月09日
    浏览(42)
  • 计算机视觉--图像拼接

    单应性变换是指一个平面上的点通过一个矩阵变换映射到另一个平面上的点,这个变换矩阵是一个 3 × 3 3 times 3 3 × 3 的矩阵,称为单应性矩阵。单应性变换可以分为仿射变换和投影变换两种类型。 在单应性变换中,仿射变换是其中一种特殊的变换。仿射变换是指在变换前后

    2024年02月04日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包