代码:lllyasviel/ControlNet: Let us control diffusion models! (github.com)
论文地址
最近AI绘画又双叒叕进化了,前一次还只能生成二次元,这次三次元都能生成了。这次AI绘画这么火爆的原因跟下面这篇文章脱不开关系,它将AI绘画带到了一个新的高度。
我们提出了一个神经网络结构controlnet网络来控制预训练的大扩散模型以支持额外的输入条件。controlnet网络以端到端的方式学习任务特定条件,即使在训练数据集较小( < 50k )的情况下,学习也是鲁棒的。此外,训练一个controlnet网络和微调一个扩散模型一样快,并且模型可以在个人设备上训练。或者,如果有强大的计算集群,模型可以扩展到大量的(百万到十亿)数据。我们报告了像Stable Diffusion这样的大型扩散模型可以用ControlNets来增强,以启用边缘图、分割图、关键点等条件输入。这可能会丰富控制大型扩散模型的方法,进而方便相关应用。
根据以上的发现,文章提出了控制大型图像扩散模型(像Stable Diffusion)去学习任务特定输入条件的端到端神经网络架构ControlNet。
令人十分欣喜的是,在深度到图像等任务中,在个人计算机(1个Nvidia RTX 3090TI)上训练ControlNets可以取得与在拥有TB级GPU内存和数千GPU小时的大型计算集群上训练的商业模型相当的结果。
整体还是U-Net框架
注意整个网络是一起训练的,右边绿色部分的初始参数是从左边copy过来的,左边部分的参数不能训练,右边部分的可以训练。
使用ControlNet创建稳定扩散的12个编码块和1个中间块的trainable copy,对应右边绿色部分的。
将条件图像变成64 × 64的特征空间方法:使用一个4 × 4 kernel,2 × 2步长的4个卷积层,卷积层通过ReLU激活,通道数分别为16、32、64、128,以高斯权重初始化,与整个模型联合训练)的网络,公式描述如下:
cf是转换后的特征图。
如图a所示:没有使用ControlNet之前的一个网络块,用公式描述就是:
其中x是一个特征图,F代表一个神经网络块,它的参数是Θ,这个网络块将x转换成另一个特征图
如图b所示:使用了ControlNet之后的一个网络块,它所作的修改如下:
(1)它从原来的网络中复制了一份参数,这份参数是可以训练的(论文中叫trainable copy,它的参数为Θc),而原来网络的参数是不能训练的(论文中叫locked copy),也就是图中加锁的部分。
这样做的目的是为了防止数据量小的时候过拟合并且保留之前模型的生成质量。
(2)增加了zero-convolution,它的特点是权重和偏差都初始化为0。
经过(1)(2)的修改后,新的网络块用公式描述就是:
其中Z表示zero convolution操作,Θz1和Θz2是两个zero convolution的参数。
在第一个训练阶段,有:
因此我们可以推出:
因为优化之前卷积部分的参数都是0,根据卷积操作的运算过程可知卷积的结果都是0。
由此可以看到:在第一个训练步骤中,神经网络块的trainable copy和locked copy的所有输入和输出都与ControlNet网络不存在时一致。也就是说在开始优化参数之前,ControlNet不会对深度神经特征造成任何影响。任何进一步的优化都将变得像微调(相比于从头训练这些层)一样快。
梯度下降过程:
一个卷积层的公式描述如下:
I是输入的特征图,B是偏差,W是权重。
它的梯度为:(注意它的权重W和偏差B初始值都是0)
从这个公式可以看出,zero-convolution可以导致特征项I上的梯度变为零,但是权重和偏置的梯度不受影响。
在本文中,I为输入数据或从数据集中采样的条件向量,肯定不为0,则在第一次梯度下降迭代中将权重W优化为非零矩阵。梯度下降过程如下:
然后特征上的梯度变为:
此时特征上的梯度不为0,由此神经网络开始学习。
损失函数跟扩散模型差不多,增加了任务指向型的条件参数cf。
同时文章将50 %的文本提示ct随机替换为空字符串。这有利于增强ControlNet从输入条件图中识别语义内容的能力。
挑几个出来。
(1)使用Hough lines
(2)使用Canny算子
(3)使用姿势