Python CLIP 多模态对齐

作者:追风剑情 发布于:2026-6-11 15:31 分类:AI

多模态对齐是指将来自不同模态(例如文本、图像、音频、视频)的信息映射到同一个语义向量空间中,使得语义相似的内容在该空间中彼此靠近,而语义不同的内容相互远离。

多模态对齐的核心是学习一个共享的嵌入空间,让不同模态的数据可以相互比较、检索、生成。典型的应用包括:

  • 图文检索:用文字搜索图片,或用图片搜索文字。
  • 零样本分类:用类别名称的向量与图像向量比较,直接分类。
  • 图文生成:如 DALL-E、Stable Diffusion,根据文本生成对齐的图像。

示例:

import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
import torch
from PIL import Image
from transformers import CLIPProcessor, CLIPModel

# 1. 加载预训练的 CLIP 模型和处理器
model_name = "openai/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(model_name)
processor = CLIPProcessor.from_pretrained(model_name)

# 2. 准备示例图像(请替换为你本地的图片路径,或使用网络图片)
image_path = "dog.png"   # 假设你有一张狗的图片
image = Image.open(image_path).convert("RGB")

# 3. 准备多条候选文本描述(中文也会被模型编码,但 CLIP 主要在英文上训练,中文效果有限)
texts = [
    "a dog running on grass",
    "a cat sleeping on a sofa",
    "a car on the road",
    "a bird in the sky"
]

# 4. 同时对图像和文本进行预处理
inputs = processor(text=texts, images=image, return_tensors="pt", padding=True)

# 5. 前向传播,获取图像和文本的特征向量
with torch.no_grad():
    outputs = model(**inputs)
    image_features = outputs.image_embeds      # 形状 (1, 512)
    text_features = outputs.text_embeds        # 形状 (4, 512)

# 6. 计算余弦相似度(CLIP 默认对特征进行了 L2 归一化,可以直接点积)
similarities = (image_features @ text_features.T).squeeze(0)   # 形状 (4,)
print("相似度分数:")
for text, sim in zip(texts, similarities):
    print(f"{text:30} : {sim.item():.4f}")

# 7. 找到最相似的文本
best_idx = similarities.argmax().item()
print(f"\n最匹配的描述是:{texts[best_idx]} (相似度 {similarities[best_idx].item():.4f})")

1111111.png

标签: AI

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号