动机
在现有的文生图模型中,我们可以通过文字描述来让模型生成对应的图片。然而在某些时候,我们的文字描述并不能十分准确地描述我们脑海中想要的图片的要求,就比如一个人的特定姿势,我们很难用语言来准确描述出他的肢体的摆放位置,身体比例,脸部细节或特征等等。就好像这样:
我们想要生成类似这个姿势的人的图像:
实际上我们很难准确地描述出他的姿势对吧,于是我们就希望能够通过一些比文字更加具体可理解的形式,让模型学习到我们的需求,然后生成符合我们需求的图片!
就好像这样:
在文章中作者给出的效果图:
怎么样,效果很可以吧!
思路
那我们要怎么做到这一点呢?
假如我们直接把我们的条件控制图扔给模型训练学习条件控制,行吗?
显然是不行的。原因主要有以下几点:
1.原本人家一个Diffusion模型在指定训练集下训练可以得到很不错的结果,如果你贸然向里面添加额外的训练数据,很可能会毁坏模型的Latent Space分布,使得模型最终生成的图片质量大大降低。(那我还不如不加呢)
2.对于某一类条件控制,我们的训练数据往往很少。而把如此少量的训练数据扔给一个大型的Diffusion模型会导致严重的过拟合问题以及灾难性遗忘。这显然是我们不想看见的。
3.训练一个大型Diffusion模型的成本太高了,每当我们需要生成不同条件控制下的图片时,都需要重新训练整个模型,这对于小规模的ai图片创作来说显然是不可接受的。
综合以上几点,我们很显然可以看出,直接把条件控制给模型学习是不可取的。
那我们要怎么生成高质量的,又符合我们条件控制的图片呢?
首先针对第一个问题,也即直接添加训练数据可能破坏原本模型的Latent Space分布从而降低图片质量的问题,假如我们用一个已经训练好的模型作为基础,把它的参数锁住,这样就成功保留了一个具备良好性能的Diffusion模型,能够保证生成图片的质量了,对吧!
接下来,要怎么让它学习到条件呢?
emmm....既然不能够同时学习生成图片跟条件控制,那我们能不能单独学习条件控制呢?
于是我们直接复制一份原模型中未锁定的可训练的编码器,用来单独训练条件控制!这样子,我们是不是就成功解决了后两个问题!我们单独训练条件控制,就避免了过拟合的问题;而选择另外训练条件控制,而不是训练整个模型,也大大降低了我们的成本。
最后,再将条件控制的训练结果跟原模型的结果直接拼接起来,送到decoder中,我们就能够生成符合我们条件控制的高质量图片了!
于是,我们便得到了文章中提出的基本架构:
诶,我是不是漏了什么部分?噢,这里的零卷积层是用来防止随机初始化的权重矩阵带来的干扰的。虽然它的权重一开始都是0,但是它的梯度并不是0,因此BP是可以对其权重进行有效更新的!
ControlNet的基本结构就是这样,我们来看看整体的结构。
这里的*3表示对应的块连续放三个。
到这里,有的同学可能注意到了,我们这个ControlNet的所有操作实际上是在Latent Space中完成的,而我们的条件控制都是图片的形式,所以我们不能直接把条件控制图片扔进去,而要把控制条件映射到Latent Space中,再输入ControlNet中去。原文中表述如下:
作者用了一个简单的CNN来完成这件事情。
于是,我们做到了!
试试看效果如何呢?
咦?怎么生成出来的图片好像不太行呢?难道哪里还有不够合理的地方吗?!!
仔细观察分析一下:这🦅的羽毛颜色怎么这样呢??喙的颜色也跟羽毛差不多啊??除了颜色的问题之外,形状上倒是完美符合我们的条件控制。那......这是不是说明了我们的条件控制过于强烈了呢?
哈哈哈没错,就是这个问题!
再看看我们的结构图,我们能在什么地方改改,让条件控制减弱一些,让基于文本提示的信息与条件控制的信息结合得更加完美一点呢?
emmm...在这个模型中,越深处的隐空间分布中,条件控制跟文本提示显然是结合得越好的,越浅的地方,两者的分立就越明显 ......
那我们给越深的地方赋予更大的权重,越浅的地方赋予小一些的权重,是不是就能够减弱控制条件的影响,得到控制条件与文本提示完美结合的图片了呢!
这就是作者提出的CFG-Resolution-Weighting方法。在ControlNet的输出与原模型连接的地方,根据这个块的大小,赋予不同的权重,越深处的块,块的大小越小,权重就越大;越浅处的块,块的大小越大,权重就越小。
hi表示第i块的大小。
诶 这么一改之后,效果显然就好了很多了
到这里,我们就得到了一个能够使用预训练好的Diffusion模型,并且能够生成符合我们的需求的图片的模型啦!
当然啦,我们的ControlNet肯定不止可以添加一种条件控制,你往一个预训练好的Diffusion模型上添加多少个ControlNet都行,直接加上就好了,不需要其他的步骤。
Ablative Study and Quantitative Evaluation
这部分的内容直接看文章就好啦,讲得很详细很通俗易懂,这里就不再重复。
总结
这是张吕敏大佬的力作之一,真是让人惊叹。
翻译文章的Conclusion:
ControlNet是一种神经网络结构,用于学习大型预训练文本到图像扩散模型的条件控制。它重用源模型的大规模预训练层来构建一个深度和强编码器来学习特定的条件。原始模型和可训练的副本通过“零卷积”层连接,消除了训练过程中的有害噪声。大量的实验证明ControlNet可以有效地控制单个或多个条件下的稳定扩散,有或没有提示。在不同条件数据集上的结果表明,ControlNet结构可能适用于更广泛的条件,并能促进相关应用的发展。