浅析扩散模型与图像生成【应用篇】(七)——Prompt-to-Prpmpt

7. Prompt-to-Prompt Image Editing with Cross Attention Control

  本文提出一种利用交叉注意力机制实现文本驱动的图像编辑方法,可以对生成图像中的对象进行替换,整体改变图像的风格,或改变某个词对生成图像的影响程度,如下图所示。
在这里插入图片描述
  之前的文本驱动的图像生成方法很难对图像的内容进行精细地编辑,哪怕只改变了一点文本提示的内容都可能让生成的结果发生非常大的改变,而无法保留原有的内容和结构。为了保留图像整体的结构,只对特定目标进行修改,有些方法通过让使用者给出要修改对象的掩码,引导算法只针对掩码的内容进行修改。但这种方式不仅非常麻烦,而且无法对整体风格进行编辑。因此作者希望提出一种只需修改文本提示内容,就可以直接编辑生成图像,且保持原本生成结果的内容和结构特征。
  作者发现在交叉注意力层建立了文本提示和图像像素之间的联系,通过在生成过程中插入或者修改交叉注意力层就可以实现对对应像素点的修改。实现的过程如下
在这里插入图片描述

  首先,我们先回顾一下文本驱动的图像生成过程中,交叉注意力层是如何工作的。包含噪声的图像 z t z_t zt其对应的特征图 ϕ ( z t ) \phi(z_t) ϕ(zt),经过一个线性层映射为一个query矩阵 Q = ℓ Q ( ϕ ( z t ) ) Q=\ell_{Q}(\phi(z_t)) Q=Q(ϕ(zt)),而文本提示 P \mathcal{P} P的特征向量 ψ ( P ) \psi(\mathcal{P}) ψ(P)被分别映射为key和value矩阵, K = ℓ K ( ψ ( P ) ) K =\ell_K(\psi(\mathcal{P})) K=K(ψ(P)) V = ℓ V ( ψ ( P ) ) V =\ell_V(\psi(\mathcal{P})) V=V(ψ(P))。则注意力图为 M = Softmax ⁡ ( Q K T d ) M=\operatorname{Softmax}\left(\frac{Q K^{T}}{\sqrt{d}}\right) M=Softmax(d QKT)其中的元素 M i j M_{ij} Mij表示第 j j j个token对于第 i i i个像素的权重值。交叉注意力层的输出为 ϕ ^ ( z t ) = M V \hat{\phi}(z_t)=MV ϕ^(zt)=MV,其被用于更新 ϕ ( z t ) \phi(z_t) ϕ(zt)。注意力层中每个单词和图像像素之间的对应关系如下图所示,可见即便在生成过程的早期阶段,单词和对应的像素之间已经具备较为明确的匹配关系。因此通过修改交叉注意力层就能够针对性的改变生成图像的内容。
在这里插入图片描述

  假设原本的文本提示 P \mathcal{P} P生成的图像为 I \mathcal{I} I,其对应的注意力图 M M M中包含着生成结果的主要内容信息。在根据修改后的文本提示 P ∗ \mathcal{P}^* P对图像进行编辑时,通过将 M M M插入到生成过程中,则可以保证修改后的生成结果 I ∗ \mathcal{I}^* I能够保留原有结果的主要内容。整个算法流程如下图所示
在这里插入图片描述
  其中 D M ( z t , P , t , s ) DM\left(z_{t}, \mathcal{P}, t, s\right) DM(zt,P,t,s)表示根据噪声图 z t z_t zt,文本提示 P \mathcal{P} P,时刻 t t t和随机数种子 s s s进行单步反向去噪生成 x t − 1 x_{t-1} xt1的过程。 M t M_t Mt M t ∗ M_t^* Mt分别表示原始文本和修改后文本对应的注意力图,对二者进行编辑可以得到 M t ^ \hat{M_t} Mt^,使用其取代 M t ∗ M_t^* Mt再进行反向去噪即可生成编辑后的图像。不同的修改方式对应了不同的编辑方法,下面将详细的介绍对注意力层进行编辑的方法 E d i t ( M t , M t ∗ , t ) Edit(M_t,M_t^*,t) Edit(Mt,Mt,t)

1. 更换单词(Word Swap)

  对于更改生成文本中某个单词的修改方式,如把“dog”换成“cat”。可以在某个生成步骤 τ \tau τ之后,直接用 M t ∗ M_t^* Mt取代 M t M_t Mt,如下式所示 Edit ⁡ ( M t , M t ∗ , t ) : = { M t ∗ if  t < τ M t otherwise.  \operatorname{Edit}\left(M_{t}, M_{t}^{*}, t\right):=\left\{\begin{array}{ll} M_{t}^{*} & \text { if } t<\tau \\ M_{t} & \text { otherwise. } \end{array}\right. Edit(Mt,Mt,t):={MtMt if t<τ otherwise. 正如我们前面所提到的,在生成过程的前几步就已经确定了生成对象的主要内容,因此可以先用原本的注意力图 M t M_t Mt进行一定次数的迭代, t = T → τ t=T\rightarrow\tau t=Tτ。然后再用修改后的注意力图 M t ∗ M_t^* Mt取代 M t M_t Mt,从而对在保留原本生成结果主体内容不变的基础上,根据更改的单词进行具体内容的修改。如下图所示,随着 τ \tau τ取值的不断变大,也就是越早使用 M t ∗ M_t^* Mt替换 M t M_t Mt(图中越靠近右边的部分),则生成的对象就越能更多的保留原本生成的内容,而如果完全不加入原本的注意力图 M t M_t Mt,则修改后的生成结果和原本生成结果之间基本没有任何联系。
在这里插入图片描述

2. 添加新的短语(Adding a New Phrase)

  这也是一个非常常见的修改方式,就在原本文字提示的基础上增加一些描述性的或限制性的短语。为了保留原本的生成对象,作者采用一种匹配的方式来计算修改后的文字提示 P ∗ \mathcal{P}^* P所生成的token和原本的文字提示 P \mathcal{P} P所生成的token之间的对应关系。 A ( j ) = k A(j)=k A(j)=k,就表示 P ∗ \mathcal{P}^* P的第 j j j个token与 P \mathcal{P} P的第 k k k个token相对应。若 A ( j ) = N o n e A(j)=None A(j)=None,则表示这个token是新添加的,在 P \mathcal{P} P中没有与之对应的token。在生成过程中,对于新添加的token就使用修改后的 ( M t ∗ ) i , j (M_t^*)_{i,j} (Mt)i,j来引导生成;否则,使用原本注意力图 M t M_t Mt中匹配的token A ( j ) A(j) A(j)所对应的元素 ( M t ) i , A ( j ) (M_t)_{i,A(j)} (Mt)i,A(j)来引导生成, ( Edit ⁡ ( M t , M t ∗ , t ) ) i , j : = { ( M t ∗ ) i , j if  A ( j ) = None  ( M t ) i , A ( j ) otherwise.  \left(\operatorname{Edit}\left(M_{t}, M_{t}^{*}, t\right)\right)_{i, j}:=\left\{\begin{array}{ll} \left(M_{t}^{*}\right)_{i, j} & \text { if } A(j)=\text { None } \\ \left(M_{t}\right)_{i, A(j)} & \text { otherwise. } \end{array}\right. (Edit(Mt,Mt,t))i,j:={(Mt)i,j(Mt)i,A(j) if A(j)= None  otherwise. 简单来说,就是如果某个token在原本的描述中是存在的就直接用它对应的注意力值,如果是新添加的token那么则使用修改后的注意力值。这种修改方式既可以对图像中局部的某个对象做修改,也可以对整幅图像的整体风格做编辑,如下图所示
在这里插入图片描述

3. 对注意力重新加权(Attention Re–weighting)

  这也是一个常用的编辑方式,就是加强或减弱文字提示中的某个描述词的程度,比如说让雪变更大一些或更小一些。作者通过引入一个权重值 c ∈ [ − 2 , 2 ] c\in[-2,2] c[2,2]来对注意力图中某个描述词对应的token进行重新加权,从而修改其影响程度,如下式 ( Edit ⁡ ( M t , M t ∗ , t ) ) i , j : = { c ⋅ ( M t ) i , j if  j = j ∗ ( M t ) i , j otherwise.  \left(\operatorname{Edit}\left(M_{t}, M_{t}^{*}, t\right)\right)_{i, j}:=\left\{\begin{array}{ll} c \cdot\left(M_{t}\right)_{i, j} & \text { if } j=j^{*} \\ \left(M_{t}\right)_{i, j} & \text { otherwise. } \end{array}\right. (Edit(Mt,Mt,t))i,j:={c(Mt)i,j(Mt)i,j if j=j otherwise. 这个方式也是非常的直观和简单,权重值 c c c为正数时则加强其效果,且数值越大加强的越多;反之,权重为负数时则减弱其效果,数值越小减弱的越明显,如下图所示。
在这里插入图片描述
  通过上述的介绍,我们看到虽然作者提出的方法都非常简单,但其实现的效果确实非常显著。但是值得注意的是这里的编辑对象都是通过文本生成的图像,也就是对生成结果的“二次创作”,那么这个方法能不能对真实拍摄的图像进行编辑呢?答案是可以的,实现的方法就是作者先用DDIM对真实拍摄的图像进行一次重建,也就是先不断地添加噪声使其变成一个随机噪声图,然后再逐步去噪使其恢复原图。在去噪的过程中就可以使用上述的方法进行编辑了,如下图所示

这里有个问题如果真是图像没有对应的文字描述怎么办呢?大概可以用一些图像描述算法来生成对应的文本

在这里插入图片描述

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

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

相关文章

《程序员的职业迷宫:选择你的职业赛道》

程序员如何选择职业赛道&#xff1f; 大家好&#xff0c;我是小明&#xff0c;一名在编程迷宫中探索的程序员。作为这个庞大迷宫的探险者&#xff0c;我深知选择适合自己的职业赛道有多么重要。今天&#xff0c;我将分享一些关于如何选择职业赛道的心得&#xff0c;希望能够帮…

网络编程作业day6

数据库操作的增、删、改完成 #include <myhead.h>//查询的回调函数 int callback(void* data,int count,char** argv, char** columnName) {//count是字段数//argv是字段内容//columnName是字段名称for(int i0;i<count;i) {printf("%s%s\n", columnName[…

2024全国水科技大会暨新能源及电子行业废水论坛(十一)

一、会议背景 为深入学习贯彻《中共中央、国务院关于全面推进美丽中国建设的意见》&#xff0c;全面贯彻实施《固体废物污染环境防治法》、《“十四五”全国城市基础设施建设规划》&#xff0c;推进我国污泥处理工程建设&#xff0c;提高处理产物资源化利用水平&#xff0c;促进…

Python内置模块

目录 什么是模块 模块分类 通过模块创建者分类 系统内置模块 第三方模块 在线安装 离线安装 模块导入 math和random模块介绍 math模块 random模块 什么是模块 在我们编写程序时&#xff0c;需要导入包。例如随机数的产生&#xff0c;需要import random。import XXX&…

XGboost的整理

XGboost&#xff08;extreme gradient boosting&#xff09;:高效实现了GBDT算法并进行了算法和工程上的许多改进。 XGboost的思路&#xff1a; 目标&#xff1a;建立k个回归树&#xff0c;使得树群的预测尽量接近真实值&#xff08;准确率&#xff09;而且有尽量大的泛化能力…

Java项目:39 springboot008房屋租赁系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 房屋租赁系统的设计基于现有的网络平台&#xff0c;主要有管理员、房东、用户三个角色 管理员可以在线查看系统已有的人中心、房屋类型管理、房屋信息…

创建java项目

文章目录 一、安装idea二、创建一个java项目1.设置名称 项目路径 安装JDK&#xff08;自己选择一个位置存放JDK&#xff09;2.创建完成之后 在src文件夹下创package包 再在包下创建Class类3. hellojava类创建完成设置打印语句 输出HelloJava 一、安装idea 官网地址 二、创建一…

不买后悔的阿里云服务器租用价格表_优惠活动整理_2024新版

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…

使用Http请求下载文件带来的问题

java.io.IOException: Broken pipe 当使用http请求的方式将文件作为响应内容给浏览器&#xff0c;这个时候如果浏览器未开启自动下载(浏览器可能会终止这个tcp连接)&#xff0c;文件不会下载成功&#xff0c;但是这个时候请求已经到达服务器&#xff0c;如果这个时候&#xff0…

Dynamo初学常识梳理(四)——Revit图元

希望想学 Dynamo 的小伙伴坚持住&#xff0c;每天积累一点点知识&#xff0c;Dynamo 你很快就能上手的&#xff01;Dynamo 并不是你想的那样难学哦&#xff01; 今天要讲的是如何从 Dynamo 中获取 Revit 的图元&#xff0c;这些节点很常用&#xff0c;不需要全背下来&#xff0…

指针运算笔试题解析

题目1&#xff1a; int main() { int a[5] { 1, 2, 3, 4, 5 }; int* ptr (int*)(&a 1); printf("%d %d", *(a 1), *(ptr - 1)); return 0; } ptr中存放了整个数组的地址&#xff0c;ptr是int*类型&#xff0c;&a1跳到5的地址后又被强制类…

算法DFS 复习

思路&#xff1a;for 代表的是每一位的纵向&#xff0c;数字变化&#xff0c;dfs 代表的是横向的&#xff0c;位置变化。vis 来做到每个枚举的数不重复&#xff0c;并且要在搜索前记录&#xff0c;搜索后还原。模拟该样例 dfs3 的时候是输出&#xff0c;dfs0&#xff0c;1&…

【DAY05 软考中级备考笔记】线性表,栈和队列,串数组矩阵和广义表

线性表&#xff0c;栈和队列&#xff0c;串数组矩阵和广义表 2月28日 – 天气&#xff1a;阴转晴 时隔好几天没有学习了&#xff0c;今天补上。明天发工资&#xff0c;开心&#x1f604; 1. 线性表 1.1 线性表的结构 首先线性表的结构分为物理结构和逻辑结构 物理结构按照实…

【LabVIEW FPGA】CIC滤波器

一、CIC滤波器应用概述 在通信数字信号上下变频时&#xff0c;经常会用到对数字信号的升采样和降采样&#xff0c;即通过CIC数字速率器实现变采样率。 二、滤波器IP 首先设置滤波器基本参数&#xff08;filter specification&#xff09; 滤波器类型&#xff08;Filter Type…

uipath调用js代码

1&#xff0c;调用js代码&#xff0c;不带参数&#xff0c;没有返回值 为了去掉按钮的disabled属性 function(){ document.getElementsByClassName(submitBtn)[0].removeAttribute(disabled); } 2&#xff0c;调用js代码&#xff0c;带参数&#xff0c;没有返回值 输入参数&a…

【conda】实现conda环境迁移的4种方式

文章目录 方案1: 使用conda pack制作压缩包并在目标环境解压使用方案2: 使用package列表文件重新创建conda环境方案3: scp将环境文件夹拷贝到目标主机上方案4: 通过--clone先克隆一个环境再conda pack打包迁移 方案1: 使用conda pack制作压缩包并在目标环境解压使用 适合离线环…

基于51单片机的四位并行数据主从机传输设计

基于51单片机的四位并行数据主从机传输设计[proteus仿真] 主从机通信系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于51单片机的四位并行数据主从机传输设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文…

WPF调用webapi并展示数据(一):WPF页面的构建

有错误欢迎大家给我指正 本项目为WPFPrismnet6.0 RestSharp调用API UI为MaterialDesignThemes EF Core自动生成数据库 效果展示&#xff1a; 项目启动后点击待办事项进入数据展示页 源码地址&#xff1a;绎Ronion/WPF.ToDo (gitee.com) 1.准备 1.1创建WPF项目 1.2 创建…

Axure 入门文档 文件格式 全局样式 元件居中

文件格式 .rp 原型文件.rplib:元件库文件.rpteam 团队项目文件.html 项目网页文件 批量设置居中 选中多个&#xff0c;然后上方任务栏即可设置 设置自定义页面视图尺寸 项目-自适应视图设置 点击页面空白处就可以使用 添加元件说明 当一个元件创建好&#xff0c;可以设…

[R] Underline your idea with ggplot2

Preview: # 介绍&#xff1a;之前的教程中&#xff0c;我们学习了如何使条形图或直方图看起来更好 比如&#xff1a; 1. How to select a graph calibrate the geom part 2. How to select variables calibrate the aes part 3. How to add a title calibrate the labs …