ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【机器视觉】必会算法之:CLIP(对比语言-图像预训练)

【机器视觉】必会算法之:CLIP(对比语言-图像预训练)

机器视觉之:CLIP

  • 1、引言
  • 2、CLIP(Contrastive Language-Image Pre-training)
    • 2.1 定义与解析
    • 2.2 核心原理
      • 2.2.1 双塔结构:图像编码器 + 文本编码器
      • 2.2.2 对比学习:把"配对"拉近、把"非配对"推远
      • 2.2.3 训练数据:4 亿图文对
      • 2.2.4 零样本分类:用文本当"分类器"
    • 2.3 实现方式 / 工作流程
    • 2.4 算法公式
    • 2.5 代码示例
  • 3、总结

1、引言

小屌丝:鱼哥,最近搞图像分类,发现个怪事——我训的模型换个数据集就拉胯,咋回事啊?

小鱼:嘿,这叫"数据集偏见",模型只认你喂的那几个类,没见过的它一脸懵。

小屌丝:那有没有那种"啥都能认一点"的万能模型?

小鱼:有,而且思路特别骚——直接让图像和文字"谈恋爱"。这就是今天的主角CLIP。

小屌丝:图……和文谈恋爱?鱼哥你别又整抽象。

小鱼:(⊙o⊙)… 用对比学习把图像和对应文字塞进同一个向量空间,谁跟谁是一对,模型自己学会。零样本分类,就是从这儿来的。

小屌丝:懂了,一个"看图说话"、一个"听文认图",最后他俩能在同一个坐标系里对上号。

小鱼:精辟。那咱开整。


2、CLIP(Contrastive Language-Image Pre-training)

2.1 定义与解析

CLIP(Contrastive Language-Image Pre-training,对比语言-图像预训练),是 OpenAI 在 2021 年提出的多模态预训练模型。

一句话理解它:同时训练一个"看图"的编码器和一个"读文"的编码器,让"图片—文字"配对样本在向量空间里挨得近、非配对样本离得远。训完之后,图像和文本就共用同一个语义空间了。

它最炸裂的地方在于——零样本(Zero-shot)。你不用再为某个新任务重新训练分类器,直接拿文字描述当"类别原型"去比对图像就行。

简单来说,CLIP 把"分类"从"背题库"变成了"查字典":图像查到文字,分类自然就出来了。

2.2 核心原理

2.2.1 双塔结构:图像编码器 + 文本编码器

CLIP 是两个独立的编码器(双塔):

  • 图像编码器(Image Encoder):可选ViT(Vision Transformer)或ResNet,把图像压成一个特征向量;
  • 文本编码器(Text Encoder):一个Transformer,把句子压成同维度的特征向量。

关键点:两塔输出维度一致(如 512/640/768),这样图像向量和文本向量才能直接算相似度。

2.2.2 对比学习:把"配对"拉近、把"非配对"推远

训练数据是一堆(图像, 文本)对。在一个 batch 里,真正配对的只有对角线上的 N 对,其余 N²−N 对都是"错的"。

CLIP 用对比损失训练:让对角线(正样本对)的相似度尽可能高,让非对角线(负样本对)的相似度尽可能低。这就逼着两个编码器把"图文语义"对齐到同一空间。

2.2.3 训练数据:4 亿图文对

CLIP 在4 亿(400M)从互联网收集的(图像, 文本)对上训练。海量、弱标注、天然多样——这正是它能"泛化到没见过的任务"的底气。

2.2.4 零样本分类:用文本当"分类器"

推理时,比如要分"狗/猫/车",就把类别名套进模板:

“a photo of a dog” / “a photo of a cat” / “a photo of a car”

用文本编码器编码这些句子,再和图像向量算余弦相似度,谁最像就是哪类。整个过程没有任何新增训练参数。

2.3 实现方式 / 工作流程

CLIP 的推理可以压缩成 4 步:

  1. 编码图像:图像过 Image Encoder → 图像向量I II;
  2. 编码文本:候选类别描述过 Text Encoder → 一组文本向量{ T 1 , T 2 , . . . } \{T_1,T_2,...\}{T1​,T2​,...};
  3. 算相似度:每个T k T_kTk​与I II做余弦相似度(再乘温度系数);
  4. 归一化选类:softmax 后取概率最大的类别。
Image ──▶ Image Encoder ──▶ I │ Text (prompts) ──▶ Text Encoder ──▶ {Tk} ──▶ cosine(I, Tk) ──▶ softmax ──▶ 类别

2.4 算法公式

CLIP 的核心是对比损失(InfoNCE 的对称形式)。设 batch 内有 N 对,图像特征I i I_iIi​、文本特征T i T_iTi​,先各自做 L2 归一化并除以温度τ \tauτ:

sim ( I i , T j ) = I i ⊤ T j ∥ I i ∥ ∥ T j ∥ ⋅ τ \text{sim}(I_i, T_j) = \frac{I_i^\top T_j}{\|I_i\|\|T_j\| \cdot \tau}sim(Ii​,Tj​)=∥Ii​∥∥Tj​∥⋅τIi⊤​Tj​​

图像→文本方向的损失(让第i ii个图像匹配第i ii个文本):

L i → t = − 1 N ∑ i = 1 N log ⁡ exp ⁡ ( sim ( I i , T i ) ) ∑ j = 1 N exp ⁡ ( sim ( I i , T j ) ) \mathcal{L}_{i\to t} = -\frac{1}{N}\sum_{i=1}^{N} \log \frac{\exp(\text{sim}(I_i, T_i))}{\sum_{j=1}^{N}\exp(\text{sim}(I_i, T_j))}Li→t​=−N1​i=1∑N​log∑j=1N​exp(sim(Ii​,Tj​))exp(sim(Ii​,Ti​))​

总损失为双向对称平均:L = 1 2 ( L i → t + L t → i ) \mathcal{L} = \frac{1}{2}(\mathcal{L}_{i\to t} + \mathcal{L}_{t\to i})L=21​(Li→t​+Lt→i​)。

记住一句话:正样本对相似度拉满,负样本对压下去,图文就对齐了。

2.5 代码示例

用 OpenAI 官方clip包,跑一个零样本图像分类:

环境准备:

pipinstallgit+https://github.com/openai/CLIP.git pipinstalltorch torchvision pillow

零样本分类:

importclipimporttorchfromPILimportImage# 1、加载模型(可选 ViT-B/32、ViT-B/16、ViT-L/14 等)device="cuda"iftorch.cuda.is_available()else"cpu"model,preprocess=clip.load("ViT-B/32",device=device)# 2、准备图像与候选文本image=preprocess(Image.open("dog.jpg")).unsqueeze(0).to(device)labels=["a photo of a dog","a photo of a cat","a photo of a car"]text=clip.tokenize(labels).to(device)# 3、前向:得到图像-文本相似度(已含温度缩放)withtorch.no_grad():logits_per_image,_=model(image,text)probs=logits_per_image.softmax(dim=-1).cpu().numpy()[0]# 4、输出概率forlabel,pinzip(labels,probs):print(f"{label}:{p:.3f}")# 例:a photo of a dog: 0.912

图像检索(以文搜图):

# 把一批图像编码成向量,用文本向量去检索最相近的图withtorch.no_grad():image_features=model.encode_image(image_batch)# [B, D]text_feature=model.encode_text(clip.tokenize(["a sunset on the beach"]).to(device))sims=(image_features @ text_feature.T).softmax(dim=0)top_idx=sims.argmax().item()# 最匹配的图像索引

小提示:CLIP 是后续一大波多模态模型的"地基"——DALL·E、Stable Diffusion 的文本条件、BLIP、LLaVA 都建立在它的图文对齐思想之上。学会了 CLIP,半个多模态圈子你就通了。

典型应用场景:零样本图像分类、以文搜图 / 以图搜文、图像检索、内容审核、作为下游生成模型(扩散模型)的文本条件编码器。


3、总结

今天这篇,把CLIP(对比语言-图像预训练)啃了一遍:

  • 是什么:OpenAI 的多模态模型,把图像和文本对齐到同一向量空间;
  • 怎么搭:图像编码器 + 文本编码器双塔,对比损失训练;
  • 强在哪:4 亿图文对喂出来的,天然零样本,换个任务不用重训;
  • 怎么用:文本当分类器,算余弦相似度 + softmax,几行代码就跑通;
  • 往哪走:它是 DALL·E、Stable Diffusion、LLaVA 等多模态模型的共同基石。

到这儿,你手里又多了一把"万能钥匙"。配合前面咱讲过的SAM(分割一切),图文分割+识别的活儿基本都能拿下。

我是小鱼:

  • CSDN 博客专家;
  • AIGC MVP专家;
  • 阿里云 专家博主;
  • 51CTO博客专家;
  • 企业认证金牌面试官;
  • 多个头部名企认证&特邀讲师等;
  • 名企签约职场面试培训、职场规划师;
  • 多个国内主流技术社区的认证专家博主;
  • 多款主流产品(阿里云等)评测一等奖获得者;

关注小鱼,学习【机器视觉与目标检测】最新最全的领域知识。

返回列表