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

第十八章:AI的“通感”:揭秘图、文、音的共同语言——CLIP模型

clip基础

  • 前言:当AI睁开“眼睛”,又竖起“耳朵”
  • 第一章:多模态的“巴别塔”难题 —— 如何让苹果(图片)等于“apple”(文字)?
  • 第二章:CLIP的革命性思想 —— 一场4亿人的“大型相亲会”
    • 2.1 两个“专家”编码器:一个懂图,一个懂文
    • 2 .2 核心魔法“对比学习”:找到你“官配”的另一半
    • 2.3 结果:一个图文共享的“联合嵌入空间”
  • 第三章:CLIP惊人的“超能力”—— 零样本学习 (Zero-Shot Learning)
    • 3.1 不训练,不成活!AI的“看图识字”大赛
  • 第四章:实战演练:用CLIP打造你自己的“以文搜图”引擎
    • 4.1 编码你的图库与搜索词
    • 4.2 计算余弦相似度,找到最匹配的图片
  • 第五章 CLIP的“后裔”们:从Stable Diffusion到LLaVA
  • 总结与展望:万物皆可Embedding

前言:当AI睁开“眼睛”,又竖起“耳朵”

在我们的旅程中,我们已经见识了只处理文本的“语言学家”AI(如GPT),也探索了只处理图像的“画家”AI(如VAE)。

它们在各自的领域都表现出色,但它们的世界是“单一感官”的。

而我们人类,却生活在一个多模-态(Multi-Modal)的世界里。我们能看到一只猫的图片,同时读到文字“这是一只可爱的猫”,还能听到它的叫声,并将这三者毫不费力地关联起来。

如何让AI也拥有这种“通感”能力,打破不同信息模态之间的壁垒?
AI 多模态
今天,我们将深入探索多模态领域的“开山之作”和“绝对基石”——由OpenAI在2021年发布的**CLIP(Contrastive Language-Image Pre-training)**模型。理解了它,你就理解了后续所有文生图、图生文模型的“初心”。

第一章:多模态的“巴别塔”难题 —— 如何让苹果(图片)等于“apple”(文字)?

想象一下,我们用一个图像模型,把一张“苹果”的图片,编码成了一个向量V_image。

同时,我们用一个语言模型,把“apple”这个单词,编码成了另一个向量V_text。

问题是:在没有经过特殊训练的情况下,V_image和V_text在向量空间中可能相隔十万八千里!计算机无法知道这两个代表着完全不同数据格式的向量,指向的是同一个现实世界的概念。

多模态学习的核心难题,就是如何构建一座桥梁,让V_image和V_text在数学上“相遇”并“对齐”。

第二章:CLIP的革命性思想 —— 一场4亿人的“大型相亲会”

CLIP的训练方式,堪称“暴力美学”的典范。

收集数据:OpenAI从互联网上收集了4亿个“图片-文本”配对。这就像一个巨大的数据库,记录了4亿对“官配CP”。

训练过程:这个过程,就像举办一场4亿人规模的“大型相亲会”

2.1 两个“专家”编码器:一个懂图,一个懂文

CLIP同时训练了两个独立的编码器:

Image Encoder (图像编码器):通常是一个Vision Transformer (ViT)。它的工作是“看”图片,并为每张图片生成一个向量表示。

Text Encoder (文本编码器):一个标准的Transformer。它的工作是“读”文本,并为每段文字生成一个向量表示。

2 .2 核心魔法“对比学习”:找到你“官配”的另一半

假设我们从4亿对CP中,随机抽取N对(比如4对)进入“相亲大厅”。现在大厅里有4张图片和4段与之对应的文字描述。

CLIP的目标非常简单粗暴:
计算所有可能性:计算大厅里每一张图片和每一段文字之间的“相似度”(通过向量点积)。我们会得到一个4x4的相似度矩阵。

奖励“官配”,惩罚“错配”:

我们知道,对角线上的(图1,文1), (图2,文2)… 才是真正的“官配CP”。

CLIP的损失函数会**“奖励”模型,让这些官配CP的相似度得分尽可能高**。
同时,它会**“惩罚”所有非对角线上的“错配组合”(比如(图1,文2)),让它们的相似度得分尽可能低**。

整个训练过程,就是不断地重复这个“相亲-匹配-奖惩”的游戏。
clip 配对游戏

2.3 结果:一个图文共享的“联合嵌入空间”

经过4亿对CP的“千锤百炼”,Image Encoder和Text Encoder最终学会了一件不可思议的事情:
它们学会了将一张关于“猫”的图片,和一句关于“猫”的文字,映射到这个共享向量空间中几乎相同的位置!

这座连接图像和文本的“巴别塔”,建成了。

第三章:CLIP惊人的“超能力”—— 零样本学习 (Zero-Shot Learning)

3.1 不训练,不成活!AI的“看图识字”大赛

零样本学习能力

任务:我们要对一张图片进行分类,比如判断一张图片是“猫”、“狗”还是“飞机”。
CLIP的做法 (Zero-Shot):

准备“候选答案”:我们把所有可能的类别,都构造成句子,比如 [“a photo of a cat”, “a photo of a dog”, “a photo of a plane”]。

编码所有东西:
用Image Encoder编码我们要分类的那张未知图片,得到一个图像向量V_img。
用Text Encoder编码上面那三个候选答案句子,得到三个文本向量V_cat, V_dog, V_plane。

找最“情投意合”的:计算V_img和这三个文本向量的相似度。哪个文本向量的相似度最高,我们就认为图片属于哪个类别!

我们将亲手实践CLIP最令人惊艳的能力。我们将加载一张完全不在CLIP训练集中的图片,然后只通过提供文字“候选答案”,让CLIP模型在零训练的情况下,完成高精度的图像分类。

代码显示:

import torch
from PIL import Image
from transformers import CLIPProcessor, CLIPModel
from datasets import load_dataset# --- 1. 加载预训练的CLIP模型和处理器 ---
# CLIPProcessor负责将图片和文本预处理成模型需要的格式
# CLIPModel就是CLIP模型本身
print("正在加载CLIP模型...")
model_name = "openai/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(model_name)
processor = CLIPProcessor.from_pretrained(model_name)
print("模型加载完成!")# --- 2. 准备一张待分类的图片 ---
# 我们从Hugging Face datasets中加载一张猫的图片作为示例
print("正在加载示例图片...")
dataset = load_dataset("huggingface/cats_vs_dogs", split="test", streaming=True)
image_to_classify = next(iter(dataset))["image"]
# 你也可以换成自己的本地图片:
# image_to_classify = Image.open("path/to/your/image.jpg")
print("图片加载完成!")
# 展示图片 (如果在Jupyter Notebook中,可以直接显示)
# image_to_classify.show() # --- 3. 准备“候选答案”文本 ---
# 这就是我们让AI做的“选择题”
candidate_labels = ["a photo of a cat", "a photo of a dog", "a photo of a car"]
print(f"\n候选答案: {candidate_labels}")# --- 4. 魔法发生:进行零样本分类 ---
with torch.no_grad(): # 推理时不需要计算梯度# 使用processor处理图片和文本# padding=True确保所有文本长度一致inputs = processor(text=candidate_labels, images=image_to_classify, return_tensors="pt", padding=True)# 将处理好的数据喂给模型outputs = model(**inputs)# outputs.logits_per_image是关键!它包含了图片与每个文本的相似度分数logits_per_image = outputs.logits_per_image # 使用softmax将分数转换为概率分布probs = logits_per_image.softmax(dim=1) # 找到概率最高的那个选项best_prob, best_idx = torch.max(probs, 1)predicted_label = candidate_labels[best_idx.item()]# --- 5. 打印结果 ---
print("\n--- AI的分类结果 ---")
print(f"AI认为这张图片是: '{predicted_label}'")
print(f"置信度: {best_prob.item() * 100:.2f}%")print("\n--- 各选项的概率 ---")
for label, prob in zip(candidate_labels, probs[0]):print(f"'{label}': {prob.item() * 100:.2f}%")

第四章:实战演练:用CLIP打造你自己的“以文搜图”引擎

4.1 编码你的图库与搜索词

我们将模拟一个本地图库,并使用CLIP的Image Encoder,将所有图片“翻译”成可供快速检索的向量,构建我们的“图像DNA数据库”。

代码显示

import torch
from PIL import Image
from transformers import CLIPProcessor, CLIPModel
from datasets import load_dataset
import os# --- 0. 准备工作:加载模型,并创建一个模拟图库 ---
model_name = "openai/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(model_name)
processor = CLIPProcessor.from_pretrained(model_name)# 创建一个文件夹来存放我们的模拟图库
os.makedirs("my_image_gallery", exist_ok=True)# 从数据集中下载几张不同类别的图片作为我们的图库
print("正在准备模拟图库...")
cats_dataset = load_dataset("huggingface/cats_vs_dogs", split="test", streaming=True).take(3)
cars_dataset = load_dataset("keremberke/car-classification", split="test", streaming=True).take(2)image_paths = []
all_images = []for i, cat_example in enumerate(cats_dataset):path = f"my_image_gallery/cat_{i}.jpg"cat_example["image"].save(path)image_paths.append(path)all_images.append(cat_example["image"])for i, car_example in enumerate(cars_dataset):path = f"my_image_gallery/car_{i}.jpg"car_example["image"].save(path)image_paths.append(path)all_images.append(car_example["image"])print(f"图库准备完毕,包含 {len(image_paths)} 张图片: {image_paths}")# --- 1. 编码图库中的所有图片 ---
print("\n正在为图库中的所有图片建立“语义索引”...")
with torch.no_grad():# 使用processor一次性处理所有图片inputs = processor(images=all_images, return_tensors="pt", padding=True)# 使用 get_image_features 方法来获取图像的嵌入向量image_features = model.get_image_features(**inputs)# 对向量进行归一化,这对于计算余弦相似度很重要image_features = image_features / image_features.norm(dim=-1, keepdim=True)print(f"图像索引建立完成!向量数据库的形状: {image_features.shape}")# --- 2. 编码你的文本搜索词 ---
search_query = "a cat sitting on the grass"
print(f"\n你的搜索词是: '{search_query}'")with torch.no_grad():# 使用processor处理文本text_inputs = processor(text=[search_query], return_tensors="pt", padding=True)# 使用 get_text_features 方法获取文本的嵌入向量text_features = model.get_text_features(**text_inputs)# 同样进行归一化text_features = text_features / text_features.norm(dim=-1, keepdim=True)print(f"搜索词的向量形状: {text_features.shape}")# 在下一个案例中,我们将使用 image_features 和 text_features 来进行匹配!
# 为了方便,我们可以将它们保存起来
# torch.save(image_features, "gallery_features.pt")
# torch.save(image_paths, "gallery_paths.pkl")

【代码解读】
这段代码的核心是model.get_image_features()和model.get_text_features()。它们分别调用CLIP内部的图像编码器和文本编码器,将原始数据转换成了归一化的、512维的嵌入向量。我们现在拥有了图库中所有图片的“数学DNA”(image_features)和我们搜索词的“数学DNA”(text_features)。

4.2 计算余弦相似度,找到最匹配的图片

我们将在上一步的基础上,完成“以文搜图”的最后一步——在联合嵌入空间中,寻找与我们文本向量“距离”最近的图像向量。

# (接上一个案例的代码,假设 image_features 和 text_features 变量已存在)print("\n--- 开始在向量空间中进行搜索匹配 ---")# --- 3. 计算文本向量与所有图像向量的余弦相似度 ---
# 矩阵乘法是计算归一化向量之间余弦相似度的最快方法
# (1, 512) @ (5, 512).T -> (1, 5)
similarity_scores = text_features @ image_features.T
# .T 表示转置,将(5, 512)变为(512, 5)print(f"计算出的相似度分数 (1个文本 vs {len(image_paths)}张图片):")
print(similarity_scores)# --- 4. 找到分数最高的Top-K个结果 ---
top_k = 3
# torch.topk会返回最高的分数和它们对应的索引
top_results = torch.topk(similarity_scores, k=top_k)top_scores = top_results.values[0]
top_indices = top_results.indices[0]print(f"\n--- 搜索完成!最匹配的 Top {top_k} 张图片是 ---")
for i in range(top_k):image_index = top_indices[i].item()score = top_scores[i].item()path = image_paths[image_index]print(f"第 {i+1} 名: 图片路径 '{path}', 相似度分数: {score:.4f}")# 可以选择性地显示图片# Image.open(path).show()

【代码解读与见证奇迹】
最核心的一行是text_features @ image_features.T。在联合嵌入空间中,相似度就是这么简单、优雅的一次矩阵乘法!运行代码后,你会看到,尽管我们的搜索词是"a cat sitting on the grass",而图库里可能并没有完全符合这个描述的图片,但CLIP依然能够凭借其强大的语义理解能力,找出所有与“猫”相关的图片,并且它们的相似度得分会远高于那些“车”的图片。
以文搜图

第五章 CLIP的“后裔”们:从Stable Diffusion到LLaVA

CLIP的出现,是AIGC领域的一场“寒武纪大爆发”。它那个强大的、能理解图文关系的Text Encoder,成为了后续无数模型的“标准配件”:

Stable Diffusion & Midjourney:这些文生图模型的背后,都有一个CLIP的Text Encoder。当你输入一段Prompt时,是它先把你的文字“翻译”成高质量的语义向量,然后扩散模型(Diffusion Model)才根据这个“语义指导”,一步步地从噪声中生成图像。

LLaVA & GPT-4V:这些大型多模-态模型(LMMs),其核心思想就是将一个强大的视觉编码器(类似CLIP的Image Encoder)和一个强大的大语言模型(LLM)“连接”起来。CLIP为这种“连接”提供了理论和实践的基础。

总结与展望:万物皆可Embedding

恭喜你!今天你已经掌握了打通不同信息模态的“金钥匙”。
✨ 本章惊喜概括 ✨

你掌握了什么?对应的技能/工具
理解了多模态的核心✅ 对比学习与联合嵌入空间
洞悉了CLIP的原理✅ “大型相亲会”的生动比喻
解锁了惊人超能力✅ 零样本图像分类的实现
打造了实用工具✅ 亲手实现了“以文搜图”引擎
看到了未来✅ 了解CLIP对整个AIGC领域的深远影响

CLIP的核心思想——将不同来源的信息,通过对比学习,映射到同一个高维语义空间——是极其普适的。这个思想不仅适用于图文,也同样适用于**“声音-文本”、“视频-文本”、“蛋白质结构-功能描述”**等任何可以“配对”的数据。

🔮 敬请期待! 在下一篇文章中,我们将继续深入多模态的世界,探索像LLaVA这样的**大型多模态模型(LMMs)**是如何工作的。我们将看到,当一个强大的“眼睛”(视觉编码器)和一个强大的“大脑”(LLM)结合时,AI将展现出怎样更加惊人的、接近人类的理解与交互能力!

http://www.dtcms.com/a/301243.html

相关文章:

  • 图像智能识别(一)-Python方向
  • 嵌入式学习日志————对射式红外传感器计次
  • 「iOS」————ARC
  • MyBatis-Plus 条件构造器(Wrapper)全解析
  • docker in docker - 在docker容器中使用宿主机的docker
  • mac电脑安装docker图文教程
  • Java面试全栈通关:从微服务到AI的技术深度解析
  • [10月考试] C
  • Java面试全攻略:Spring生态与微服务架构实战
  • LangChain实现RAG
  • [2025CVPR-图象超分辨方向]DORNet:面向退化的正则化网络,用于盲深度超分辨率
  • 马尔可夫链
  • 设计模式(十三)结构型:代理模式详解
  • Python 使用 asyncio 包处理并 发(避免阻塞型调用)
  • 图像智能识别算法记录
  • 动态规划 (Dynamic Programming) 算法概念-Python示例
  • Leetcode——287. 寻找重复数
  • SignalR 全解析:核心原理、适用场景与 Vue + .NET Core 实战
  • 工业控制系统安全之 Modbus 协议中间人攻击(MITM)分析与防范
  • 全面理解JVM虚拟机
  • RS485转profinet网关如何让JRT激光测距传感器开启自动模式连续测量模式
  • 淘宝获取店铺订单信息操作指南
  • Python爬虫入门:从零开始抓取网页数据
  • 每日一讲——Podman
  • 分布式事务-MQ事务消息学习与落地方案
  • 前端面试专栏-前沿技术:32.AI辅助开发工具应用
  • 0-1BFS(双端队列,洛谷P4667 [BalticOI 2011] Switch the Lamp On 电路维修 (Day1)题解)
  • 用 Flask 打造宠物店线上平台:从 0 到 1 的全栈开发实践
  • 电商项目_核心业务_数据归档
  • esp32-使用虚拟机开发-部署esp32的linux的环境