文章目录
前言
之前的文章里,我们已经总结了AIGC几篇经典文章,这篇博文,我们将总结ICCV的best paper ControlNet,后续的文章将解析score base以及consistency model。
以往的condition diffusion model多通过文字来控制生成的图像,但是控制粒度仍然不够细。试想一个场景,我们对于生成图像中人类的姿态有所要求,例如下图,我们很难用语言来描述符合要求的人类姿态,现有的文生图模型很难满足我们的需求。
基于此背景,便有了ControlNet,其在文生图模型的基础上,允许用户通过简单的图像条件来更细粒度的控制生成的图像,如下图所示
Method
其实用CFG也可以实现上述需求,但这意味着需要耗费大量资源重新训练模型,并且需要构建优质的训练数据。ControlNet的想法是直接微调已训练好的Stable diffusion模型,在固定Stable Diffusion模型参数的前提下,通过额外可训练的参数在decoder中引入图像控制信息,微调Stable Diffusion模型的decoder结构。
整体结构
其整体结构下图(b)所示
设在隐空间中,文本prompt为 c t c_t ct,反向过程轮数为 t t t,图像控制条件为 c f c_f cf,Stable Diffusion的输入为 z t z_t zt,则ControlNet的输入包括四个部分
- 图像控制条件 c f c_f cf
- 文本prompt c t c_t ct
- 反向过程轮数 t t t
- Stable Diffusion的输入 z t z_t zt
ControlNet结构的关键内容为初始化,体现在三个方面
- 利用Stable Diffusion模型的Encoder block和Middle block初始化ControlNet的Encoder。
- 图像控制条件 c f c_f cf经过一层零卷积后与Stable Diffusion的输入 z t z_t zt相加,则在训练初期,ControlNet每一个block的输出与stable diffusion的encoder一致。
- ControlNet每一个block的输出都经过一个零卷积后与Stable Diffusion的decoder中对应block的输出相加,从而在decoder中引入额外的图像控制信息。
注意到上述所有操作都是在隐空间进行的,因此我们需要用一个CNN网络将图像控制条件
c
i
c_i
ci映射到隐空间,得到
c
f
c_f
cf。
训练流程
训练流程和常规的Diffusion model一致,其loss为预测添加到图像中的噪声
ϵ
\epsilon
ϵ,如下图所示
整体的训练流程为
- 训练数据为图像对:<文本,原图对应的图像控制条件(例如纹理图、姿态),原图>,例如下图
- 将图像对映射到隐空间
- 将原图、文本prompt、time embedding输入到stable diffusion的encoder中
- 将图像控制条件、文本prompt、time embedding输入到controlnet中
- controlnet每个block的输出与stable diffusion的decoder中对应的block的输出相加,输入到decoder下一个block中
- 利用decoder输出的噪声计算loss
为了使用CFG(Classifier-free guidance)进行条件生成,在训练时会随机置空50%的文本prompt。
测试流程
设无文本prompt情况下生成的图像为 ϵ u c \epsilon_{uc} ϵuc,有文本prompt情况下生成的图像为 ϵ c \epsilon_c ϵc,则在使用CFG情况下,最终生成的图像 ϵ p r e d \epsilon_{pred} ϵpred为
ϵ p r e d = ϵ u c + β ( ϵ c − ϵ u c ) \epsilon_{pred}=\epsilon_{uc}+\beta(\epsilon_c-\epsilon_{uc}) ϵpred=ϵuc+β(ϵc−ϵuc)
依据CFG的原理,ControlNet仅参与 ϵ c \epsilon_c ϵc的生成,但是实验结果显示控制效果太强,生成的图像会趋近于图像控制条件(纹理图等),基于此背景,作者提出了CFG-RW,具体流程为:
- 仅在生成 ϵ c \epsilon_c ϵc时引入ControlNet。
- ControlNet每个block的输出都会乘以一个系数 w i w_i wi后再与stable diffusion对应decoder block的输出相加,其中 w i = 64 / h i w_i=64/h_i wi=64/hi, h i h_i hi为第 i i i个block输出的feature map的分辨率大小。
- 利用输出的 ϵ c \epsilon_c ϵc,套用CFG生成最终的图像。
上述流程也适用于文本条件空置情况下的图像生成
为什么要使用零卷积?
注意到stable diffusion是在大规模数据上”预训练“过的,因此模型收敛到的参数泛化性非常好,假设不使用零卷积初始化,则初始阶段模型的参数将远离“预训练”时收敛到的泛化性较好的参数(甚至是很差的参数),可能对微调的结果产生较大的影响。
为什么使用Stable diffusion的encoder初始化ControlNet
猜测是作者随便拍的。ControlNet的作用是往decoder中引入额外的控制条件,例如生成图像的纹理、姿态等等,因此ControlNet需要具备提取图像中的纹理、姿态等基础能力。如此看来,Stable diffusion的encoder未必是最优的选择,作者没有做过随机初始化或用其他预训练模型初始化ControlNet的实验。但从结果来看,Stable diffusion虽然做的是噪声预测,但其encoder确实具备提取图像初级语义信息的能力。
没有loss的指引情况下,ControlNet如何学会follow input condition image
如下图所示,作者提到微调过程中,Stable diffusion是忽然学会follow input condition image的。
为了引导模型往match input condition的方向优化,训练数据中的图像控制条件与最终生成的图像必须要有很强烈的对应关系(例如test input和 step 6133这种对应关系),按实践经验来看,模型是不会忽略这种强对应关系的。ControlNet也是通过上述策略来引导模型往match input condition的方向优化,因此我们可以看到模型似乎是忽然开窍一般忽然学会了match input condition。如果有合适的loss指引,则我们看到的将会是渐变性的match input condition。由此可见,ControlNet要想有效果,微调的训练数据质量应该足够高(图像控制条件与生成的图像需要有很强烈的对应关系)。
为什么使用零卷积仍然有梯度
只要某一层的输入不为0,则对应的权重项就有梯度,注意到图像控制条件
c
f
c_f
cf在经过第一层零卷积的处理后,会与
z
t
z_t
zt相加(看前文controlnet的图),这保证了controlnet后续层的输入不为0,从而确保与decoder相连的零卷积有梯度存在。值得一提的是,训练的第一个step,第一层零卷积的梯度会为0。
实验结果
作者主要评估了零卷积的作用,包含了两个消融实验
- 将零卷积替换为随机初始化的卷积
- 去除零卷积
同时试验了四种情况下图像生成的效果
- 无文本prompt
- 与生成图像关联性不强的文本prompt,比如 high-quality and detailed masterpiece
- 与生成图像矛盾的文本prompt
- 完美描述生成图像的文本prompt
结果如下图,结果很好的验证了零卷积的作用
此外作者也与其他方法比对了生成图像的质量