InstructPix2Pix: 动动嘴皮子,超越PS
摘要:InstructPix2Pix提出了一种使用文本编辑图像的方法:给定输入图像和编辑指令,告诉模型要做什么,模型将遵循这些指令来编辑图像。
本文分享自华为云社区《InstructPix2Pix: 动动嘴皮子,超越PS》,作者:杜甫盖房子。
InstructPix2Pix: Learning to Follow Image Editing Instructions
InstructPix2Pix提出了一种使用文本编辑图像的方法:给定输入图像和编辑指令,告诉模型要做什么,模型将遵循这些指令来编辑图像,如:

我们在ModelArts中发布了一个notebook方便大家玩一玩,同时也将对模型的实现方法进行简单介绍:

方法概览
在InstructPix2Pix中,作者通过有监督的方法来实现文本编辑图像。方法主要包括两部分:
- 数据集生成:作者整合了语言模型GPT-3和文生图模型Stable Diffusion,生成了一个用于图像编辑的数据集;
- 模型训练:作者使用生成的数据集训练了一个条件扩散模型来实现文本编辑图像:

在推理时,图像在模型forward过程中被编辑,不需要微调,因此推理速度很快,可玩性较高。
数据准备
在数据准备时,首先通过GPT-3生成一些文本编辑指令,之后通过Stable Diffusion和Prompt-to-Prompt生成编辑前后文本图像对。
生成文本编辑指令
作者使用了700条人工标注的文本编辑指令三元组微调GPT-3,之后使用微调过的GPT-3生成大规模的文本三元组。如下图,文本三元组包括(1)输入描述;(2)编辑指令;(3)编辑后的描述。
在使用GPT-3生成数据集时只需提供输入描述,高亮的编辑指令与输出描述都由GPT-3生成,这样可以保证描述指令的多样性。

生成图像对
在得到描述对后,作者使用Stable Diffusion将编辑前与编辑后的描述转换成图像对。在这个过程中面临了一个挑战:即使输入提示只有微小的不同,生成的图像也无法保证内容的一致性,如分别使用“photograph of a girl riding a horse”和“photograph of a girl riding a dragon”为提示生成图像,会得到下图内容:

为了解决此问题,作者使用了Prompt-to-Prompt方法。该方法通过在扩散过程中注入原始图像的注意力图来控制编辑图像的注意力映射,实现了内容一致的图像生成。使用该方法与相同的提示词,会得到下图内容:

作者共生成 454,445 个样本,生成的数据可以通过开源脚本下载。
条件扩散模型
InstructPix2Pix通过训练条件扩散模型来实现根据输入图像和文本指令来编辑图像的功能。作者使用预训练的Stable Diffusion对模型进行初始化,同时在第一个卷积层增加了额外的条件通道来支持图像编辑。在训练时模型将输入图像xx编码为隐向量z=E(x)z=E(x),在扩散过程中将噪声tt添加到编码向量zz中得到隐噪声变量ztzt,其中噪声等级随时间提升。
训练一个网络ϵθϵθ来预测在给定的图像条件cIcI和文本指令cTcT下的噪声tt,目标函数:

为了平衡扩散模型生成的样本的质量和多样性,作者在InstructPix2Pix中引入了Classifier-free Guidance方法。当我们使用一个条件来生成图像时,我们希望生成的图像与该条件有较高的相关性,Classifier-free Guidance利用一个隐式分类器 pθ(c∣zt)pθ(c∣zt) 来对生成的样本进行评分。其中,ztzt是一个编码图像的潜在表示,cc是一个条件,可以是一个文本描述或者其他图像。这个分类器会对每个样本分配一个相应的分数,表示该样本与给定条件的相关性。训练时,会通过噪声引导使概率偏向那些隐式分类器得分高的数据点上,从而提高生成的样本与给定条件的相关性。
对于文本编辑图像任务,作者设计了评分网络 eθ(zt,cI,cT)eθ(zt,cI,cT),对于图像条件cIcI和文本指令cTcT设计了指导尺度sIsI和sTsT,可以调整网络对输入图像和编辑指令的遵循程度:

针对不同的指导尺度作者给出了示例实验结果:

更多实验结果与局限性讨论可以在Project Page中查看。
案例介绍
上文提到,为了方便大家玩一玩,我们ModelArts中发布了一键运行的notebook,除了可以免去复杂的环境适配步骤外,还可以享受免费GPU资源
开源模型下载好慢好慢,体贴的我也为大家将资源转存到OBS中:

此外,预训练模型只支持英文,哪里有英语废,哪里就有翻译,翻译模型也准备好了,惊不惊喜,意不意外:

案例使用gradio搭建了一个小小的应用,一键运行后直接在应用框输入图片与中文编辑命令生成结果即可:

使用结束后不要忘记关闭哦:

InstructPix2Pix: 动动嘴皮子,超越PS的更多相关文章
- 面试想拿 10K,HR 说你只值 7K,该怎样回答或者反驳?
当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫. 礼貌地说:"7K是吗?了解了.嗯~其实我对贵司的面试官印象很好.只不过,现在我的手头上已经有一份11K的offer. ...
- 控制反转(Inversion of Control)之我的理解
关于控制反转(Inversion of Control),在具体实现上也有许多其它的叫法,如依赖倒置(Dependency Inversion Principles, DIP).依赖注入(Depend ...
- 夏宇闻教授谈FPGA工程师的入门学习
1. 必须清楚自己究竟适合不适合做工程师. 看看自己的性格特点,是不是特别安静,又耐得住寂寞.因为FPGA工程师是一个辛苦的工作,不但要通过不断学习研究提升自己的设计水平,还要经常性的熬夜加班敲写代码 ...
- 【转载】给想要入门渗透的人的忠告——schiz0wcingU
最近发现很多拥有黑客梦想的年轻人在群里或者论坛里,找"师傅"或者学一些所谓的"社工" 这些找师傅的人当中,有极大一部分人是还在上学的学生,自然也就没有收入来源, ...
- 听说尤雨溪在开发vue4.0?是谁煽动了前端圈的焦虑情绪
导火索因P图而起 今天前端圈里被一张P图搞得好热闹,最初只是QQ群里一个冒名尤雨溪的前端网友发了一句调侃的话,原话截图如下: 看完觉得好搞笑,说尤雨溪在开发vue4.0,有谁学不动了,就给他发10块钱 ...
- 【硅谷问道】Chris Lattner 访谈录(上)
[硅谷问道]Chris Lattner 访谈录(上) 话题 Chris Lattner 是谁? Xcode 的编译器 LLVM 背后有怎样的故事? Swift 诞生的前世今生,封闭的苹果为何要拥抱开源 ...
- emmm 深入浅出教你看懂现代金融游戏
3303只信仰公平[网易陕西省西安网友]1 比特币是骗人的.你们都被“现代帼家纸币”概念茜脑了,而且茜的很彻底,所以你们看不透比特币的骗局.简单来说,现代纸币是“空气纸”,比特币是“空气币(空气数据) ...
- 为什么我严重不建议去培训机构参加SAP培训?
欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 关于是否要参加SAP培训的话题已经是老生常谈了,知乎上随便一搜有好多人在问是否要去参加SAP培训,底下已经有很多人在上面给出了正确建议.但也 ...
- 硝烟中的Scrum和XP
硝烟中的Scrum和XP 初次接触Scrum和XP(更加准确的说是"看到"),心里不免有些疑问,软件开发为什么会有如此多的方式,难道软件开发.软件工程不就是写写代码的事儿吗?直到后 ...
- 10 Dubbo 配置实战
Dubbo 配置实战 快速入门 dubbo 建议看这篇文章是在学习了快速入门 dubbo 那篇文章的基础上来学习 配置说明 文档地址 https://dubbo.apache.org/zh/index ...
随机推荐
- git使用采坑-The project you were looking for could not be found 解决方式
清除本地git账户,重新输入用户名密码(最优) git config --system --unset credential.helper之后再进行git操作时,弹出用户名密码窗口,输入即可 详情如下 ...
- shell_Day02
虽然差了不少天,但的确是第......一天 history 查看历史命令记录 !命令序号 查看命令并执行 -c 清空 关于命令历史的文件 关于命令历史的变量(环境变量) 命令补全 tab:制表符 \t ...
- 微信小程序:微信web开发阶段性学习总结
小程序运行机制 前台/后台状态 小程序启动后,界面被展示给用户,此时小程序处于前台状态. 当用户点击右上角胶囊按钮关闭小程序,或者按了设备 Home 键离开微信时,小程序并没有完全终止运行,而是进入了 ...
- 北大2022编译原理实践(C/C++)-sysy 编译器构建
这是今年新推出的实践方案,由往年的sysy->IR1->IR2->RISC V变成了sysy->Koopa->RISC V,通过增量的方式让整个实践过程更容易上手 所以先 ...
- bzoj 4573
LCT神题... 首先暴力的做法就是每次在一个区间上link,然后暴力查询,时间复杂度$O(爆炸)$ 但是我们可以发现的是,每棵树之间互不影响! 因此我们可以考虑离线之后分别统计每棵树 但是这样做其实 ...
- word在指定页面设置页码
需求:比如,毕业论文前面几页要求罗马数字(摘要-目录)(这里设置页码格式即可完成),后面全是阿拉伯数字(这里比较难搞,以下方法是解决这里的) 方法: 1. 光标移到指定页面的第一个字符所在的位置前 2 ...
- C# WPF 自学 MVVM简单介绍
一.MVVM介绍 MVVM是Model-View-ViewModel(模型-视图-视图模型)的缩写形式 1.View就是用xaml实现的界面,负责与用户交互,接收用户输入,把数据展现给用户. 2.Vi ...
- #Python #微信 #消息防撤回 Python实现微信防撤回
微信(WeChat)是腾讯公司于2011年1月21日推出的一款社交软件,8年时间微信做到日活10亿,日消息量450亿.在此期间微信也推出了不少的功能如:"摇一摇"."漂流 ...
- c++ dll 传递string参数
用c++编写了一个dll,需要传递一个路径的变量参数,刚开始想着使用string变量,但是在实践过程中string变量会成为乱码,尽量避免使用string变量传递参数,可以使用const char* ...
- char和int的类型转换
char类型是16位的,底层采用unicode编码保存.char类型是可以直接赋值给int类型的,因为是16位到32位低到高.举个例子比如int i='1';打印i的值是49.char类型跟int类型 ...