网站标题flash,网站关键词检测,成都市城乡建设厅官方网站,绍兴seo管理stable diffusion真的是横空出世#xff0c;开启了AIGC的元年。不知你是否有和我一样的困惑#xff0c;这AI工具好像并不是那么听话#xff1f; 前言 我们该如何才能用好stable diffusion这个工具呢#xff1f;AI究竟在stable diffusion中承担了什么样的角色#xff1f;如… stable diffusion真的是横空出世开启了AIGC的元年。不知你是否有和我一样的困惑这AI工具好像并不是那么听话 前言 我们该如何才能用好stable diffusion这个工具呢AI究竟在stable diffusion中承担了什么样的角色如何能尽可能快、成本低地得到我们期望的结果 源于这一系列的疑问我开始了漫长的论文解读。High-Resolution Image Synthesis with Latent Diffusion Models地址https://arxiv.org/abs/2112.10752?spmata.21736010.0.0.7d0b28addsl7xQfile2112.10752 当然这论文看的云里雾里的加篇读了How does Stable Diffusion work?地址https://stable-diffusion-art.com/how-stable-diffusion-work/?spmata.21736010.0.0.7d0b28addsl7xQ 先简要概括下stable diffusion的努力基本是为了2个目的: 低成本、高效验证。设计了Latent SpaceConditioning Mechanisms。条件控制如果不能输出我们想要的图片那这就像Monkey Coding。耗费无限的时间与资源。 这是整个内容里最重要最核心的两个部分。 图片生成的几种方式 随着深度神经网络的发展生成模型已经有了巨大的发展主流的有以下几种 自回归模型(AutoRegressive model)按照像素点生成图像导致计算成本高。实验效果还不错变分自编码器(Variational Autoencoder)Image to Latent Latent to ImageVAE存在生成图像模糊或者细节问题基于流的方法(Glow)生成对抗网络(Generative adversarial network)利用生成器(G)与判别器(D)进行博弈不断让生成的图像与真实的图像在分布上越来越接近。 其中AR与GAN的生成都是在pixel space进行模型训练与推理。 ▐ 模型是如何生成图片的 以一只猫作为案例。当我们想画一只猫的时候也都是从一个白板开始框架、细节不断完善。 对于AI来说一个纯是noise的image就是一个理想的白板类似下图展示的这样。 从图中的流程我们可以看到推理的过程如下 生成一个随机的noise image图片。这个noise取决于Random这个参数。相同的Random生成的noise image是相同的。使用noise predictor预测这个图里加了多少noise生成一个predicted noise。使用原始的noise减去predicted noise。不断循环2、3直到我们的执行steps。 最终我们会得到一只猫。 在这个过程中我们会以下疑问 如何得到一个noise predictor怎么控制我们最终能得到一只猫而不是一只狗或者其他的东西 在回答这些疑问之前我先贴一部分公式 我们定义一个noise predictor是第 t 个step过程中的noise imaget 表示第t个stop。 ▐ 如何得到一个noise predictor 这是一个训练的过程。过程如下图所示 选择一张训练用的图片比如说一张猫生成一个随机的noise图片将noise图叠加到训练用的图片上得到一张有一些noise的图片。这里可以叠加1~T步noise训练noise predictor告诉我们加了多少noise。通过正确的noise答案来调整模型权重。 最终我们能得到一个相对准确的noise-predictor。这是一个U-Net model。在stable-diffusion-model中。 通过这一步我们最终能得到一个noise encoder与noise decoder。 PS: noise encoder在image2image中会应用到。 以上noise与noise-predictor的过程均在pixel space那么就会存在巨大的性能问题。比如说一张1024x1024x3的RBG图片对应3,145,728个数字需要极大的计算资源。在这里stable diffusion定义了一个Latent Space来解决这个问题。 ▐ Latent Space Latent Space的提出基于一个理论Manifold_hypothesis 它假设现实世界中许多高维数据集实际上位于该高维空间内的低维Latent manifolds。像Pixel Space就存在很多的难以感知的高频细节而这些都是在Latent Space中需要压缩掉的信息。 那么基于这个假设我们先定义一个在RGB域的图片 然后存在一个方法zvarepsilonxz是x在latent space的一种表达。 这里有一个因子fH/hW/w通常我们定义比如说stable-diffusion v1.5训练与推理图片在512x512x3然后Latent Space的中间表达则是4x64x64那么我们会有一个decoder D能将图片从Latent Space中解码出来。 在这个过程中我们期望这俩图片无限接近。 整个过程如下图所示 而执行这个过程的就是我们的Variational Autoencoder也就是VAE。 那么VAE该怎么训练呢我们需要一个衡量生成图像与训练图像之间的一个距离指标。 也就是。 细节就不关心了但这个指标可以用来衡量VAE模型的还原程度。训练过程与noise encoder和noise-predictor非常接近。 贴一个stable diffusion在FID指标上与其他方法的对比。下面的表格来自于无条件图片生成。基本就是比较Latent Space是否有丢失重要信息。 为什么Latent Space是可行的 你可能在想为什么VAE可以把一张图片压缩到更小的latent space并且可以不丢失信息。 其实和人对图片的理解是一样的自然的、优秀的图片都不是随机的他们有高度的规则比如说脸上会有眼睛、鼻子。一只狗会有4条腿和一个规则的形状。 图像的高维性是人为的而自然的图像可以很容易地压缩为更小的空间中而不丢失任何信息。 可能说我们修改了一张图片的很多难以感知的细节比如说隐藏水印微小的亮度、对比度的修改但修改后还是同样的图像吗我们只能说它表达的东西还是一样的。并没有丢失任何信息。 ▐ 结合Latent Space与noise predictor的图像生成过程 生成一个随机的latent space matrix也可以叫做latent representation。一种中间表达noise-predictor预测这个latent representation的noise.并生成一个latent space noiselatent representation减去latent space noise重复2~3直到step结束通过VAE的decoder将latent representation生成最终的图片 直到目前为止都还没有条件控制的部分。按这个过程我们最终只会得到一个随机的图片。 条件控制 非常关键没有条件控制我们最终只能不断地进行Monkey Coding得到源源不断的随机图片。 相信你在上面的图片生成的过程中已经感知到一个问题了如果只是从一堆noise中去掉noise那最后得到的为什么是有信息的图片而不是一堆noise呢 noise-predictor在训练的时候其实就是基于已经成像的图片去预测noise那么它预测的noise基本都来自于有图像信息的训练数据。 在这个denoise的过程中noise会被附加上各种各样的图像信息。 怎么控制noise-predictor去选择哪些训练数据去预测noise就是条件控制的核心要素。 这里我们以tex2img为案例讨论。 ▐ Text Conditioning 下面的流程图展示了一个prompt如何处理并提供给noise predictor。 Tokenizer 从图中可以看到我们的每一个word都会被tokenized。stable diffusion v1.5使用的openai ViT-L/14 Clip模型来进行这个过程。 tokenized将自然语言转成计算机可理解的数字(NLP)它只能将words转成token。比如说dreambeach会被CLIP模型拆分成dream和beach。一个word并不意味着一个token。同时dream与beach也不等同于dream和spacebeachstable diffusion model目前被限制只能使用75个tokens来进行prompt并不等同于75个word。 Embedding 同样这也是使用的openai ViT-L/14 Clip model. Embedding是一个768长度的向量。每一个token都会被转成一个768长度的向量如上案例我们最后会得到一个4x768的矩阵。 为什么我们需要embedding呢 比如说我们输入了man但这是不是同时可以意味着gentleman、guy、sportsman、boy。他们可能说在向量空间中与man的距离由近而远。而你不一定非要一个完全准确无误的man。通过embedding的向量我们可以决定究竟取多近的信息来生成图片。对应stable diffusion的参数就是(Classifier-Free Guidance scale)CFG。相当于用一个scale去放大距离因此scale越大对应的能获取的信息越少就会越遵循prompt。而scale越小则越容易获取到关联小甚至无关的信息。 如何去控制embedding 我们经常会遇到stable diffusion无法准确绘制出我们想要的内容。那么这里我们发现了第一种条件控制的方式textual inversion 将我们想要的token用一个全新的别名定义这个别名对应一个准确的token。那么就能准确无误地使用对应的embedding生成图片。 这里的embedding可以是新的对象也可以是其他已存在的对象。 比如说我们用一个玩具猫训练到CLIP模型中并定义其Tokenizer对应的word同时微调stable diffusion的模型。而对应toy cat就能产生如下的效果。 感觉有点像Lora的思路具体还得调研下lora。 text transformer 在得到embedding之后通过text transformer输入给noise-predictor transformer可以控制多种条件如class labels、image、depth map等。 Cross-attention 具体cross-attention是什么我也不是很清楚。但这里有一个案例可以说明 比如说我们使用prompt A man with blue eyes。虽然这里是两个token但stable diffusion会把这两个单词一起成对。 这样就能保证生成一个蓝色眼睛的男人。而不是一个蓝色袜子或者其他蓝色信息的男人。 (cross-attention between the prompt and the image) LoRA models modify the cross-attention module to change styles。后面在研究Lora这里把原话摘到这。 感觉更像是存在blue、eyes然后有一个集合同时满足blue和eye。去取这个交叉的集合。问题对应的embedding是不是不一样的该如何区分blue planet in eye和blue eye in planet的区别感觉这应该是NLP的领域了。 总结下tex2img的过程 stable diffusion生成一个随机的latent space matrix。这个由Random决定如果Random不变则这个latent space matrix不变。通过noise-predictor将noisy image与text prompt作为入参预测predicted noise in latent spacelatent noise减去predicted noise。将其作为新的latent noise不断重复2~3执行step次。比如说step20最终通过VAE的decoder将latent representation生成最终的图片 这个时候就可以贴Stable diffusion论文中的一张图了 手撕一下公式 左上角的定义为一张RGB像素空间的图。经过的变化生成这个latent space representation。再经过一系列的noise encoder得到T表示step。 而这个过程则是img2img的input。如果是img2img那么初始的noise latent representation就是这个不断加noise之后的。 如果是tex2img初始的noise latent representation则是直接random出来的。 再从右下角的开始y 表示多样的控制条件的入参如text prompts。通过(domain specific encoder)将 y 转为intermediate representation一种中间表达。而与将经过cross-attention layer的实现 具体的细节说实话没看懂而这一部分在controlnet中也有解释打算从controlnet的部分进行理解。 图中cross-attention的部分可以很清晰的看到是一个由大到小又由小到大的过程在controlnet的图中有解释 SD Encoder Block_1(64x64) - SD Encoder Block_2(32x32) - SD Encoder Block_3(16x16) - SD Encoder(Block_4 8x8) - SD Middle(Block 8x8) - SD Decoder(Block_4 8x8) - SD Decoder Block_3(16x16) - SD Decoder Block_2(32x32) - SD Decoder Blocker_1(64x64) 是一个从64x64 - 8x8 - 64x64的过程具体为啥得等我撕完controlnet的论文。回到过程图中我们可以看到denoising step则是在Latent Space的左下角进行了一个循环这里与上面的流程一直。 最终通过VAE的decoder D输出图片 最终的公式如下 结合上面的图看基本还是比较清晰的不过这个:和代表了啥就不是很清楚了。结合python代码看流程更清晰~删掉了部分代码只留下了关键的调用。 pipe StableDiffusionPipeline.from_pretrained(CompVis/stable-diffusion-v1-4, torch_dtypetorch.float16
)
vae AutoencoderKL.from_pretrained(CompVis/stable-diffusion-v1-4, subfoldervae)
tokenizer CLIPTokenizer.from_pretrained(openai/clip-vit-large-patch14)
text_encoder CLIPTextModel.from_pretrained(openai/clip-vit-large-patch14)
unet UNet2DConditionModel.from_pretrained(CompVis/stable-diffusion-v1-4, subfolderunet
)
scheduler LMSDiscreteScheduler.from_pretrained(CompVis/stable-diffusion-v1-4, subfolderscheduler
)
prompt [a photograph of an astronaut riding a horse]
generator torch.manual_seed(32)
text_input tokenizer(prompt,paddingmax_length,max_lengthtokenizer.model_max_length,truncationTrue,return_tensorspt,
)
with torch.no_grad():text_embeddings text_encoder(text_input.input_ids.to(torch_device))[0]
max_length text_input.input_ids.shape[-1]
uncond_input tokenizer([] * batch_size, paddingmax_length, max_lengthmax_length, return_tensorspt
)
with torch.no_grad():uncond_embeddings text_encoder(uncond_input.input_ids.to(torch_device))[0]
text_embeddings torch.cat([uncond_embeddings, text_embeddings])
latents torch.randn((batch_size, unet.in_channels, height // 8, width // 8), generatorgenerator
)
scheduler.set_timesteps(num_inference_steps)
latents latents * scheduler.init_noise_sigmafor t in tqdm(scheduler.timesteps):latent_model_input torch.cat([latents] * 2)latent_model_input scheduler.scale_model_input(latent_model_input, t)with torch.no_grad():noise_pred unet(latent_model_input, t, encoder_hidden_statestext_embeddings).samplenoise_pred_uncond, noise_pred_text noise_pred.chunk(2)noise_pred noise_pred_uncond guidance_scale * (noise_pred_text - noise_pred_uncond)latents scheduler.step(noise_pred, t, latents).prev_samplelatents 1 / 0.18215 * latentswith torch.no_grad():image vae.decode(latents).sample 还是很贴合图中流程的。在代码中有一个Scheduler其实就是noising的执行器它主要控制每一步noising的强度。由Scheduler不断加噪然后noise predictor进行预测减噪。具体可以看Stable Diffusion Samplers: A Comprehensive Guide地址https://stable-diffusion-art.com/samplers/ ▐ Img2Img 这个其实在上面的流程图中已经解释了。这里把步骤列一下 输入的image通过VAE的encoder变成latent space representation往里面加noise总共加T个noisenoise的强度由Denoising strength控制。noise其实没有循环加的过程就是不断叠同一个noise T次所以可以一次计算完成。noisy image和text prompt作为输入由noise predictor U-Net预测一个新的noisenoisy image减去预测的noise重复3~4 step次通过VAE的decoder将latent representation转变成image ▐ Inpainting 基于上面的原理Inpainting就很简单了noise只加到inpaint的部分。其他和Img2Img一样。相当于只生成inpaint的部分。所以我们也经常发现inpaint的边缘经常无法非常平滑~如果能接受图片的细微变化可以调低Denoising strength将inpaint的结果再进行一次img2img Stable Diffusion v1 vs v2 v2开始CLIP的部分用了OpenClip。导致生成的控制变得非常的难。OpenAI的CLIP虽然训练集更小参数也更少。(OpenClip是ViT-L/14 CLIP的5倍大小)。但似乎ViT-L/14的训练集更好一些有更多针对艺术和名人照片的部分所以输出的结果通常会更好。导致v2基本没用起来。不过现在没事了SDXL横空出世。 SDXL model SDXL模型的参数达到了66亿而v1.5只有9.8亿 由一个Base model和Refiner model组成。Base model负责生成而Refiner则负责加细节完善。可以只运行Base model。但类似人脸眼睛模糊之类的问题还是需要Refiner解决。 SDXL的主要变动 text encoder组合了OpenClip和ViT-G/14。毕竟OpenClip是可训练的。训练用的图片可以小于256x256增加了39%的训练集U-Net的部分比v1.5大了3倍默认输出就是1024x1024 展示下对比效果 从目前来看有朝一日SDXL迟早替代v1.5。从效果来说v2.1确实被时代淘汰了。 Stable Diffusion的一些常见问题 ▐ 脸部细节不足比如说眼部模糊 可以通过VAE files进行修复~有点像SDXL的Refiner ▐ 多指、少指 这个看起来是一个无解的问题。Andrew给出的建议是加prompt比如说beautiful hands和detailed fingers期望其中有部分图片满足要求。或者用inpaint。反复重新生成手部。这个时候可以用相同的prompt。 团队介绍 我们是淘天集团-场景智能技术团队作为一支专注于通过AI和3D技术驱动商业创新的技术团队, 依托大淘宝丰富的业务形态和海量的用户、数据, 致力于为消费者提供创新的场景化导购体验, 为商家提供高效的场景化内容创作工具, 为淘宝打造围绕家的场景的第一消费入口。我们不断探索并实践新的技术, 通过持续的技术创新和突破创新用户导购体验, 提升商家内容生产力, 让用户享受更好的消费体验, 让商家更高效、低成本地经营。 ¤ 拓展阅读 ¤ 3DXR技术 | 终端技术 | 音视频技术 服务端技术 | 技术质量 | 数据算法