作者:CSDN @ _养乐多_

本文将介绍如何使用 OpenAI 的 CLIP 模型来实现图像与文本之间的语义匹配。代码使用 Python 语言,加载多个图像与类别文本,并通过计算余弦相似度判断每张图片最匹配的文本标签。

结果如下图所示,

在这里插入图片描述


文章目录

      • 一、什么是 CLIP?
      • 二、准备工作
      • 三、代码
      • 四、代码2


一、什么是 CLIP?

CLIP(Contrastive Language–Image Pre-training)是由 OpenAI 提出的模型,它能够将图像和文本映射到同一个向量空间,从而实现跨模态的理解能力。CLIP 的强大之处在于它无需专门为某个任务训练,也能胜任广泛的图像识别和文本匹配任务。

二、准备工作

准备好一个包含若干图像的文件夹(如 ./images)。如"cat.jpg", “dog.jpg”, “car.jpg”, “mountain.jpg”, “food.jpg”。

安装第三方库

pip install torch torchvision ftfy regex tqdm
pip install git+https://github.com/openai/CLIP.git

三、代码

import torch
import clip
from PIL import Image
import os
import matplotlib.pyplot as plt
import numpy as np
from typing import Listdef load_images(image_paths: List[str]) -> List[Image.Image]:"""加载并转换图像为RGB格式参数:image_paths: 图像文件路径列表返回:PIL Image对象列表"""return [Image.open(path).convert("RGB") for path in image_paths]def compute_similarity(model, preprocess, images, texts, device):"""使用CLIP模型计算图像和文本之间的余弦相似度参数:model: CLIP模型实例preprocess: 图像预处理函数images: PIL Image列表texts: 文本标签列表device: 设备名称(cpu或cuda)返回:numpy数组,形状为 (图像数, 文本类别数),值为相似度分数"""# 预处理图像,转为tensor并堆叠到一个batch,放到指定设备image_tensors = torch.stack([preprocess(img) for img in images]).to(device)# 对文本进行tokenize并放到设备text_tokens = clip.tokenize(texts).to(device)with torch.no_grad():# 编码图像和文本特征image_features = model.encode_image(image_tensors)text_features = model.encode_text(text_tokens)# 对特征做归一化,方便计算余弦相似度image_features /= image_features.norm(dim=-1, keepdim=True)text_features /= text_features.norm(dim=-1, keepdim=True)# 计算余弦相似度矩阵 (图像特征 @ 文本特征转置)similarity = image_features @ text_features.Treturn similarity.cpu().numpy()def visualize_similarity_matrix_with_images(images, image_paths, categories, similarity):"""可视化相似度矩阵,左侧显示对应图片,右侧按类别显示彩虹色相似度色块,色块内标注相似度数值参数:images: PIL Image列表image_paths: 图像路径列表(用于显示文件名)categories: 文本类别标签列表similarity: numpy数组,图像与文本类别的相似度矩阵"""num_images = len(images)num_categories = len(categories)# 计算相似度最小和最大值,用于归一化色带映射min_val = similarity.min()max_val = similarity.max()# 创建子图,列数比类别数多1列,用于放图片fig, axs = plt.subplots(num_images, num_categories + 1, figsize=(2 * (num_categories + 1), 2 * num_images))if num_images == 1:axs = axs.reshape(1, -1)  # 保证axs是2D数组,方便统一处理# 去除子图间距,保证格子紧密无缝隙plt.subplots_adjust(wspace=0, hspace=0)# 第一行显示类别标题(只显示文字,不显示轴)for j in range(num_categories):axs[0, j+1].set_title(categories[j], fontsize=11, pad=6)axs[0, j+1].axis('off')axs[0, 0].axis('off')  # 左上角空白# 遍历每张图片和每个类别for i in range(num_images):# 左侧显示图片,不显示坐标轴axs[i, 0].imshow(images[i])axs[i, 0].axis('off')# 图片文件名作为标题axs[i, 0].set_title(os.path.basename(image_paths[i]), fontsize=8, pad=4)for j in range(num_categories):sim_val = similarity[i, j]# 将相似度归一化到0-1区间,用于颜色映射norm_val = (sim_val - min_val) / (max_val - min_val) if max_val > min_val else 0# 使用彩虹色带(rainbow)映射相似度color = plt.cm.rainbow(norm_val)# 显示彩色方块axs[i, j+1].imshow(np.ones((20,20,3)) * color[:3])axs[i, j+1].axis('off')# 根据颜色亮度选择文字颜色,保证对比度,易读性brightness = 0.299 * color[0] + 0.587 * color[1] + 0.114 * color[2]font_color = 'black' if brightness > 0.6 else 'white'# 在色块中心写入相似度数值axs[i, j+1].text(10, 10, f"{sim_val:.2f}", ha='center', va='center', fontsize=9, color=font_color)# 自动紧凑布局,去除多余边距plt.tight_layout(pad=0)plt.show()def main():# 选择设备,优先cuda,否则cpudevice = "cuda" if torch.cuda.is_available() else "cpu"# 加载CLIP模型和对应的图像预处理函数model, preprocess = clip.load("ViT-B/32", device=device)# 指定图像文件夹路径image_folder = "./images"# 遍历文件夹,筛选常见图片格式路径image_paths = [os.path.join(image_folder, f) for f in os.listdir(image_folder)if f.lower().endswith(('jpg', 'png', 'jpeg'))]# 读取所有图像images = load_images(image_paths)# 设定要匹配的文本类别categories = ["cat", "dog", "car", "mountain", "food"]# 计算图像与文本类别的相似度矩阵similarity = compute_similarity(model, preprocess, images, categories, device)# 输出每张图片匹配度最高的类别及相似度for i, path in enumerate(image_paths):best_idx = similarity[i].argmax()print(f"Image: {os.path.basename(path)} => Best match: '{categories[best_idx]}' (Similarity: {similarity[i][best_idx]:.4f})")# 可视化相似度矩阵visualize_similarity_matrix_with_images(images, image_paths, categories, similarity)if __name__ == "__main__":main()

谢谢各位读者对本人文章的关注和支持!

四、代码2

和第三部分一样,只是可视化效果不一样。

在这里插入图片描述

import torch
import clip
from PIL import Image
import os
import matplotlib.pyplot as plt
import seaborn as sns
from typing import Listdef load_images(image_paths: List[str]) -> List[Image.Image]:return [Image.open(path).convert("RGB") for path in image_paths]def compute_similarity(model, preprocess, images, texts, device):image_tensors = torch.stack([preprocess(img) for img in images]).to(device)text_tokens = clip.tokenize(texts).to(device)with torch.no_grad():image_features = model.encode_image(image_tensors)text_features = model.encode_text(text_tokens)image_features /= image_features.norm(dim=-1, keepdim=True)text_features /= text_features.norm(dim=-1, keepdim=True)similarity = image_features @ text_features.Treturn similarity.cpu().numpy()def visualize_similarity_matrix(image_paths, categories, similarity):plt.figure(figsize=(12, max(4, len(image_paths) * 0.5)))sns.heatmap(similarity, xticklabels=categories, yticklabels=[os.path.basename(p) for p in image_paths],cmap="YlGnBu", annot=True, fmt=".2f")plt.xlabel("Categories")plt.ylabel("Images")plt.title("Image-Text Similarity Matrix")plt.tight_layout()plt.show()def main():device = "cuda" if torch.cuda.is_available() else "cpu"model, preprocess = clip.load("ViT-B/32", device=device)image_folder = "./images"image_paths = [os.path.join(image_folder, f) for f in os.listdir(image_folder)if f.lower().endswith(('jpg', 'png', 'jpeg'))]images = load_images(image_paths)categories = ["cat", "dog", "car", "mountain", "food"]similarity = compute_similarity(model, preprocess, images, categories, device)# 输出每张图片与文本类别的相似度for i, path in enumerate(image_paths):best_idx = similarity[i].argmax()print(f"Image: {os.path.basename(path)} => Best match: '{categories[best_idx]}' (Similarity: {similarity[i][best_idx]:.4f})")visualize_similarity_matrix(image_paths, categories, similarity)if __name__ == "__main__":main()

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

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

相关文章

微服务链路追踪在生产环境问题定位中的实战经验

微服务链路追踪在生产环境问题定位中的实战经验 在当今复杂的系统架构中,微服务之间相互调用形成的链路往往变得极其复杂。一旦出现问题,仅凭日志和监控信息常常难以迅速定位根因。链路追踪技术因此成为生产环境中不可或缺的工具,能够帮助我…

正点原子——直流无刷电机-霍尔传感基本实现流程

直流无刷电机-霍尔传感实现流程 初始化TIM以及IO 霍尔状态读取函数 uint32_t hallsersor(void) {uint32_t state 0;if(HAL_GPIO_ReadPin(HALL1_TIM_CH1_GPIO,HALL_TIM_CH1_PIN)!RESET){state |0x01;}if(HAL_GPIO_ReadPin(HALL1_TIM_CH2_GPIO,HALL_TIM_CH2_PIN)!RESET){stat…

小白的进阶之路系列之十七----人工智能从初步到精通pytorch综合运用的讲解第十部分

NLP 从零开始:使用字符级 RNN 生成姓名 这是我们“NLP 从零开始”系列三部分教程中的第二部分。在第一个教程中,我们使用了 RNN 将姓名分类到其语言来源。这次我们将反过来,从语言生成姓名。 > python sample.py Russian RUS Rovakov Uantov Shavakov> python sampl…

思辨场域丨AR技术如何重塑未来学术会议体验?

毫无疑问,增强现实(AR)已成为科技浪潮中最澎湃的浪花之一。当Pokemon Go点燃全球热情,我们首次大规模体验到数字精灵与现实街景的奇妙交融。这不仅是游戏革命,更是一个强烈的信号:虚实共生的交互时代已轰然…

医学数据分析实战:冠心病发病因素可视化

一、数据加载与基本信息检查 #例9.5 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings#引入第三方库plt.rcParams[font.sans-serif]=[SimHei] #用来正常显示中文标签 warnings.filterwarnings(ignore) #防止…

Proteus8.0 打开前期版本的操作方法

1.打开Proteus8.0 2. 打开菜单File->Import legacy Project 3.在Import Legacy Project 点击Browse按钮 4.选择要打开的例子目录 5.打开*.dsn文件 6.点击Import 7.导入成功 点击运行即可

【innovus基础】- 对某根线单独route

在某些特殊需求场景,我们可能需要对某些net进行单独的route,方法如下: 1、打开design browser,选择对应net:(或者使用selectNet命令) 2、Route → nano Route → 勾选selectNet only 可以看到…

【Linux】network网络配置

目录 1、介绍2、网络配置【1】查看【2】说明 3、工作流程【1】启动以太网接口【2】关闭接口时反向执行 4、现代替换方案 1、介绍 linux中network网络服务的核心配置位于/etc/sysconfig/network-scripts/目录下。它们共同构成了网络接口的管理框架,负责处理网络接口…

深入解析 Taro 项目结构:从入门到精通

在现代前端开发中,跨平台开发框架变得越来越重要。Taro 作为一款由京东凹凸实验室推出的多端统一开发框架,支持编译到微信小程序、支付宝小程序、百度小程序、H5、React Native 等多个平台,极大地提高了开发效率。然而,要充分发挥…

零基础开始的网工之路第二十一天------系统安全基线和系统加固

目录 一、系统安全基线 1、账户与认证安全 2、文件与目录权限 3、SSH服务安全 4、网络与服务配置 5、日志与审计 6、内核参数加固 7、更新与补丁 8、安全模块配置 9、SUID/SGID文件检查 10、默认权限控制(umask) 二、系统安全加固 1、账户与…

Log4j 和 Log4j2的比较

以下是 Log4j(通常指 Log4j 1.x)与 Log4j2 的核心对比分析,结合架构、性能、功能及适用场景,帮助开发者做出合理选择: 📊 一、架构与设计 特性Log4j 1.xLog4j2分析架构模型单模块设计,耦合度高…

说说 Springboot 的启动流程?

Spring Boot 的启动流程是一个相对复杂但有序的过程,它涉及多个组件和步骤的协同工作。以下是 Spring Boot 启动流程的详细解析: 一、初始化阶段 启动入口 Spring Boot 应用的启动入口通常是一个包含 main 方法的类,该类上标注了 SpringBoot…

从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页

如果php.ini已经加入了如下的内容还是报错 : upload_max_filesize 1024M post_max_size 1024M 那就是因为阿帕奇导致:

10、java语法糖

编译期处理:语法糖(即java编译器把。java的源码编译成。class字节码的过程中,自动生成和转换的一些代码,主要是为了减轻程序员的负担,算是java编译器给我们的一个额外福利-给糖吃) 默认构造器:…

在Vscode中安装Sass并配置

在Vscode中安装Sass并配置 sass简介安装Sass插件配置sass插件编写sass使用Sass sass简介 Sass(Syntactically Awesome Style Sheets,英文官方文档 )是一种CSS预处理器,扩展了CSS的功能并提供了更高效的样式表编写方式。它兼容所有CSS版本&am…

深入解析 MySQL 并发控制:读写锁、锁粒度与高级优化

深入解析 MySQL 并发控制:读写锁、锁粒度与 InnoDB 实现细节 在高并发数据库应用中,确保数据一致性的同时最大化性能是永恒的挑战。MySQL 通过精巧的 锁机制(Locking) 和 多版本并发控制(MVCC) 来解决这个问题。本文聚焦于锁机制的核心:读写锁(共享/排他锁) 和 锁粒度…

【深度学习加速探秘】Winograd 卷积算法:让计算效率 “飞” 起来

一、为什么需要 Winograd 卷积算法?从 “卷积计算瓶颈” 说起 在深度学习领域,卷积神经网络(CNN)被广泛应用于图像识别、目标检测、语义分割等任务。然而,卷积操作作为 CNN 的核心计算单元,其计算量巨大&a…

前端项目脱离后端运行,备份后端API数据

问题描述: 开发过的项目老是打不开,因为离开公司后服务器用不了了。所以想着在公司开发的时候把数据都备份一下,供之后参考项目代码。 实现方法: 建一个Express服务,前端请求Express,Express代理目标服务器…

Windows下利用DevEcoStudio的交叉编译工具链编译assimp库给OpenHarmony使用

文章目录 准备编译使用 准备 安装DevEco Studio,并且安装好对应OpenHarmony版本的SDK 比如我这里安装了API 11 的sdk 对应的文件夹 然后下载ASSIMP的源文件,我这里下载的是5.4.3版本 【assimp 5.4.3】 解压放在一个文件夹里面,并在源码文…

批量大数据并发处理中的内存安全与高效调度设计(以Qt为例)

背景 在批量处理大型文件(如高分辨率图片、视频片段、科学数据块)时,开发者通常希望利用多核CPU并行计算以提升处理效率。然而,如果每个任务对象的数据量很大,直接批量并发处理极易导致系统内存被迅速耗尽,出现程序假死、崩溃,甚至系统级“死机”。 Qt自带的线程池(Q…