Prompt-to-Prompt Image Editing with Cross Attention Control

news2024/10/6 6:51:56

Prompt-to-Prompt Image Editing with Cross Attention Control

TL; DR:prompt2prompt 提出通过替换 UNet 中的交叉注意力图,在图像编辑过程中根据新的 prompt 语义生图的同时,保持图像整体布局结构不变。从而实现了基于纯文本(不用 mask 等额外信息)的图像编辑。


导语

基于文本控制图像生成模型取得了飞速的进展,一个自然的想法是如何实现基于文本控制的图像编辑模型。图像编辑需要在保持原始图片构图不变的情况下,对部分元素或整体风格进行修改。然而,在文生图模型中,文本 prompt 中一个小小的修改(比如替换一个单词),通常都会使得生图结果完全不同。现有的图像编辑方法一般是通过要求用户同时提供编辑区域的 mask,并只在 mask 内进行图像编辑,从而保持图像整体构图布局不变。

本文中,作者深入分析了现有的文生图模型,发现交叉注意力层是控制图像空间布局与 prompt 中每个单词之间关系的关键。基于此,作者通过替换交叉注意力图,构建了一种仅需修改 prompt (无需额外 mask) 的图像编辑框架。并基于该框架介绍了三种图像编辑应用,包括替换单词的局部编辑、添加描述的全局编辑以及更改单词权重来修改单词在生图结果中的反映程度。

下图展示了 prompt2prompt 图像编辑的一些结果,可以看到,仅通过在 prompt 中替换、删除或添加几个单词,就能完成对应的图像编辑,关键是在这个过程过程中保持了图像整体空间布局和其他背景元素不变。

在这里插入图片描述

方法

I \mathcal{I} I 为文生图模型在 prompt 为 P \mathcal{P} P ,随机种子为 s s s 下生成的一张图像,我们的目标是仅通过修改 prompt 为 P ∗ \mathcal{P}^* P ,同时固定随机种子 s s s,生成出语义符合 P ∗ \mathcal{P}^* P 且空间构图与 I \mathcal{I} I 一致的编辑图像 I ∗ \mathcal{I}^* I

图文交叉注意力

prompt2prompt 的方法注意力替换技术如下图所示。带噪图像 ϕ ( z t ) \phi(z_t) ϕ(zt) 映射为 query 矩阵 Q = l Q ( ϕ ( z t ) Q=l_Q(\phi(z_t) Q=lQ(ϕ(zt) ,文本 prompt 嵌入 ψ ( P ) \psi(\mathcal{P}) ψ(P) 映射为 key 矩阵 K = l K ψ ( P ) K=l_K\psi(\mathcal{P}) K=lKψ(P) 和 value 矩阵 V = l V ψ ( P ) V=l_V\psi(\mathcal{P}) V=lVψ(P) ,其中 l Q , l K , l V l_Q,l_K,l_V lQ,lK,lV 是三个线性映射层。注意力图(attention maps) M M M 为:
M = Softmax ( Q K T d ) M=\text{Softmax}(\frac{QK^T}{\sqrt{d}}) M=Softmax(d QKT)

其中 d d d 是 key 和 value 的隐层维度,每个单元 M i j M_{ij} Mij 表示第 j j j 个文本 token 和第 i i i 个图像块 token 的相关性,该值会作为 value 矩阵的权重,从而交叉注意力层最终的输出为 ϕ ^ ( z t ) = M V \hat\phi(z_t)=MV ϕ^(zt)=MV

在这里插入图片描述

总结一下,交叉注意力层的输出 M V MV MV 是 value 矩阵 V V V 的加权平均,而各位置的权重就是注意力图 M M M M M M 其实就是 query 矩阵 Q Q Q 和 key 矩阵 K K K​​ 的各位置的相似度。

交叉注意力图替换

本文的关键发现是:生成图像的空间布局是由交叉注意力图决定的。该发现可由下图看出。图中展示了文本 prompt 中的各个单词对应的交叉注意力图,其中上方一行展示了交叉注意力图在所有时间步平均的结果,可以看到:像素位置与描述它的单词之间的注意力权重更高(如 bear、bird 都对应于各自的位置);下方两行展示了 bear 和 bird 两个单词在整个生图过程中每一时间步的对应注意力图,可以看到:文本单词与空间位置的对应关系在生图早期就已经确定下来了。这个可视化实验支撑了本文的关键发现:生成图像的空间布局是由交叉注意力图决定的。

在这里插入图片描述

既然已经知道了生图的空间构图是由交叉注意力图决定的,那要保持图像编辑过程中的空间构图的思路就很直接了:将第一次生图 I \mathcal{I} I 时的交叉注意力图 M M M 保存下来,在图像编辑生图 I ∗ \mathcal{I}^* I 的过程中替换上去,让对应位置的单词还是在编辑生图的对应空间位置。这样就可以使得编辑图像 I ∗ \mathcal{I}^* I 不仅语义与编辑 prompt P ∗ \mathcal{P}^* P 一致,同时还能保持空间构图与原图 I \mathcal{I} I 一致。

接下来,本文提出了一种统一的图像编辑框架,并介绍了该框架下的三种图像编辑应用:分别是替换单词的局部编辑、添加描述的全局编辑以及更改单词权重来修改单词在生图结果中的反映程度。

记扩散模型的在时间步 t t t 的去噪过程为 D M ( z t , P , t , s ) DM(z_t,\mathcal{P},t,s) DM(zt,P,t,s) ,其输出为预测的上一时间步的噪声图像 z t − 1 z_{t-1} zt1,我们同时保存该步去噪过程中的交叉注意力图,记为 M t M_t Mt。记 D M ( z t , P , t , s ) { M ← M ^ } DM(z_t,\mathcal{P},t,s)\{M\leftarrow \hat{M}\} DM(zt,P,t,s){MM^} 为将交叉注意力图 M M M 替换为 M ^ \hat{M} M^ 的去噪步,注意其中的 value 矩阵 V V V 不做替换,仅替换交叉注意力图。我们定义 E d i t ( M t , M t ∗ , t ) Edit(M_t,M_t^*,t) Edit(Mt,Mt,t) 为交叉注意力图编辑函数,其中 M t ∗ M_t^* Mt​ 为生成编辑图像时的交叉注意力图。编辑函数输入为:生成原始图片时的注意力图、生成编辑图片时的注意力图和时间步,输出为当前步的注意力图。

prompt2prompt 框架的算法伪代码如下所示:

在这里插入图片描述

注意 prompt2prompt 需要保持生成原始图片时的随机种子和生成编辑图片时的随机种子一致,因为在扩散模型中,即使文本 prompt 相同,如果随机种子不同,生成结果也会非常不同。

通过在上述框架下使用不同的编辑函数,就能实现不同的图像编辑应用。本文提到的三种应用图示见图 2 下侧,以下分别具体介绍三种图像编辑应用。

应用

word swap

通过单词替换来改变原图中的物体或属性。比如原 prompt 为 “a big red car”,编辑 prompt 为 “a big red bike”。由于 prompt 中 token 数目没变,这种情况可以直接通过交叉注意力替换来实现语义与编辑 prompt 一致,而构图与原图一致。但是,在去噪过程全程都进行注意力替换约束可能会过强,尤其是当编辑前后 prompt 的轮廓发生很大变化时(如 car -> bike)。考虑到生图的空间位置关系是在早期的去噪步中确定的,这里通过指定在某个时间步 τ \tau τ 之前进行注意力替换,来使得整体约束相对宽松,给编辑图像生图一定的自由度:
E d i t ( M t , M t ∗ , t ) : = { M t ∗    if  t < τ M t    oherwise Edit(M_t,M_t^*,t):= \begin{cases} M_t^*\ \ \ \text{if}\ t<\tau \\ M_t\ \ \ \text{oherwise} \end{cases} Edit(Mt,Mt,t):={Mt   if t<τMt   oherwise
如果编辑 prompt 中的新单词编码为多个 token,还可以对不同的 token 分别指定不同的 τ \tau τ ;如果编辑前后两个单词编码的 token 数不同,可以通过复制、平均或使用对齐函数来对齐。

adding a new phrase

用户还可以在原 prompt 中添加一些单词,得到编辑 prompt。比如原 prompt 为 “a castle next to a river”,编辑 prompt 为 “children drawing of a castle next to a river”。此时我们仅对编辑前后两个 prompt 中相同的单词进行注意力图替换。具体老说,我们使用一个对齐函数 A A A,将编辑 prompt 中的 token 的索引映射为原始 prompt 中相同 token 的索引,如果原始 prompt 没有就返回 None。此时编辑函数为:
( E d i t ( M t , M t ∗ , t ) ) i , j : = { ( M t ∗ ) i , j    if  A ( j ) = N o n e ( M t ) i , j    oherwise (Edit(M_t,M_t^*,t))_{i,j}:= \begin{cases} (M_t^*)_{i,j}\ \ \ \text{if}\ A(j)=None \\ (M_t)_{i,j}\ \ \ \text{oherwise} \end{cases} (Edit(Mt,Mt,t))i,j:={(Mt)i,j   if A(j)=None(Mt)i,j   oherwise
这种情况下同时可以结合情况 1 来控制使用注意力替换的时机 τ \tau τ 。这种编辑方式可以实现整体图像风格的修改,图中某物体属性的修改等。

attention re-weighting

还有一种情况,用户可能想要强化或者弱化某个单词在最终的生图结果中反映的程度。比如原始 prompt 为 “a fluffy ball”,可能会想要控制生图结果中 ball fluffy 的程度。这种情况下的编辑函数其实不是注意力替换了,而是对 prompt 中某些 token 的注意力值乘上一个权重 c ∈ [ − 2 , 2 ] c\in[-2,2] c[2,2]
( E d i t ( M t , M t ∗ , t ) ) i , j : = { c ⋅ ( M t ) i , j    if  j = j ∗ ( M t ) i , j    oherwise (Edit(M_t,M_t^*,t))_{i,j}:= \begin{cases} c\cdot(M_t)_{i,j}\ \ \ \text{if}\ j=j^* \\ (M_t)_{i,j}\ \ \ \text{oherwise} \end{cases} (Edit(Mt,Mt,t))i,j:={c(Mt)i,j   if j=j(Mt)i,j   oherwise
接下来作者介绍了 prompt2prompt 的几种实际应用,包括 text-only localized editing、global editing、fader control 和 real image editing。这里就不一一介绍了。

提一下关于 real image editing,由于此时的待编辑图片不是模型生成的,而是真实图片,因此我们无法直接获得其去噪过程的交叉注意力图。对于真实图片,我们需要先根据图片反推出扩散模型的起始噪声,确保这个其实噪声输入扩散模型能够生成出这张真实图片。然后再使用 prompt2prompt 进行图像编辑。这种根据图片反推生成模型的起始噪声的技术称为 inversion。在之前的生成模型中,GAN Inversion 是图像编辑中的一种关键技术。而在扩散模型中,比较常用的是 DDIM Inversion 及其变体。这是因为 DDIM 的去噪过程是确定的,而原始的 DDPM 去噪过程每一步还加入了额外的随机噪声,无法做 inversion。关于 inversion 技术用于图像编辑也有相当多的工作,有兴趣的读者可自行查找。

代码简读

谷歌官方的 prompt2prompt 代码 封装得非常优雅,但第一次读起来可能会被稍显复杂的继承关系搞晕,这里简单梳理一下。diffusers 中集成的 prompt2prompt 代码 基本是将官方代码的主要部分搬了过来,然后通过 diffusers 库提供的可自定义的 AttnProcessor 的方式将 prompt2prompt 对注意力的修改注册到 unet 中,这里也简单介绍一下。

AttentionControlClasses

prompt2prompt 代码将注意力图修改抽象为了四层类。其中最顶层的三个子类 AttentionReplace、AttentionRefine、AttentionReweight 分别对应了本文介绍的三种编辑方式,这三个子类中主要是实现不同的 replace_cross_attention 方法。AttentionControlEdit 是这三个子类的共同父类,该类的 forward 方法定义了注意力图的存储(由其父类 AttentionStore 的 forward 方法实现)和编辑,其中注意力图的编辑需要调用 replace_self_attention(通用) 和 replace_cross_attention(由不同子类实现)。再低一层是 AttentionStore,该类主要是在其 forward 函数中定义了注意力图的存储,并由其子类通过 super().forward() 来调用。最底层是 AttentionControl,该类在 __call__ 方法中调用 forward 方法,最终子类的 __call__ 方法一直继承到这一层。

从调用链的角度(图中左下角)来说,最顶层的子类在实例化后调用 __call__ 方法时会一直向上继承调用到 AttentionControl 的 __call__ 方法,该方法调用了 forward 方法,Attention 的 foward 方法实现了注意力图的存储,AttentionControlEdit 的 forward 方法则结合其子类的 replace_cross_attention 方法实现了注意力图的修改。图中左下角调用链中红色部分是存在实际执行逻辑的方法,其他则是继承链中的抽象方法。

在这里插入图片描述

Utils

这里 是包括不同 token 对齐等在内的一些 utils,不作过多介绍。

P2PAttentionProcessor

在 diffusers 继承的 prompt2prompt pipeline 中,是通过自定义 AttnProcessor 的方式来进行上述注意力图修改的。

首先根据传入的 cross_attention_kwargs 参数,通过 create_controller 方法 实例化对应的注意力图修改类。然后通过 prompt2prompt pipeline 的 register_attention_control 方法 controller 实例化对应的 P2PAttnProcessor 类 ,并遍历替换掉 UNet 各层的原 AttnProcessor 类,这里其实只需要增加一行,在此处使用 controller 对原注意力图进行修改即可。

总结

prompt2prompt 是扩散模型图像编辑领域非常有意义的一个工作,它通过替换编辑图像生图过程中的交叉注意力图,使得生成出的编辑图像与原始图像的空间布局保持一致。从而实现了仅需修改 prompt 的图像编辑。在之后的 InstructPix2Pix、OMG 等图像编辑方法中,都用到了这项技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1621632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Checkpoint机制和生产配置

1.前提 在将Checkpoint之前&#xff0c;先回顾一下flink处理数据的流程&#xff1a; 2. 概述 Checkpoint机制&#xff0c;又叫容错机制&#xff0c;可以保证流式任务中&#xff0c;不会因为异常时等原因&#xff0c;造成任务异常退出。可以保证任务正常运行。 &#xff08;1&…

【iCloud】土耳其苹果礼品卡购买

礼品购买官网 注册账号后&#xff0c;点击苹果礼品卡&#xff0c;选择自己想要的一款加购 没有国外的卡&#xff0c;只能选这种方式付款&#xff0c;使用银联卡&#xff1a; 接着填入银行卡信息付款即可。

Xbox VR头盔即将推出,但它是Meta Quest的‘限量版’。

&#x1f4f3;Xbox VR头盔即将推出&#xff0c;但它是Meta Quest的‘限量版’。 微软与Meta合作推出限量版Meta Quest VR头映射Xbox风格&#xff0c;可能是Meta Quest 3或未来版本的特别定制版&#xff0c;附带Xbox控制器。这一合作是Meta向第三方硬件制造商开放其Quest VR头盔…

介绍一个开源IOT组态项目

项目介绍 金合可视化平台是一款强大而操作简便的低代码平台&#xff0c;专为满足物联网领域的可视化开发需求而设计。通过该平台&#xff0c;用户可以利用拖拽配置的方式&#xff0c;轻松创建个性化的可视化大屏&#xff0c;无需熟练的编程技能&#xff0c;大幅提高了开发效率。…

Go Sync并发包之errgroup

你是否写过一个函数&#xff0c;它之所以很长&#xff0c;是因为它要完成很多任务&#xff0c;即使这些任务之间并不相互依赖&#xff1f; 你是否写过一个很长的函数&#xff0c;因为它要完成很多任务&#xff0c;即使这些任务并不相互依赖&#xff1f;我就遇到过这种情况。 想…

k8s集群CD工具-ArgoCD

ArgoCD是什么 Argo CD 是 Kubernetes 的声明式 GitOps 持续交付工具。应用程序定义、配置和环境应该是声明性的和版本控制的。应用程序部署和生命周期管理应该是自动化的、可审计的且易于理解。 官方文档 CD工作流&#xff08;无ArgoCD&#xff09; 假设有一个微服务应用程序…

Python解析和嵌入媒体资源的工具库之micawber使用详解

概要 在Web开发中,经常需要处理媒体资源的解析和嵌入,例如视频、音频、图片等。Python Micawber库就是一个用于解析和嵌入媒体资源的工具,它可以自动识别各种媒体资源的URL,并生成对应的嵌入代码,方便在网页中展示多媒体内容。 安装 可以通过pip来安装Micawber库: pip…

RustGUI学习(iced)之小部件(一):如何使用按钮和文本标签部件

前言 本专栏是学习Rust的GUI库iced的合集&#xff0c;将介绍iced涉及的各个小部件分别介绍&#xff0c;最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个&#xff0c;目前处于发展中&#xff08;即版本可能会改变&#xff09;&#xff0c;本专栏基于版本0.12.1. 概述…

开源文本嵌入模型M3E

进入正文前&#xff0c;先扯点题外话 这两天遇到一个棘手的问题&#xff0c;在用 docker pull 拉取镜像时&#xff0c;会报错&#xff1a; x509: certificate has expired or is not yet valid 具体是下面&#x1f447;这样的 rootDS918:/volume2/docker/xiaoya# docker pul…

数据中台工具的选型要点_光点科技

数据中台工具扮演着举足轻重的角色。想要全面理解数据中台工具的意义、作用以及应用方式&#xff0c;就必须深入探讨这一概念以及相关实践。 数据中台工具概述 数据中台&#xff0c;是一个支持数据集成、管理、分析和服务的平台&#xff0c;它能够帮助企业统一数据资源&#xf…

Linux使用操作(一)

Linux创建链接的方式 在Linux中&#xff0c;可以给文件创建链接。链接的意思可以理解是快捷方式&#xff0c;它指向另一个文件或目录。 软链接 软连接&#xff08;也叫符号链接&#xff09;是一种特殊类型的文件&#xff0c;它指向另一个文件或目录 语法 ln -s 原文件路径…

udp/tcp错误总结

udp tcp——多进程 tcp——多线程 tcp——线程池 tcp——守护进程 &#x1f386;udp  ✨pthread_create 错误总结  ✨LockGuard错误总结  ✨服务端需要写成多线程  ✨客户端也需要写成多线程  ✨多线程调试工具 &#x1f386;tcp  ✨tcp独有调试工具——telnet  ✨Threa…

【Unity】UnityEvent(一)

​UnityEvent----高效管理游戏事件的利器 在游戏开发中&#xff0c;事件系统是实现各种功能的关键组成部分。它允许我们将不同对象之间的交互解耦&#xff0c;使得代码更加模块化和易于维护。而UnityEvent作为Unity引擎提供的一种强大的事件系统工具&#xff0c;为开发者提供了…

CTFHub(web sql)(四)

Cookie注入 Cookie 注入的原理也和其他注入一样&#xff0c;只不过是将提交的参数已 Cookie 方式提交&#xff0c;而一般的注入是使用 GET 或者 POST 方式提交&#xff0c;GET 方式提交就是直接在网址后面加上需要注入的语句&#xff0c;POST 方式则是通过表单&#xff0c;GET …

数据仓库与数据挖掘(实验一2024.4.24)

实验准备&#xff1a; 1.下载conda 2.配置环境C:\ProgramData\miniconda3\Scripts 3.创建文件夹panda进入虚拟环境qq 激活虚拟环境&#xff1a;activate qq 启动jupyter lab&#xff08;python语言环境编译&#xff09;&#xff1a;jupyter lab 4.panda下载 &#xff08;…

【行为型模式】中介者模式

一、中介者模式概述 中介者模式定义&#xff1a;用一个中介对象来封装一系列的对象交互&#xff0c;中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。(对象行为型模式) 中介者模式…

基于uni-app的动态表单

一、应用场景和意义 可以通过配置字段和校验规则&#xff0c;快速完成页面开发、提升开发效率 二、应用前提 形成ui/业务规范&#xff0c;最好是应用在问卷调查之类的业务 三、动态表单的功能 字段报错、快速滚动定位报错信息、支持字段值和字段规则拆分&#xff0c;便于实…

《R语言与农业数据统计分析及建模》学习——描述性统计分析

一、描述性统计概念和方法 1、概念和作用 描述性统计是对数据进行概括和描述&#xff0c;便于理解数据的特征、趋势和分布&#xff0c;帮助我们了解数据基本情况和总体特征&#xff0c;为后续更深入的数据分析和建模提供基础。 2、基础方法 &#xff08;1&#xff09;中心趋…

STM32的定时器

一、介绍 定时器的工作原理 通用定时器的介绍 定时器的计数模式 定时器时钟源 定时器溢出时间计算公式 二、使用定时器中断点亮LED灯 打开一个LED灯 更改TIME2 然后就是生成代码 三&#xff0c;代码

深度学习基础之《TensorFlow框架(15)—神经网络》

一、神经网络基础 1、什么是神经网络 人工神经网络&#xff08;Artificial Neural Network&#xff0c;简写为ANN&#xff09;。也简称为神经网络&#xff08;NN&#xff09; 是一种模仿生物神经网络&#xff08;动物的中枢神经系统&#xff0c;特别是大脑&#xff09;结构和功…