简介
-
目标:加入额外的条件(例如边缘图像,深度图像)控制生成的图像
-
现有挑战
- 特定领域上的数据较少,而预训练模型很大,很容易出现过拟合的情况。
- 在资源有限的情况下,只能选择pretrain- finetune的训练方式
- 端到端的训练对于使用是很有必要的
-
idea:将预训练模型拷贝两份分别为:locked copy和trainable copy。前者保留了原始模型的能力,后者使用小样本进行微调。然后通过zero convolution将二者连接起来。
ps:这里的zero convolution是1*1卷积,初始化为0以保证一开始模型的输出与预训练模型一致,以实现在预训练模型的基础上进行微调。相比于从头训练的收敛速度是更快的
-
方法:
- 只copy了上采样和middle部分的block
- 这里为了让condition匹配latent space,也使用了一个encoder(卷积)降维
-
训练
- 在训练的时候mask掉了50%的prompt文本,来促使controlnet通过condition map学习到更多的语义
- 小样本训练:只在middle block有zero convolution连接,decoder部分可以去掉连接,保证训练的高效
- 有资源的情况下:可以在训练50k步之后把stable diffusion的decoder部分的4个block参数解冻一起训练
-
控制条件
- Canny Edge,边缘检测图
- Hough Line,直线检测图
- User Scribble,用户涂鸦
- HED Edge,边缘检测图,基于vgg的神经网络,相较于canny对语义有一定理解
- Human Pose,人体姿态
- Semantic Segmentation,语义分割图
- Depth,深度图
- Normal Maps,法线贴图,对光线方向敏感
- Cartoon line drawing,卡通线条画
-
注意
- 如果出现突然收敛的情况(前面生成的不确,突然在某一步正确了),可能是陷入了局部最优解,这是最好不要继续优化更多的步,在算力允许的情况下增大batch size
- 可以只在前面部分的step中加入controlnet控制,后面的step不加控制,能够让生成的图像更具多样性(webUI上操作很容易)
-
优缺点
- 优点:能够在数据量有限,计算有限(消费级显卡)的情况下fine tune一个端到端的下游模型
- 局限:使用边缘检测的时候可能controlnet会理解错语言,不过加上正确的prompt能够在一定程度上进行纠正