浅析扩散模型与图像生成【应用篇】(七)——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;希望能够帮…

代码随想录算法训练营第一天|704.二分查找、27.移除元素

题目 704. 二分查找 相关企业 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], tar…

标准C库函数之perror()、strerror(),以及他们之间各种的优缺点(打印错误信息)

标准C库函数之perror()、strerror()&#xff0c;以及他们之间各种的优缺点&#xff08;打印错误信息&#xff09; 前言 如果&#xff0c;想要深入的学习标准C库中perror、strerror函数&#xff0c;还是需要去自己阅读Linux系统中的帮助文档。 具体输入命令&#xff1a; man 3…

网络编程作业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;促进…

堆排序实现

在了解堆的一些性质后&#xff0c;我们可以根据这些性质来实现一个较优的算法&#xff0c;也就是堆排序。 堆排序&#xff0c;顾名思义就是排序&#xff0c;其运用到堆的各种性质。首先我们要创建一个堆&#xff0c;在原有数组上进行向上或者向下调整使其变成一个堆。那么这时…

typedef的详细理解

目录 1.typedef对整型指针进行重命名 2.typedef对数组指针进行重命名 3.typedef对函数指针进行重命名 总结&#xff1a;所有重新命名的函数名必须写在*号旁边。 1.typedef对整型指针进行重命名 代码如下&#xff1a; typedef int* pint; int main() {int* p NULL;pint p…

Python内置模块

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

计算机基础专升本笔记-汇总笔记(三)常用文件格式

计算机基础专升本笔记-汇总笔记&#xff08;三&#xff09;常用文件格式 一、文本文件格式 扩展名&#xff08;后缀名&#xff09;文件类型docxWord2010文档dotxWord2010模版xlsxExcel2010文档xltxExcel2010模版pptxPower Point 演示文稿potxPower Point 2010模版ppsxPower P…

XGboost的整理

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

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

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

在 Android 中使用 Kotlin 调用动态库

在 Android 开发中&#xff0c;有时候需要使用原生代码来执行一些特定的任务&#xff0c;比如高性能计算、访问硬件或者使用现有的 C/C 库。通常&#xff0c;这样的原生代码会被编译成动态库&#xff08;.so 文件&#xff09;&#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核…

面试经典150题(105-107)

leetcode 150道题 计划花两个月时候刷完之未完成后转&#xff0c;今天&#xff08;第2天&#xff09;完成了3道(105-107)150 105.&#xff08;191. 位1的个数&#xff09;题目描述&#xff1a; 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&am…

simplex算法的代码实现

def pivot(N, B, A, b, c, v, l, e):N对应非基本元变量下标,B对应基本元变量下标,A对应非基本元在约束方程组中的系数相反数形成的矩阵,b对应约束条件中小于等于号右边的数值集合,c对应目标函数中变量系数形成的集合,v对应当前目标函数的取值,l对应转出变量下标在B中的位置,e…

使用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的地址后又被强制类…

Freesia Spring配置文件与其他文件

common-api模块【application.yml文件】 project:version: 来自顶级pom.xml的properties配置 --- spring:profiles:# 根据当前活跃环境指定对应的 application文件active: profiles.active --- spring:datasource:driver-class-name: com.p6spy.engine.spy.P6SpyDriverurl: jd…