在这里插入图片描述
📖 Stable_diffusion技术路线总结(SDXL、SD 1.4/1.5、SD 2.0/2.1)
1 改进
1 模型结构改进
扩散模型提出后,模型结构在不断的改进。先后引入了自注意力机制、upscaling layers和交叉注意力机制。在这样的机制引入到扩散模型中后,文生图的效果得到了提升。
SDXL的作者也尝试对模型结构进行改进。主要把Transformer转移到UNet的低级特征中去。
表格中展示了SDXL省略了浅特征层的Transformer块,而是在深特征层中分别使用了2和10个Transformer块。这样做的好处是:
- 能够高效的分配计算资源。浅层特征的特征图分辨率较大,一般是512x512或256x256。Transformer的计算成本与特征长度平方成正比,所以SDXL省略了浅特征层(高分辨率特征图)的Transformer块。
- 深层特征图的分辨率较低,此时需要整合全局上下文信息,例如场景分布、物体之间的关系之类的。而Transformer对捕捉全局依赖关系更加的擅长,所以深层特征提取提引入更多Transformer块有助于提升模型的全局建模能力。
在文本编码器上,SDXL使用了CLIP ViT-L & OpenCLIP ViT-bigG作为文本编码器,而SD 1.4/1.5用的是CLIP ViT-L,SD 2.0/2.1用的是OpenCLIP ViT-H。
2 对训练数据处理的改进
3 裁剪参数的裁剪条件的改进
在图像数据Pipeline中,常见的做法是将图像短边缩放到训练目标尺寸,然后从长边进行随机裁剪。这会导致模型学到的分布中,经常出现主体被裁掉的情况,比如猫的耳朵被裁掉、人脸被截断等如图3所示,在生成图像时也会出现此类裁剪问题。和尺寸条件类似,把随机裁剪产生的偏移量 ( C t o p C_{top} Ctop , C l e f t C_{left} Cleft) 也作为模型的额外条件输入。这样,模型不仅得到裁剪后的图像,也获得了“裁剪在何处发生”的信息。具体做法是在当对图像随机裁剪时,记录下裁剪起点( C t o p C_{top} Ctop , C l e f t C_{left} Cleft),将( C t o p C_{top} Ctop , C l e f t C_{left} Cleft)用傅里叶编码,并且拼接到模型的条件向量中。这样的作用是:
- 防止随机裁剪隐式地成为模型在推断时的先验,使得输出样本不知道会“被裁掉”。
- 因为裁剪坐标本身也成了条件,可在生成时设置为 (0,0) 让主体居中,从而避免“残缺”现象。
- 也可以在生成图片时人为地改变 (ctop, cleft) 来模拟“裁剪后的重构”,相当于能控制图像在上下或左右的可见部分。
引用:
Podell, Dustin, et al. “Sdxl: Improving latent diffusion models for high-resolution image synthesis.” arXiv preprint arXiv:2307.01952 (2023).