原文链接:https://www.techbeat.net/article-info?id=4375
作者:seven_
最近的一些工作向我们展示了AIGC在创造性生成图像、视频等方面的潜力,相信已有很多研究者在沿着这一方向进行拓展式的挖掘和创新。目前已有很多衍生应用出现在了大家眼前,例如仅通过手绘草图生成具有真实感的照片,该工作可以应用在很多设计领域,将设计师寥寥数笔画下的草图进行加工,可以提高工作效率。再比如另一个非常新奇的新功能,模型根据用户输入的指令就可以对目标图像进行P图修改,这一功能受到了广泛的关注。

论文链接:
https://arxiv.org/abs/2211.09800
代码链接:
https://www.timothybrooks.com/instruct-pix2pix
今天介绍的这篇文章就是这一应用的最新研究进展,来自加州大学伯克利分校。本文作者提出了一种可以完全根据人类指令来对图像进行编辑的模型,命名为InstructPix2Pix。需要注意的是,InstructPix2Pix与之前类似的方法不同,之前的方法在接收编辑指令时,更多的是倾向于描述编辑后的目标状态,例如在下图最左侧的“向日葵-玫瑰花”示例中。

之前方法输入的指令可能是“一个花盆中插满了玫瑰花”,其实这种描述首先带有一定的不确定性。而对于图像编辑任务本身而言,我们需要让模型关注的是要编辑的主体,以及编辑的最终效果。因此,最合适的编辑指令设置为“将向日葵更换为玫瑰花”即可,这样也更加符合人类的直觉。
InstructPix2Pix的提出就是为了解决这一问题,其整合了目前较为成熟的两个大规模预训练模型:语言模型GPT-3[1]和文本图像生成模型Stable Diffusion[2],生成了一个专用于图像编辑训练的数据集,随后训练了一个条件引导型的扩散模型来完成这一任务。此外,InstructPix2Pix模型可以在几秒钟内快速完成图像编辑操作,这进一步提高了InstructPix2Pix的可用性和实用性。
InstructPix2Pix模型的整体构建流程分为两大部分:(1)生成一个专用于图像编辑任务的数据集。(2)使用生成的数据集训练一个条件扩散模型,该模型可以按照人类的指令对目标图像进行各种形式的编辑操作,例如替换物体、更改图像本身的风格、修改图像的背景环境等等。如下图所示,当给InstructPix2Pix输入简单的更换背景指令“Make it Pairs”,模型会将画面的背景更改为埃菲尔铁塔,当输入指令为“Turn this into 1900s”,模型会将整个画面风格转换为20世纪拍摄的胶片风格,效果也是非常的逼真生动。

下图展示了InstructPix2Pix构建的框架图,作者还介绍到,InstructPix2Pix对任意输入的真实环境图像和人类指令都实现了zero-shot的泛化。下面我们将详细介绍上述步骤的具体实现细节。

上文提到,作者在InstructPix2Pix中整合了两个大规模预训练模型:语言模型GPT-3和文本图像模型Stable Diffusion,同时利用这两个模型中蕴含的知识构建了一个多模态训练数据集,该数据集主要包含了由文本编辑指令和编辑前后对应图像构成的图像对。在构建过程中,作者首先从文本编辑指令出发,生成成对的图像描述。随后再根据这些描述生成对应的成对图像构成训练样本。
在这一过程中,需要先给定一个图像文本描述,例如“一个女孩骑马的照片”,如上图(a)中所示,随后需要根据该文本描述生成一些合理的编辑指令,例如“让一个女孩骑龙”,更合理一点的描述为“一个女孩骑龙的照片”,这一操作可以通过GPT-3类似的文本大模型完成。需要注意的是,这些操作完全在文本域中进行,这样做可以生成大量的、多样性的编辑指令,同时能够保证图像变化和文本指令之间的对应关系。
具体来说,作者对GPT-3进行了专门的微调,首先收集了一个规模相对较小的人工编辑三元组数据集,三元组包含(1)输入的图像描述,(2)编辑指令,(3)输出的图像描述,数据集详细介绍如下表所示。

作者首先收集了700条图像描述样本,然后手动编写了编辑指令和输出图像描述,然后使用这700条样本对GPT-3模型进行微调,微调后的模型可以自行生成详细的训练样本,上表非常鲜明的展示了作者手动生成的样本和GPT-3随后生成样本的对比。
在得到成对的编辑指令后,作者使用文本图像模型Stable Diffusion将这两个文本提示(即编辑前和编辑后)转换为一对相应的图像,如上图(b)所示。然而这一过程仍然面临一个重大挑战:目前的文本到图像模型无法保证图像内容身份信息的一致性,即使在输入的条件提示变化非常小的情况下。
例如,我们为模型指定两个非常相似的文本提示:“一张猫的照片”和“一张黑猫的照片”,模型可能会产生两只截然不同的猫的图像,这对本文图像编辑的目的来说是不合理的。为了解决这一问题,作者想到使用这些成对数据来训练模型编辑图像,而不是遵循这些模型原本的生成模式去生成随机图像。
作者使用了最近新提出的Prompt-to-Prompt方法[3]来完成操作,该方法可以针对一个输入文本生成多代近似的图像,且这些图像彼此之间含有相同的身份信息,Prompt-to-Prompt通过在去噪过程中使用交互注意力权重来实现。下图展示了使用Prompt-to-Prompt方法和使用随机方法生成的图像效果对比。

InstructPix2Pix的建模本质是从隐空间扩散模型(Latent Diffusion)演变而来,Latent Diffusion通过在带有编码器
E
E
E 和解码器
D
D
D 的预训练变分自动编码器的隐空间中运行来提高扩散模型的效率和质量。对于一个图像
x
x
x,扩散过程将噪声添加到编码的隐层向量
z
=
E
(
x
)
z=\mathcal{E}(x)
z=E(x) 中,产生一个噪声隐变量
z
t
z_{t}
zt,其中噪声等级随时间步数
t
∈
T
t \in T
t∈T 而增加。然后训练一个网络
ϵ
θ
\epsilon_{\theta}
ϵθ ,它可以预测在给定的图像条件
C
I
C_{I}
CI 和文本指令条件
C
T
C_{T}
CT 下添加到噪声隐变量
z
t
z_{t}
zt 中的噪声信息,然后通过以下目标函数来优化模型:
之前的工作[4]表明微调大型图像扩散模型往往比从头训练模型以完成图像翻译任务效果更好,尤其是在配对训练数据有限的情况下。因此,本文作者使用预训练的Stable Diffusion对模型进行初始化。为了赋予InstructPix2Pix图像编辑的能力,作者在模型的第一个卷积层中增加了额外的条件输入通道。
为了进一步提高图像生成效果以及模型对输入条件的遵循程度,作者在InstructPix2Pix中也引入了Classifier-free引导策略。Classifier-free扩散引导是一种权衡扩散模型生成的样本质量和多样性的方法。其中隐式分类器 p θ ( c ∣ z t ) p_{\theta}\left(c \mid z_{t}\right) pθ(c∣zt) 会将更高的可能性分配给条件 c c c ,以提高生成图像的视觉质量并使采样图像更好地与输入条件相符合。Classifier-free引导的训练需要同时联合训练有条件和无条件去噪的扩散模型,并在推理时结合两个分数进行估计。
对于本文的任务,作者设计了一个评分网络
e
θ
(
z
t
,
c
I
,
c
T
)
e_{\theta}\left(z_{t}, c_{I}, c_{T}\right)
eθ(zt,cI,cT) ,其中有两个条件:输入图像
c
I
c_{I}
cI 和文本指令
c
T
c_{T}
cT 。在训练过程中,使InstructPix2Pix能够针对两个或任一条件输入进行有条件或无条件去噪。为此,作者引入了两个指导尺度
s
I
s_{I}
sI 和
s
T
s_{T}
sT,可以对其进行调整以权衡生成的样本与输入图像的遵循程度以及它们与编辑指令的遵循程度,评分网络的分数估计如下:

在下图的“将大卫变成半机械人”的例子中显示了这两个参数对生成样本的影响。
s
I
s_{I}
sI 控制与输入图像的相似性,而
s
T
s_{T}
sT 控制与编辑指令的一致性。

在实验部分,作者分别将本文提出的InstructPix2Pix与最近提出的几个相似的图像编辑模型SDEdit和Text2Live进行定性和定量的实验对比,如下图所示。我们可以观察到,虽然SDEdit和Text2Live等模型也可以在对图像整体风格基本保持不变的情况下对图像主体进行编辑,但其会丢失图像主体的一部分身份信息,尤其是在进行较大更改时。此外这些方法需要更加完整的图像生成描述,而不是编辑指令。

紧接着,作者对InstructPix2Pix进行了定量分析实验,实验结果如下图所示,作者使用SDEdit作为对比基线,作者绘制了两个指标的曲线走向:
通过这两个指标,可以清晰地展现出模型在图像编辑过程中对图像主体的保留程度以及编辑效果。从结果来看,InstructPix2Pix具有更明显的优势。

本文分别借助语言大模型GPT-3和图像文本模型Stable Diffusion构建出一个具有更高智能的图像编辑模型InstructPix2Pix。InstructPix2Pix的出现解决了之前方法中存在的编辑指令不直接、不确定的问题。作者通过手动收集了700条标注数据对现有大模型进行微调,进而完成了整个框架的训练,这一过程也为我们明确了对现有大模型装置的二次研究路径,增强了我们对AIGC社区开发更多更好应用的信心。
[1] Tom Brown, Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared D Kaplan, Prafulla Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Sastry, Amanda Askell, et al. Language models are few-shot learners. Advances in neural information processing systems, 33:1877–1901, 2020.
[2] Robin Rombach, Andreas Blattmann, Dominik Lorenz, Patrick Esser, and Bjorn Ommer. High-resolution image synthesis with latent diffusion models. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition, pages 10684–10695, 2022.
[3] Amir Hertz, Ron Mokady, Jay Tenenbaum, Kfir Aberman, Yael Pritch, and Daniel CohenOr. Prompt-to-prompt image editing with cross attention control. arXiv preprint arXiv:2208.01626, 2022.
[4] Tengfei Wang, Ting Zhang, Bo Zhang, Hao Ouyang, Dong Chen, Qifeng Chen, and Fang Wen. Pretraining is all you need for image-to-image translation. arXiv preprint arXiv:2205.12952, 2022.
Illustration by Manypixels Gallery from IconScout
-The End-
关于我“门”
▼
将门是一家以专注于发掘、加速及投资技术驱动型创业公司的新型创投机构,旗下涵盖将门创新服务、将门-TechBeat技术社区以及将门创投基金。
将门成立于2015年底,创始团队由微软创投在中国的创始团队原班人马构建而成,曾为微软优选和深度孵化了126家创新的技术型创业公司。
如果您是技术领域的初创企业,不仅想获得投资,还希望获得一系列持续性、有价值的投后服务,欢迎发送或者推荐项目给我“门”:
bp@thejiangmen.com
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#