文章地址:https://arxiv.org/abs/2302.05543
代码地址:https://github.com/lllyasviel/ControlNet

这篇文章特点是在之前生成的方式的基础上加了一定的约束,使得生成的结果更容易达到用户预期。

一、前言

文章通过观察现有的图像处理应用发现三个问题:

  1. 图片处理特定任务上的数据集规模较小,例如LAION-5B这种数据集是特殊领域图像处理数据集(100k)的5w倍
  2. 图片处理任务还是靠数据驱动的,所以想要在特定的硬件资源和时间上快速的训练一个大网络是比较难的
  3. 图像处理任务非常的多样,目前还没有一个灵活的方式将不同的任务采用end-to-end方式完成,还是不同的任务用不同的方式来适配任务

本文提出一种方法可以使得大模型在特定领域的小数据集上训练而不会过拟合,并且成本相对训练大模型来说低很多,并且不同的任务可以用同一套训练方式来适配。

缺点:推断时会带来一定的性能增加。

二、网络结构

ControlNet其实是一种思路,利用它可以继承已训练好的权重,同时可以适配不同子任务。如何做到这一点?

我们先定义一些参数:
对于一个网络block的输入feature表示为x∈Rh×w×cx\in R^{h\times w\times c}xRh×w×c, h, w, c分别表示高宽通道数,一个网络中的block表示为F(⋅;Θ)F(\cdot; \Theta)F(;Θ),那么该block的输出可以表示为:
y=F(x;Θ)y=F(x;\Theta)y=F(x;Θ)
该流程如下图a所示。

对于一个已经训练好的网络,如下图a所示。现在拷贝一份训练好的参数,然后固定原有参数,对于一些子任务,可以只更新拷贝部分的参数,如图b所示。这样做的目的是为了在保存在数十亿数据上训练的参数达到的效果同时不会过拟合在小的数据集上。

1.jpg

从上图b中还能看出,网络的拷贝部分加入了一些zero convolution(例如一些1x1的卷积,参数初始化为0,用符号表示为Z(⋅;⋅)Z(\cdot;\cdot)Z(;)),即训练初始化的参数都是0,保证了训练初期就是一个已训练好的网络。公式表示如下:
yc=F(x;Θ)+Z(F(x+Z(c;Θz1);Θc);Θz2)y_c = F(x;\Theta) + Z(F(x+Z(c;\Theta_{z1}); \Theta_c);\Theta_{z2})yc=F(x;Θ)+Z(F(x+Z(c;Θz1);Θc);Θz2)
ycy_cyc为加入controlnet结构的输出。

因为上面说了拷贝部分加入的卷积参数都初始化为0,即
Z(c;Θz1)=0Z(c;\Theta_{z1}) = 0Z(c;Θz1)=0
F(x+Z(c;Θz1);Θc)=F(x;Θc)=F(x;Θ)F(x+Z(c;\Theta_{z1});\Theta_c)=F(x;\Theta_c)=F(x;\Theta)F(x+Z(c;Θz1);Θc)=F(x;Θc)=F(x;Θ)
Z(F(x+Z(c;Θz1);Θc);Θz2)=Z(F(x;Θc);Θz2)=0Z(F(x+Z(c;\Theta_{z1}); \Theta_c);\Theta_{z2}) = Z(F(x; \Theta_c);\Theta_{z2}) = 0Z(F(x+Z(c;Θz1);Θc);Θz2)=Z(F(x;Θc);Θz2)=0
可以看出训练初期就是原始已训好的模型的输出。

对于一个1x1的卷积,卷积权重表示为WWW,偏置表示为BBB,对于输入I∈Rh×w×cI\in R^{h\times w\times c}IRh×w×c中空间位置p,通道索引i的位置来说,公式表示如下:
Z(I;{W,B})p,i=Bi+∑jcIp,iWi,jZ(I;\{W, B\})_{p,i}=B_i + \sum^c_j I_{p,i}W_{i,j}Z(I;{W,B})p,i=Bi+jcIp,iWi,j
虽然输出是0,但是通过公式求导可以知道W和B是有更新的。
∂Z(I;{W,B})p,i∂Bi=1\frac{\partial Z(I;\{W, B\})_{p,i}}{\partial B_i} = 1BiZ(I;{W,B})p,i=1
∂Z(I;{W,B})p,i∂Wi,j=Ip,i≠0\frac{\partial Z(I;\{W, B\})_{p,i}}{\partial W_{i,j}} = I_{p,i}\neq 0Wi,jZ(I;{W,B})p,i=Ip,i=0

因为文章用的是SD来做实验的,所以整体的SD+Controlnet网络结构如下:

2.jpg

其中Condition为输入的控制条件,文章做了很多种不同控制条件的实验,例如输入的是人体姿态图、canny edge图、法向图等等。

关于训练:

  1. SD部分采用了SD1.5的模型
  2. 训练方式同SD,只是多了输入的条件
  3. 可以根据硬件资源的限制调整训练结构,如果资源十分有限,controlnet只使用middle block部分,如果数据和资源足够,可以先训练controlnet,然后把原始的SD模型也放开,参数全部更新

三、效果

文章开头就说了,这个方法可以适配不同的图像处理任务,所以文章做了很多实验。

3.1 输入条件为Canny Edge

Canny Edge由输入的某张图片经过canny算子得到,default为默认prompt,auto prompt为采用BLIP生成的,user prompt为用户写的。

3.jpg

3.2 输入条件为Hough Line

4.jpg

3.3 输入条件为随手画

5.jpg

3.4 输入条件为HED Edge

6.jpg

3.5 输入条件为人体骨架

7.jpg

8.jpg

3.6 输入为语义分割

9.jpg

3.7 输入法向图

10.jpg

3.8 输入深度图

11.jpg

3.9 输入卡通线条画

12.jpg

四、一些思考

4.1 controlnet与LDM(SD)区别
  1. controlnet用SD来举例子,实际可以用于其它的网络中,更像一种思路
  2. controlnet不用训练整个网络,只需训练部分附加参数
  3. 比SD输入条件多一点,使得生成更有目的性,毕竟文章名字叫Adding Conditional Control to Text-to-Image Diffusion Models
4.2 controlnet与image2image任务的区别

image2image主要是为了学习图像间不同的分布,controlnet目的是为了控制diffusion model进一步去用于特定的任务上。(这是文章的说法,这是从文章提出的思路来讲的,但对于用户来说基本是一样的)

参考:

  1. https://arxiv.org/abs/2302.05543
  2. https://github.com/lllyasviel/ControlNet
  3. https://arxiv.org/abs/2112.10752
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐