clip_en的使用学习

2024-06-18 08:29
文章标签 学习 使用 clip en

本文主要是介绍clip_en的使用学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码分析

import torch
import cn_clip.clip as clip
from PIL import Image
from cn_clip.clip import load_from_name, available_modelsprint("Torch version:", torch.__version__)
device = "cuda" if torch.cuda.is_available() else "cpu"
print("Available models:", available_models())
# Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./')
model.eval()image = preprocess(Image.open("data_examples/truck.jpg")).unsqueeze(0).to(device)
cls_list = ["狗", "汽车", "白色皮卡", "火车", "皮卡"]
text = clip.tokenize(cls_list).to(device)with torch.no_grad():image_features = model.encode_image(image)text_features = model.encode_text(text)# 对特征进行归一化,请使用归一化后的图文特征用于下游任务image_features /= image_features.norm(dim=-1, keepdim=True)text_features /= text_features.norm(dim=-1, keepdim=True)logits_per_image, logits_per_text = model.get_similarity(image, text)probs = logits_per_image.softmax(dim=-1).cpu().numpy()from IPython.display import Image, display
display(Image(filename="data_examples/truck.jpg"))
for i in range(len(cls_list)):print(f"{cls_list[i]}: {probs[0][i]}")

这段代码演示了如何使用 CLIP(Contrastive Language-Image Pretraining)模型进行图像和文本之间的匹配和相似性计算。特别是使用了中文版本的 CLIP(cn_clip),即支持中文文本的 CLIP 模型。

让我们逐行分析这段代码,理解其功能和原理。

import torch
import cn_clip.clip as clip
from PIL import Image
from cn_clip.clip import load_from_name, available_models
  1. import torch: 导入 PyTorch,这是一个流行的深度学习框架,CLIP 模型依赖于它进行张量计算和模型推理。
  2. import cn_clip.clip as clip: 从 cn_clip 库中导入 CLIP 模型的核心功能,并命名为 clipcn_clip 是 CLIP 的中文版本,支持中文文本输入。
  3. from PIL import Image: 导入 PIL 库中的 Image 模块,用于加载和处理图像。
  4. from cn_clip.clip import load_from_name, available_models: 从 cn_clip.clip 中导入 load_from_name 函数和 available_models 列表。
    • load_from_name 用于加载指定名称的模型。
    • available_models 是一个列表,包含了所有可用的 CLIP 模型名称。
print("Torch version:", torch.__version__)
device = "cuda" if torch.cuda.is_available() else "cpu"
print("Available models:", available_models())
  1. print("Torch version:", torch.__version__): 输出当前 PyTorch 的版本。
  2. device = "cuda" if torch.cuda.is_available() else "cpu": 检查是否有可用的 GPU,如果有,则使用 cuda 设备,否则使用 CPU。
  3. print("Available models:", available_models()): 输出所有可用的 CLIP 模型名称。
# Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']
model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./')
model.eval()
  1. model, preprocess = load_from_name("ViT-B-16", device=device, download_root='./'):
    • 通过 load_from_name 函数加载指定的模型(这里是 ViT-B-16),并指定设备(GPU 或 CPU)和下载路径。
    • 返回值 model 是加载的模型,preprocess 是一个预处理函数,用于将图像处理成模型可以接受的格式。
  2. model.eval(): 将模型设置为评估模式。这是一个常见的步骤,尤其是在推理阶段,它禁用了 dropout 和批归一化的训练行为。
image = preprocess(Image.open("data_examples/truck.jpg")).unsqueeze(0).to(device)
cls_list = ["狗", "汽车", "白色皮卡", "火车", "皮卡"]
text = clip.tokenize(cls_list).to(device)
  1. image = preprocess(Image.open("data_examples/truck.jpg")).unsqueeze(0).to(device):
    • 使用 PIL 打开指定路径的图像文件。
    • 使用预处理函数 preprocess 处理图像,使其符合模型的输入要求。
    • unsqueeze(0) 增加一个批次维度,使图像的形状适应模型的输入需求(即批量大小)。
    • 使用 to(device) 将图像数据移动到指定设备(CPU 或 GPU)。
  2. cls_list = ["狗", "汽车", "白色皮卡", "火车", "皮卡"]:
    • 定义一个包含几个中文描述词的列表,用于与图像进行匹配。
  3. text = clip.tokenize(cls_list).to(device):
    • 使用 clip.tokenize 函数将文本列表转换为模型可以接受的张量格式。
    • 同样地,使用 to(device) 将文本数据移动到指定设备。
with torch.no_grad():image_features = model.encode_image(image)text_features = model.encode_text(text)# 对特征进行归一化,请使用归一化后的图文特征用于下游任务image_features /= image_features.norm(dim=-1, keepdim=True)text_features /= text_features.norm(dim=-1, keepdim=True)logits_per_image, logits_per_text = model.get_similarity(image, text)probs = logits_per_image.softmax(dim=-1).cpu().numpy()
  1. with torch.no_grad()::
    • 使用 torch.no_grad() 上下文管理器,禁用梯度计算,这可以减少内存消耗并加速计算,因为我们只是在进行推理而不是训练。
  2. image_features = model.encode_image(image):
    • 使用模型的 encode_image 方法将图像输入编码为图像特征向量。
  3. text_features = model.encode_text(text):
    • 使用模型的 encode_text 方法将文本输入编码为文本特征向量。
  4. image_features /= image_features.norm(dim=-1, keepdim=True)text_features /= text_features.norm(dim=-1, keepdim=True):
    • 对图像和文本的特征向量进行归一化处理。这一步确保特征向量的长度(即欧几里得范数)为1,便于后续的相似性计算。
  5. logits_per_image, logits_per_text = model.get_similarity(image, text):
    • 使用模型的 get_similarity 方法计算图像和文本之间的相似性分数。这些分数是图像特征和文本特征之间的点积。
  6. probs = logits_per_image.softmax(dim=-1).cpu().numpy():
    • 将图像的相似性分数通过 softmax 函数转换为概率分布,表示每个文本描述与图像匹配的概率。
    • 使用 cpu() 将张量移动到 CPU,然后转换为 NumPy 数组以便于进一步处理或打印。
from IPython.display import Image, display
display(Image(filename="data_examples/truck.jpg"))
for i in range(len(cls_list)):print(f"{cls_list[i]}: {probs[0][i]}")
  1. from IPython.display import Image, display:
    • IPython.display 模块中导入 Imagedisplay 函数,用于在 Jupyter Notebook 或 IPython 环境中显示图像。
  2. display(Image(filename="data_examples/truck.jpg")):
    • 显示指定路径的图像文件。
  3. for i in range(len(cls_list)):print(f"{cls_list[i]}: {probs[0][i]}"):
    • 遍历文本描述列表 cls_list,打印每个文本描述与图像的匹配概率。

CLIP 和 cn_clip 的区别和联系

  • CLIP: 由 OpenAI 提出的 CLIP 模型(Contrastive Language-Image Pretraining)是一个多模态模型,可以将图像和文本编码到同一个向量空间中,从而能够进行图像与文本之间的相似性匹配。CLIP 主要是用英语训练的,因此更适用于处理英文文本和图像匹配。

  • cn_clip: cn_clip 是 CLIP 的中文版本,专为支持中文文本和图像之间的匹配而训练。它使用了中文语料进行预训练,可以处理和理解中文文本。

两者的联系:

  • 相同的原理:CLIP 和 cn_clip 都基于相同的对比学习原理,将图像和文本映射到相同的向量空间中,并通过最大化正确图像-文本对之间的相似性和最小化错误对之间的相似性来进行训练。
  • 不同的语料:CLIP 使用的是英文语料,而 cn_clip 使用的是中文语料。因此,它们分别在各自的语言领域内表现出色。

代码执行结果

PS E:\study\OPENAI-BASE-ENV> & D:/Python311/python.exe e:/study/OPENAI-BASE-ENV/fine-tuning-lab/web_demo/13_clip_en.py
Torch version: 2.3.0+cu121
Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']
Loading vision model config from D:\Python311\Lib\site-packages\cn_clip\clip\model_configs\ViT-B-16.json
Loading text model config from D:\Python311\Lib\site-packages\cn_clip\clip\model_configs\RoBERTa-wwm-ext-base-chinese.json
Model info {'embed_dim': 512, 'image_resolution': 224, 'vision_layers': 12, 'vision_width': 768, 'vision_patch_size': 16, 'vocab_size': 21128, 'text_attention_probs_dropout_prob': 0.1, 'text_hidden_act': 'gelu', 'text_hidden_dropout_prob': 0.1, 'text_hidden_size': 768, 'text_initializer_range': 0.02, 'text_intermediate_size': 3072, 'text_max_position_embeddings': 512, 'text_num_attention_heads': 12, 'text_num_hidden_layers': 12, 'text_type_vocab_size': 2}
D:\Python311\Lib\site-packages\torch\nn\functional.py:5504: UserWarning: 1Torch was not compiled with flash attention. (Triggered internally at ..\aten\src\ATen\native\transformers\cuda\sdp_utils.cpp:455.)attn_output = scaled_dot_product_attention(q, k, v, attn_mask, dropout_p, is_causal)
<IPython.core.display.Image object>
狗: 1.3709068298339844e-06
汽车: 0.0012388229370117188
白色皮卡: 0.705078125
火车: 2.6524066925048828e-05
皮卡: 0.2939453125

分析代码执行过程与输出结果

环境和模型信息
Torch version: 2.3.0+cu121
Available models: ['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']
Loading vision model config from D:\Python311\Lib\site-packages\cn_clip\clip\model_configs\ViT-B-16.json
Loading text model config from D:\Python311\Lib\site-packages\cn_clip\clip\model_configs\RoBERTa-wwm-ext-base-chinese.json
  • Torch version: 2.3.0+cu121: 指出使用的 PyTorch 版本是 2.3.0,并且包含了 CUDA 121 支持,这表明模型可以在 GPU 上加速运行。
  • Available models: …: 列出 cn_clip 库中可用的模型名称,这些模型是不同的视觉和文本模型组合,支持不同的应用场景。
  • Loading vision model config…: 加载视觉模型(ViT-B-16)的配置文件,这个文件包含了视觉模型的架构和参数信息。
  • Loading text model config…: 加载文本模型(RoBERTa-wwm-ext-base-chinese)的配置文件,这个文件包含了文本模型的架构和参数信息。
模型结构信息
Model info {'embed_dim': 512, 'image_resolution': 224, 'vision_layers': 12, 'vision_width': 768, 'vision_patch_size': 16, 'vocab_size': 21128, 'text_attention_probs_dropout_prob': 0.1, 'text_hidden_act': 'gelu', 'text_hidden_dropout_prob': 0.1, 'text_hidden_size': 768, 'text_initializer_range': 0.02, 'text_intermediate_size': 3072, 'text_max_position_embeddings': 512, 'text_num_attention_heads': 12, 'text_num_hidden_layers': 12, 'text_type_vocab_size': 2}

这个输出提供了模型的详细配置:

  • embed_dim: 嵌入维度,512 表示图像和文本的特征向量维度是 512。
  • image_resolution: 图像分辨率,224 表示输入图像的尺寸为 224x224 像素。
  • vision_layers: 视觉模型的层数,这里是 12 层。
  • vision_width: 视觉模型每层的宽度,即每层的通道数为 768。
  • vision_patch_size: 每个图像块的大小,16 表示图像被分割成 16x16 的小块。
  • vocab_size: 文本模型的词汇表大小,21128 表示可以处理的不同词汇的数量。
  • **text_*: 文本模型的其他参数,如注意力概率的 dropout 率、隐藏层的激活函数(gelu)、最大位置嵌入数(512)等。
  • text_num_hidden_layers: 文本模型的隐藏层数,12 层。
警告信息
D:\Python311\Lib\site-packages\torch\nn\functional.py:5504: UserWarning: 1Torch was not compiled with flash attention. (Triggered internally at ..\aten\src\ATen\native\transformers\cuda\sdp_utils.cpp:455.)attn_output = scaled_dot_product_attention(q, k, v, attn_mask, dropout_p, is_causal)
  • UserWarning: 这是一个警告,表明当前的 PyTorch 版本没有使用 “flash attention” 优化。这种优化可以加速自注意力机制的计算,但在没有这种优化的情况下,模型依然可以正常工作,只是性能上可能会稍微差一点。
显示图像
<IPython.core.display.Image object>
  • 这是在代码中使用 display(Image(filename="data_examples/truck.jpg")) 语句显示的图像。这一步只是展示输入图像,帮助我们更直观地理解后续的文本与图像匹配结果。
匹配结果输出
狗: 1.3709068298339844e-06
汽车: 0.0012388229370117188
白色皮卡: 0.705078125
火车: 2.6524066925048828e-05
皮卡: 0.2939453125

这些结果是模型计算出每个文本标签与输入图像的匹配概率。解释这些概率的含义可以帮助我们理解模型的工作原理:

  1. 狗: 1.3709068298339844e-06:

    • 非常低的概率,表明模型认为图像与“狗”几乎没有匹配度。
  2. 汽车: 0.0012388229370117188:

    • 较低的概率,表明图像与“汽车”不太匹配,尽管比“狗”略高。
  3. 白色皮卡: 0.705078125:

    • 很高的概率,表明图像与“白色皮卡”有很高的匹配度。由于图像实际上是一辆白色的卡车,这与这个标签非常吻合。
  4. 火车: 2.6524066925048828e-05:

    • 很低的概率,表明图像与“火车”几乎没有匹配度。
  5. 皮卡: 0.2939453125:

    • 适中的概率,表明图像与“皮卡”有一定的匹配度。由于“皮卡”也可以指某种卡车,尽管不如“白色皮卡”那么精确,这个结果是合理的。

原理解释

  1. 特征提取与匹配:

    • CLIP 模型通过视觉模型(ViT-B-16)将输入图像编码为特征向量,并通过文本模型(基于 RoBERTa 的中文模型)将文本描述编码为特征向量。
    • 这些特征向量被映射到一个共享的向量空间中,使得相似的图像和文本特征向量在空间中靠得更近。
  2. 相似性计算:

    • 通过计算图像特征向量与每个文本特征向量之间的点积,得到它们的相似性分数(logits)。
    • 然后,这些分数通过 softmax 函数转换为概率,表示每个文本与图像匹配的概率。
  3. 归一化处理:

    • 在计算相似性之前,对图像和文本的特征向量进行归一化,使得每个向量的长度为1。这有助于稳定计算,并使得点积的结果直接反映向量之间的角度相似性。

clipcn_clip 的区别与联系

  • clip: 是 OpenAI 提供的基于英语训练的多模态模型,用于图像和英文文本之间的匹配。
  • cn_clip: 是 clip 的中文版本,针对中文文本进行了调整和优化,使用了中文语料进行预训练,更适合处理中文的多模态任务。

两者的核心思想和模型架构相似,主要区别在于训练语料和处理的语言不同。对于中文应用,cn_clip 提供了更好的性能和支持。

使用场景

这些模型可以广泛应用于:

  • 图片搜索与推荐: 根据文字描述找到最匹配的图像,或根据图像找到相关的描述。
  • 自动图像标注: 为图像生成准确的文字标签。
  • 多模态问答系统: 根据图像和文本进行智能问答。
  • 电子商务: 根据用户输入的文本描述推荐合适的产品图像。

通过上述代码和结果的分析,我们可以看出,CLIP 模型在处理多模态任务时具有强大的功能和灵活性,尤其是在不同语言环境下,如中文,通过 cn_clip 的支持,可以更好地满足特定语言的应用需求。

这篇关于clip_en的使用学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071766

相关文章

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma