AIGC-Stable Diffusion

Stable Diffusion(稳定扩散)是一种生成式大模型,它在AI领域中标志着一个新的里程碑,为我们揭示了未来将会是AIGC的时代。传统的深度学习模型逐渐向AIGC过渡,这也意味着我们需要学习更多关于AIGC的内容。

如果你和我一样是AIGC的初学者,那么学习AIGC模型的基础知识是非常重要的。Stable Diffusion作为一个强大的模型,有着很高的适用性,特别是在生成式任务方面。通过学习它的基本理论和应用,可以更好地理解复杂网络中的信息传播规律,并掌握不同场景下的生成技术。

总之,Stable Diffusion是一个引人注目的模型,它的出现标志着AI领域的一个新的发展方向,并且未来的趋势将会是由AIGC模型主导。如果对此感兴趣,那么深入学习AIGC的内容将会是非常有益的。【文末含SD搭建与使用】


在学习Stable Diffusion之前,了解DDPM的内容是必要的。

在我之前的文章中简单介绍了一下有关DDPM的内容,有兴趣的可以看一下:AIGC-从代码角度去理解DDPM(扩散模型)

因为本地环境受限(显存、算力),因此部分内容可能分析比较浅显请见谅~


Stable Diffusion(SD)是由Stability AI和LAION共同研发的一种生成式模型。该模型可以应用于文生图和图生图任务,并且还包括后续的定制生成图像任务,如ControlNet等。

从模型名称上可以看出,SD模型中包含了"Diffusion"一词,这意味着它与DDPM类似,具备去噪的过程。而对于图生图任务来说,还会涉及到加噪的过程。

本文将主要介绍文生图任务,探讨SD模型在该任务中的应用。


文生图是指用户输入一段文字,经过一定的迭代次数,模型输出一张符合文字描述的图像。

SD模型的组成

SD模型主要包含了以下几个部分:

1.CLIP Text Encoder(文本编码器)

作用:将文本信息进行编码生成对应的特征矩阵方便输入到SD模型中。

2.VAE Encoder(变分自编码器)

作用:生成Latent Feature(隐空间特征)和文本特征同时作为模型输入。如果是图生图任务则将图像进行编码生成Latent Feature;如果是文生图则用随机生成的高斯噪声矩阵作为Latent Feature作为输入。【也就是在输入SD模型前有两个输入,文本特征和隐空间特征】

3.U-Net网络

作用:用于不断地预测噪声,并在每次预测噪声过程中加入文本语义特征

4.Schedule

作用:对UNet预测的噪声进行优化处理(动态调整预测的噪声,控制U-Net预测噪声的强度)

5.VAE Decoder(解码器)

作用:将最终得到的Latent Feature经过解码器生成图像

在SD的迭代过程中(去噪过程),噪声会不断的减少,图像信息和文本语义信息会不断的增加。

大致过程如下:


SD基础原理

其实不论是GAN、DDPM还是说SD模型,都和其他的深度学习算法一样,都是在训练中学习训练集的数据分布。

SD和DDPM一样,都有扩散过程(加噪过程)和生成过程(去噪过程)。

在前向的扩散过程中,会通过不断的加噪得到随机高斯噪声分布。在生成过程中是对噪声图像不断的去噪得到最终的图像。过程如下,整个加噪和去噪的过程是马尔科夫链

 前向扩散过程(加噪):

前向的扩散过程就是一个不断加噪的过程,我们可以对一张图不断的加噪直至生成一张随机噪声矩阵(控制加噪的步数即可),也就是由前面说的Schedule进行控制。

反向生成过程(去噪):

反向生成与前向扩散相反,该过程是已知一个噪声分布,由模型进行推理预测得到预测噪声的过程。

那么训练过程就是将预测噪声和实际的输入噪声之间建立loss进行训练【该部分我在我的另一篇DDPM有讲过】。


快速搭建SD模型

搭建SD的方式有很多种,我这里先以diffusers搭建SD为例(仅含推理部分)。

安装diffusers库以及依赖:

pip install diffusers==0.18.0 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

pip install transformers==4.27.0 accelerate==0.12.0 safetensors==0.2.7 invisible_watermark -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

接下来就可以快速调用SD

from diffusers import StableDiffusionPipeline


#初始化SD模型,加载预训练权重
pipe = StableDiffusionPipeline.from_pretrained("F:/BaiduNetdiskDownload/stable-diffusion-v1-5")


pipe.to("cuda")

#如GPU的内存不够,可以加载float16
pipe = StableDiffusionPipeline.from_pretrained("F:/BaiduNetdiskDownload/stable-diffusion-v1-5",revision="fp16",torch_dtype=torch.float16)

#输入prompt
prompt = "a photograph of an astronaut riding a horse"
steps = 50
image = pipe(prompt, height=512, width=512, num_inference_steps=steps).images[0]
image.save('SD_image.png')

其中:num_inference_steps表示优化的次数,数值越大越好,但需要的时间也会多。

输出尺寸模型为512x512,较低的分辨率生成效果也不好。

如果是低算力,或者用CPU推理也是可以的,但效果就是很好了~

比如我在我的电脑上用cpu进行推理【我的显卡1650 4G的太拉跨了】,效果如下:

文章参考

[1]  Rocky Ding.深入浅出完整解析Stable Diffusion(SD)核心基础知识

[2] Bubbliiiing.AIGC专栏2——Stable Diffusion结构解析-以文本生成图像(文生图,txt2img)为例

猜你喜欢

转载自blog.csdn.net/z240626191s/article/details/134851961
今日推荐