当前位置: 扩散器 >> 扩散器优势 >> StableDiffusion详细教程简
SD没有中文版并且需要翻墙,如果不会的也可以直接用国内AI绘画工具:触站AI,是国内基于SD搭建的最好用站点,对国人来说更加方便,所以本教程面向sd海外用户。
自定义扩散管道与扩散器,并使用不同的scheduler
Diffusers是一种强大的工具,可用于生成高质量的图像。此文介绍如何通过Diffusers自定义扩散管道与扩散器,以及使用不同的scheduler来生成图像。
StableDiffusionPipeline
我们可以使用预训练的模型包括建立一个完整的管道所需的所有组件。这些组件存放在以下文件夹中:
text_encoder:StableDiffusion使用CLIP,其他扩散模型可能使用其他编码器如BERT。
tokenizer:它必须与text_encoder模型使用的标记器匹配。
scheduler:用于在训练过程中逐步向图像添加噪声的scheduler算法。
U-Net:用于生成输入的潜在表示的模型。
VAE:我们将使用它将潜在的表示解码为真实的图像。
可以通过引用组件被保存的文件夹,并使用from_pretraining的子文件夹参数加载组件。
StableDiffusionPipeline的代码如下所示:
fromtransformersimportCLIPTextModel,CLIPTokenizerfromdiffusersimportAutoencoderKL,UNet2DConditionModel,PNDMScheduler#1.Loadtheautoencodermodelwhichwillbeusedtodecodethelatentsintoimagespace.vae=AutoencoderKL.from_pretrained("CompVis/stable-diffusion-v1-4",subfolder="vae")#2.Loadthetokenizerandtextencodertotokenizeandencodethetext.tokenizer=CLIPTokenizer.from_pretrained("openai/clip-vit-large-patch14")text_encoder=CLIPTextModel.from_pretrained("openai/clip-vit-large-patch14")#3.TheUNetmodelforgeneratingthelatents.unet=UNet2DConditionModel.from_pretrained("CompVis/stable-diffusion-v1-4",subfolder="unet")
使用不同的scheduler
现在,我们不加载预定义的scheduler,而是使用KatherineCrowson的K-LMS调度器。我们需要从diffusers中引入LMSDiscreteScheduler,并设置beta_start、beta_end和num_train_timesteps等参数。
代码如下所示:
fromdiffusersimportLMSDiscreteSchedulerscheduler=LMSDiscreteScheduler(beta_start=0.,beta_end=0.,beta_schedule="scaled_linear",num_train_timesteps=)
将模型移动到GPU上。
我们将VAE、text_encoder和unet模型移动到GPU上,以加速训练。
vae=vae.to(torch_device)text_encoder=text_encoder.to(torch_device)unet=unet.to(torch_device)
定义生成图像所需的参数。
定义用于生成图像的参数,包括prompt、height、width、num_inference_steps、guidance_scale等内容。为了获得更明确的图像,将num_inference_steps设置为。
prompt=["aphotographofanastronautridingahorse"]height=#StableDiffusion默认高度width=#StableDiffusion默认宽度num_inference_steps=#去噪步骤数guidance_scale=7.5#无分类器引导的规模generator=torch.manual_seed(32)#种子生成随机噪声batch_size=1
获取文本提示的text_embeddings。然后将嵌入用于调整U-Net模型。
我们先从文本提示中获得text_embeddings,然后将这些嵌入用于调整U-Net模型。
text_input=tokenizer(prompt,padding="max_length",max_length=tokenizer.model_max_length,truncation=True,return_tensors="pt")withtorch.no_grad():text_embeddings=text_encoder(text_input.input_ids.to(torch_device))[0]
获得用于无分类器引导的无条件文本嵌入。
我们需要获得用于无分类器引导的无条件文本嵌入,这只是填充令牌(空文本)的嵌入。它们需要具有与text_embeddings(batch_size和seq_length)相同的形状。
max_length=text_input.input_ids.shape[-1]uncond_input=tokenizer([""]*batch_size,padding="max_length",max_length=max_length,return_tensors="pt")withtorch.no_grad():uncond_embeddings=text_encoder(uncond_input.input_ids.to(torch_device))[0]
对于无分类的引导,需要进行两次向前传递。第一个是条件输入(text_embeddings),第二个是无条件嵌入(uncond_embeddings)。将两者连接到一个批处理中,以避免进行两次向前传递。
text_embeddings=torch.cat([uncond_embeddings,text_embeddings])
生成初始随机噪声
latents=torch.randn((batch_size,unet.in_channels,height//8,width//8),generator=generator,)latents=latents.to(torch_device)
该模型将这种潜在的表示(纯噪声)转换为x的图像,生成图像的过程需要一些时间,需要耐心等待。
通过Diffusers自定义扩散管道与扩散器,我们可以使用不同的scheduler来生成高质量的图像。使用自定义的scheduler,我们可以得到不同的生成结果,适用于各种不同的应用场景。Diffusers是一个强大的工具,可以生成高质量的图像,可以广泛应用于计算机视觉领域。
Midjourney培训机构Midjourney培训班Midjourney课程Midjourney网课Midjourney培训