在当今的数字时代,人工智能技术正以前所未有的速度改变着我们的生活和工作方式。其中,Stable Diffusion作为一种深度学习技术,因其强大的图像生成能力而备受瞩目。它能够将文本描述或视频处理成逼真的数字人视频,为众多领域带来了革命性的创新。本文将深入探讨Stable Diffusion的核心基础知识,详细介绍如何使用它制作AI数字人视频,解析本地部署的要求,并介绍蓝海大脑PC集群解决方案在其中的应用。
Stable Diffusion,简称SD,是一种基于扩散模型的深度学习技术。扩散模型自2015年推出以来,就因其独特的图像生成方式而备受关注。它通过逐步添加和去除高斯噪声,将图像或视频转换为潜在表示,再将其解码为像素空间中的图像。Stable Diffusion模型主要由三个部分组成:变分自编码器(VAE)、U-Net和一个文本编码器。在生成过程中,高斯噪声被迭代地应用于压缩的潜在表征,并通过U-Net逐步去噪,最终由VAE解码器将去噪后的潜在表征转换回像素空间,生成输出图像。
SadTalker模型则是一个专门用于合成人物说话动画的开源模型。它能够根据音频文件自动为输入的图片添加人脸动作,如张嘴、眨眼、头部移动等,从而生成逼真的说话动画。它通过音频生成3DMM的3D运动系数,并使用新颖的3D感知面部渲染技术,实现说话头部运动的视频生成。
在本地部署Stable Diffusion模型时,需要满足一定的硬件和软件要求。首先,需要高性能的GPU集群,以支持大规模的模型训练和推理。同时,还需要安装相应的软件环境,包括深度学习框架、Python编程语言和模型库等。此外,网络带宽和稳定性也是必不可少的,以保证模型的下载和更新。
针对本地部署的硬件和软件要求,蓝海大脑提供了一种高效、可靠且经济的PC集群解决方案。该方案采用高性能GPU节点和高速网络互联,能够满足大规模模型训练和推理的需求。同时,该方案还提供多种深度学习框架和模型库,方便用户进行模型的训练和推理。此外,蓝海大脑PC集群解决方案还提供全面的安全防护措施,确保用户数据的安全性和隐私性。
Stable Diffusion的核心基础知识在2022年迎来了重大突破,它一举击败了传统的深度学习模型,成为开启人工智能新纪元的强大引擎。它的出现不仅为工业界带来了革命性的创新,也让投资者看到了巨大的商机,让AI再次变得”性感”起来。下面将以通俗易懂的语言,全方位讲解Stable Diffusion的原理、应用和训练技巧。
Stable Diffusion模型原理生成式模型在AI界被誉为“制假大师”,能够生成看似真实的新数据。其中,GAN和Stable Diffusion可以说是其中的翘楚。这两类模型通过不同的技巧捕捉训练数据的特征分布,然后生成类似风格的新样本。例如,在计算机视觉领域,可以输出逼真的新图片;在自然语言处理领域,可以写出语义连贯的新文字。GAN通过对抗训练实现,让生成器和判别器互相竞争,不断逼近真实数据分布。而Stable Diffusion则直接利用文本提示指导模型生成所需的输出。可以说,GAN和Stable Diffusion如同变色龙,可根据需求变换不同的创作形态,为人类开拓一个广阔的想象空间,将抽象概念转换为具体作品。
生成式模型的主流架构下面主要就GAN进行详细描述。由于篇幅限制,VAE和Flow-based models这里就不再过多介绍。GAN的训练过程可比喻为一场精妙的舞台表演。表演由两大角色联手完成——生成器与判别器。生成器扮演制作“假货”的角色,生成尽可能逼真的假数据来欺骗判别器。判别器则扮演辨别真伪的角色,判断生成器输出的数据是真是假。两者之间展开一场激烈的智慧竞赛。生成器不断提升自己的造假技术,使生成的假数据更加真实。判别器也在竞相增强自身的判断能力,来识别假数据的破绽。双方都在以极快的速度成长。要取得最佳的生成效果,生成器和判别器必须同步训练。这也增加了GAN的训练难度。在训练初期,生成器制造的假数据非常容易被判别器识破。但随着训练轮数的增多,生成器的造假水平越来越高,判别器也必须不断自我革新来跟上生成器的进步。这里可以把生成器比喻为高明的画家,不断精进绘画技巧来制作逼真的艺术品。判别器则像鉴赏家,需要提高自己的审美和识别能力,才能判断画作的真伪。两者互相促进,最终画家可以画出真假难辨的作品。GAN训练过程中充满智慧的对抗与不断深化的博弈。表面上双方合作焕然一新,实际都在暗地努力进步。最终,生成器取得决定性优势,其生成效果达到欺骗判别器的视真程度。
SD文生图过程 Stable Diffusion (SD)模型在图像生成任务上有着广泛的应用。其中最典型和基础的两大应用分别是文生图和图生图。文生图(Text-to-Image)是将文本描述转换为图像的过程。可以输入一段文字到Stable Diffusion模型中,描述想要生成的图像内容。模型会解析文本语义,经过迭代逐步生成出符合文本描述的图片。例如,输入“天堂,巨大的,海滩”等文字,模型会联想到天堂与海滩的概念,并图像化出一个美丽宽广的沙滩场景。文本描述越细致,生成的图像也会越符合预期。SD图生图过程图生图(Image-to-Image)在文生图的基础上,额外输入一张图像,根据文本描述对图片进行修饰和丰富。例如,先输入“天堂,巨大的,海滩”,生成一张美丽沙滩的图片。然后继续输入“海盗船”,同时输入先前生成的沙滩图。模型将解析文本语义,在原图片中添加一个海盗船,输出一张融合文本描述的新图像。可以看出,图生图保留原图片的主体内容,同时根据文本提示进行图像的二次创作。感受SD模型强大的生成能力,大家可能会想到生成式领域上一个霸主模型GAN,与GAN模型不同的是,SD模型是属于扩散模型,是基于latent的扩散模型。那么扩散模型是什么呢?扩散模型是一种图像生成方法,通过逐步添加细节来生成图像。将图像的生成过程分为多个步骤,每个步骤都会对图像进行一定程度的修改和完善,这样经过20- 50 次“扩散”循环后,最终输出的图像就会变得更加精致。下面是一个通过 SD 模型的推理过程, 将随机高斯噪声矩阵逐步去燥并生成一张小别墅图片的直观示例。SD模型的Inference过程那么latent又是什么呢?基于 latent 的扩散模型在低维隐空间中进行“扩散”过程,而不是在实际像素空间中,大大降低了内存占用和计算复杂性。与常规扩散模型不同,latent 扩散模型的主要特点是在训练和推理过程中都集中在 latent 空间中。
Stable Diffusion模型的核心组件 SD模型主要由自动编码器(VAE),U-Net以及文本编码器三个核心组件构成。SD模型文生图流程1)自动编码器(VAE)在图像生成任务中,VAE的编码器可以将输入图片转换为低维的特征表示,作为后续模型的输入。这些低维特征保留原图像的主要语义信息。而VAE的解码器则可以将编码器输出的低维特征再次恢复为完整的图像。解码器实现了从压缩特征到图像空间的映射。不同的VAE结构设计,会使其在图像中的注意力区域不同,从而影响生成图片的细节与整体颜色风格。VAE的主要工作 VAE能够有效压缩图像到低维潜空间后仍实现良好重建,其关键在于自然图像具有高度规律性。例如,人脸图像中眼睛、鼻子、嘴巴遵循特定空间结构;猫身体有固定数量四肢以及特定生物学形态。这种先验知识使得VAE可以只保留图像最关键信息。即使在压缩特征损失的情况下,只要生成图像大小合适,重建后的语义内容和结构依然能够保持可识别性。2)U-Net在扩散模型生成流程中,需要逐步将随机噪声转化为图像隐特征。实现方式是:- 模型预测当前噪声的残差,即需要调整的量。- 利用调度算法(如PNDM、DDIM等)结合预测残差,重新构建并优化噪声。- 经过多轮扩散优化,最终得到可生成目标图像的隐特征。实现扩散模型的网络结构通常采用U-Net架构。U-Net由多层ResNet模块串联构成,并在模块之间添加交叉注意力机制。交叉注意力可用于接收额外的文本指令,指导图像生成方向。常规U-Net结构ResNet模块与CrossAttention模块的结合3)文本编码器在扩散模型中,需要输入文本prompt,以指导图像生成方向。实现方式是:- 使用文本编码器(通常是CLIP等预训练模型),对prompt进行编码,得到表示其语义信息的词向量。- 将文本词向量通过交叉注意力机制,输入到扩散模型的U-Net中。- 文本词向量作为条件信息,引导U-Net的图像生成过程,以输出符合文本意图的图片。默认的文本编码器是CLIP模型,可以输出跟图像语义相关的稠密词向量。3、Stable Diffusion推理流程要运行Stable Diffusion(SD),可以直接使用diffusers库中的完整pipeline流程。需要安装相关依赖,使用以下命令进行安装:pip install diffusers transformers scipy ftfy accelerate导入diffusers库:from diffusers import StableDiffusionPipeline初始化SD模型并加载预训练权重:pipe = StableDiffusionPipeline.from_pretrained(“runwayml/stable-diffusion-v1-5″如果想使用GPU加速,可以使用以下命令将模型加载到GPU上:pipe.to(“cuda”)如果GPU内存少于10GB,可以加载float16 精度的SD模型:pipe = StableDiffusionPipeline.from_pretrained(“runwayml/stable-diffusion-v1-5″, revision=”fp16″, torch_dtype=torch.float16)使用pipeline来运行SD模型。例如,给定一个prompt和一张图片,可以使用以下代码生成一张新的图片:prompt = “a photograph of an astronaut riding a horse”image = pipe(prompt).images[0]由于没有固定seed,每次运行代码都会得到一个不同的图片。预训练文件夹中的模型主要由以下几个部分组成:text_encoder和tokenizer,scheduler,unet,vae。其中text_encoder,scheduler,unet,vae分别代表SD模型的核心结构。此外,还有一个名为Tokenizer的文件夹表示标记器。标记器将Prompt中的每个词转换为一个称为标记(token)的数字,符号化(Tokenization)是计算机理解单词的方式。然后通过text_encoder将每个标记转换为一个 768 维的向量称为嵌入(embedding),用于U-Net的condition。Tokenizer的作用有时候在运行完pipeline后,可能会遇到生成的图片全黑情况。这是因为生成的图片可能触发了NSFW(不适宜内容)机制,导致生成一些违规的图片。为解决这个问题,建议使用自定义的seed来重新生成图片。可以使用以下代码来设置seed,并控制生成图片的输出:#import torch# 设置seedtorch.manual_seed(1024)# 创建生成器generator = torch.Generator(“cuda”).manual_seed(1024)# 使用设置的seed和生成器来生成图片image = pipe(prompt, guidance_scale=7.5, generator=generator).images[0]将pipeline的完整结构梳理好之后,再对一些核心参数进行讲解:1)num_inference_steps表示对图片进行噪声优化的迭代次数。一般来说,该值可以选择在 20 到 50 之间,数值越大生成的图片质量越高,但同时也需要更多的计算时间。2)guidance_scale代表文本提示对图像生成过程的影响程度。具体来说,它控制着有条件生成所使用噪声的比例。通常该值在 7 到8. 5 之间取值较好,如果取值过大,生成的图片质量可能会很高,但多样性会下降。其中代表CFG,当越大时,condition起的作用越大,即生成的图像更和输入文本一致,当被设置为时,图像生成是无条件的,文本提示会被忽略。3)输出尺寸除了将预训练的SD模型整体加载,还可以选择加载其不同的组件。通过以下方式实现:从transformers库中加载CLIPTextModel和CLIPTokenizer:from transformers import CLIPTextModel, CLIPTokenizer从diffusers库中加载AutoencoderKL、UNet2DConditionModel和PNDMScheduler:from diffusers import AutoencoderKL, UNet2DConditionModel, PNDMScheduler还需要加载LMSDiscreteScheduler:from diffusers import LMSDiscreteScheduler可以单独加载VAE模型:vae = AutoencoderKL.from_pretrained(“runwayml/stable-diffusion-v1-5″, subfolder=”vae”)加载CLIP模型和tokenizer:tokenizer = CLIPTokenizer.from_pre训练好的模型主要由以下几个部分组成:text_encoder,scheduler,unet,vae。其中text_encoder,scheduler,unet,vae分别代表SD模型的核心结构。此外,还有一个名为Tokenizer的文件夹表示标记器。标记器将Prompt中的每个词转换为一个称为标记(token)的数字,符号化(Tokenization)是计算机理解单词的方式。然后通过text_encoder将每个标记转换为一个 768 维的向量称为嵌入(embedding),用于U-Net的condition。Tokenizer的作用有时候在运行完pipeline后,可能会遇到生成的图片全黑情况。这是因为生成的图片可能触发了NSFW(不适宜内容)机制,导致生成一些违规的图片。为解决这个问题,建议使用自定义的seed来重新生成图片。可以使用以下代码来设置seed,并控制生成图片的输出:#import torch# 设置seedtorch手动_seed(1024)# 创建生成器generator = torch.Generator(“cuda”).manual_seed(1024)# 使用设置的seed和生成器来生成图片image = pipe(prompt, guidance_scale=7.5, generator=generator).images[0]将pipeline的完整结构梳理好之后,再对一些核心参数进行讲解:1)num_inference_steps表示对图片进行噪声优化的迭代次数。一般来说,该值可以选择在 20 到 50 之间,数值越大生成的图片质量越高,但同时也需要更多的计算时间。2)guidance_scale代表文本提示对图像生成过程的影响程度。具体来说,它控制着有条件生成所使用噪声的比例。通常该值在 7 到8. 5 之间取值较好,如果取值过大,生成的图片质量可能会很高,但多样性会下降。其中代表CFG,当越大时,condition起的作用越大,即生成的图像更和输入文本一致,当被设置为时,图像生成是无条件的,文本提示会被忽略。3)输出尺寸除了将预训练的SD模型整体加载,还可以选择加载其不同的组件。通过以下方式实现:从transformers库中加载CLIPTextModel和CLIPTokenizer:from transformers import CLIPTextModel, CLIPTokenizer从diffusers库中加载AutoencoderKL、UNet2DConditionModel和PNDMScheduler:from diffusers import AutoencoderKL, UNet2DConditionModel, PNDMScheduler还需要加载LMSDiscreteScheduler:from diffusers import LMSDiscreteScheduler可以单独加载VAE模型:vae = AutoencoderKL.from_pre训练好的模型主要由以下几个部分组成:text_encoder,scheduler,unet,vae。其中text_encoder,scheduler,unet,vae分别代表SD模型的核心结构。此外,还有一个名为Tokenizer的文件夹表示标记器。标记器将Prompt中的每个词转换为一个称为标记(token)的数字,符号化(Tokenization)是计算机理解单词的方式。然后通过text_encoder将每个标记转换为一个 768 维的向量称为嵌入(embedding),用于U-Net的condition。Tokenizer的作用有时候在运行完pipeline后,可能会遇到生成的图片全黑情况。这是因为生成的图片可能触发了NSFW(不适宜内容)机制,导致生成一些违规的图片。为解决这个问题,建议使用自定义的seed来重新生成图片。可以使用以下代码来设置seed,并控制生成图片的输出:#import torch# 设置seedtorch手动_seed(1024)# 创建生成器generator = torch.Generator(“cuda”).manual_seed(1024)# 使用设置的seed和生成器来生成图片image = pipe(prompt, guidance_scale=7.5, generator=generator).images[0]将pipeline的完整结构梳理好之后,再对一些核心参数进行讲解:1)num_inference_steps表示对图片进行噪声优化的迭代次数。一般来说,该值可以选择在 20 到 50 之间,数值越大生成的图片质量越高,但同时也需要更多的计算时间。2)guidance_scale代表文本提示对图像生成过程的影响程度。具体来说,它控制着有条件生成所使用噪声的比例。通常该值在 7 到8. 5 之间取值较好,如果取值过大,生成的图片质量可能会很高,但多样性会下降。其中代表CFG,当越大时,condition起的作用越大,即生成的图像更和输入文本一致,当被设置为时,图像生成是无条件的,文本提示会被忽略。3)输出尺寸除了将预训练的SD模型整体加载,还可以选择加载其不同的组件。通过以下方式实现:从transformers库中加载CLIPTextModel和CLIPTokenizer:from transformers import CLIPTextModel, CLIPTokenizer从diffusers库中加载AutoencoderKL、UNet2DConditionModel和PNDMScheduler:from diffusers import AutoencoderKL, UNet2DConditionModel, PNDMScheduler还需要加载LMSDiscreteScheduler:from diffusers import LMSDiscreteScheduler可以单独加载VAE模型:vae = AutoencoderKL.from预训练好的模型主要由以下几个部分组成:text_encoder,scheduler,unet,vae。其中text_encoder,scheduler,un化简后的模型主要由以下几个部分组成:text_encoder,scheduler,unet,vae。其中text_encoder,scheduler,unet,vae分别代表SD模型的核心结构。此外,还有一个名为Tokenizer的文件夹表示标记器。标记器将Prompt中的每个词转换为一个称为标记(token)的数字,符号化(Tokenization)是计算机理解单词的方式。然后通过text_encoder将每个标记转换为一个 768 维的向量称为嵌入(embedding),用于U-Net的condition。Tokenizer的作用有时候在运行完pipeline后,可能会遇到生成的图片全黑情况。这是因为生成的图片可能触发了NSFW(不适宜内容)机制,导致生成一些违规的图片。为解决这个问题,建议使用自定义的seed来重新生成图片。可以使用以下代码来设置seed,并控制生成图片的输出:#import torch# 设置seedtorch手动_seed(1024)