多模态 AI 应用
文本 + 图像 + 语音联合推理、VLM 视觉语言模型、CLIP / BLIP / Qwen-VL 实践
多模态 AI 概述
多模态 AI 是指能够同时理解和处理多种数据类型(文本、图像、语音、视频等)的人工智能系统。与传统的单模态模型不同,多模态模型通过联合建模不同模态之间的语义关联,实现更接近人类感知的认知能力。
单模态与多模态的差异
单模态模型(如纯文本模型 GPT、纯视觉模型 ResNet)只能处理单一类型的数据输入,其理解能力受限于单一信息源。多模态模型则能够融合多种信息渠道,在图文检索、视觉问答、多模态对话等场景中展现出更强的推理能力。
核心应用场景
- 图文检索:根据文本描述搜索匹配的图像,或根据图像查找相关文本描述
- 视觉问答(VQA):给定一张图像,模型回答关于图像内容的自然语言问题
- 多模态对话:用户交替输入图像和文本,模型进行连贯的多轮对话
- 图像描述生成:为输入图像自动生成自然语言描述
- 跨模态翻译:将一种模态的信息转换为另一种模态(如语音转图像描述)
CLIP(Contrastive Language-Image Pre-training)
CLIP 由 OpenAI 于 2021 年提出,是开放词汇图像分类和多模态对齐的里程碑式工作。其核心思想是通过对比学习在大量图文对数据上训练双塔模型,将图像和文本映射到共享的语义空间。
双塔架构
CLIP 包含两个独立的编码器:
- Text Encoder:通常基于 Transformer 架构(GPT 风格),将文本序列编码为固定维度的向量
- Image Encoder:可采用 ResNet 或 Vision Transformer(ViT),将图像编码为同维度的向量
两个编码器的输出经过 L2 归一化后,通过对比学习损失拉近匹配图文对的距离,推远不匹配图文对的距离。
Zero-shot 图像分类原理
CLIP 的 Zero-shot 分类不需要任何训练样本,只需将类别标签构造为 "a photo of a {class}" 的文本模板,计算图像嵌入与所有类别文本嵌入的余弦相似度,选择相似度最高的类别作为预测结果。
代码示例:使用 open_clip 计算图文相似度
import torch
from PIL import Image
import open_clip
# 加载模型和预处理
model, _, preprocess = open_clip.create_model_and_transforms(
"ViT-B-32", pretrained="laion2b_s34b_b79k"
)
tokenizer = open_clip.get_tokenizer("ViT-B-32")
# 准备输入
image = preprocess(Image.open("example.jpg")).unsqueeze(0)
text = tokenizer(["a cat sitting on a sofa", "a dog running in the park"])
# 计算相似度
with torch.no_grad(), torch.cuda.amp.autocast():
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)
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)
print(similarity) # 输出每个文本与图像的匹配概率BLIP / BLIP-2
BLIP(Bootstrapping Language-Image Pre-training)系列由 Salesforce 提出,专注于统一视觉语言理解和生成任务。
BLIP:Bootstrapping 数据增强
BLIP 的核心创新在于利用生成模型为网络图文对生成合成描述(Captioning),同时使用过滤机制(Filtering)去除噪声数据,实现数据质量的 Bootstrapping 提升。模型采用多任务学习框架,同时训练三个目标:
- 图文对比学习(ITC):对齐图像和文本嵌入
- 图文匹配(ITM):二分类任务判断图文是否匹配
- 语言建模(LM):以图像为条件生成文本描述
BLIP-2:Q-Former 桥接模块
BLIP-2 引入 Q-Former(Querying Transformer)作为视觉 backbone 和冻结大语言模型之间的桥接模块,实现高效的轻量训练。其关键设计包括:
- 冻结视觉 backbone:使用预训练的 ViT 提取图像特征,不参与训练
- 冻结 LLM:使用 OPT、FlanT5 等大语言模型,仅通过 Q-Former 交互
- 可学习的查询向量(Learnable Queries):一组固定数量的查询向量与图像特征做交叉注意力,提取与文本最相关的视觉信息
- 两阶段训练:第一阶段训练 Q-Former 与视觉 backbone 的对齐,第二阶段联合 Q-Former 与冻结 LLM 进行生成训练
这种设计使得 BLIP-2 仅需极少的可训练参数(约 188M)即可获得强大的多模态能力,训练成本大幅降低。
Qwen-VL 系列
Qwen-VL 是阿里云通义千问大模型的视觉语言版本,具备强大的多模态理解和对话能力。
模型架构
Qwen-VL 采用视觉编码器 + 位置感知适配器 + 大语言模型的级联架构:
- 视觉编码器:基于 Openclip 的 ViT-bigG,支持 448x448 高分辨率输入
- 位置感知适配器:区别于 BLIP-2 的 Q-Former,Qwen-VL 使用单层交叉注意力模块,将视觉特征压缩为固定长度的视觉 Token,同时保留图像内物体的位置信息
- 大语言模型:基于 Qwen-7B 的增强版本,支持中英双语
视觉理解与对话能力
Qwen-VL 支持以下多模态任务:
- 图像描述:生成详细的图像内容描述
- 视觉问答:回答关于图像内容的自由形式问题
- 文字识别:识别图像中的文字(OCR)
- 多图像对比:同时输入多张图像进行对比推理
- 定位与检测:支持通过对话指定图像中的物体位置
通过多任务联合训练(图文匹配、描述生成、VQA、OCR 等),Qwen-VL 在多个多模态基准上取得了领先成绩。其对话版本 Qwen-VL-Chat 进一步通过监督微调和人类反馈强化学习,优化了交互体验。
模型对比表
| 模型 | 架构类型 | 输入模态 | 参数量 | 核心任务能力 | 开源 |
|---|---|---|---|---|---|
| CLIP | 双塔编码器 | 文本 + 图像 | ~150M (ViT-L) | 图文检索、Zero-shot 分类 | 是 |
| BLIP-2 | 编码器-解码器 + Q-Former | 文本 + 图像 | ~1.2B (ViT-g + Q-Former + FlanT5-XL) | 图像描述、VQA、图文检索 | 是 |
| Qwen-VL | 视觉编码器 + 适配器 + LLM | 文本 + 图像 | ~9.6B (ViT-bigG + Qwen-7B) | VQA、多模态对话、OCR、定位 | 是 |
| LLaVA | 视觉编码器 + 投影层 + LLM | 文本 + 图像 | ~13B (ViT-L + Vicuna-13B) | 多模态对话、VQA | 是 |
| GPT-4V | 闭源多模态 Transformer | 文本 + 图像 | 未公开 | 全能视觉理解、推理、创作 | 否 |
文本 + 图像 + 语音联合推理
多模态融合策略
实现文本、图像和语音的联合推理,需要设计合理的多模态融合方案。主流的融合策略包括:
早期融合(Early Fusion)
在所有模态的最底层就将特征拼接或混合,让模型在后续层中学习跨模态交互。
- 优势:模态间交互充分,能捕捉细粒度的跨模态对应关系
- 劣势:输入维度高,计算开销大;需要各模态数据严格对齐
- 适用场景:模态间强相关的任务(如音视频说话人识别)
晚期融合(Late Fusion)
各模态独立编码后,在决策层进行融合(如拼接特征向量后接分类器或采用投票机制)。
- 优势:各模态编码器可以独立训练和优化,架构灵活
- 劣势:无法利用模态间的细粒度交互信息
- 适用场景:模态间关系较弱的任务(如多模态情感分析)
跨模态注意力(Cross-modal Attention)
使用注意力机制让一种模态的表示根据另一种模态的上下文进行更新,这是当前最主流的融合方案。
- 优势:动态建模模态间依赖关系,可解释性好
- 劣势:计算复杂度随模态数平方增长
- 典型实现:Transformer 的交叉注意力层、Q-Former
实际搭建多模态流程的思路
- 模态编码阶段:分别为文本、图像、语音选择预训练编码器(如 BERT、ViT、Whisper),提取各模态的特征表示
- 对齐与融合阶段:使用跨模态注意力或适配器模块,将不同模态的特征映射到统一语义空间
- 推理与生成阶段:使用大语言模型或任务专用解码器,基于融合后的多模态特征进行推理和生成
- 训练策略:先进行模态对齐预训练,再进行多模态指令微调
代码示例:使用 transformers 加载 CLIP 进行图文推理
from transformers import CLIPProcessor, CLIPModel
from PIL import Image
import torch
# 加载预训练 CLIP 模型
model_name = "openai/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(model_name)
processor = CLIPProcessor.from_pretrained(model_name)
# 准备输入数据
image = Image.open("example.jpg")
texts = ["a photo of a cat", "a photo of a dog", "a photo of a car"]
# 处理输入
inputs = processor(
text=texts,
images=image,
return_tensors="pt",
padding=True
)
# 前向推理
with torch.no_grad():
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image # 图像与文本的相似度分数
probs = logits_per_image.softmax(dim=1)
# 输出结果
for text, prob in zip(texts, probs[0]):
print(f"{text}: {prob.item():.4f}")使用 transformers 加载 BLIP 进行图像描述生成
from transformers import BlipProcessor, BlipForConditionalGeneration
from PIL import Image
# 加载 BLIP 模型和处理器
processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
model = BlipForConditionalGeneration.from_pretrained(
"Salesforce/blip-image-captioning-base"
)
# 加载图像
image = Image.open("example.jpg")
# 生成图像描述
inputs = processor(image, return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=50)
caption = processor.decode(out[0], skip_special_tokens=True)
print(f"Image caption: {caption}")
# 视觉问答
question = "What is the color of the cat?"
inputs = processor(image, question, return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=20)
answer = processor.decode(out[0], skip_special_tokens=True)
print(f"Question: {question}")
print(f"Answer: {answer}")总结与展望
多模态 AI 正在从研究走向广泛落地。CLIP 为图文理解奠定了对比学习范式,BLIP-2 展示了冻结大模型结合轻量适配器的效率优势,Qwen-VL 和 GPT-4V 则代表了多模态大模型在理解和对话方面的新高度。未来,随着更多模态(视频、3D、触觉)的加入和统一架构的演进,多模态 AI 将在自动驾驶、医疗诊断、智能教育等领域发挥更大的作用。