该文提出一种精细的由文本指令驱动的图像编辑技术,与InstructPix2Pix类似,给定一段文字修改指令就能对图像进行准确精细的修改。作者认为现有的图像编辑技术,如InstructPix2Pix,在理解和执行指令上还存在困难,并且他们的泛化能力仍然有限,在与他们训练数据存在差别的任务中表现有所下降。Emu Edit在执行编辑指令和保留原始图像的视觉保真度方面都取得了实质性改进。作者主要做了两方面的工作:一是在包含16种图像编辑任务的多任务条件下对模型进行训练;二是引入了学习型任务嵌入的概念,针对每个任务都训练一个对应的嵌入特征,并将其引入到模型中。在这两个方法的帮助下,Emu Edit在众多图像编辑任务中都取得了令人惊异的优秀表现,如添加、移除对象,修改背景、风格,甚至是目标识别和分割等。
为了实现在多个图像编辑任务中的模型训练,需要一个数据集包含:原始图片,文本描述和修改后的图片,现有数据集都难以满足高质量、大规模、多任务这三个要求,因此作者首先构建了一个大规模的高质量图像编辑数据集。作者将所有图像编辑任务分成三大类:基于区域的编辑(例如添加、移除对象)、*形式编辑(如风格迁移)和其他视觉任务(如目标检测、分割)。然后,微调一个语言大模型(LLama2-70B)根据图像的描述(一只猫)和任务类型(添加物体),输出编辑指令(增加一个粉红色夹克)、要编辑的目标物体(夹克)、新的图像描述(一只穿着红色夹克的猫)和原始的目标对象(猫)。根据这些条件信息,来获取对应的修改后的图片。作者利用DINO-SAM根据编辑指令得到要编辑区域的掩码,然后利用DiffEdit中的技术将这些掩码融入到编辑过程中,实现区域之间的无缝拼接,最后作者还对这些生成好的图像进行过滤和筛选。最终得到一个包含1千万张图片对和文本指令的图像编辑数据集。
Emu Edit的网络结构采用了Emu中的设置,包括一个含有28亿参数的UNet扩散模型
ϵ
θ
\epsilon_{\theta}
ϵθ,一个编码器
E
E
E和解码器
D
D
D,和来自CLIP ViT-L和T5-XXL模型的文本嵌入。给定一张输入图像
x
x
x,经编码得到潜在特征
z
=
E
(
x
)
z=E(x)
z=E(x),经过扩散过程得到含有噪声的特征
z
t
z_t
zt。将含有噪声的特征
z
t
z_t
zt,与时刻
t
t
t,修改后的图像潜在特征
E
(
c
I
)
E(c_I)
E(cI)和文本指令嵌入
c
T
c_T
cT一起输入到模型中,进行训练。损失函数依旧是扩撒模型常用的
min
θ
E
y
,
ϵ
,
t
[
∥
ϵ
−
ϵ
θ
(
z
t
,
t
,
E
(
c
I
)
,
c
T
)
∥
2
2
]
\min _{\theta} \mathbb{E}_{y, \epsilon, t}\left[\left\|\epsilon-\epsilon_{\theta}\left(z_{t}, t, E\left(c_{I}\right), c_{T}\right)\right\|_{2}^{2}\right]
θminEy,ϵ,t[∥ϵ−ϵθ(zt,t,E(cI),cT)∥22]
为了提高对于特定任务的适应性,作者又引入了学习型任务嵌入的概念,就是单独定义了一组嵌入式向量
v
i
v_i
vi,
i
i
i表示第
i
i
i个任务,并将其加入到模型中。一方面将
v
i
v_i
vi与时间步数嵌入相加,另一方面参考Prompt-to-Prompt通过交叉注意力机制将任务嵌入融合进去。损失函数如下
min
θ
,
v
1
,
…
,
v
k
E
y
^
,
ϵ
,
t
[
∥
ϵ
−
ϵ
θ
(
z
t
,
t
,
E
(
c
I
)
,
c
T
,
v
i
)
∥
2
2
]
\min _{\theta, v_{1}, \ldots, v_{k}} \mathbb{E}_{\hat{y}, \epsilon, t}\left[\left\|\epsilon-\epsilon_{\theta}\left(z_{t}, t, E\left(c_{I}\right), c_{T}, v_{i}\right)\right\|_{2}^{2}\right]
θ,v1,…,vkminEy^,ϵ,t[∥ϵ−ϵθ(zt,t,E(cI),cT,vi)∥22]在推理时,任务类别无需人工指定,而是单独微调了一个Flan-T5-XL模型根据输入的编辑指令来判断任务类别。该模型具备少样本的任务学习能力,实验表明最少只需要一个样本的训练,就能在新的任务上取得非常明显的效果提升。在对新任务进行学习时,为了快速训练,保持原有的生成能力不受影响,仅对任务嵌入的参数进行更新,而保持整个Unet模型参数锁定。
在对图像进行连续编辑时,会出现“误差累积”的现象,就是图像越来越失真。为了提升连续编辑的效果,作者提出一种简单的方法,逐像素计算编辑后图像和原始图像之间的像素差值,只有差值大于一定阈值的像素点才会更改为新的图像,其他的保持原图不变。