ControlNet
参考链接
面临问题
生成图片既需要多样性,又需要准确性。
模型架构
把原本的结构参数锁定,但是创建了一个副本,在接受 condition 的情况下进行训练。
有两个多加入的零卷积层。
最后将有条件与无条件的输出简单相加。
Z 表示零卷积。
零卷积
用于保证初始时刻,新加入的分支不会对结果造成影响。
完整结构
可以看到,在编码下采样的过程中,原本的模型与复制的模型并行进行。到了解码上采样的过程中,编码的输出通过 Skip Connection被加入了进来。
并且每一个 control 信息都通过了零卷积。
Condition 转换成特征图
input_hint_block = TimestepEmbedSequential(
conv_nd(dims, hint_channels, 16, 3, padding=1),
nn.SiLU(),
conv_nd(dims, 16, 16, 3, padding=1),
nn.SiLU(),
conv_nd(dims, 16, 32, 3, padding=1, stride=2),
nn.SiLU(),
conv_nd(dims, 32, 32, 3, padding=1),
nn.SiLU(),
conv_nd(dims, 32, 96, 3, padding=1, stride=2),
nn.SiLU(),
conv_nd(dims, 96, 96, 3, padding=1),
nn.SiLU(),
conv_nd(dims, 96, 256, 3, padding=1, stride=2),
nn.SiLU(),
zero_module(conv_nd(dims, 256, model_channels, 3, padding=1))
)
之所以不用 VAE ,而用一个简单的卷积块来进行处理,是因为 condition 图一般比较简单(如深度图、骨骼图等)。
训练
Dropout
为了让模型更多地从额外的控制信息中进行学习,模型对文本控制信息采用了较大的 dropout 率(0.5)。
优势
可迁移性
灵活性
Only Mid
算力资源不够充足时,可以只训练一部分的参数
比如上图,就是只训练 middle-blocks
整体训练
算力资源足够充足时,则可以把解码器加进来一起进行训练。
ControlNet 实例
30分钟零基础掌握ControlNet!绝对是你看过最好懂的控制网原理分析 | 基本操作、插件安装与5大模型应用 · Stable Diffusion教程_哔哩哔哩_bilibili
可以使用预处理器从图片里面得到这些 ControlNet 所需要的条件信息。
OpenPose ControlNet
OpenPose-Face
可以控制人物的表情
OpenPose-Full
又有脸,又有手
Depth ControlNet
- Depth Leres
- Depth Leres++
- Depth Midas
- Depth Zoe
Canny ControlNet
SoftEdge ControlNet
HED