IP-Adapter
IP-Adapter 的任务与设计原理
背景:IP-Adapter 的任务是什么?
IP-Adapter 的核心目标是:
在文本引导合成的扩散模型(如 Stable Diffusion)中,同时引入图像引导信息(比如图像风格、结构、布局)来提升多模态控制能力。
但问题来了:
Stable Diffusion 是 text-to-image 预训练的,它的 UNet 中的 attention 机制默认是专门"听文本"的。
❌ 简单拼接图文 embedding 的问题
如果直接把图像和文本的 embedding 拼接在一起当作 cross attention 的 key 和 value:
[ C L S t e x t , . . . , C L S i m a g e , . . . ] → 一起喂给 UNet 进行 cross-attention [CLS_{text}, ..., CLS_{image}, ...] \rightarrow \text{一起喂给 UNet 进行 cross-attention} [CLStext,...,CLSimage,...]→一起喂给 UNet 进行 cross-attention
那么就会遇到这些问题:
-
模型更偏向文本
因为模型在预训练时只见过 text condition,它习惯于从文本中提取语义。
图像 embedding 没受过训练,被当"噪声"忽略或误用。 -
细粒度图像控制失败
图像的结构或风格难以体现,最终图像生成仍然被文本主导。
✅ 解耦 Cross-Attention 的设计动机
Decoupled Cross Attention 的核心做法是:
不混合图像和文本的 embedding,而是分别做两个 Cross Attention,再将输出结果融合。
操作步骤:
-
让 UNet latent 分别与图像 embedding 和文本 embedding 做 cross attention:
z i m g = CrossAttention ( l a t e n t , i m a g e c o n d ) z_{img} = \text{CrossAttention}(latent, image_{cond}) zimg=CrossAttention(latent,imagecond)
z t x t = CrossAttention ( l a t e n t , t e x t c o n d ) z_{txt} = \text{CrossAttention}(latent, text_{cond}) ztxt=CrossAttention(latent,textcond) -
然后再相加或融合:
z = z i m g + z t x t z = z_{img} + z_{txt} z=zimg+ztxt
好处:
- ✅ 不争抢注意力资源:图像和文本分别获取表达,不相互干扰。
- ✅ 充分表达图像引导细节:图像信息不会被文本淹没。
- ✅ 保留原始结构:不改变 UNet 的输入接口,只是换了 attention 的处理方式。
总结
IP-Adapter 使用解耦的 cross attention是为了克服 Stable Diffusion 强烈的文本偏向性,避免简单拼接 embedding 导致图像条件被忽视。通过分别建模 latent 对图像和文本的注意力,确保图像条件能提供更细粒度、更有效的控制信号。