前排提示照片已经取得小姐姐答应。

ControlNet原理解析 | 读论文

光知道ControlNet好用,不想知道它背后的原理么?今天就看一看这篇论文,带咱们了解一下ControlNet是怎么炼成的。

代码地址:github.com/lllyasviel/…

论文地址:arxiv.org/abs/2302.05…

ControlNet原理解析 | 读论文


ControlNet是干嘛的

咱们知道现在文本到图画生成很火爆,你只需要输入文字就能够取得对应的输出,这个使命的开展多亏了分散模型的开展。

而咱们今天要说的ControlNet的作用便是能够操控分散模型,生成更挨近用户需求的图。

咱们用几个图演示一下:

假设咱们只用文字去生成图画,咱们给模型输入文本prompt:

a girl, long hair, blond hair, black eyes, black coat, winter, snow

那模型会出来这些图:

ControlNet原理解析 | 读论文

咱们能够看到,咱们输入的要素都契合了。可是差别又很大,大在哪里?每个妹子动作差异都好大。

那现在咱们就能够掏出ControlNet了,用ControlNet来操控你生成的人物的动作。

比方下图这样,能够看到即便我换了画风(换了模型的checkpoint)生成的人物动作也是相同的, 而且满足我前边输入的条件。

ControlNet原理解析 | 读论文

那我做了什么才让模型能稳定输出相同的人物动作呢?下面请出咱们的仙女姐姐尚尚:

为咱们生成的妹子供给动作的是咱们的尚影嫣小姐姐,我把她的照片放到ControlNet中作为操控条件,这里运用的是ControlNet的Depth功用,ControlNet会依据小姐姐提取一个深度图,然后依照人物深度图概括去生成咱们的人物。

下图你看到的便是文本prompt操控ControlNet图画条件操控相互作用的成果。

既契合文本prompt:a girl, long hair, blond hair, black eyes, black coat, winter, snow,又保持了小姐姐的大致动作形状。

ControlNet原理解析 | 读论文

当然,假如咱们把文字操控删除一点,只留下a girl, long hair, black eyes,咱们能够得到更挨近小姐姐原图的成果。

ControlNet原理解析 | 读论文

好了,美人看完了,那咱们就介绍一下这个论文吧。

ControlNet 网络规划

在一个分散模型中,假如不加ControlNet的分散模型,其间原始的神经网络F\mathcal F输入xx取得yy,参数用\Theta表明。

y=F(x;)y = \mathcal F(x;\Theta)

也便是下图这个姿态。

ControlNet原理解析 | 读论文

ControlNet中,便是将模型原始的神经网络锁定,设为locked copy

然后将原始网络的模型仿制一份,称之为trainable copy,在其上进行操作施加操控条件。然后将施加操控条件之后的成果和原来模型的成果相加取得最终的输出。

通过这么一顿操作之后,施加操控条件之后,最后将原始网络的输出修改为:

yc=F(x;)+Z(F(x+Z(c;z1);c);z2)\boldsymbol{y}_{\mathrm{c}}=\mathcal{F}(\boldsymbol{x} ; \Theta)+\mathcal{Z}\left(\mathcal{F}\left(\boldsymbol{x}+\mathcal{Z}\left(\boldsymbol{c} ; \Theta_{\mathrm{z} 1}\right) ; \Theta_{\mathrm{c}}\right) ; \Theta_{\mathrm{z2}}\right)

其间zero convolution,也便是零卷积Z\mathcal Z是初始化weight和bias为0,两层零卷积的参数为{z1,z2}\{ \Theta_{z1},\Theta_{z2} \}

ControlNet原理解析 | 读论文

将操控条件通过零卷积之后,与原始输入相加,相加之后进入ControlNet的仿制神经网络块中,将网络输出再做一次零卷积之后与原始网络的输出相加。

初始化之后未经练习的ControlNet参数应该是这样的:

{Z(c;z1)=0F(x+Z(c;z1);c)=F(x;c)=F(x;)Z(F(x+Z(c;z1);c);z2)=Z(F(x;c);z2)=0\left\{\begin{array}{l}\mathcal{Z}\left(\boldsymbol{c} ; \Theta_{\mathrm{z} 1}\right)=0 \\ \mathcal{F}\left(x+\mathcal{Z}\left(\boldsymbol{c} ; \Theta_{\mathrm{z} 1}\right) ; \Theta_{\mathrm{c}}\right)=\mathcal{F}\left(x ; \Theta_{\mathrm{c}}\right)=\mathcal{F}(x ; \Theta) \\ \mathcal{Z}\left(\mathcal{F}\left(x+\mathcal{Z}\left(\boldsymbol{c} ; \Theta_{\mathrm{z} 1}\right) ; \Theta_{\mathrm{c}}\right) ; \Theta_{\mathrm{z} 2}\right)=\mathcal{Z}\left(\mathcal{F}\left(x ; \Theta_{\mathrm{c}}\right) ; \Theta_{\mathrm{z} 2}\right)=\mathbf{0}\end{array}\right.

也便是说ControlNet未经练习的时分,输出为0,那加到原始网络上的数字也是0。这样对原始网络是没有任何影响的,就能确保原网络的性能得以完好保存。之后ControlNet练习也只是在原始网络上进行优化,这样能够认为和微调网络是相同的。

ControlNet in Stable Diffusion

上一部分描述了ControlNet怎么操控单个神经网络块,论文中作者是以Stable Diffusion为比方,讲了怎么运用ControlNet对大型网络进行操控。下图能够看到操控Stable Diffusion的进程便是将Encoder仿制练习,decoder部分进行skip connection。

ControlNet原理解析 | 读论文

在这之前需要留意:

Stable Diffusion有一个预处理步骤,将512512的图片转化为6464的图之后再进行练习,因此为了保证将操控条件也转化到6464的条件空间上,练习进程中添加了一个小网络E\Epsilon将图画空间条件转化为特征图条件。

cf=E(ci)c_f = \Epsilon (c_i)

这个网络E\Epsilon是四层卷积神经网络,卷积核为44,步长为2,通道16,32,64,128,初始化为高斯权重。这个网络练习进程是和整个ControlNet进行联合练习。

或许咱们能够把他的图改吧改吧,画成这样:

ControlNet原理解析 | 读论文

练习进程

练习的方针函数为:

L=Ez0,t,ct,cr,∼N(0,1)[∥−(zt,t,ct,cf))∥22]\left.\mathcal{L}=\mathbb{E}_{\boldsymbol{z}_0, t, \boldsymbol{c}_t, \boldsymbol{c}_{\mathrm{r}}, \epsilon \sim \mathcal{N}(0,1)}\left[\| \epsilon-\epsilon_\theta\left(z_t, t, \boldsymbol{c}_t, \boldsymbol{c}_{\mathrm{f}}\right)\right) \|_2^2\right]

运用的便是人家Stable Diffusion原始的方针函数改了改。

先看一下原始的Stable Diffusion的方针函数:

LLDM:=EE(x),∼N(0,1),t[∥−(zt,t)∥22]L_{L D M}:=\mathbb{E}_{\mathcal{E}(x), \epsilon \sim \mathcal{N}(0,1), t}\left[\left\|\epsilon-\epsilon_\theta\left(z_t, t\right)\right\|_2^2\right]

将采样ztz_t运用网络\epsilon_\theta去噪之后和原图通过网络\epsilon取得的潜变量核算L2L_2loss,看其重建的作用。

那再回到

L=Ez0,t,ct,cr,∼N(0,1)[∥−(zt,t,ct,cf))∥22]\left.\mathcal{L}=\mathbb{E}_{\boldsymbol{z}_0, t, \boldsymbol{c}_t, \boldsymbol{c}_{\mathrm{r}}, \epsilon \sim \mathcal{N}(0,1)}\left[\| \epsilon-\epsilon_\theta\left(z_t, t, \boldsymbol{c}_t, \boldsymbol{c}_{\mathrm{f}}\right)\right) \|_2^2\right]

将原始图画通过\epsilon之后取得潜变量,和通过网络\epsilon_\theta重建之后的图算L2L_2loss。原来Stable Diffusion中解码器要处理的是采样ztz_t和时刻步长tt,在这里加了两个操控条件:

  • 文字prompt ctc_t
  • 使命相关的prompt cfc_f

练习进程中将50 %的文本提示ctc_t随机替换为空字符串。这样有利于ControlNet网络从操控条件中识别语义内容。这样做的意图是,当Stable Diffusion没有prompt的时分,编码器能从输入的操控条件中取得更多的语义来代替prompt。(这也便是classifier-free guidance。)

作用!

这一部分作者主要是讲了怎么练习不同操控条件的ControlNet的,练习方法感兴趣的自己看,这里简单展示一下作者供给好的练习出来的模型。用《青蛇劫起》里面小青做一下演示:

Canny Edge

运用Canny边缘检测生成边缘线稿,再将作为分散模型输入。

ControlNet原理解析 | 读论文

HED

运用hed边界检测。

ControlNet原理解析 | 读论文

Depth

运用深度图生成。

ControlNet原理解析 | 读论文

Normal Maps

运用法线图生成图画。供给了Midas核算深度图并转换为法线图的扩展版别的模型。

ControlNet原理解析 | 读论文

Human Pose

运用姿态检测,取得人体骨骼的可视化姿态图画。

ControlNet原理解析 | 读论文

User Sketching

运用人类涂鸦进行生成。

ControlNet原理解析 | 读论文

ControlNet原理解析 | 读论文

Semantic Segmentation

运用语义分割。

ControlNet原理解析 | 读论文

ControlNet原理解析 | 读论文

Hough Line

运用m-lsd直线检测算法。(论文中还提到了运用传统的霍夫变换直线检测)

ControlNet原理解析 | 读论文

其他

论文中还提到了其他的,比方动漫线稿之类的,可是没有供给对应的模型,所以这里无法展示,感兴趣的能够自己去看一下论文。


本文正在参与「金石计划」